From a5b3759670232c035b360f5da9db184fb4e36a03 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Fri, 15 Aug 2025 21:26:12 +0400 Subject: [PATCH 01/11] Modify the CRMServiceBuilder class for the crm.documentgenerator.numerator methods --- src/Services/CRM/CRMServiceBuilder.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index d72be5ce..f76d1e88 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -653,4 +653,17 @@ public function timelineBindings(): Timeline\Bindings\Service\Bindings return $this->serviceCache[__METHOD__]; } + + public function numerator(): Documentgenerator\Numerator\Service\Numerator + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Documentgenerator\Numerator\Service\Numerator( + new Documentgenerator\Numerator\Service\Batch($this->batch, $this->log), + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } } From d1af5c4e06503752616946f569b0ad72158b0280 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Wed, 17 Sep 2025 20:50:05 +0400 Subject: [PATCH 02/11] Correct the CRMServiceBuilder class --- src/Services/CRM/CRMServiceBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index f76d1e88..d2814a6d 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -654,7 +654,7 @@ public function timelineBindings(): Timeline\Bindings\Service\Bindings return $this->serviceCache[__METHOD__]; } - public function numerator(): Documentgenerator\Numerator\Service\Numerator + public function documentgeneratorNumerator(): Documentgenerator\Numerator\Service\Numerator { if (!isset($this->serviceCache[__METHOD__])) { $this->serviceCache[__METHOD__] = new Documentgenerator\Numerator\Service\Numerator( From f91a9b06b11d521ec1d6c32e9dba9e990d4727b2 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Thu, 18 Sep 2025 21:26:53 +0400 Subject: [PATCH 03/11] Create classes of crm.documentgenerator.numerator items and requests --- .../CRM/Documentgenerator/Numerator/Batch.php | 101 ++++++++++ .../Numerator/Result/NumeratorItemResult.php | 28 +++ .../Numerator/Result/NumeratorResult.php | 34 ++++ .../Numerator/Result/NumeratorsResult.php | 40 ++++ .../Numerator/Service/Batch.php | 112 +++++++++++ .../Numerator/Service/Numerator.php | 181 ++++++++++++++++++ 6 files changed, 496 insertions(+) create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Batch.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorItemResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php diff --git a/src/Services/CRM/Documentgenerator/Numerator/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Batch.php new file mode 100644 index 00000000..10f893f7 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Batch.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator; + +use Bitrix24\SDK\Core\Commands\Command; +use Bitrix24\SDK\Core\Commands\CommandCollection; +use Bitrix24\SDK\Core\Contracts\CoreInterface; +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException; +use Bitrix24\SDK\Core\Response\DTO\Pagination; +use Bitrix24\SDK\Core\Response\DTO\ResponseData; +use Bitrix24\SDK\Core\Response\DTO\Result; +use Bitrix24\SDK\Core\Response\DTO\Time; +use Bitrix24\SDK\Core\Response\Response; +use Generator; +use Psr\Log\LoggerInterface; + +/** + * Class Batch + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator + */ +class Batch extends \Bitrix24\SDK\Core\Batch +{ + /** + * Delete entity items with batch call + * + * + * @return Generator|ResponseData[] + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + public function deleteEntityItems( + string $apiMethod, + array $entityItemId, + ?array $additionalParameters = null + ): Generator { + $this->logger->debug( + 'deleteEntityItems.start', + [ + 'apiMethod' => $apiMethod, + 'entityItems' => $entityItemId, + 'additionalParameters' => $additionalParameters, + ] + ); + + try { + $this->clearCommands(); + foreach ($entityItemId as $cnt => $code) { + if (!is_int($code)) { + throw new InvalidArgumentException( + sprintf( + 'invalid type «%s» of numerator id «%s» at position %s, id must be integer type', + gettype($code), + $code, + $cnt + ) + ); + } + + $parameters = ['id' => $code]; + $this->registerCommand($apiMethod, $parameters); + } + + foreach ($this->getTraversable(true) as $cnt => $deletedItemResult) { + yield $cnt => $deletedItemResult; + } + } catch (InvalidArgumentException $exception) { + $errorMessage = sprintf('batch delete entity items: %s', $exception->getMessage()); + $this->logger->error( + $errorMessage, + [ + 'trace' => $exception->getTrace(), + ] + ); + throw $exception; + } catch (\Throwable $exception) { + $errorMessage = sprintf('batch delete entity items: %s', $exception->getMessage()); + $this->logger->error( + $errorMessage, + [ + 'trace' => $exception->getTrace(), + ] + ); + + throw new BaseException($errorMessage, $exception->getCode(), $exception); + } + + $this->logger->debug('deleteEntityItems.finish'); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorItemResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorItemResult.php new file mode 100644 index 00000000..241cb6d0 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorItemResult.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; + +/** + * Class NumeratorItemResult + * + * @property-read int $id + * @property-read string $name + * @property-read string $template + * @property-read array|null $settings + */ +class NumeratorItemResult extends AbstractCrmItem +{ +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php new file mode 100644 index 00000000..24f81efa --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class NumeratorResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class NumeratorResult extends AbstractResult +{ + /** + * @throws BaseException + */ + public function numerator(): NumeratorItemResult + { + return new NumeratorItemResult($this->getCoreResponse()->getResponseData()->getResult()); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php new file mode 100644 index 00000000..07c83db7 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class NumeratorsResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class NumeratorsResult extends AbstractResult +{ + /** + * @return NumeratorItemResult[] + * @throws BaseException + */ + public function getNumerators(): array + { + $items = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $items[] = new NumeratorItemResult($item); + } + + return $items; + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php new file mode 100644 index 00000000..045163eb --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service; + +use Bitrix24\SDK\Attributes\ApiBatchMethodMetadata; +use Bitrix24\SDK\Attributes\ApiBatchServiceMetadata; +use Bitrix24\SDK\Core\Contracts\BatchOperationsInterface; +use Bitrix24\SDK\Core\Credentials\Scope; +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AddedItemBatchResult; +use Bitrix24\SDK\Core\Result\DeletedItemBatchResult; +use Bitrix24\SDK\Core\Result\UpdatedItemBatchResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorItemResult; +use Generator; +use Psr\Log\LoggerInterface; + +#[ApiBatchServiceMetadata(new Scope(['crm']))] +class Batch +{ + /** + * Batch constructor + */ + public function __construct(protected BatchOperationsInterface $batch, protected LoggerInterface $log) + { + } + + /** + * Batch adding numerators + * + * @param array $numerators + * + * @return Generator + * @throws BaseException + */ + #[ApiBatchMethodMetadata( + 'crm.documentgenerator.numerator.add', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-add.html', + 'Batch adding numerators' + )] + public function add(array $numerators): Generator + { + $items = []; + foreach ($numerators as $item) { + $items[] = [ + 'fields' => $item, + ]; + } + + foreach ($this->batch->addEntityItems('crm.documentgenerator.numerator.add', $items) as $key => $item) { + yield $key => new AddedItemBatchResult($item); + } + } + + /** + * Batch update numerators + * + * Update elements in array with structure + * id => [ // Numerator id + * 'fields' => [] // Numerator fields to update + * ] + * + * @param array $entityItems + * @return Generator + * @throws BaseException + */ + #[ApiBatchMethodMetadata( + 'crm.documentgenerator.numerator.update', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-update.html', + 'Update in batch mode a list of numerators' + )] + public function update(array $entityItems): Generator + { + foreach ($this->batch->updateEntityItems('crm.documentgenerator.numerator.update', $entityItems) as $key => $item) { + yield $key => new UpdatedItemBatchResult($item); + } + } + + /** + * Batch delete numerators + * + * @param int[] $numeratorId + * + * @return Generator + * @throws BaseException + */ + #[ApiBatchMethodMetadata( + 'crm.documentgenerator.numerator.delete', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-delete.html', + 'Batch delete numerators' + )] + public function delete(array $numeratorId): Generator + { + foreach ($this->batch->deleteEntityItems('crm.documentgenerator.numerator.delete', $numeratorId) as $key => $item) { + yield $key => new DeletedItemBatchResult($item); + } + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php new file mode 100644 index 00000000..97a89257 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service; + +use Bitrix24\SDK\Attributes\ApiEndpointMetadata; +use Bitrix24\SDK\Attributes\ApiServiceMetadata; +use Bitrix24\SDK\Core\Contracts\CoreInterface; +use Bitrix24\SDK\Core\Credentials\Scope; +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Core\Result\AddedItemResult; +use Bitrix24\SDK\Core\Result\DeletedItemResult; +use Bitrix24\SDK\Core\Result\FieldsResult; +use Bitrix24\SDK\Core\Result\UpdatedItemResult; +use Bitrix24\SDK\Services\AbstractService; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorsResult; +use Psr\Log\LoggerInterface; + +#[ApiServiceMetadata(new Scope(['crm']))] +class Numerator extends AbstractService +{ + /** + * Numerator constructor + */ + public function __construct(public Batch $batch, CoreInterface $core, LoggerInterface $logger) + { + parent::__construct($core, $logger); + } + + /** + * Adds a new numerator + * + * @link https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-add.html + * + * @param array{ + * name: string, + * template: string, + * settings?: array + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.documentgenerator.numerator.add', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-add.html', + 'Adds a new numerator' + )] + public function add(array $fields): AddedItemResult + { + return new AddedItemResult( + $this->core->call( + 'crm.documentgenerator.numerator.add', + [ + 'fields' => $fields + ] + ) + ); + } + + /** + * Removes a numerator + * + * @link https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-delete.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.documentgenerator.numerator.delete', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-delete.html', + 'Removes a numerator' + )] + public function delete(int $id): DeletedItemResult + { + $params = [ + 'id' => $id, + ]; + + return new DeletedItemResult( + $this->core->call( + 'crm.documentgenerator.numerator.delete', + $params + ) + ); + } + + /** + * Returns information about the numerator by its identifier + * + * @link https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-get.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.documentgenerator.numerator.get', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-get.html', + 'Returns information about the numerator by its identifier' + )] + public function get(int $id): NumeratorResult + { + return new NumeratorResult($this->core->call('crm.documentgenerator.numerator.get', ['id' => $id])); + } + + /** + * Returns a list of numerators + * + * @link https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-list.html + * + * @param int $start - offset for pagination + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.documentgenerator.numerator.list', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-list.html', + 'Returns a list of numerators' + )] + public function list(int $start = 0): NumeratorsResult + { + return new NumeratorsResult( + $this->core->call( + 'crm.documentgenerator.numerator.list', + [ + 'start' => $start + ] + ) + ); + } + + /** + * Updates an existing numbering with new values + * + * The method crm.documentgenerator.numerator.update updates an existing numbering with new values + * + * @link https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-update.html + * + * @param array{ + * name: string, + * template: string, + * settings?: array + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.documentgenerator.numerator.update', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-update.html', + 'Updates an existing numbering with new values' + )] + public function update(int $id, array $fields): UpdatedItemResult + { + $params = [ + 'id' => $id, + 'fields' => $fields + ]; + + return new UpdatedItemResult( + $this->core->call( + 'crm.documentgenerator.numerator.update', + $params + ) + ); + } +} From d18d627ebf84d993b74c970a7c487a49e86d3e07 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Wed, 24 Sep 2025 20:53:07 +0400 Subject: [PATCH 04/11] Correct the numerator classes and add tests --- .../Numerator/Service/Batch.php | 46 ++++++++++++++++++- .../Numerator/Service/Numerator.php | 11 +++++ .../Numerator/Service/BatchTest.php | 31 +++++++++++++ .../Numerator/Service/NumeratorTest.php | 41 +++++++++++++++++ 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php create mode 100644 tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php index 045163eb..1d03211e 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php @@ -35,6 +35,38 @@ public function __construct(protected BatchOperationsInterface $batch, protected { } + /** + * Batch list method for numerators + * + * @return Generator + * @throws BaseException + */ + #[ApiBatchMethodMetadata( + 'crm.documentgenerator.numerator.list', + 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-list.html', + 'Batch list method for numerators' + )] + public function list(?int $limit = null): Generator + { + $this->log->debug( + 'batchList', + [ + 'limit' => $limit, + ] + ); + + $numeratorListGenerator = $this->batch->getTraversableList( + 'crm.documentgenerator.numerator.list', + [], + [], + [], + $limit + ); + foreach ($numeratorListGenerator as $key => $value) { + yield $key => new NumeratorItemResult($value); + } + } + /** * Batch adding numerators * @@ -85,7 +117,12 @@ public function add(array $numerators): Generator )] public function update(array $entityItems): Generator { - foreach ($this->batch->updateEntityItems('crm.documentgenerator.numerator.update', $entityItems) as $key => $item) { + foreach ( + $this->batch->updateEntityItems( + 'crm.documentgenerator.numerator.update', + $entityItems + ) as $key => $item + ) { yield $key => new UpdatedItemBatchResult($item); } } @@ -105,7 +142,12 @@ public function update(array $entityItems): Generator )] public function delete(array $numeratorId): Generator { - foreach ($this->batch->deleteEntityItems('crm.documentgenerator.numerator.delete', $numeratorId) as $key => $item) { + foreach ( + $this->batch->deleteEntityItems( + 'crm.documentgenerator.numerator.delete', + $numeratorId + ) as $key => $item + ) { yield $key => new DeletedItemBatchResult($item); } } diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php index 97a89257..1cce73f7 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php @@ -178,4 +178,15 @@ public function update(int $id, array $fields): UpdatedItemResult ) ); } + + /** + * Count numerators + * + * @throws BaseException + * @throws TransportException + */ + public function count(): int + { + return $this->list(1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + } } diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php new file mode 100644 index 00000000..3401469a --- /dev/null +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; +use Bitrix24\SDK\Tests\Integration\Fabric; +use PHPUnit\Framework\TestCase; + +/** + * Class BatchTest + * + * @package Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service + */ +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Batch::class)] +class BatchTest extends TestCase +{ + protected Numerator $numeratorService; +} diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php new file mode 100644 index 00000000..b4c6496b --- /dev/null +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Core; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorItemResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; +use Bitrix24\SDK\Tests\CustomAssertions\CustomBitrix24Assertions; +use Bitrix24\SDK\Tests\Integration\Fabric; +use PHPUnit\Framework\Attributes\CoversFunction; +use PHPUnit\Framework\Attributes\CoversMethod; +use PHPUnit\Framework\TestCase; + +/** + * Class NumeratorTest + * + * @package Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service + */ +#[CoversMethod(Numerator::class, 'add')] +#[CoversMethod(Numerator::class, 'delete')] +#[CoversMethod(Numerator::class, 'get')] +#[CoversMethod(Numerator::class, 'list')] +#[CoversMethod(Numerator::class, 'update')] +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator::class)] +class NumeratorTest extends TestCase +{ + use CustomBitrix24Assertions; +} From 27bf4dfc0ac5c2724abfe4e0795c29f1f4d70dbb Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Thu, 25 Sep 2025 17:07:34 +0400 Subject: [PATCH 05/11] Minor fix --- src/Services/CRM/CRMServiceBuilder.php | 7 ++++++- .../CRM/Documentgenerator/Numerator/Batch.php | 8 -------- .../Numerator/Result/NumeratorResult.php | 9 +++++++-- .../Numerator/Result/NumeratorsResult.php | 13 +++++++++++-- .../Documentgenerator/Numerator/Service/Batch.php | 3 ++- .../Numerator/Service/Numerator.php | 3 +-- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index d2814a6d..b4905fc3 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -657,8 +657,13 @@ public function timelineBindings(): Timeline\Bindings\Service\Bindings public function documentgeneratorNumerator(): Documentgenerator\Numerator\Service\Numerator { if (!isset($this->serviceCache[__METHOD__])) { + // Use specialized Batch for Numerator to ensure correct REST parameter mapping (e.g., 'id') + $numeratorBatch = new Documentgenerator\Numerator\Batch( + $this->core, + $this->log + ); $this->serviceCache[__METHOD__] = new Documentgenerator\Numerator\Service\Numerator( - new Documentgenerator\Numerator\Service\Batch($this->batch, $this->log), + new Documentgenerator\Numerator\Service\Batch($numeratorBatch, $this->log), $this->core, $this->log ); diff --git a/src/Services/CRM/Documentgenerator/Numerator/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Batch.php index 10f893f7..6a9a6c71 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Batch.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Batch.php @@ -13,18 +13,10 @@ namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator; -use Bitrix24\SDK\Core\Commands\Command; -use Bitrix24\SDK\Core\Commands\CommandCollection; -use Bitrix24\SDK\Core\Contracts\CoreInterface; use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException; -use Bitrix24\SDK\Core\Response\DTO\Pagination; use Bitrix24\SDK\Core\Response\DTO\ResponseData; -use Bitrix24\SDK\Core\Response\DTO\Result; -use Bitrix24\SDK\Core\Response\DTO\Time; -use Bitrix24\SDK\Core\Response\Response; use Generator; -use Psr\Log\LoggerInterface; /** * Class Batch diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php index 24f81efa..717ad45f 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorResult.php @@ -9,7 +9,6 @@ * file that was distributed with this source code. */ - declare(strict_types=1); namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; @@ -29,6 +28,12 @@ class NumeratorResult extends AbstractResult */ public function numerator(): NumeratorItemResult { - return new NumeratorItemResult($this->getCoreResponse()->getResponseData()->getResult()); + $result = $this->getCoreResponse()->getResponseData()->getResult(); + // Be tolerant to different API payload shapes + if (!empty($result['numerator']) && is_array($result['numerator'])) { + $result = $result['numerator']; + } + + return new NumeratorItemResult($result); } } diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php index 07c83db7..465674fc 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/NumeratorsResult.php @@ -9,7 +9,6 @@ * file that was distributed with this source code. */ - declare(strict_types=1); namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; @@ -31,7 +30,17 @@ class NumeratorsResult extends AbstractResult public function getNumerators(): array { $items = []; - foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $source = []; + + $result = $this->getCoreResponse()->getResponseData()->getResult(); + + if (!empty($result['numerators']) && is_array($result['numerators'])) { + $source = $result['numerators']; + } elseif (!empty($result['items']) && is_array($result['items'])) { + $source = $result['items']; + } + + foreach ($source as $item) { $items[] = new NumeratorItemResult($item); } diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php index 1d03211e..1f6a8249 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php @@ -55,7 +55,8 @@ public function list(?int $limit = null): Generator ] ); - $numeratorListGenerator = $this->batch->getTraversableList( + // Use pagination-based traversable to avoid dependency on element ID field name + $numeratorListGenerator = $this->batch->getTraversableListWithCount( 'crm.documentgenerator.numerator.list', [], [], diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php index 1cce73f7..63c4e286 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php @@ -20,7 +20,6 @@ use Bitrix24\SDK\Core\Exceptions\TransportException; use Bitrix24\SDK\Core\Result\AddedItemResult; use Bitrix24\SDK\Core\Result\DeletedItemResult; -use Bitrix24\SDK\Core\Result\FieldsResult; use Bitrix24\SDK\Core\Result\UpdatedItemResult; use Bitrix24\SDK\Services\AbstractService; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorResult; @@ -187,6 +186,6 @@ public function update(int $id, array $fields): UpdatedItemResult */ public function count(): int { - return $this->list(1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + return $this->list()->getCoreResponse()->getResponseData()->getPagination()->getTotal(); } } From edeeb80550b8adb06bb494966663c52e2d0b7b97 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Thu, 25 Sep 2025 17:53:33 +0400 Subject: [PATCH 06/11] Create tests for CRM documentgenerator numerator --- .../Numerator/Service/BatchTest.php | 130 +++++++++++++++++ .../Numerator/Service/NumeratorTest.php | 132 +++++++++++++++++- 2 files changed, 260 insertions(+), 2 deletions(-) diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php index 3401469a..65b1c651 100644 --- a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php @@ -18,6 +18,7 @@ use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; use Bitrix24\SDK\Tests\Integration\Fabric; use PHPUnit\Framework\TestCase; +use Faker; /** * Class BatchTest @@ -28,4 +29,133 @@ class BatchTest extends TestCase { protected Numerator $numeratorService; + + private Faker\Generator $faker; + + protected function setUp(): void + { + $this->numeratorService = Fabric::getServiceBuilder()->getCRMScope()->documentgeneratorNumerator(); + $this->faker = Faker\Factory::create(); + } + + /** + * @throws BaseException + * @throws TransportException + */ + #[\PHPUnit\Framework\Attributes\TestDox('Batch list numerators')] + public function testBatchList(): void + { + $id = $this->numeratorService->add([ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'BL-{NUMBER}', + ])->getId(); + + $cnt = 0; + foreach ($this->numeratorService->batch->list(1) as $item) { + $cnt++; + } + + self::assertGreaterThanOrEqual(1, $cnt); + + // cleanup + $this->numeratorService->delete($id); + } + + /** + * @throws BaseException + * @throws TransportException + */ + #[\PHPUnit\Framework\Attributes\TestDox('Batch add numerators')] + public function testBatchAdd(): void + { + $items = []; + for ($i = 1; $i <= 5; $i++) { + $items[] = [ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'BA-{NUMBER}', + ]; + } + + $ids = []; + $cnt = 0; + foreach ($this->numeratorService->batch->add($items) as $added) { + $cnt++; + $ids[] = $added->getId(); + } + + self::assertEquals(count($items), $cnt); + + $delCnt = 0; + foreach ($this->numeratorService->batch->delete($ids) as $deleted) { + $delCnt++; + } + self::assertEquals(count($items), $delCnt); + } + + /** + * @throws BaseException + */ + #[\PHPUnit\Framework\Attributes\TestDox('Batch delete numerators')] + public function testBatchDelete(): void + { + $items = []; + for ($i = 1; $i <= 5; $i++) { + $items[] = [ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'BD-{NUMBER}', + ]; + } + + $ids = []; + foreach ($this->numeratorService->batch->add($items) as $added) { + $ids[] = $added->getId(); + } + + $delCnt = 0; + foreach ($this->numeratorService->batch->delete($ids) as $deleted) { + $delCnt++; + } + + self::assertEquals(count($items), $delCnt); + } + + /** + * @throws BaseException + */ + #[\PHPUnit\Framework\Attributes\TestDox('Batch update numerators')] + public function testBatchUpdate(): void + { + $items = []; + for ($i = 1; $i <= 5; $i++) { + $items[] = [ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'BU-{NUMBER}', + ]; + } + + $updatePayload = []; + foreach ($this->numeratorService->batch->add($items) as $added) { + $id = $added->getId(); + $updatePayload[$id] = [ + 'fields' => [ + 'name' => 'updated-' . $id, + 'template' => 'BU2-{NUMBER}', + ], + ]; + } + + foreach ($this->numeratorService->batch->update($updatePayload) as $updated) { + $this->assertTrue($updated->isSuccess()); + } + + // cleanup + $ids = array_keys($updatePayload); + $deletedCount = 0; + foreach ($this->numeratorService->batch->delete($ids) as $deleted) { + $deletedCount++; + } + self::assertEquals(count($ids), $deletedCount); + + self::assertTrue(true); + } } diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php index b4c6496b..ee2ee398 100644 --- a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php @@ -15,14 +15,13 @@ use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Exceptions\TransportException; -use Bitrix24\SDK\Core; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorItemResult; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; use Bitrix24\SDK\Tests\CustomAssertions\CustomBitrix24Assertions; use Bitrix24\SDK\Tests\Integration\Fabric; -use PHPUnit\Framework\Attributes\CoversFunction; use PHPUnit\Framework\Attributes\CoversMethod; use PHPUnit\Framework\TestCase; +use Faker; /** * Class NumeratorTest @@ -38,4 +37,133 @@ class NumeratorTest extends TestCase { use CustomBitrix24Assertions; + + private Numerator $numeratorService; + + private Faker\Generator $faker; + + protected function setUp(): void + { + $this->numeratorService = Fabric::getServiceBuilder()->getCRMScope()->documentgeneratorNumerator(); + $this->faker = Faker\Factory::create(); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testAdd(): void + { + $name = 'num-' . $this->faker->uuid(); + $id = $this->numeratorService->add([ + 'name' => $name, + 'template' => 'N-{NUMBER}', + ])->getId(); + + self::assertGreaterThanOrEqual(1, $id); + + // cleanup + $this->numeratorService->delete($id); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testGet(): void + { + $name = 'num-' . $this->faker->uuid(); + $id = $this->numeratorService->add([ + 'name' => $name, + 'template' => 'G-{NUMBER}', + ])->getId(); + + $got = $this->numeratorService->get($id)->numerator(); + self::assertInstanceOf(NumeratorItemResult::class, $got); + self::assertEquals($id, $got->id); + self::assertEquals($name, $got->name); + + // cleanup + $this->numeratorService->delete($id); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testList(): void + { + $name = 'num-' . $this->faker->uuid(); + $id = $this->numeratorService->add([ + 'name' => $name, + 'template' => 'L-{NUMBER}', + ])->getId(); + + $list = $this->numeratorService->list()->getNumerators(); + self::assertIsArray($list); + self::assertGreaterThanOrEqual(1, count($list)); + + // cleanup + $this->numeratorService->delete($id); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testUpdate(): void + { + $name = 'num-' . $this->faker->uuid(); + $id = $this->numeratorService->add([ + 'name' => $name, + 'template' => 'U-{NUMBER}', + ])->getId(); + + $newName = $name . '-updated'; + self::assertTrue( + $this->numeratorService->update($id, [ + 'name' => $newName, + 'template' => 'U2-{NUMBER}', + ])->isSuccess() + ); + + self::assertEquals($newName, $this->numeratorService->get($id)->numerator()->name); + + // cleanup + $this->numeratorService->delete($id); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testDelete(): void + { + $id = $this->numeratorService->add([ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'D-{NUMBER}', + ])->getId(); + + self::assertTrue($this->numeratorService->delete($id)->isSuccess()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testCount(): void + { + $countBefore = $this->numeratorService->count(); + + $id = $this->numeratorService->add([ + 'name' => 'num-' . $this->faker->uuid(), + 'template' => 'C-{NUMBER}', + ])->getId(); + + $countAfter = $this->numeratorService->count(); + self::assertEquals($countBefore + 1, $countAfter); + + // cleanup + $this->numeratorService->delete($id); + } } From ad264aec791330ed9984842522b50cfc3c661b27 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Fri, 26 Sep 2025 14:01:15 +0400 Subject: [PATCH 07/11] Linter and test registration --- .php-cs-fixer.php | 2 +- Makefile | 5 ++++- phpstan.neon.dist | 1 + phpunit.xml.dist | 3 +++ rector.php | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index ee2ef05e..93fc01df 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -15,11 +15,11 @@ ->in(__DIR__ . '/src/Services/CRM/Requisites/') ->in(__DIR__ . '/src/Services/CRM/Status/') ->in(__DIR__ . '/src/Services/CRM/Timeline/') + ->in(__DIR__ . '/src/Services/CRM/Documentgenerator/Numerator/') ->in(__DIR__ . '/src/Services/Entity/Section/') ->in(__DIR__ . '/src/Services/Department/') ->in(__DIR__ . '/src/Services/Sale/') ->in(__DIR__ . '/src/Services/Task/') - ->in(__DIR__ . '/src/Services/Sale/') ->name('*.php') ->exclude(['vendor', 'storage', 'docker', 'docs']) // Exclude directories ->ignoreDotFiles(true) diff --git a/Makefile b/Makefile index 5c93b5ac..9e9de1c9 100644 --- a/Makefile +++ b/Makefile @@ -304,6 +304,10 @@ integration_tests_sale: integration_tests_sale_payment: docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_sale_payment +.PHONY: integration_tests_crm_documentgenerator_numerator +integration_tests_crm_documentgenerator_numerator: + docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_documentgenerator_numerator + # work dev environment .PHONY: php-dev-server-up php-dev-server-up: @@ -359,4 +363,3 @@ build-examples-for-documentation: --example-template=docs/api/file-templates/examples/master-example.php \ --openai-api-key=$(DOCUMENTATION_OPEN_AI_API_KEY) \ --docs-repo-folder=$(DOCUMENTATION_REPOSITORY_FOLDER) - diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 3bead767..88e0ccfb 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -29,6 +29,7 @@ parameters: - tests/Integration/Services/CRM/Requisites - tests/Integration/Services/Task - tests/Integration/Services/Sale + - tests/Integration/Services/CRM/Documentgenerator/Numerator excludePaths: - tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php - tests/Integration/Services/CRM/Status diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d69753c3..8a011ec8 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -136,6 +136,9 @@ ./tests/Integration/Services/Sale/Order/ + + ./tests/Integration/Services/CRM/Documentgenerator/Numerator/ + diff --git a/rector.php b/rector.php index 4b458e5f..1ca4632e 100644 --- a/rector.php +++ b/rector.php @@ -62,6 +62,8 @@ __DIR__ . '/tests/Integration/Services/Task', __DIR__ . '/src/Services/Sale', __DIR__ . '/tests/Integration/Services/Sale', + __DIR__ . '/src/Services/CRM/Documentgenerator/Numerator', + __DIR__ . '/tests/Integration/Services/CRM/Documentgenerator/Numerator', __DIR__ . '/tests/Unit/', ]) ->withCache(cacheDirectory: __DIR__ . '.cache/rector') From 0310b4c9e55d0077facd003e9be8ed0270e480c5 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Fri, 26 Sep 2025 16:19:49 +0400 Subject: [PATCH 08/11] Numerator tests minor fix --- .../Numerator/Service/BatchTest.php | 8 ++++++-- .../Numerator/Service/NumeratorTest.php | 14 +++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php index 65b1c651..3869737c 100644 --- a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/BatchTest.php @@ -14,6 +14,7 @@ namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service; use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException; use Bitrix24\SDK\Core\Exceptions\TransportException; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; use Bitrix24\SDK\Tests\Integration\Fabric; @@ -32,6 +33,9 @@ class BatchTest extends TestCase private Faker\Generator $faker; + /** + * @throws InvalidArgumentException + */ protected function setUp(): void { $this->numeratorService = Fabric::getServiceBuilder()->getCRMScope()->documentgeneratorNumerator(); @@ -57,7 +61,7 @@ public function testBatchList(): void self::assertGreaterThanOrEqual(1, $cnt); - // cleanup + // Cleanup $this->numeratorService->delete($id); } @@ -148,7 +152,7 @@ public function testBatchUpdate(): void $this->assertTrue($updated->isSuccess()); } - // cleanup + // Cleanup $ids = array_keys($updatePayload); $deletedCount = 0; foreach ($this->numeratorService->batch->delete($ids) as $deleted) { diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php index ee2ee398..9f31bc26 100644 --- a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php @@ -14,6 +14,7 @@ namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Documentgenerator\Numerator\Service; use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\InvalidArgumentException; use Bitrix24\SDK\Core\Exceptions\TransportException; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorItemResult; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Service\Numerator; @@ -42,6 +43,9 @@ class NumeratorTest extends TestCase private Faker\Generator $faker; + /** + * @throws InvalidArgumentException + */ protected function setUp(): void { $this->numeratorService = Fabric::getServiceBuilder()->getCRMScope()->documentgeneratorNumerator(); @@ -62,7 +66,7 @@ public function testAdd(): void self::assertGreaterThanOrEqual(1, $id); - // cleanup + // Cleanup $this->numeratorService->delete($id); } @@ -83,7 +87,7 @@ public function testGet(): void self::assertEquals($id, $got->id); self::assertEquals($name, $got->name); - // cleanup + // Cleanup $this->numeratorService->delete($id); } @@ -103,7 +107,7 @@ public function testList(): void self::assertIsArray($list); self::assertGreaterThanOrEqual(1, count($list)); - // cleanup + // Cleanup $this->numeratorService->delete($id); } @@ -129,7 +133,7 @@ public function testUpdate(): void self::assertEquals($newName, $this->numeratorService->get($id)->numerator()->name); - // cleanup + // Cleanup $this->numeratorService->delete($id); } @@ -163,7 +167,7 @@ public function testCount(): void $countAfter = $this->numeratorService->count(); self::assertEquals($countBefore + 1, $countAfter); - // cleanup + // Cleanup $this->numeratorService->delete($id); } } From ee320cf7b01562bfbaba706619b6bbd443f1f9ae Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Fri, 26 Sep 2025 17:51:22 +0400 Subject: [PATCH 09/11] Fix on linter --- .../CRM/Documentgenerator/Numerator/Service/Numerator.php | 1 + .../CRM/Documentgenerator/Numerator/Service/BatchTest.php | 4 ++-- .../Documentgenerator/Numerator/Service/NumeratorTest.php | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php index 63c4e286..7cd72ac5 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php @@ -1,4 +1,5 @@ - * * For the full copyright and license information, please view the MIT-LICENSE.txt * file that was distributed with this source code. */ @@ -93,6 +91,7 @@ public function testBatchAdd(): void foreach ($this->numeratorService->batch->delete($ids) as $deleted) { $delCnt++; } + self::assertEquals(count($items), $delCnt); } @@ -158,6 +157,7 @@ public function testBatchUpdate(): void foreach ($this->numeratorService->batch->delete($ids) as $deleted) { $deletedCount++; } + self::assertEquals(count($ids), $deletedCount); self::assertTrue(true); diff --git a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php index 9f31bc26..26485191 100644 --- a/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php +++ b/tests/Integration/Services/CRM/Documentgenerator/Numerator/Service/NumeratorTest.php @@ -82,10 +82,10 @@ public function testGet(): void 'template' => 'G-{NUMBER}', ])->getId(); - $got = $this->numeratorService->get($id)->numerator(); - self::assertInstanceOf(NumeratorItemResult::class, $got); - self::assertEquals($id, $got->id); - self::assertEquals($name, $got->name); + $numeratorItemResult = $this->numeratorService->get($id)->numerator(); + self::assertInstanceOf(NumeratorItemResult::class, $numeratorItemResult); + self::assertEquals($id, $numeratorItemResult->id); + self::assertEquals($name, $numeratorItemResult->name); // Cleanup $this->numeratorService->delete($id); From e796481976e276d8386be8c8a007894056afbd32 Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Mon, 29 Sep 2025 17:31:37 +0400 Subject: [PATCH 10/11] Test and debug the crm.documentgenerator.numerator methods --- .../Result/AddedNumeratorBatchResult.php | 29 ++++++++++++++++ .../Numerator/Result/AddedNumeratorResult.php | 34 +++++++++++++++++++ .../Result/DeletedNumeratorBatchResult.php | 29 ++++++++++++++++ .../Result/DeletedNumeratorResult.php | 33 ++++++++++++++++++ .../Result/UpdatedNumeratorBatchResult.php | 29 ++++++++++++++++ .../Result/UpdatedNumeratorResult.php | 33 ++++++++++++++++++ .../Numerator/Service/Batch.php | 19 ++++++----- .../Numerator/Service/Numerator.php | 18 +++++----- 8 files changed, 206 insertions(+), 18 deletions(-) create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorBatchResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorBatchResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorBatchResult.php create mode 100644 src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorResult.php diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorBatchResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorBatchResult.php new file mode 100644 index 00000000..f770ba94 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorBatchResult.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Result\AddedItemBatchResult; + +/** + * Class AddedNumeratorBatchResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class AddedNumeratorBatchResult extends AddedItemBatchResult +{ + public function getId(): int + { + return (int)$this->getResponseData()->getResult()['numerator']['id']; + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorResult.php new file mode 100644 index 00000000..ac11cbbe --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/AddedNumeratorResult.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Result\AddedItemResult; +use Bitrix24\SDK\Core\Exceptions\BaseException; + +/** + * Class AddedNumeratorResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class AddedNumeratorResult extends AddedItemResult +{ + /** + * @throws BaseException + */ + public function getId(): int + { + return (int)$this->getCoreResponse()->getResponseData()->getResult()['numerator']['id']; + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorBatchResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorBatchResult.php new file mode 100644 index 00000000..aa7f9f50 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorBatchResult.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Result\DeletedItemBatchResult; + +/** + * Class DeletedNumeratorBatchResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class DeletedNumeratorBatchResult extends DeletedItemBatchResult +{ + public function isSuccess(): bool + { + return (bool)$this->getResponseData()->getResult(); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorResult.php new file mode 100644 index 00000000..f760244f --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/DeletedNumeratorResult.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\DeletedItemResult; + +/** + * Class DeletedNumeratorResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class DeletedNumeratorResult extends DeletedItemResult +{ + /** + * @throws BaseException + */ + public function isSuccess(): bool + { + return (bool)$this->getCoreResponse()->getResponseData()->getResult(); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorBatchResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorBatchResult.php new file mode 100644 index 00000000..b73b514c --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorBatchResult.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Result\UpdatedItemBatchResult; + +/** + * Class UpdatedNumeratorBatchResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class UpdatedNumeratorBatchResult extends UpdatedItemBatchResult +{ + public function isSuccess(): bool + { + return (bool)$this->getResponseData()->getResult(); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorResult.php b/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorResult.php new file mode 100644 index 00000000..fbf08705 --- /dev/null +++ b/src/Services/CRM/Documentgenerator/Numerator/Result/UpdatedNumeratorResult.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the MIT-LICENSE.txt + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\UpdatedItemResult; + +/** + * Class UpdatedNumeratorResult + * + * @package Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result + */ +class UpdatedNumeratorResult extends UpdatedItemResult +{ + /** + * @throws BaseException + */ + public function isSuccess(): bool + { + return (bool)$this->getCoreResponse()->getResponseData()->getResult(); + } +} diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php index 1f6a8249..1139c41c 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Batch.php @@ -18,9 +18,9 @@ use Bitrix24\SDK\Core\Contracts\BatchOperationsInterface; use Bitrix24\SDK\Core\Credentials\Scope; use Bitrix24\SDK\Core\Exceptions\BaseException; -use Bitrix24\SDK\Core\Result\AddedItemBatchResult; -use Bitrix24\SDK\Core\Result\DeletedItemBatchResult; -use Bitrix24\SDK\Core\Result\UpdatedItemBatchResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\AddedNumeratorBatchResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\UpdatedNumeratorBatchResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\DeletedNumeratorBatchResult; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorItemResult; use Generator; use Psr\Log\LoggerInterface; @@ -77,7 +77,7 @@ public function list(?int $limit = null): Generator * settings?: array * }> $numerators * - * @return Generator + * @return Generator * @throws BaseException */ #[ApiBatchMethodMetadata( @@ -95,7 +95,7 @@ public function add(array $numerators): Generator } foreach ($this->batch->addEntityItems('crm.documentgenerator.numerator.add', $items) as $key => $item) { - yield $key => new AddedItemBatchResult($item); + yield $key => new AddedNumeratorBatchResult($item); } } @@ -108,7 +108,8 @@ public function add(array $numerators): Generator * ] * * @param array $entityItems - * @return Generator + * + * @return Generator * @throws BaseException */ #[ApiBatchMethodMetadata( @@ -124,7 +125,7 @@ public function update(array $entityItems): Generator $entityItems ) as $key => $item ) { - yield $key => new UpdatedItemBatchResult($item); + yield $key => new UpdatedNumeratorBatchResult($item); } } @@ -133,7 +134,7 @@ public function update(array $entityItems): Generator * * @param int[] $numeratorId * - * @return Generator + * @return Generator * @throws BaseException */ #[ApiBatchMethodMetadata( @@ -149,7 +150,7 @@ public function delete(array $numeratorId): Generator $numeratorId ) as $key => $item ) { - yield $key => new DeletedItemBatchResult($item); + yield $key => new DeletedNumeratorBatchResult($item); } } } diff --git a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php index 7cd72ac5..a0f73eb5 100644 --- a/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php +++ b/src/Services/CRM/Documentgenerator/Numerator/Service/Numerator.php @@ -19,12 +19,12 @@ use Bitrix24\SDK\Core\Credentials\Scope; use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Exceptions\TransportException; -use Bitrix24\SDK\Core\Result\AddedItemResult; -use Bitrix24\SDK\Core\Result\DeletedItemResult; -use Bitrix24\SDK\Core\Result\UpdatedItemResult; use Bitrix24\SDK\Services\AbstractService; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\AddedNumeratorResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\DeletedNumeratorResult; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorResult; use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\NumeratorsResult; +use Bitrix24\SDK\Services\CRM\Documentgenerator\Numerator\Result\UpdatedNumeratorResult; use Psr\Log\LoggerInterface; #[ApiServiceMetadata(new Scope(['crm']))] @@ -57,9 +57,9 @@ public function __construct(public Batch $batch, CoreInterface $core, LoggerInte 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-add.html', 'Adds a new numerator' )] - public function add(array $fields): AddedItemResult + public function add(array $fields): AddedNumeratorResult { - return new AddedItemResult( + return new AddedNumeratorResult( $this->core->call( 'crm.documentgenerator.numerator.add', [ @@ -83,13 +83,13 @@ public function add(array $fields): AddedItemResult 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-delete.html', 'Removes a numerator' )] - public function delete(int $id): DeletedItemResult + public function delete(int $id): DeletedNumeratorResult { $params = [ 'id' => $id, ]; - return new DeletedItemResult( + return new DeletedNumeratorResult( $this->core->call( 'crm.documentgenerator.numerator.delete', $params @@ -164,14 +164,14 @@ public function list(int $start = 0): NumeratorsResult 'https://apidocs.bitrix24.com/api-reference/crm/document-generator/numerator/crm-document-generator-numerator-update.html', 'Updates an existing numbering with new values' )] - public function update(int $id, array $fields): UpdatedItemResult + public function update(int $id, array $fields): UpdatedNumeratorResult { $params = [ 'id' => $id, 'fields' => $fields ]; - return new UpdatedItemResult( + return new UpdatedNumeratorResult( $this->core->call( 'crm.documentgenerator.numerator.update', $params From dfa2a3e978eb045242461b21598a937f5abc0a9e Mon Sep 17 00:00:00 2001 From: Dmitriy Ignatenko Date: Tue, 30 Sep 2025 17:49:34 +0400 Subject: [PATCH 11/11] Add methods description to CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7af2a5bb..8c4dfebe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ ### Added +- Added service `Services\CRM\Documentgenerator\Numerator` with support methods, + see [crm.documentgenerator.numerator.* methods](https://github.com/bitrix24/b24phpsdk/issues/215): + - `add` adds a new numerator, with batch calls support + - `list` gets the list of numerators, with batch calls support + - `update` updates an existing numbering with new values, with batch calls support + - `delete` deletes a numerator, with batch calls support + - `get` gets information about the numerator by its identifier + - `count` count numerators - Added service `Services\Sale\Shipment\Service\Shipment` with support methods, see [sale.shipment.* methods](https://github.com/bitrix24/b24phpsdk/issues/250): - `add` adds a shipment