From aca8a636e199712c79d4c2501c2b5b856f99abdd Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 23 Jun 2025 10:59:13 +0400 Subject: [PATCH 01/17] add bankdetail classes --- .../Result/RequisiteBankdetailItemResult.php | 83 +++++ .../Result/RequisiteBankdetailResult.php | 33 ++ .../Result/RequisiteBankdetailsResult.php | 40 +++ .../Service/RequisiteBankdetail.php | 307 ++++++++++++++++++ 4 files changed, 463 insertions(+) create mode 100644 src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php create mode 100644 src/Services/CRM/Requisites/Service/RequisiteBankdetail.php diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php new file mode 100644 index 00000000..9475b36f --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php @@ -0,0 +1,83 @@ + + * + * 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\Quote\Result; + +use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; +use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Email; +use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\InstantMessenger; +use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Phone; +use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Website; +use Carbon\CarbonImmutable; +use Money\Currency; +use Money\Money; + +/** + * Class QuoteItemResult + * + * @property-read int $ID + * @property-read string $TITLE + * @property-read int|null $ASSIGNED_BY_ID + * @property-read int|null $LAST_ACTIVITY_BY + * @property-read CarbonImmutable|null $LAST_ACTIVITY_TIME + * @property-read string|null $LAST_COMMUNICATION_TIME + * @property-read CarbonImmutable|null $BEGINDATE + * @property-read CarbonImmutable|null $CLOSEDATE + * @property-read CarbonImmutable|null $ACTUAL_DATE + * @property-read string|null $CLIENT_ADDR + * @property-read string|null $CLIENT_CONTACT + * @property-read string|null $CLIENT_EMAIL + * @property-read string|null $CLIENT_PHONE + * @property-read string|null $CLIENT_TITLE + * @property-read string|null $CLIENT_TPA_ID + * @property-read string|null $CLIENT_TP_ID + * @property-read bool|null $CLOSED + * @property-read string|null $COMMENTS + * @property-read int|null $COMPANY_ID + * @property-read int|null $CONTACT_ID + * @property-read array|null $CONTACT_IDS + * @property-read string|null $CONTENT + * @property-read int|null $CREATED_BY_ID + * @property-read Currency|null $CURRENCY_ID + * @property-read CarbonImmutable|null $DATE_CREATE + * @property-read CarbonImmutable|null $DATE_MODIFY + * @property-read int|null $DEAL_ID + * @property-read int|null $LEAD_ID + * @property-read int|null $LOCATION_ID + * @property-read int|null $MODIFY_BY_ID + * @property-read int|null $MYCOMPANY_ID + * @property-read bool|null $OPENED + * @property-read Money|null $OPPORTUNITY + * @property-read int|null $PERSON_TYPE_ID + * @property-read string|null $QUOTE_NUMBER + * @property-read string|null $STATUS_ID + * @property-read Money|null $TAX_VALUE + * @property-read string|null $TERMS + * @property-read string|null $UTM_SOURCE + * @property-read string|null $UTM_MEDIUM + * @property-read string|null $UTM_CAMPAIGN + * @property-read string|null $UTM_CONTENT + * @property-read string|null $UTM_TERM + */ +class QuoteItemResult extends AbstractCrmItem +{ + /** + * + * @return mixed|null + * @throws \Bitrix24\SDK\Services\CRM\Userfield\Exceptions\UserfieldNotFoundException + */ + public function getUserfieldByFieldName(string $userfieldName) + { + return $this->getKeyWithUserfieldByFieldName($userfieldName); + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php new file mode 100644 index 00000000..1cf4b9af --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.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\Quote\Result; + +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class QuoteResult + * + * @package Bitrix24\SDK\Services\CRM\Quote\Result + */ +class QuoteResult extends AbstractResult +{ + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + public function quote(): QuoteItemResult + { + return new QuoteItemResult($this->getCoreResponse()->getResponseData()->getResult()); + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php new file mode 100644 index 00000000..f676dade --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.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\Quote\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class QuotesResult + * + * @package Bitrix24\SDK\Services\CRM\Quote\Result + */ +class QuotesResult extends AbstractResult +{ + /** + * @return QuoteItemResult[] + * @throws BaseException + */ + public function getQuotes(): array + { + $items = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $items[] = new QuoteItemResult($item); + } + + return $items; + } +} diff --git a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php new file mode 100644 index 00000000..1c591c40 --- /dev/null +++ b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php @@ -0,0 +1,307 @@ + + * + * 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\Requisite\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\Requisite\Result\RequisiteBankdetailResult; +use Bitrix24\SDK\Services\CRM\Requisite\Result\RequisiteBankdetailsResult; +use Psr\Log\LoggerInterface; + +#[ApiServiceMetadata(new Scope(['crm']))] +class RequisiteBankdetail extends AbstractService +{ + /** + * RequisiteBankdetail constructor. + */ + public function __construct(public Batch $batch, CoreInterface $core, LoggerInterface $logger) + { + parent::__construct($core, $logger); + } + + /** + * Add a new Bank Detail + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-add.html + * + * @param array{ + * ID?: int, + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * COUNTRY_ID?: int, + * DATE_CREATE?: string, + * DATE_MODIFY?: string, + * CREATED_BY_ID?: int, + * MODIFY_BY_ID?: int, + * NAME?: string, + * CODE?: string, + * XML_ID?: string, + * ACTIVE?: bool, + * SORT?: int, + * RQ_BANK_NAME?: string, + * RQ_BANK_ADDR?: string, + * RQ_BANK_CODE?: string, + * RQ_BANK_ROUTE_NUM?: string, + * RQ_BIK?: string, + * RQ_CODEB?: string, + * RQ_CODEG?: string, + * RQ_RIB?: string, + * RQ_MFO?: string, + * RQ_ACC_NAME?: string, + * RQ_ACC_TYPE?: string, + * RQ_AGENCY_NAME?: string, + * RQ_IIK?: string, + * RQ_ACC_CURRENCY?: string, + * RQ_COR_ACC_NUM?: string, + * RQ_IBAN?: string, + * RQ_SWIFT?: string, + * RQ_BIC?: string, + * COMMENTS?: string, + * ORIGINATOR_ID?: string, + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.add', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-add.html', + 'Add a new Bank Detail' + )] + public function add(array $fields): AddedItemResult + { + return new AddedItemResult( + $this->core->call( + 'crm.requisite.bankdetail.add', + [ + 'fields' => $fields + ] + ) + ); + } + + /** + * Deletes the specified quote and all the associated objects. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-delete.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.delete', + 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-delete.html', + 'Deletes the specified quote and all the associated objects.' + )] + public function delete(int $id): DeletedItemResult + { + return new DeletedItemResult( + $this->core->call( + 'crm.requisite.bankdetail.delete', + [ + 'id' => $id, + ] + ) + ); + } + + /** + * Returns the description of the quote fields, including user fields. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-fields.html + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.fields', + 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-fields.html', + 'Returns the description of the quote fields, including user fields.' + )] + public function fields(): FieldsResult + { + return new FieldsResult($this->core->call('crm.requisite.bankdetail.fields')); + } + + /** + * Returns a quote by the quote ID. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-get.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.get', + 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-get.html', + 'Returns a quote by the quote ID.' + )] + public function get(int $id): RequisiteResult + { + return new RequisiteResult($this->core->call('crm.requisite.bankdetail.get', ['id' => $id])); + } + + /** + * Get list of quote items. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-list.html + * + * @param array $order - order of quote items + * @param array $filter - filter array + * @param array $select = ['ID','ASSIGNED_BY_ID','BEGINDATA','CLIENT_ADDR','CLOSED','CLOSEDATA','COMMENTS','COMPANY_ID','CONTACT_ID','CONTACT_IDS','CONTENT','CREATED_BY_ID','CURRENCY_ID','DATE_CREATE','DATE_MODIFY','DEAL_ID','LEAD_ID','LOCATION_ID','MODIFY_BY_ID','MYCOMPANY_ID','OPENED','OPPORTUNITY','PERSON_TYPE_ID','QUOTE_NUMBER','STATUS_ID','TAX_VALUE','TERMS','TITLE','UTM_CAMPAIGN','UTM_CONTENT','UTM_MEDIUM','UTM_SOURCE','UTM_TERM'] + * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.bankdetail.list' API call) + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.list', + 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-list.html', + 'Get list of quote items.' + )] + public function list(array $order, array $filter, array $select, int $startItem = 0): RequisitesResult + { + return new RequisitesResult( + $this->core->call( + 'crm.requisite.bankdetail.list', + [ + 'order' => $order, + 'filter' => $filter, + 'select' => $select, + 'start' => $startItem, + ] + ) + ); + } + + /** + * Updates the specified (existing) requisite.bankdetail. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-update.html + * + * @param array{ + * ID?: int, + * ASSIGNED_BY_ID?: int, + * BEGINDATA?: string, + * CLIENT_ADDR?: string, + * CLOSED?: bool, + * CLOSEDATA?: string, + * COMMENTS?: string, + * COMPANY_ID?: int, + * CONTACT_ID?: int, + * CONTACT_IDS?: int[], + * CONTENT?: string, + * CREATED_BY_ID?: int, + * CURRENCY_ID?: string, + * DATE_CREATE?: string, + * DATE_MODIFY?: string, + * DEAL_ID?: int, + * LEAD_ID?: int, + * LOCATION_ID?: int, + * MODIFY_BY_ID?: int, + * MYCOMPANY_ID?: int, + * OPENED?: bool, + * OPPORTUNITY?: string, + * PERSON_TYPE_ID?: int, + * QUOTE_NUMBER?: string, + * STATUS_ID?: string, + * TAX_VALUE?: string, + * TERMS?: string, + * TITLE?: string, + * UTM_CAMPAIGN?: string, + * UTM_CONTENT?: string, + * UTM_MEDIUM?: string, + * UTM_SOURCE?: string, + * UTM_TERM?: string, + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.bankdetail.update', + 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-update.html', + 'Updates the specified (existing) requisite.bankdetail.' + )] + public function update(int $id, array $fields): UpdatedItemResult + { + return new UpdatedItemResult( + $this->core->call( + 'crm.requisite.bankdetail.update', + [ + 'id' => $id, + 'fields' => $fields + ] + ) + ); + } + + /** + * Count quotes by filter + * + * @param array{ + * ID?: int, + * ASSIGNED_BY_ID?: int, + * BEGINDATA?: string, + * CLIENT_ADDR?: string, + * CLOSED?: bool, + * CLOSEDATA?: string, + * COMMENTS?: string, + * COMPANY_ID?: int, + * CONTACT_ID?: int, + * CONTACT_IDS?: int[], + * CONTENT?: string, + * CREATED_BY_ID?: int, + * CURRENCY_ID?: string, + * DATE_CREATE?: string, + * DATE_MODIFY?: string, + * DEAL_ID?: int, + * LEAD_ID?: int, + * LOCATION_ID?: int, + * MODIFY_BY_ID?: int, + * MYCOMPANY_ID?: int, + * OPENED?: bool, + * OPPORTUNITY?: string, + * PERSON_TYPE_ID?: int, + * QUOTE_NUMBER?: string, + * STATUS_ID?: string, + * TAX_VALUE?: string, + * TERMS?: string, + * TITLE?: string, + * UTM_CAMPAIGN?: string, + * UTM_CONTENT?: string, + * UTM_MEDIUM?: string, + * UTM_SOURCE?: string, + * UTM_TERM?: string, + * } $filter + * + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + */ + public function countByFilter(array $filter = []): int + { + return $this->list([], $filter, ['ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + } +} From b92700dba64ec54ecf612b47fa79367cba4cfa53 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 23 Jun 2025 15:35:10 +0400 Subject: [PATCH 02/17] add bank detail test --- src/Services/CRM/CRMServiceBuilder.php | 12 + .../Result/RequisiteBankdetailItemResult.php | 78 +++--- .../Result/RequisiteBankdetailResult.php | 12 +- .../Result/RequisiteBankdetailsResult.php | 12 +- .../Service/RequisiteBankdetail.php | 176 +++++++------ .../Service/RequisiteBankdetailTest.php | 235 ++++++++++++++++++ 6 files changed, 374 insertions(+), 151 deletions(-) create mode 100644 tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index e70e39b9..3fbf10bf 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -47,6 +47,18 @@ public function requisitePreset(): Requisites\Service\RequisitePreset return $this->serviceCache[__METHOD__]; } + + public function requisiteBankdetail(): Requisites\Service\RequisiteBankdetail + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Requisites\Service\RequisiteBankdetail( + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } public function contactCompany(): Contact\Service\ContactCompany { diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php index 9475b36f..4f1e25a3 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php @@ -11,65 +11,49 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Quote\Result; +namespace Bitrix24\SDK\Services\CRM\Requisite\Result; use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; -use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Email; -use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\InstantMessenger; -use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Phone; -use Bitrix24\SDK\Services\CRM\Common\Result\SystemFields\Types\Website; use Carbon\CarbonImmutable; -use Money\Currency; -use Money\Money; /** * Class QuoteItemResult * * @property-read int $ID - * @property-read string $TITLE - * @property-read int|null $ASSIGNED_BY_ID - * @property-read int|null $LAST_ACTIVITY_BY - * @property-read CarbonImmutable|null $LAST_ACTIVITY_TIME - * @property-read string|null $LAST_COMMUNICATION_TIME - * @property-read CarbonImmutable|null $BEGINDATE - * @property-read CarbonImmutable|null $CLOSEDATE - * @property-read CarbonImmutable|null $ACTUAL_DATE - * @property-read string|null $CLIENT_ADDR - * @property-read string|null $CLIENT_CONTACT - * @property-read string|null $CLIENT_EMAIL - * @property-read string|null $CLIENT_PHONE - * @property-read string|null $CLIENT_TITLE - * @property-read string|null $CLIENT_TPA_ID - * @property-read string|null $CLIENT_TP_ID - * @property-read bool|null $CLOSED - * @property-read string|null $COMMENTS - * @property-read int|null $COMPANY_ID - * @property-read int|null $CONTACT_ID - * @property-read array|null $CONTACT_IDS - * @property-read string|null $CONTENT - * @property-read int|null $CREATED_BY_ID - * @property-read Currency|null $CURRENCY_ID + * @property-read int $ENTITY_TYPE_ID + * @property-read int $ENTITY_ID + * @property-read int $COUNTRY_ID * @property-read CarbonImmutable|null $DATE_CREATE * @property-read CarbonImmutable|null $DATE_MODIFY - * @property-read int|null $DEAL_ID - * @property-read int|null $LEAD_ID - * @property-read int|null $LOCATION_ID + * @property-read int|null $CREATED_BY_ID * @property-read int|null $MODIFY_BY_ID - * @property-read int|null $MYCOMPANY_ID - * @property-read bool|null $OPENED - * @property-read Money|null $OPPORTUNITY - * @property-read int|null $PERSON_TYPE_ID - * @property-read string|null $QUOTE_NUMBER - * @property-read string|null $STATUS_ID - * @property-read Money|null $TAX_VALUE - * @property-read string|null $TERMS - * @property-read string|null $UTM_SOURCE - * @property-read string|null $UTM_MEDIUM - * @property-read string|null $UTM_CAMPAIGN - * @property-read string|null $UTM_CONTENT - * @property-read string|null $UTM_TERM + * @property-read string $NAME + * @property-read string $CODE + * @property-read string $XML_ID + * @property-read bool|null $ACTIVE + * @property-read int|null $SORT + * @property-read string|null $RQ_BANK_NAME + * @property-read string|null $RQ_BANK_ADDR + * @property-read string|null $RQ_BANK_CODE + * @property-read string|null $RQ_BANK_ROUTE_NUM + * @property-read string|null $RQ_BIK + * @property-read string|null $RQ_CODEB + * @property-read string|null $RQ_CODEG + * @property-read string|null $RQ_RIB + * @property-read string|null $RQ_MFO + * @property-read string|null $RQ_ACC_NAME + * @property-read string|null $RQ_ACC_TYPE + * @property-read string|null $RQ_AGENCY_NAME + * @property-read string|null $RQ_IIK + * @property-read string|null $RQ_ACC_CURRENCY + * @property-read string|null $RQ_COR_ACC_NUM + * @property-read string|null $RQ_IBAN + * @property-read string|null $RQ_SWIFT + * @property-read string|null $RQ_BIC + * @property-read string|null $COMMENTS + * @property-read string|null $ORIGINATOR_ID */ -class QuoteItemResult extends AbstractCrmItem +class RequisiteBankdetailItemResult extends AbstractCrmItem { /** * diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php index 1cf4b9af..e2f80ffa 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php @@ -12,22 +12,22 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Quote\Result; +namespace Bitrix24\SDK\Services\CRM\Requisite\Result; use Bitrix24\SDK\Core\Result\AbstractResult; /** - * Class QuoteResult + * Class RequisiteBankdetailResult * - * @package Bitrix24\SDK\Services\CRM\Quote\Result + * @package Bitrix24\SDK\Services\CRM\Requisite\Result */ -class QuoteResult extends AbstractResult +class RequisiteBankdetailResult extends AbstractResult { /** * @throws \Bitrix24\SDK\Core\Exceptions\BaseException */ - public function quote(): QuoteItemResult + public function bankdetail(): RequisiteBankdetailItemResult { - return new QuoteItemResult($this->getCoreResponse()->getResponseData()->getResult()); + return new RequisiteBankdetailItemResult($this->getCoreResponse()->getResponseData()->getResult()); } } diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php index f676dade..4137ef9b 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php @@ -12,7 +12,7 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Quote\Result; +namespace Bitrix24\SDK\Services\CRM\Requisite\Result; use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Result\AbstractResult; @@ -20,19 +20,19 @@ /** * Class QuotesResult * - * @package Bitrix24\SDK\Services\CRM\Quote\Result + * @package Bitrix24\SDK\Services\CRM\Requisite\Result */ -class QuotesResult extends AbstractResult +class RequisiteBankdetailsResult extends AbstractResult { /** - * @return QuoteItemResult[] + * @return RequisiteBankdetailItemResult[] * @throws BaseException */ - public function getQuotes(): array + public function getBankdetails(): array { $items = []; foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { - $items[] = new QuoteItemResult($item); + $items[] = new RequisiteBankdetailItemResult($item); } return $items; diff --git a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php index 1c591c40..786de0e5 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php +++ b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php @@ -31,14 +31,6 @@ #[ApiServiceMetadata(new Scope(['crm']))] class RequisiteBankdetail extends AbstractService { - /** - * RequisiteBankdetail constructor. - */ - public function __construct(public Batch $batch, CoreInterface $core, LoggerInterface $logger) - { - parent::__construct($core, $logger); - } - /** * Add a new Bank Detail * @@ -101,9 +93,9 @@ public function add(array $fields): AddedItemResult } /** - * Deletes the specified quote and all the associated objects. + * Deletes the specified bank detail. * - * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-delete.html + * @link hhttps://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-delete.html * * * @throws BaseException @@ -111,8 +103,8 @@ public function add(array $fields): AddedItemResult */ #[ApiEndpointMetadata( 'crm.requisite.bankdetail.delete', - 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-delete.html', - 'Deletes the specified quote and all the associated objects.' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-delete.html', + 'Deletes the specified bank detail' )] public function delete(int $id): DeletedItemResult { @@ -127,17 +119,17 @@ public function delete(int $id): DeletedItemResult } /** - * Returns the description of the quote fields, including user fields. + * Returns the description of the bank detail fields, including user fields. * - * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-fields.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-fields.html * * @throws BaseException * @throws TransportException */ #[ApiEndpointMetadata( 'crm.requisite.bankdetail.fields', - 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-fields.html', - 'Returns the description of the quote fields, including user fields.' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-fields.html', + 'Returns the description of the bank detail fields, including user fields.' )] public function fields(): FieldsResult { @@ -145,9 +137,9 @@ public function fields(): FieldsResult } /** - * Returns a quote by the quote ID. + * Returns a bank detail by identifier. * - * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-get.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-get.html * * * @throws BaseException @@ -155,22 +147,22 @@ public function fields(): FieldsResult */ #[ApiEndpointMetadata( 'crm.requisite.bankdetail.get', - 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-get.html', - 'Returns a quote by the quote ID.' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-get.html', + 'Returns a bank detail by identifier.' )] - public function get(int $id): RequisiteResult + public function get(int $id): RequisiteBankdetailResult { - return new RequisiteResult($this->core->call('crm.requisite.bankdetail.get', ['id' => $id])); + return new RequisiteBankdetailResult($this->core->call('crm.requisite.bankdetail.get', ['id' => $id])); } /** - * Get list of quote items. + * Get list of bank detail items. * - * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-list.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-list.html * - * @param array $order - order of quote items + * @param array $order - order of bank detail items * @param array $filter - filter array - * @param array $select = ['ID','ASSIGNED_BY_ID','BEGINDATA','CLIENT_ADDR','CLOSED','CLOSEDATA','COMMENTS','COMPANY_ID','CONTACT_ID','CONTACT_IDS','CONTENT','CREATED_BY_ID','CURRENCY_ID','DATE_CREATE','DATE_MODIFY','DEAL_ID','LEAD_ID','LOCATION_ID','MODIFY_BY_ID','MYCOMPANY_ID','OPENED','OPPORTUNITY','PERSON_TYPE_ID','QUOTE_NUMBER','STATUS_ID','TAX_VALUE','TERMS','TITLE','UTM_CAMPAIGN','UTM_CONTENT','UTM_MEDIUM','UTM_SOURCE','UTM_TERM'] + * @param array $select = ['ID','ENTITY_TYPE_ID','ENTITY_ID','COUNTRY_ID','DATE_CREATE','DATE_MODIFY','CREATED_BY_ID','MODIFY_BY_ID','NAME','CODE','XML_ID','ACTIVE','SORT','RQ_BANK_NAME','RQ_BANK_ADDR','RQ_BANK_CODE','RQ_BANK_ROUTE_NUM','RQ_BIK','RQ_CODEB','RQ_CODEG','RQ_RIB','RQ_MFO','RQ_ACC_NAME','RQ_ACC_TYPE','RQ_AGENCY_NAME','RQ_IIK','RQ_ACC_CURRENCY','RQ_COR_ACC_NUM','RQ_IBAN','RQ_SWIFT','RQ_BIC','COMMENTS','ORIGINATOR_ID'] * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.bankdetail.list' API call) * * @throws BaseException @@ -178,12 +170,12 @@ public function get(int $id): RequisiteResult */ #[ApiEndpointMetadata( 'crm.requisite.bankdetail.list', - 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-list.html', - 'Get list of quote items.' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-list.html', + 'Get list of bank detail items.' )] - public function list(array $order, array $filter, array $select, int $startItem = 0): RequisitesResult + public function list(array $order, array $filter, array $select, int $startItem = 0): RequisiteBankdetailsResult { - return new RequisitesResult( + return new RequisiteBankdetailsResult( $this->core->call( 'crm.requisite.bankdetail.list', [ @@ -199,42 +191,42 @@ public function list(array $order, array $filter, array $select, int $startItem /** * Updates the specified (existing) requisite.bankdetail. * - * @link https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-update.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-update.html * * @param array{ * ID?: int, - * ASSIGNED_BY_ID?: int, - * BEGINDATA?: string, - * CLIENT_ADDR?: string, - * CLOSED?: bool, - * CLOSEDATA?: string, - * COMMENTS?: string, - * COMPANY_ID?: int, - * CONTACT_ID?: int, - * CONTACT_IDS?: int[], - * CONTENT?: string, - * CREATED_BY_ID?: int, - * CURRENCY_ID?: string, + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * COUNTRY_ID?: int, * DATE_CREATE?: string, * DATE_MODIFY?: string, - * DEAL_ID?: int, - * LEAD_ID?: int, - * LOCATION_ID?: int, - * MODIFY_BY_ID?: int, - * MYCOMPANY_ID?: int, - * OPENED?: bool, - * OPPORTUNITY?: string, - * PERSON_TYPE_ID?: int, - * QUOTE_NUMBER?: string, - * STATUS_ID?: string, - * TAX_VALUE?: string, - * TERMS?: string, - * TITLE?: string, - * UTM_CAMPAIGN?: string, - * UTM_CONTENT?: string, - * UTM_MEDIUM?: string, - * UTM_SOURCE?: string, - * UTM_TERM?: string, + * CREATED_BY_ID?: int, + * MODIFY_BY_ID?: int, + * NAME?: string, + * CODE?: string, + * XML_ID?: string, + * ACTIVE?: bool, + * SORT?: int, + * RQ_BANK_NAME?: string, + * RQ_BANK_ADDR?: string, + * RQ_BANK_CODE?: string, + * RQ_BANK_ROUTE_NUM?: string, + * RQ_BIK?: string, + * RQ_CODEB?: string, + * RQ_CODEG?: string, + * RQ_RIB?: string, + * RQ_MFO?: string, + * RQ_ACC_NAME?: string, + * RQ_ACC_TYPE?: string, + * RQ_AGENCY_NAME?: string, + * RQ_IIK?: string, + * RQ_ACC_CURRENCY?: string, + * RQ_COR_ACC_NUM?: string, + * RQ_IBAN?: string, + * RQ_SWIFT?: string, + * RQ_BIC?: string, + * COMMENTS?: string, + * ORIGINATOR_ID?: string, * } $fields * * @throws BaseException @@ -242,7 +234,7 @@ public function list(array $order, array $filter, array $select, int $startItem */ #[ApiEndpointMetadata( 'crm.requisite.bankdetail.update', - 'https://apidocs.bitrix24.com/api-reference/crm/quote/crm-quote-update.html', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/bank-detail/crm-requisite-bank-detail-update.html', 'Updates the specified (existing) requisite.bankdetail.' )] public function update(int $id, array $fields): UpdatedItemResult @@ -263,38 +255,38 @@ public function update(int $id, array $fields): UpdatedItemResult * * @param array{ * ID?: int, - * ASSIGNED_BY_ID?: int, - * BEGINDATA?: string, - * CLIENT_ADDR?: string, - * CLOSED?: bool, - * CLOSEDATA?: string, - * COMMENTS?: string, - * COMPANY_ID?: int, - * CONTACT_ID?: int, - * CONTACT_IDS?: int[], - * CONTENT?: string, - * CREATED_BY_ID?: int, - * CURRENCY_ID?: string, + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * COUNTRY_ID?: int, * DATE_CREATE?: string, * DATE_MODIFY?: string, - * DEAL_ID?: int, - * LEAD_ID?: int, - * LOCATION_ID?: int, - * MODIFY_BY_ID?: int, - * MYCOMPANY_ID?: int, - * OPENED?: bool, - * OPPORTUNITY?: string, - * PERSON_TYPE_ID?: int, - * QUOTE_NUMBER?: string, - * STATUS_ID?: string, - * TAX_VALUE?: string, - * TERMS?: string, - * TITLE?: string, - * UTM_CAMPAIGN?: string, - * UTM_CONTENT?: string, - * UTM_MEDIUM?: string, - * UTM_SOURCE?: string, - * UTM_TERM?: string, + * CREATED_BY_ID?: int, + * MODIFY_BY_ID?: int, + * NAME?: string, + * CODE?: string, + * XML_ID?: string, + * ACTIVE?: bool, + * SORT?: int, + * RQ_BANK_NAME?: string, + * RQ_BANK_ADDR?: string, + * RQ_BANK_CODE?: string, + * RQ_BANK_ROUTE_NUM?: string, + * RQ_BIK?: string, + * RQ_CODEB?: string, + * RQ_CODEG?: string, + * RQ_RIB?: string, + * RQ_MFO?: string, + * RQ_ACC_NAME?: string, + * RQ_ACC_TYPE?: string, + * RQ_AGENCY_NAME?: string, + * RQ_IIK?: string, + * RQ_ACC_CURRENCY?: string, + * RQ_COR_ACC_NUM?: string, + * RQ_IBAN?: string, + * RQ_SWIFT?: string, + * RQ_BIC?: string, + * COMMENTS?: string, + * ORIGINATOR_ID?: string, * } $filter * * @throws \Bitrix24\SDK\Core\Exceptions\BaseException diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php new file mode 100644 index 00000000..1ef785e5 --- /dev/null +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php @@ -0,0 +1,235 @@ + + * + * 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\Requisite\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Core; +use Bitrix24\SDK\Services\CRM\Requisite\Result\RequisiteBankdetailItemResult; +use Bitrix24\SDK\Services\CRM\Requisite\Service\RequisiteBankdetail; +use Bitrix24\SDK\Services\CRM\Company\Service\Company; +use Bitrix24\SDK\Services\CRM\Requisites\Service\Requisite; +use Bitrix24\SDK\Services\CRM\Enum\OwnerType; +use Bitrix24\SDK\Tests\Builders\Services\CRM\CompanyBuilder; +use Bitrix24\SDK\Tests\Builders\Services\CRM\RequisiteBuilder; + +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 RequisiteBankdetailTest + * + * @package Bitrix24\SDK\Tests\Integration\Services\CRM\Requisite\Service + */ +#[CoversMethod(RequisiteBankdetail::class,'add')] +#[CoversMethod(RequisiteBankdetail::class,'delete')] +#[CoversMethod(RequisiteBankdetail::class,'get')] +#[CoversMethod(RequisiteBankdetail::class,'list')] +#[CoversMethod(RequisiteBankdetail::class,'fields')] +#[CoversMethod(RequisiteBankdetail::class,'update')] +#[CoversMethod(RequisiteBankdetail::class,'countByFilter')] +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisite\Service\RequisiteBankdetail::class)] +class RequisiteBankdetailTest extends TestCase +{ + use CustomBitrix24Assertions; + + protected ServiceBuilder $sb; + protected RequisiteBankdetail $bankService; + protected Company $companyService; + protected Requisite $requisiteService; + protected array $presets = []; + private int $countryId; + private array $createdCompanies = []; + + protected function setUp(): void + { + $this->sb = Fabric::getServiceBuilder(); + $this->companyService = $this->sb->getCRMScope()->company(); + $this->requisiteService = $this->sb->getCRMScope()->requisite(); + $this->bankService = $this->sb->getCRMScope()->requisiteBankdetail(); + $requisitePreset = $this->sb->getCRMScope()->requisitePreset(); + foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { + $this->presets[] = $presetItemResult->ID; + } + // probably not needed + $this->countryId = current( + array_column( + array_filter( + $this->sb->getCRMScope()->requisitePreset()->countries()->getCountries(), + function ($item) { + return $item->CODE === 'US'; + } + ), + 'ID' + ) + ); + } + + protected function tearDown(): void + { + foreach ($this->companyService->batch->delete($this->createdCompanies) as $result) { + // ### + } + } + + public function testAllSystemFieldsAnnotated(): void + { + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($this->bankService->fields()->getFieldsDescription())); + $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteBankdetailItemResult::class); + } + + public function testAllSystemFieldsHasValidTypeAnnotation():void + { + $allFields = $this->bankService->fields()->getFieldsDescription(); + $systemFieldsCodes = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($allFields)); + $systemFields = array_filter($allFields, static fn($code): bool => in_array($code, $systemFieldsCodes, true), ARRAY_FILTER_USE_KEY); + + $this->assertBitrix24AllResultItemFieldsHasValidTypeAnnotation( + $systemFields, + RequisiteBankdetailItemResult::class); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testAdd(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThan(1, $bankRequisite->getId()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testDelete(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertTrue($this->bankService->delete($bankRequisite->getId())->isSuccess()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testFields(): void + { + self::assertIsArray($this->bankService->fields()->getFieldsDescription()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testGet(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThan( + 1, + $this->bankService->get($bankRequisite->getId())->bankdetail()->ID + ); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testList(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThanOrEqual(1, $this->bankService->list([], [], ['ID', 'NAME'])->getBankdetails()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testUpdate(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + $newName = 'Test2 bank requisite'; + + self::assertTrue($this->bankService->update($bankRequisite->getId(), ['NAME' => $newName])->isSuccess()); + self::assertEquals($newName, $this->bankService->get($bankRequisite->getId())->getBankdetails()->NAME); + } + + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + */ + public function testCountByFilter(): void + { + $before = $this->bankService->countByFilter(); + + foreach ($this->presets as $presetId) { + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->bankService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite '.$presetId + ]); + } + + $after = $this->bankService->countByFilter(); + + $this->assertEquals($before + count($this->presets), $after); + } + + protected function addCompanyAndRequisite(int $presetId = 0): array { + $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); + $requisiteId = $this->requisiteService->add( + $companyId, + 4, + $presetId, + 'Test requisite '.$presetId, + (new RequisiteBuilder(OwnerType::company->value, $companyId, $presetId))->build() + )->getId(); + + return [$companyId, $requisiteId]; + } +} From a47e6af0134c09ccda392b972b1128666e640f60 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 23 Jun 2025 15:44:05 +0400 Subject: [PATCH 03/17] change reuisite namespace --- src/Services/CRM/Requisites/Service/RequisiteBankdetail.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php index 786de0e5..d97a3751 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php +++ b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Requisite\Service; +namespace Bitrix24\SDK\Services\CRM\Requisites\Service; use Bitrix24\SDK\Attributes\ApiEndpointMetadata; use Bitrix24\SDK\Attributes\ApiServiceMetadata; @@ -24,8 +24,8 @@ use Bitrix24\SDK\Core\Result\FieldsResult; use Bitrix24\SDK\Core\Result\UpdatedItemResult; use Bitrix24\SDK\Services\AbstractService; -use Bitrix24\SDK\Services\CRM\Requisite\Result\RequisiteBankdetailResult; -use Bitrix24\SDK\Services\CRM\Requisite\Result\RequisiteBankdetailsResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteBankdetailResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteBankdetailsResult; use Psr\Log\LoggerInterface; #[ApiServiceMetadata(new Scope(['crm']))] From 46dcfd4707d0f306da18360f16c5124fd31aac51 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 23 Jun 2025 16:42:14 +0400 Subject: [PATCH 04/17] run RequisiteBankdetailTest --- .php-cs-fixer.php | 1 + Makefile | 4 ++++ phpstan.neon.dist | 1 + phpunit.xml.dist | 3 +++ .../Result/RequisiteBankdetailItemResult.php | 4 ++-- .../Result/RequisiteBankdetailResult.php | 4 ++-- .../Result/RequisiteBankdetailsResult.php | 4 ++-- .../Service/RequisiteBankdetail.php | 4 +--- .../Service/RequisiteBankdetailTest.php | 22 ++++++++++++------- 9 files changed, 30 insertions(+), 17 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index fcb7e644..af7c2fa4 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -11,6 +11,7 @@ ->in(__DIR__ . '/src/Services/CRM/Quote/') ->in(__DIR__ . '/src/Services/CRM/Lead/') ->in(__DIR__ . '/src/Services/CRM/Currency/') + ->in(__DIR__ . '/src/Services/CRM/Requisites/') ->name('*.php') ->exclude(['vendor', 'storage', 'docker', 'docs']) // Exclude directories ->ignoreDotFiles(true) diff --git a/Makefile b/Makefile index 4c03d6bd..b30bd923 100644 --- a/Makefile +++ b/Makefile @@ -218,6 +218,10 @@ integration_tests_lead_productrows: .PHONY: integration_tests_crm_quote integration_tests_crm_quote: docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_quote + +.PHONY: integration_tests_crm_requisite +integration_tests_crm_requisite: + docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_requisite # work dev environment .PHONY: php-dev-server-up diff --git a/phpstan.neon.dist b/phpstan.neon.dist index e92ac81a..096998d4 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -21,6 +21,7 @@ parameters: - tests/Integration/Services/CRM/Quote/Service/QuoteProductRowsTest.php - tests/Integration/Services/CRM/Lead/Service/LeadUserfieldTest.php - tests/Integration/Services/CRM/Currency + - tests/Integration/Services/CRM/Requisites bootstrapFiles: - tests/bootstrap.php parallel: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 97888bec..0a690ba1 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -67,6 +67,9 @@ ./tests/Integration/Services/CRM/Quote/ + + ./tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php + diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php index 4f1e25a3..036a95d8 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Requisite\Result; +namespace Bitrix24\SDK\Services\CRM\Requisites\Result; use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; use Carbon\CarbonImmutable; @@ -20,7 +20,6 @@ * Class QuoteItemResult * * @property-read int $ID - * @property-read int $ENTITY_TYPE_ID * @property-read int $ENTITY_ID * @property-read int $COUNTRY_ID * @property-read CarbonImmutable|null $DATE_CREATE @@ -46,6 +45,7 @@ * @property-read string|null $RQ_AGENCY_NAME * @property-read string|null $RQ_IIK * @property-read string|null $RQ_ACC_CURRENCY + * @property-read string|null $RQ_ACC_NUM * @property-read string|null $RQ_COR_ACC_NUM * @property-read string|null $RQ_IBAN * @property-read string|null $RQ_SWIFT diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php index e2f80ffa..186b8ab0 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailResult.php @@ -12,14 +12,14 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Requisite\Result; +namespace Bitrix24\SDK\Services\CRM\Requisites\Result; use Bitrix24\SDK\Core\Result\AbstractResult; /** * Class RequisiteBankdetailResult * - * @package Bitrix24\SDK\Services\CRM\Requisite\Result + * @package Bitrix24\SDK\Services\CRM\Requisites\Result */ class RequisiteBankdetailResult extends AbstractResult { diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php index 4137ef9b..5c21a2e9 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php @@ -12,7 +12,7 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Services\CRM\Requisite\Result; +namespace Bitrix24\SDK\Services\CRM\Requisites\Result; use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Result\AbstractResult; @@ -20,7 +20,7 @@ /** * Class QuotesResult * - * @package Bitrix24\SDK\Services\CRM\Requisite\Result + * @package Bitrix24\SDK\Services\CRM\Requisites\Result */ class RequisiteBankdetailsResult extends AbstractResult { diff --git a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php index d97a3751..7563f506 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php +++ b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php @@ -38,7 +38,6 @@ class RequisiteBankdetail extends AbstractService * * @param array{ * ID?: int, - * ENTITY_TYPE_ID?: int, * ENTITY_ID?: int, * COUNTRY_ID?: int, * DATE_CREATE?: string, @@ -162,7 +161,7 @@ public function get(int $id): RequisiteBankdetailResult * * @param array $order - order of bank detail items * @param array $filter - filter array - * @param array $select = ['ID','ENTITY_TYPE_ID','ENTITY_ID','COUNTRY_ID','DATE_CREATE','DATE_MODIFY','CREATED_BY_ID','MODIFY_BY_ID','NAME','CODE','XML_ID','ACTIVE','SORT','RQ_BANK_NAME','RQ_BANK_ADDR','RQ_BANK_CODE','RQ_BANK_ROUTE_NUM','RQ_BIK','RQ_CODEB','RQ_CODEG','RQ_RIB','RQ_MFO','RQ_ACC_NAME','RQ_ACC_TYPE','RQ_AGENCY_NAME','RQ_IIK','RQ_ACC_CURRENCY','RQ_COR_ACC_NUM','RQ_IBAN','RQ_SWIFT','RQ_BIC','COMMENTS','ORIGINATOR_ID'] + * @param array $select = ['ID','ENTITY_ID','COUNTRY_ID','DATE_CREATE','DATE_MODIFY','CREATED_BY_ID','MODIFY_BY_ID','NAME','CODE','XML_ID','ACTIVE','SORT','RQ_BANK_NAME','RQ_BANK_ADDR','RQ_BANK_CODE','RQ_BANK_ROUTE_NUM','RQ_BIK','RQ_CODEB','RQ_CODEG','RQ_RIB','RQ_MFO','RQ_ACC_NAME','RQ_ACC_TYPE','RQ_AGENCY_NAME','RQ_IIK','RQ_ACC_CURRENCY','RQ_COR_ACC_NUM','RQ_IBAN','RQ_SWIFT','RQ_BIC','COMMENTS','ORIGINATOR_ID'] * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.bankdetail.list' API call) * * @throws BaseException @@ -195,7 +194,6 @@ public function list(array $order, array $filter, array $select, int $startItem * * @param array{ * ID?: int, - * ENTITY_TYPE_ID?: int, * ENTITY_ID?: int, * COUNTRY_ID?: int, * DATE_CREATE?: string, diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php index 1ef785e5..71120182 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php @@ -11,16 +11,16 @@ declare(strict_types=1); -namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Requisite\Service; +namespace Bitrix24\SDK\Tests\Integration\Services\CRM\Requisites\Service; use Bitrix24\SDK\Core\Exceptions\BaseException; use Bitrix24\SDK\Core\Exceptions\TransportException; use Bitrix24\SDK\Core; -use Bitrix24\SDK\Services\CRM\Requisite\Result\RequisiteBankdetailItemResult; -use Bitrix24\SDK\Services\CRM\Requisite\Service\RequisiteBankdetail; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteBankdetailItemResult; +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteBankdetail; use Bitrix24\SDK\Services\CRM\Company\Service\Company; use Bitrix24\SDK\Services\CRM\Requisites\Service\Requisite; -use Bitrix24\SDK\Services\CRM\Enum\OwnerType; +use Bitrix24\SDK\Services\ServiceBuilder; use Bitrix24\SDK\Tests\Builders\Services\CRM\CompanyBuilder; use Bitrix24\SDK\Tests\Builders\Services\CRM\RequisiteBuilder; @@ -47,6 +47,8 @@ class RequisiteBankdetailTest extends TestCase { use CustomBitrix24Assertions; + const COMPANY_OWNER_TYPE_ID = 4; + protected ServiceBuilder $sb; protected RequisiteBankdetail $bankService; protected Company $companyService; @@ -88,7 +90,11 @@ protected function tearDown(): void public function testAllSystemFieldsAnnotated(): void { - $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($this->bankService->fields()->getFieldsDescription())); + $fieldDescriptions = $this->bankService->fields()->getFieldsDescription(); + echo "Fields \n"; + print_r($fieldDescriptions); + + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteBankdetailItemResult::class); } @@ -195,7 +201,7 @@ public function testUpdate(): void $newName = 'Test2 bank requisite'; self::assertTrue($this->bankService->update($bankRequisite->getId(), ['NAME' => $newName])->isSuccess()); - self::assertEquals($newName, $this->bankService->get($bankRequisite->getId())->getBankdetails()->NAME); + self::assertEquals($newName, $this->bankService->get($bankRequisite->getId())->bankdetail()->NAME); } /** @@ -224,10 +230,10 @@ protected function addCompanyAndRequisite(int $presetId = 0): array { $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); $requisiteId = $this->requisiteService->add( $companyId, - 4, + self::COMPANY_OWNER_TYPE_ID, $presetId, 'Test requisite '.$presetId, - (new RequisiteBuilder(OwnerType::company->value, $companyId, $presetId))->build() + (new RequisiteBuilder(self::COMPANY_OWNER_TYPE_ID, $companyId, $presetId))->build() )->getId(); return [$companyId, $requisiteId]; From 87a7e6d51cd9c207049c6ee978fa9699720021d9 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 23 Jun 2025 16:48:29 +0400 Subject: [PATCH 05/17] run linters --- .../Requisites/Service/RequisiteBankdetail.php | 6 +++--- .../Service/RequisiteBankdetailTest.php | 15 +-------------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php index 7563f506..6f482c72 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php +++ b/src/Services/CRM/Requisites/Service/RequisiteBankdetail.php @@ -43,7 +43,7 @@ class RequisiteBankdetail extends AbstractService * DATE_CREATE?: string, * DATE_MODIFY?: string, * CREATED_BY_ID?: int, - * MODIFY_BY_ID?: int, + * MODIFY_BY_ID?: int, * NAME?: string, * CODE?: string, * XML_ID?: string, @@ -199,7 +199,7 @@ public function list(array $order, array $filter, array $select, int $startItem * DATE_CREATE?: string, * DATE_MODIFY?: string, * CREATED_BY_ID?: int, - * MODIFY_BY_ID?: int, + * MODIFY_BY_ID?: int, * NAME?: string, * CODE?: string, * XML_ID?: string, @@ -259,7 +259,7 @@ public function update(int $id, array $fields): UpdatedItemResult * DATE_CREATE?: string, * DATE_MODIFY?: string, * CREATED_BY_ID?: int, - * MODIFY_BY_ID?: int, + * MODIFY_BY_ID?: int, * NAME?: string, * CODE?: string, * XML_ID?: string, diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php index 71120182..7d2dd279 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php @@ -42,7 +42,7 @@ #[CoversMethod(RequisiteBankdetail::class,'fields')] #[CoversMethod(RequisiteBankdetail::class,'update')] #[CoversMethod(RequisiteBankdetail::class,'countByFilter')] -#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisite\Service\RequisiteBankdetail::class)] +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteBankdetail::class)] class RequisiteBankdetailTest extends TestCase { use CustomBitrix24Assertions; @@ -54,7 +54,6 @@ class RequisiteBankdetailTest extends TestCase protected Company $companyService; protected Requisite $requisiteService; protected array $presets = []; - private int $countryId; private array $createdCompanies = []; protected function setUp(): void @@ -67,18 +66,6 @@ protected function setUp(): void foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { $this->presets[] = $presetItemResult->ID; } - // probably not needed - $this->countryId = current( - array_column( - array_filter( - $this->sb->getCRMScope()->requisitePreset()->countries()->getCountries(), - function ($item) { - return $item->CODE === 'US'; - } - ), - 'ID' - ) - ); } protected function tearDown(): void From 6d7b68394a72519b626505d43fb3c078fd35d433 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Tue, 24 Jun 2025 13:24:05 +0400 Subject: [PATCH 06/17] add requisite link class --- .../Result/RequisiteBankdetailItemResult.php | 2 +- .../Result/RequisiteBankdetailsResult.php | 2 +- .../Result/RequisiteLinkItemResult.php | 30 +++ .../Requisites/Result/RequisiteLinkResult.php | 33 +++ .../Result/RequisiteLinksResult.php | 40 +++ .../CRM/Requisites/Service/RequisiteLink.php | 192 +++++++++++++++ .../Service/.RequisiteLinkTest.php.kate-swp | Bin 0 -> 123 bytes .../Requisites/Service/RequisiteLinkTest.php | 228 ++++++++++++++++++ 8 files changed, 525 insertions(+), 2 deletions(-) create mode 100644 src/Services/CRM/Requisites/Result/RequisiteLinkItemResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteLinkResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteLinksResult.php create mode 100644 src/Services/CRM/Requisites/Service/RequisiteLink.php create mode 100644 tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp create mode 100644 tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php index 036a95d8..2fc75b4d 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailItemResult.php @@ -17,7 +17,7 @@ use Carbon\CarbonImmutable; /** - * Class QuoteItemResult + * Class RequisiteBankdetailItemResult * * @property-read int $ID * @property-read int $ENTITY_ID diff --git a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php index 5c21a2e9..2448d9a4 100644 --- a/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php +++ b/src/Services/CRM/Requisites/Result/RequisiteBankdetailsResult.php @@ -18,7 +18,7 @@ use Bitrix24\SDK\Core\Result\AbstractResult; /** - * Class QuotesResult + * Class RequisiteBankdetailsResult * * @package Bitrix24\SDK\Services\CRM\Requisites\Result */ diff --git a/src/Services/CRM/Requisites/Result/RequisiteLinkItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteLinkItemResult.php new file mode 100644 index 00000000..6992223c --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteLinkItemResult.php @@ -0,0 +1,30 @@ + + * + * 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\Requisites\Result; + +use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; + +/** + * Class RequisiteLinkItemResult + * + * @property-read int $ENTITY_TYPE_ID + * @property-read int $ENTITY_ID + * @property-read int $REQUISITE_ID + * @property-read int $BANK_DETAIL_ID + * @property-read int $MC_REQUISITE_ID + * @property-read int $MC_BANK_DETAIL_ID + */ +class RequisiteLinkItemResult extends AbstractCrmItem +{ +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteLinkResult.php b/src/Services/CRM/Requisites/Result/RequisiteLinkResult.php new file mode 100644 index 00000000..7c40b90d --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteLinkResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class RequisiteLinkResult + * + * @package Bitrix24\SDK\Services\CRM\Requisites\Result + */ +class RequisiteLinkResult extends AbstractResult +{ + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + public function link(): RequisiteLinkItemResult + { + return new RequisiteLinkItemResult($this->getCoreResponse()->getResponseData()->getResult()); + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteLinksResult.php b/src/Services/CRM/Requisites/Result/RequisiteLinksResult.php new file mode 100644 index 00000000..f0377fe8 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteLinksResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class RequisiteLinksResult + * + * @package Bitrix24\SDK\Services\CRM\Requisites\Result + */ +class RequisiteLinksResult extends AbstractResult +{ + /** + * @return RequisiteLinkItemResult[] + * @throws BaseException + */ + public function getLinks(): array + { + $items = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $items[] = new RequisiteLinkItemResult($item); + } + + return $items; + } +} diff --git a/src/Services/CRM/Requisites/Service/RequisiteLink.php b/src/Services/CRM/Requisites/Service/RequisiteLink.php new file mode 100644 index 00000000..7f01a49c --- /dev/null +++ b/src/Services/CRM/Requisites/Service/RequisiteLink.php @@ -0,0 +1,192 @@ + + * + * 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\Requisites\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\Requisites\Result\RequisiteLinkResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteLinksResult; +use Psr\Log\LoggerInterface; + +#[ApiServiceMetadata(new Scope(['crm']))] +class RequisiteLink extends AbstractService +{ + /** + * Registers the link between requisites and an object + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-register.html + * + * @param array{ + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * REQUISITE_ID?: int, + * BANK_DETAIL_ID?: int, + * MC_REQUISITE_ID?: int, + * MC_BANK_DETAIL_ID?: int, + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.link.register', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-register.html', + 'Registers the link between requisites and an object' + )] + public function register(array $fields): AddedItemResult + { + return new AddedItemResult( + $this->core->call( + 'crm.requisite.link.register', + [ + 'fields' => $fields + ] + ) + ); + } + + /** + * Removes the link between requisites and an object. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-unregister.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.link.unregister', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-unregister.html', + 'Removes the link between requisites and an object' + )] + public function unregister(int $entityTypeId, int $entityId): DeletedItemResult + { + return new DeletedItemResult( + $this->core->call( + 'crm.requisite.link.unregister', + [ + 'entityTypeId' => $entityTypeId, + 'entityId' => $entityId, + ] + ) + ); + } + + /** + * Returns a formal description of the fields of the requisites link. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.link.fields', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html', + 'Returns a formal description of the fields of the requisites link' + )] + public function fields(): FieldsResult + { + return new FieldsResult($this->core->call('crm.requisite.link.fields')); + } + + /** + * Returns the link between requisites and an object. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.link.get', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html', + 'Returns the link between requisites and an object' + )] + public function get(int $entityTypeId, int $entityId): RequisiteLinkResult + { + return new RequisiteLinkResult( + $this->core->call( + 'crm.requisite.link.get', + [ + 'entityTypeId' => $entityTypeId, + 'entityId' => $entityId, + ] + ) + ); + } + + /** + * Returns a list of links between requisites based on a filter. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html + * + * @param array $order - order of link items + * @param array $filter - filter array + * @param array $select = ['ENTITY_TYPE_ID','ENTITY_ID','REQUISITE_ID','BANK_DETAIL_ID','MC_REQUISITE_ID','MC_BANK_DETAIL_ID'] + * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.link.list' API call) + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.link.list', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html', + 'Returns a list of links between requisites based on a filter' + )] + public function list(array $order, array $filter, array $select, int $startItem = 0): RequisiteLinksResult + { + return new RequisiteLinksResult( + $this->core->call( + 'crm.requisite.link.list', + [ + 'order' => $order, + 'filter' => $filter, + 'select' => $select, + 'start' => $startItem, + ] + ) + ); + } + + /** + * Count links by filter + * + * @param array{ + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * REQUISITE_ID?: int, + * BANK_DETAIL_ID?: int, + * MC_REQUISITE_ID?: int, + * MC_BANK_DETAIL_ID?: int, + * } $filter + * + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + */ + public function countByFilter(array $filter = []): int + { + return $this->list([], $filter, ['ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + } +} diff --git a/tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp b/tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..508014ad4e0237cc809bced386b3cc120e153d0c GIT binary patch literal 123 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vn2|Kp-#?$*I(+%@0Qu1ebgygz9{|ycT l%Gd+30}y+8B5@dfT!UeJN1!-kCW7w-;^!gw&LDoaD*!rg7%Kn( literal 0 HcmV?d00001 diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php new file mode 100644 index 00000000..56c6add8 --- /dev/null +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php @@ -0,0 +1,228 @@ + + * + * 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\Requisites\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Core; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteLinkItemResult; +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteLink; +use Bitrix24\SDK\Services\CRM\Company\Service\Company; +use Bitrix24\SDK\Services\CRM\Requisites\Service\Requisite; +use Bitrix24\SDK\Services\ServiceBuilder; +use Bitrix24\SDK\Tests\Builders\Services\CRM\CompanyBuilder; +use Bitrix24\SDK\Tests\Builders\Services\CRM\RequisiteBuilder; + +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 RequisiteLinkTest + * + * @package Bitrix24\SDK\Tests\Integration\Services\CRM\Requisite\Service + */ +#[CoversMethod(RequisiteLink::class,'add')] +#[CoversMethod(RequisiteLink::class,'delete')] +#[CoversMethod(RequisiteLink::class,'get')] +#[CoversMethod(RequisiteLink::class,'list')] +#[CoversMethod(RequisiteLink::class,'fields')] +#[CoversMethod(RequisiteLink::class,'update')] +#[CoversMethod(RequisiteLink::class,'countByFilter')] +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteLink::class)] +class RequisiteLinkTest extends TestCase +{ + use CustomBitrix24Assertions; + + const COMPANY_OWNER_TYPE_ID = 4; + + protected ServiceBuilder $sb; + protected RequisiteLink $linkService; + protected Company $companyService; + protected Requisite $requisiteService; + protected array $presets = []; + private array $createdCompanies = []; + + protected function setUp(): void + { + $this->sb = Fabric::getServiceBuilder(); + $this->companyService = $this->sb->getCRMScope()->company(); + $this->requisiteService = $this->sb->getCRMScope()->requisite(); + $this->linkService = $this->sb->getCRMScope()->requisiteBankdetail(); + $requisitePreset = $this->sb->getCRMScope()->requisitePreset(); + foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { + $this->presets[] = $presetItemResult->ID; + } + } + + protected function tearDown(): void + { + foreach ($this->companyService->batch->delete($this->createdCompanies) as $result) { + // ### + } + } + + public function testAllSystemFieldsAnnotated(): void + { + $fieldDescriptions = $this->linkService->fields()->getFieldsDescription(); + echo "Fields \n"; + print_r($fieldDescriptions); + + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); + $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteLinkItemResult::class); + } + + public function testAllSystemFieldsHasValidTypeAnnotation():void + { + $allFields = $this->linkService->fields()->getFieldsDescription(); + $systemFieldsCodes = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($allFields)); + $systemFields = array_filter($allFields, static fn($code): bool => in_array($code, $systemFieldsCodes, true), ARRAY_FILTER_USE_KEY); + + $this->assertBitrix24AllResultItemFieldsHasValidTypeAnnotation( + $systemFields, + RequisiteLinkItemResult::class); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testAdd(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThan(1, $bankRequisite->getId()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testDelete(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertTrue($this->linkService->delete($bankRequisite->getId())->isSuccess()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testFields(): void + { + self::assertIsArray($this->linkService->fields()->getFieldsDescription()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testGet(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThan( + 1, + $this->linkService->get($bankRequisite->getId())->bankdetail()->ID + ); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testList(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + self::assertGreaterThanOrEqual(1, $this->linkService->list([], [], ['ID', 'NAME'])->getBankdetails()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testUpdate(): void + { + $presetId = $this->presets[0]; + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite' + ]); + $newName = 'Test2 bank requisite'; + + self::assertTrue($this->linkService->update($bankRequisite->getId(), ['NAME' => $newName])->isSuccess()); + self::assertEquals($newName, $this->linkService->get($bankRequisite->getId())->bankdetail()->NAME); + } + + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + */ + public function testCountByFilter(): void + { + $before = $this->linkService->countByFilter(); + + foreach ($this->presets as $presetId) { + list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->createdCompanies[] = $companyId; + $bankRequisite = $this->linkService->add([ + 'ENTITY_ID' => $requisiteId, + 'NAME' => 'Test bank requisite '.$presetId + ]); + } + + $after = $this->linkService->countByFilter(); + + $this->assertEquals($before + count($this->presets), $after); + } + + protected function addCompanyAndRequisite(int $presetId = 0): array { + $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); + $requisiteId = $this->requisiteService->add( + $companyId, + self::COMPANY_OWNER_TYPE_ID, + $presetId, + 'Test requisite '.$presetId, + (new RequisiteBuilder(self::COMPANY_OWNER_TYPE_ID, $companyId, $presetId))->build() + )->getId(); + + return [$companyId, $requisiteId]; + } +} From 12b982cddad46264ab299d459be5ae0014871c04 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Tue, 24 Jun 2025 17:07:03 +0400 Subject: [PATCH 07/17] begin requisite link test class --- .../Service/.RequisiteLinkTest.php.kate-swp | Bin 123 -> 0 bytes .../Requisites/Service/RequisiteLinkTest.php | 56 +++++++++++++----- 2 files changed, 41 insertions(+), 15 deletions(-) delete mode 100644 tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp diff --git a/tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp b/tests/Integration/Services/CRM/Requisites/Service/.RequisiteLinkTest.php.kate-swp deleted file mode 100644 index 508014ad4e0237cc809bced386b3cc120e153d0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vn2|Kp-#?$*I(+%@0Qu1ebgygz9{|ycT l%Gd+30}y+8B5@dfT!UeJN1!-kCW7w-;^!gw&LDoaD*!rg7%Kn( diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php index 56c6add8..d470b1fa 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php @@ -23,6 +23,8 @@ use Bitrix24\SDK\Services\ServiceBuilder; use Bitrix24\SDK\Tests\Builders\Services\CRM\CompanyBuilder; use Bitrix24\SDK\Tests\Builders\Services\CRM\RequisiteBuilder; +use Bitrix24\SDK\Services\CRM\Deal\Service\Deal; +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteBankdetail; use Bitrix24\SDK\Tests\CustomAssertions\CustomBitrix24Assertions; use Bitrix24\SDK\Tests\Integration\Fabric; @@ -48,31 +50,56 @@ class RequisiteLinkTest extends TestCase use CustomBitrix24Assertions; const COMPANY_OWNER_TYPE_ID = 4; + const DEAL_OWNER_TYPE_ID = 2; protected ServiceBuilder $sb; protected RequisiteLink $linkService; protected Company $companyService; protected Requisite $requisiteService; - protected array $presets = []; - private array $createdCompanies = []; + protected RequisiteBankdetail $bankService; + protected Deal $dealService; + private int $companyId = 0; + private int $myCompanyId = 0; + private int $myRequisiteId = 0; + private int $myRequisiteBankId = 0; + private int $requisiteId = 0; + private int $requisiteBankId = 0; + private int $dealId = 0; protected function setUp(): void { $this->sb = Fabric::getServiceBuilder(); $this->companyService = $this->sb->getCRMScope()->company(); $this->requisiteService = $this->sb->getCRMScope()->requisite(); - $this->linkService = $this->sb->getCRMScope()->requisiteBankdetail(); + $this->linkService = $this->sb->getCRMScope()->requisiteLink(); + $presetId = 0; $requisitePreset = $this->sb->getCRMScope()->requisitePreset(); foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { - $this->presets[] = $presetItemResult->ID; + $presetId = $presetItemResult->ID; + break; } + list($this->companyId, $this->requisiteId) = $this->addCompanyAndRequisite($presetId); + $this->bankService = $this->sb->getCRMScope()->requisiteBankdetail(); + $this->requisiteBankId = $this->bankService->add([ + 'ENTITY_ID' => $this->requisiteId, + 'NAME' => 'Test requisite link' + ])->getId(); + $this->dealService = $this->sb->getCRMScope()->deal(); + $this->dealId = $this->dealService->add(['TITLE' => 'test requisite link'])->getId(); + // my company + list($this->myCompanyId, $this->myRequisiteId) = $this->addCompanyAndRequisite($presetId); + $this->companyService->update($this->myCompanyId, ['IS_MY_COMPANY'=>'Y']); + $this->myRequisiteBankId = $this->bankService->add([ + 'ENTITY_ID' => $this->myRequisiteId, + 'NAME' => 'Test my requisite link' + ])->getId(); } protected function tearDown(): void { - foreach ($this->companyService->batch->delete($this->createdCompanies) as $result) { - // ### - } + $this->companyService->delete($this->companyId); + $this->companyService->delete($this->myCompanyId); + $this->dealService->delete($this->dealId); } public function testAllSystemFieldsAnnotated(): void @@ -100,16 +127,15 @@ public function testAllSystemFieldsHasValidTypeAnnotation():void * @throws BaseException * @throws TransportException */ - public function testAdd(): void + public function testRegister(): void { - $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $bankRequisite = $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite' + $requisiteLink = $this->linkService->register([ + 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, + 'ENTITY_ID' => $this->dealId, + 'REQUISITE_ID' => $this->requisiteId, + ]); - self::assertGreaterThan(1, $bankRequisite->getId()); + self::assertTrue($requisiteLink->isSuccess()); } /** From ae3f2ea15c10e4445b73bd38badc2ba383db0275 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Wed, 25 Jun 2025 11:11:06 +0400 Subject: [PATCH 08/17] add RequisiteLinkTest --- .../Requisites/Service/RequisiteLinkTest.php | 88 ++++++++----------- 1 file changed, 37 insertions(+), 51 deletions(-) diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php index d470b1fa..05b51f67 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php @@ -133,7 +133,9 @@ public function testRegister(): void 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, 'ENTITY_ID' => $this->dealId, 'REQUISITE_ID' => $this->requisiteId, - + 'BANK_DETAIL_ID' => $this->requisiteBankId, + 'MC_REQUISITE_ID' => $this->myRequisiteId, + 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, ]); self::assertTrue($requisiteLink->isSuccess()); } @@ -142,16 +144,17 @@ public function testRegister(): void * @throws BaseException * @throws TransportException */ - public function testDelete(): void + public function testUnregister(): void { - $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $bankRequisite = $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite' + $this->linkService->register([ + 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, + 'ENTITY_ID' => $this->dealId, + 'REQUISITE_ID' => $this->requisiteId, + 'BANK_DETAIL_ID' => $this->requisiteBankId, + 'MC_REQUISITE_ID' => $this->myRequisiteId, + 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, ]); - self::assertTrue($this->linkService->delete($bankRequisite->getId())->isSuccess()); + self::assertTrue($this->linkService->unregister(self::DEAL_OWNER_TYPE_ID, $this->dealId)->isSuccess()); } /** @@ -169,16 +172,17 @@ public function testFields(): void */ public function testGet(): void { - $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $bankRequisite = $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite' + $this->linkService->register([ + 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, + 'ENTITY_ID' => $this->dealId, + 'REQUISITE_ID' => $this->requisiteId, + 'BANK_DETAIL_ID' => $this->requisiteBankId, + 'MC_REQUISITE_ID' => $this->myRequisiteId, + 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, ]); self::assertGreaterThan( 1, - $this->linkService->get($bankRequisite->getId())->bankdetail()->ID + $this->linkService->get(self::DEAL_OWNER_TYPE_ID, $this->dealId)->bankdetail()->ENTITY_ID ); } @@ -188,33 +192,15 @@ public function testGet(): void */ public function testList(): void { - $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite' - ]); - self::assertGreaterThanOrEqual(1, $this->linkService->list([], [], ['ID', 'NAME'])->getBankdetails()); - } - - /** - * @throws BaseException - * @throws TransportException - */ - public function testUpdate(): void - { - $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $bankRequisite = $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite' + $this->linkService->register([ + 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, + 'ENTITY_ID' => $this->dealId, + 'REQUISITE_ID' => $this->requisiteId, + 'BANK_DETAIL_ID' => $this->requisiteBankId, + 'MC_REQUISITE_ID' => $this->myRequisiteId, + 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, ]); - $newName = 'Test2 bank requisite'; - - self::assertTrue($this->linkService->update($bankRequisite->getId(), ['NAME' => $newName])->isSuccess()); - self::assertEquals($newName, $this->linkService->get($bankRequisite->getId())->bankdetail()->NAME); + self::assertGreaterThanOrEqual(1, $this->linkService->list([], [], ['REQUISITE_ID', 'BANK_DETAIL_ID'])->getLinks()); } /** @@ -225,18 +211,18 @@ public function testCountByFilter(): void { $before = $this->linkService->countByFilter(); - foreach ($this->presets as $presetId) { - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->createdCompanies[] = $companyId; - $bankRequisite = $this->linkService->add([ - 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite '.$presetId - ]); - } + $this->linkService->register([ + 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, + 'ENTITY_ID' => $this->dealId, + 'REQUISITE_ID' => $this->requisiteId, + 'BANK_DETAIL_ID' => $this->requisiteBankId, + 'MC_REQUISITE_ID' => $this->myRequisiteId, + 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + ]); $after = $this->linkService->countByFilter(); - $this->assertEquals($before + count($this->presets), $after); + $this->assertEquals($before + 1, $after); } protected function addCompanyAndRequisite(int $presetId = 0): array { From 2076c51403de38f35a0b11d1a451a28b6b145105 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Wed, 25 Jun 2025 16:37:07 +0400 Subject: [PATCH 09/17] Requisite links, after tests and linters --- phpunit.xml.dist | 2 +- rector.php | 2 + src/Services/CRM/CRMServiceBuilder.php | 12 ++ src/Services/CRM/Requisites/Service/Batch.php | 6 +- .../CRM/Requisites/Service/Requisite.php | 13 +-- .../CRM/Requisites/Service/RequisiteLink.php | 6 +- .../Requisites/Service/RequisitePreset.php | 11 +- .../Service/RequisiteBankdetailTest.php | 59 +++++----- .../Requisites/Service/RequisiteLinkTest.php | 107 +++++++++--------- .../Service/RequisitePresetTest.php | 29 ++--- .../CRM/Requisites/Service/RequisiteTest.php | 44 +++---- 11 files changed, 137 insertions(+), 154 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 0a690ba1..d3c87420 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -68,7 +68,7 @@ ./tests/Integration/Services/CRM/Quote/ - ./tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php + ./tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php diff --git a/rector.php b/rector.php index 1b914b95..d1c20fbb 100644 --- a/rector.php +++ b/rector.php @@ -44,6 +44,8 @@ __DIR__ . '/tests/Integration/Services/CRM/Quote/Service', __DIR__ . '/src/Services/CRM/Currency', __DIR__ . '/tests/Integration/Services/CRM/Currency', + __DIR__ . '/src/Services/CRM/Requisites', + __DIR__ . '/tests/Integration/Services/CRM/Requisites', __DIR__ . '/tests/Unit/', ]) ->withCache(cacheDirectory: __DIR__ . '.cache/rector') diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index 3fbf10bf..4ace1972 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -59,6 +59,18 @@ public function requisiteBankdetail(): Requisites\Service\RequisiteBankdetail return $this->serviceCache[__METHOD__]; } + + public function requisiteLink(): Requisites\Service\RequisiteLink + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Requisites\Service\RequisiteLink( + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } public function contactCompany(): Contact\Service\ContactCompany { diff --git a/src/Services/CRM/Requisites/Service/Batch.php b/src/Services/CRM/Requisites/Service/Batch.php index 78954e60..cbbb1190 100644 --- a/src/Services/CRM/Requisites/Service/Batch.php +++ b/src/Services/CRM/Requisites/Service/Batch.php @@ -26,12 +26,8 @@ #[ApiBatchServiceMetadata(new Scope(['crm']))] class Batch { - protected BatchOperationsInterface $batch; - protected LoggerInterface $log; - public function __construct(BatchOperationsInterface $batch, LoggerInterface $log) + public function __construct(protected BatchOperationsInterface $batch, protected LoggerInterface $log) { - $this->batch = $batch; - $this->log = $log; } /** diff --git a/src/Services/CRM/Requisites/Service/Requisite.php b/src/Services/CRM/Requisites/Service/Requisite.php index c446a35f..4ede750b 100644 --- a/src/Services/CRM/Requisites/Service/Requisite.php +++ b/src/Services/CRM/Requisites/Service/Requisite.php @@ -33,12 +33,9 @@ #[ApiServiceMetadata(new Scope(['crm']))] class Requisite extends AbstractService { - public Batch $batch; - - public function __construct(Batch $batch, CoreInterface $core, LoggerInterface $log) + public function __construct(public Batch $batch, CoreInterface $core, LoggerInterface $logger) { - parent::__construct($core, $log); - $this->batch = $batch; + parent::__construct($core, $logger); } /** @@ -46,7 +43,6 @@ public function __construct(Batch $batch, CoreInterface $core, LoggerInterface $ * * @link https://training.bitrix24.com/rest_help/crm/requisite/crm_requisite_fields.php * - * @return FieldsResult * @throws BaseException * @throws TransportException */ @@ -146,7 +142,6 @@ public function fields(): FieldsResult * @param array $select = ['ID','ENTITY_TYPE_ID','ENTITY_ID','PRESET_ID','DATE_CREATE','DATE_MODIFY','CREATED_BY_ID','MODIFY_BY_ID','NAME','CODE','XML_ID','ORIGINATOR_ID','ACTIVE','ADDRESS_ONLY','SORT','RQ_NAME','RQ_FIRST_NAME','RQ_LAST_NAME','RQ_SECOND_NAME','RQ_COMPANY_ID','RQ_COMPANY_NAME','RQ_COMPANY_FULL_NAME','RQ_COMPANY_REG_DATE','RQ_DIRECTOR','RQ_ACCOUNTANT','RQ_CEO_NAME','RQ_CEO_WORK_POS','RQ_CONTACT','RQ_EMAIL','RQ_PHONE','RQ_FAX','RQ_IDENT_TYPE','RQ_IDENT_DOC','RQ_IDENT_DOC_SER','RQ_IDENT_DOC_NUM','RQ_IDENT_DOC_PERS_NUM','RQ_IDENT_DOC_DATE','RQ_IDENT_DOC_ISSUED_BY','RQ_IDENT_DOC_DEP_CODE','RQ_INN','RQ_KPP','RQ_USRLE','RQ_IFNS','RQ_OGRN','RQ_OGRNIP','RQ_OKPO','RQ_OKTMO','RQ_OKVED','RQ_EDRPOU','RQ_DRFO','RQ_KBE','RQ_IIN','RQ_BIN','RQ_ST_CERT_SER','RQ_ST_CERT_NUM','RQ_ST_CERT_DATE','RQ_VAT_PAYER','RQ_VAT_ID','RQ_VAT_CERT_SER','RQ_VAT_CERT_NUM','RQ_VAT_CERT_DATE','RQ_RESIDENCE_COUNTRY','RQ_BASE_DOC','RQ_REGON','RQ_KRS','RQ_PESEL','RQ_LEGAL_FORM','RQ_SIRET','RQ_SIREN','RQ_CAPITAL','RQ_RCS','RQ_CNPJ','RQ_STATE_REG','RQ_MNPL_REG','RQ_CPF'] * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.list' API call) * - * @return RequisitesResult * @throws BaseException * @throws TransportException */ @@ -232,7 +227,6 @@ public function list(array $order, array $filter, array $select, int $startItem * IM?: string, * LINK?: string * } $fields - * @return AddedItemResult * @throws BaseException * @throws TransportException */ @@ -291,7 +285,6 @@ public function get(int $id): RequisiteResult * * @param non-negative-int $id * - * @return DeletedItemResult * @throws BaseException * @throws TransportException */ @@ -318,7 +311,6 @@ public function delete(int $id): DeletedItemResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/universal/crm-requisite-update.html * - * @param int $id * @param array{ * ID?: int, * TITLE?: string, @@ -377,7 +369,6 @@ public function delete(int $id): DeletedItemResult * LINK?: string * } $fields * - * @return UpdatedItemResult * @throws BaseException * @throws TransportException */ diff --git a/src/Services/CRM/Requisites/Service/RequisiteLink.php b/src/Services/CRM/Requisites/Service/RequisiteLink.php index 7f01a49c..5b9a4534 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteLink.php +++ b/src/Services/CRM/Requisites/Service/RequisiteLink.php @@ -53,9 +53,9 @@ class RequisiteLink extends AbstractService 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-register.html', 'Registers the link between requisites and an object' )] - public function register(array $fields): AddedItemResult + public function register(array $fields): UpdatedItemResult { - return new AddedItemResult( + return new UpdatedItemResult( $this->core->call( 'crm.requisite.link.register', [ @@ -187,6 +187,6 @@ public function list(array $order, array $filter, array $select, int $startItem */ public function countByFilter(array $filter = []): int { - return $this->list([], $filter, ['ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + return $this->list([], $filter, ['ENTITY_ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); } } diff --git a/src/Services/CRM/Requisites/Service/RequisitePreset.php b/src/Services/CRM/Requisites/Service/RequisitePreset.php index b8407271..e43bf05b 100644 --- a/src/Services/CRM/Requisites/Service/RequisitePreset.php +++ b/src/Services/CRM/Requisites/Service/RequisitePreset.php @@ -35,9 +35,9 @@ #[ApiServiceMetadata(new Scope(['crm']))] class RequisitePreset extends AbstractService { - public function __construct(CoreInterface $core, LoggerInterface $log) + public function __construct(CoreInterface $core, LoggerInterface $logger) { - parent::__construct($core, $log); + parent::__construct($core, $logger); } /** @@ -112,7 +112,6 @@ public function list( * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/crm-requisite-preset-add.html * - * @return AddedItemResult * @throws BaseException * @throws TransportException */ @@ -149,7 +148,6 @@ public function add( * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/crm-requisite-preset-countries.html * - * @return CountriesResult * @throws BaseException * @throws TransportException */ @@ -168,9 +166,7 @@ public function countries(): CountriesResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/crm-requisite-preset-delete.html * - * @param int $id * - * @return DeletedItemResult * @throws BaseException * @throws TransportException */ @@ -196,7 +192,6 @@ public function delete(int $id): DeletedItemResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/crm-requisite-preset-get.html * - * @param int $id * * @throws BaseException * @throws TransportException @@ -216,7 +211,6 @@ public function get(int $id): RequisitePresetResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/crm-requisite-preset-update.html * - * @param int $id * @param array{ * ID?: int, * ENTITY_TYPE_ID?: int, @@ -230,7 +224,6 @@ public function get(int $id): RequisitePresetResult * SORT?: int, * XML_ID?: string, * } $fields - * @return UpdatedItemResult * @throws BaseException * @throws TransportException */ diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php index 7d2dd279..c1e1db41 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php @@ -46,16 +46,21 @@ class RequisiteBankdetailTest extends TestCase { use CustomBitrix24Assertions; - - const COMPANY_OWNER_TYPE_ID = 4; - + + public const COMPANY_OWNER_TYPE_ID = 4; + protected ServiceBuilder $sb; + protected RequisiteBankdetail $bankService; + protected Company $companyService; + protected Requisite $requisiteService; + protected array $presets = []; + private array $createdCompanies = []; - + protected function setUp(): void { $this->sb = Fabric::getServiceBuilder(); @@ -63,11 +68,11 @@ protected function setUp(): void $this->requisiteService = $this->sb->getCRMScope()->requisite(); $this->bankService = $this->sb->getCRMScope()->requisiteBankdetail(); $requisitePreset = $this->sb->getCRMScope()->requisitePreset(); - foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { - $this->presets[] = $presetItemResult->ID; + foreach ($requisitePreset->list()->getRequisitePresets() as $requisitePresetItemResult) { + $this->presets[] = $requisitePresetItemResult->ID; } } - + protected function tearDown(): void { foreach ($this->companyService->batch->delete($this->createdCompanies) as $result) { @@ -80,7 +85,7 @@ public function testAllSystemFieldsAnnotated(): void $fieldDescriptions = $this->bankService->fields()->getFieldsDescription(); echo "Fields \n"; print_r($fieldDescriptions); - + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteBankdetailItemResult::class); } @@ -103,13 +108,13 @@ public function testAllSystemFieldsHasValidTypeAnnotation():void public function testAdd(): void { $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($presetId); $this->createdCompanies[] = $companyId; - $bankRequisite = $this->bankService->add([ + $addedItemResult = $this->bankService->add([ 'ENTITY_ID' => $requisiteId, 'NAME' => 'Test bank requisite' ]); - self::assertGreaterThan(1, $bankRequisite->getId()); + self::assertGreaterThan(1, $addedItemResult->getId()); } /** @@ -119,13 +124,13 @@ public function testAdd(): void public function testDelete(): void { $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($presetId); $this->createdCompanies[] = $companyId; - $bankRequisite = $this->bankService->add([ + $addedItemResult = $this->bankService->add([ 'ENTITY_ID' => $requisiteId, 'NAME' => 'Test bank requisite' ]); - self::assertTrue($this->bankService->delete($bankRequisite->getId())->isSuccess()); + self::assertTrue($this->bankService->delete($addedItemResult->getId())->isSuccess()); } /** @@ -144,15 +149,15 @@ public function testFields(): void public function testGet(): void { $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($presetId); $this->createdCompanies[] = $companyId; - $bankRequisite = $this->bankService->add([ + $addedItemResult = $this->bankService->add([ 'ENTITY_ID' => $requisiteId, 'NAME' => 'Test bank requisite' ]); self::assertGreaterThan( 1, - $this->bankService->get($bankRequisite->getId())->bankdetail()->ID + $this->bankService->get($addedItemResult->getId())->bankdetail()->ID ); } @@ -163,7 +168,7 @@ public function testGet(): void public function testList(): void { $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($presetId); $this->createdCompanies[] = $companyId; $this->bankService->add([ 'ENTITY_ID' => $requisiteId, @@ -179,16 +184,16 @@ public function testList(): void public function testUpdate(): void { $presetId = $this->presets[0]; - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($presetId); $this->createdCompanies[] = $companyId; - $bankRequisite = $this->bankService->add([ + $addedItemResult = $this->bankService->add([ 'ENTITY_ID' => $requisiteId, 'NAME' => 'Test bank requisite' ]); $newName = 'Test2 bank requisite'; - self::assertTrue($this->bankService->update($bankRequisite->getId(), ['NAME' => $newName])->isSuccess()); - self::assertEquals($newName, $this->bankService->get($bankRequisite->getId())->bankdetail()->NAME); + self::assertTrue($this->bankService->update($addedItemResult->getId(), ['NAME' => $newName])->isSuccess()); + self::assertEquals($newName, $this->bankService->get($addedItemResult->getId())->bankdetail()->NAME); } /** @@ -199,20 +204,20 @@ public function testCountByFilter(): void { $before = $this->bankService->countByFilter(); - foreach ($this->presets as $presetId) { - list($companyId, $requisiteId) = $this->addCompanyAndRequisite($presetId); + foreach ($this->presets as $preset) { + [$companyId, $requisiteId] = $this->addCompanyAndRequisite($preset); $this->createdCompanies[] = $companyId; $bankRequisite = $this->bankService->add([ 'ENTITY_ID' => $requisiteId, - 'NAME' => 'Test bank requisite '.$presetId + 'NAME' => 'Test bank requisite '.$preset ]); } - + $after = $this->bankService->countByFilter(); $this->assertEquals($before + count($this->presets), $after); } - + protected function addCompanyAndRequisite(int $presetId = 0): array { $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); $requisiteId = $this->requisiteService->add( diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php index 05b51f67..ec0f8514 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php @@ -48,24 +48,27 @@ class RequisiteLinkTest extends TestCase { use CustomBitrix24Assertions; - - const COMPANY_OWNER_TYPE_ID = 4; - const DEAL_OWNER_TYPE_ID = 2; - + + public const COMPANY_OWNER_TYPE_ID = 4; + + public const DEAL_OWNER_TYPE_ID = 2; + protected ServiceBuilder $sb; + protected RequisiteLink $linkService; + protected Company $companyService; + protected Requisite $requisiteService; - protected RequisiteBankdetail $bankService; + protected Deal $dealService; + private int $companyId = 0; - private int $myCompanyId = 0; - private int $myRequisiteId = 0; - private int $myRequisiteBankId = 0; + private int $requisiteId = 0; - private int $requisiteBankId = 0; + private int $dealId = 0; - + protected function setUp(): void { $this->sb = Fabric::getServiceBuilder(); @@ -74,40 +77,30 @@ protected function setUp(): void $this->linkService = $this->sb->getCRMScope()->requisiteLink(); $presetId = 0; $requisitePreset = $this->sb->getCRMScope()->requisitePreset(); - foreach ($requisitePreset->list()->getRequisitePresets() as $presetItemResult) { - $presetId = $presetItemResult->ID; + foreach ($requisitePreset->list()->getRequisitePresets() as $requisitePresetItemResult) { + $presetId = $requisitePresetItemResult->ID; break; } - list($this->companyId, $this->requisiteId) = $this->addCompanyAndRequisite($presetId); - $this->bankService = $this->sb->getCRMScope()->requisiteBankdetail(); - $this->requisiteBankId = $this->bankService->add([ - 'ENTITY_ID' => $this->requisiteId, - 'NAME' => 'Test requisite link' - ])->getId(); + + [$this->companyId, $this->requisiteId] = $this->addCompanyAndRequisite($presetId); $this->dealService = $this->sb->getCRMScope()->deal(); - $this->dealId = $this->dealService->add(['TITLE' => 'test requisite link'])->getId(); - // my company - list($this->myCompanyId, $this->myRequisiteId) = $this->addCompanyAndRequisite($presetId); - $this->companyService->update($this->myCompanyId, ['IS_MY_COMPANY'=>'Y']); - $this->myRequisiteBankId = $this->bankService->add([ - 'ENTITY_ID' => $this->myRequisiteId, - 'NAME' => 'Test my requisite link' - ])->getId(); + $this->dealId = $this->dealService->add( + [ + 'TITLE' => 'test requisite link 2', + 'COMPANY_ID' => strval($this->companyId), + ] + )->getId(); } - + protected function tearDown(): void { $this->companyService->delete($this->companyId); - $this->companyService->delete($this->myCompanyId); $this->dealService->delete($this->dealId); } public function testAllSystemFieldsAnnotated(): void { $fieldDescriptions = $this->linkService->fields()->getFieldsDescription(); - echo "Fields \n"; - print_r($fieldDescriptions); - $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteLinkItemResult::class); } @@ -129,15 +122,15 @@ public function testAllSystemFieldsHasValidTypeAnnotation():void */ public function testRegister(): void { - $requisiteLink = $this->linkService->register([ + $updatedItemResult = $this->linkService->register([ 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, 'ENTITY_ID' => $this->dealId, 'REQUISITE_ID' => $this->requisiteId, - 'BANK_DETAIL_ID' => $this->requisiteBankId, - 'MC_REQUISITE_ID' => $this->myRequisiteId, - 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + 'BANK_DETAIL_ID' => 0, + 'MC_REQUISITE_ID' => 0, + 'MC_BANK_DETAIL_ID' => 0, ]); - self::assertTrue($requisiteLink->isSuccess()); + self::assertTrue($updatedItemResult->isSuccess()); } /** @@ -150,9 +143,9 @@ public function testUnregister(): void 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, 'ENTITY_ID' => $this->dealId, 'REQUISITE_ID' => $this->requisiteId, - 'BANK_DETAIL_ID' => $this->requisiteBankId, - 'MC_REQUISITE_ID' => $this->myRequisiteId, - 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + 'BANK_DETAIL_ID' => 0, + 'MC_REQUISITE_ID' => 0, + 'MC_BANK_DETAIL_ID' => 0, ]); self::assertTrue($this->linkService->unregister(self::DEAL_OWNER_TYPE_ID, $this->dealId)->isSuccess()); } @@ -176,13 +169,13 @@ public function testGet(): void 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, 'ENTITY_ID' => $this->dealId, 'REQUISITE_ID' => $this->requisiteId, - 'BANK_DETAIL_ID' => $this->requisiteBankId, - 'MC_REQUISITE_ID' => $this->myRequisiteId, - 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + 'BANK_DETAIL_ID' => 0, + 'MC_REQUISITE_ID' => 0, + 'MC_BANK_DETAIL_ID' => 0, ]); self::assertGreaterThan( 1, - $this->linkService->get(self::DEAL_OWNER_TYPE_ID, $this->dealId)->bankdetail()->ENTITY_ID + $this->linkService->get(self::DEAL_OWNER_TYPE_ID, $this->dealId)->link()->ENTITY_ID ); } @@ -196,9 +189,9 @@ public function testList(): void 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, 'ENTITY_ID' => $this->dealId, 'REQUISITE_ID' => $this->requisiteId, - 'BANK_DETAIL_ID' => $this->requisiteBankId, - 'MC_REQUISITE_ID' => $this->myRequisiteId, - 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + 'BANK_DETAIL_ID' => 0, + 'MC_REQUISITE_ID' => 0, + 'MC_BANK_DETAIL_ID' => 0, ]); self::assertGreaterThanOrEqual(1, $this->linkService->list([], [], ['REQUISITE_ID', 'BANK_DETAIL_ID'])->getLinks()); } @@ -211,20 +204,30 @@ public function testCountByFilter(): void { $before = $this->linkService->countByFilter(); - $this->linkService->register([ + $dealId = $this->dealService->add( + [ + 'TITLE' => 'test requisite link deal', + 'COMPANY_ID' => strval($this->companyId), + ] + )->getId(); + $updatedItemResult = $this->linkService->register([ 'ENTITY_TYPE_ID' => self::DEAL_OWNER_TYPE_ID, - 'ENTITY_ID' => $this->dealId, + 'ENTITY_ID' => $dealId, 'REQUISITE_ID' => $this->requisiteId, - 'BANK_DETAIL_ID' => $this->requisiteBankId, - 'MC_REQUISITE_ID' => $this->myRequisiteId, - 'MC_BANK_DETAIL_ID' => $this->myRequisiteBankId, + 'BANK_DETAIL_ID' => 0, + 'MC_REQUISITE_ID' => 0, + 'MC_BANK_DETAIL_ID' => 0, ]); + self::assertTrue($updatedItemResult->isSuccess()); + $after = $this->linkService->countByFilter(); $this->assertEquals($before + 1, $after); + + $this->dealService->delete($dealId); } - + protected function addCompanyAndRequisite(int $presetId = 0): array { $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); $requisiteId = $this->requisiteService->add( diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetTest.php index f98f8ead..ddc74b54 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetTest.php @@ -46,40 +46,31 @@ class RequisitePresetTest extends TestCase use CustomBitrix24Assertions; protected ServiceBuilder $sb; - private array $createdCompanies = []; + private int $entityTypeRequisiteId; + private int $countryId; - public function setUp(): void + protected function setUp(): void { $this->sb = Fabric::getServiceBuilder(); $this->entityTypeRequisiteId = current( array_filter( $this->sb->getCRMScope()->enum()->ownerType()->getItems(), - function ($item) { - return $item->SYMBOL_CODE === 'REQUISITE'; - } + fn($item): bool => $item->SYMBOL_CODE === 'REQUISITE' ) )->ID; $this->countryId = current( array_column( array_filter( $this->sb->getCRMScope()->requisitePreset()->countries()->getCountries(), - function ($item) { - return $item->CODE === 'US'; - } + fn($item): bool => $item->CODE === 'US' ), 'ID' ) ); } - public function tearDown(): void - { - foreach ($this->sb->getCRMScope()->company()->batch->delete($this->createdCompanies) as $result) { - } - } - public function testFields(): void { self::assertIsArray($this->sb->getCRMScope()->requisitePreset()->fields()->getFieldsDescription()); @@ -97,9 +88,7 @@ public function testAllSystemFieldsHasValidTypeAnnotation(): void { $allFields = $this->sb->getCRMScope()->requisitePreset()->fields()->getFieldsDescription(); $systemFieldsCodes = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($allFields)); - $systemFields = array_filter($allFields, static function ($code) use ($systemFieldsCodes) { - return in_array($code, $systemFieldsCodes, true); - }, ARRAY_FILTER_USE_KEY); + $systemFields = array_filter($allFields, static fn($code): bool => in_array($code, $systemFieldsCodes, true), ARRAY_FILTER_USE_KEY); $this->assertBitrix24AllResultItemFieldsHasValidTypeAnnotation($systemFields, RequisitePresetItemResult::class); } @@ -127,8 +116,8 @@ public function testAdd(): void 'ACTIVE' => 'Y', ] )->getId(); - $addedItem = $this->sb->getCRMScope()->requisitePreset()->get($tplId)->requisitePreset(); - $this->assertEquals($name, $addedItem->NAME); + $requisitePresetItemResult = $this->sb->getCRMScope()->requisitePreset()->get($tplId)->requisitePreset(); + $this->assertEquals($name, $requisitePresetItemResult->NAME); $this->assertTrue($this->sb->getCRMScope()->requisitePreset()->delete($tplId)->isSuccess()); } @@ -147,7 +136,7 @@ public function testDelete(): void $this->assertTrue($this->sb->getCRMScope()->requisitePreset()->delete($tplId)->isSuccess()); $this->expectException(ItemNotFoundException::class); - $addedReq = $this->sb->getCRMScope()->requisitePreset()->get($tplId)->requisitePreset(); + $this->sb->getCRMScope()->requisitePreset()->get($tplId)->requisitePreset(); } public function testUpdate(): void diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteTest.php index a6b549b5..b3384433 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteTest.php @@ -42,37 +42,34 @@ class RequisiteTest extends TestCase use CustomBitrix24Assertions; protected ServiceBuilder $sb; + private array $createdCompanies = []; - private array $createdRequisites = []; + private int $requisitePresetId; + private int $entityTypeIdCompany; - public function setUp(): void + protected function setUp(): void { $this->sb = Fabric::getServiceBuilder(); $this->requisitePresetId = current( array_filter( $this->sb->getCRMScope()->requisitePreset()->list()->getRequisitePresets(), - function ($item) { - return str_contains($item->XML_ID, 'COMPANY#'); - } + fn($item): bool => str_contains($item->XML_ID, 'COMPANY#') ) )->ID; $this->entityTypeIdCompany = current( array_filter( $this->sb->getCRMScope()->enum()->ownerType()->getItems(), - function ($item) { - return $item->SYMBOL_CODE === 'COMPANY'; - } + fn($item): bool => $item->SYMBOL_CODE === 'COMPANY' ) )->ID; } - public function tearDown(): void + protected function tearDown(): void { - foreach ($this->sb->getCRMScope()->requisite()->batch->delete($this->createdRequisites) as $result) { - } foreach ($this->sb->getCRMScope()->company()->batch->delete($this->createdCompanies) as $result) { + // ### } } @@ -93,9 +90,7 @@ public function testAllSystemFieldsHasValidTypeAnnotation(): void { $allFields = $this->sb->getCRMScope()->requisite()->fields()->getFieldsDescription(); $systemFieldsCodes = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($allFields)); - $systemFields = array_filter($allFields, static function ($code) use ($systemFieldsCodes) { - return in_array($code, $systemFieldsCodes, true); - }, ARRAY_FILTER_USE_KEY); + $systemFields = array_filter($allFields, static fn($code): bool => in_array($code, $systemFieldsCodes, true), ARRAY_FILTER_USE_KEY); $this->assertBitrix24AllResultItemFieldsHasValidTypeAnnotation($systemFields, RequisiteItemResult::class); } @@ -114,13 +109,12 @@ public function testAdd(): void $reqName, (new RequisiteBuilder($this->entityTypeIdCompany, $companyId, $this->requisitePresetId))->build() )->getId(); - $this->createdRequisites[] = $reqId; - $addedReq = $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); + $requisiteItemResult = $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); - $this->assertEquals($reqName, $addedReq->NAME); - $this->assertEquals($this->entityTypeIdCompany, $addedReq->ENTITY_TYPE_ID); - $this->assertEquals($this->requisitePresetId, $addedReq->PRESET_ID); + $this->assertEquals($reqName, $requisiteItemResult->NAME); + $this->assertEquals($this->entityTypeIdCompany, $requisiteItemResult->ENTITY_TYPE_ID); + $this->assertEquals($this->requisitePresetId, $requisiteItemResult->PRESET_ID); } public function testDelete(): void @@ -141,7 +135,7 @@ public function testDelete(): void $this->assertTrue($this->sb->getCRMScope()->requisite()->delete($reqId)->isSuccess()); $this->expectException(ItemNotFoundException::class); - $addedReq = $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); + $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); } public function testList(): void @@ -158,7 +152,6 @@ public function testList(): void $reqName, (new RequisiteBuilder($this->entityTypeIdCompany, $companyId, $this->requisitePresetId))->build() )->getId(); - $this->createdRequisites[] = $reqId; $this->assertContains( $reqId, @@ -183,13 +176,12 @@ public function testUpdate(): void $reqName, (new RequisiteBuilder($this->entityTypeIdCompany, $companyId, $this->requisitePresetId))->build() )->getId(); - $this->createdRequisites[] = $reqId; - $addedReq = $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); + $requisiteItemResult = $this->sb->getCRMScope()->requisite()->get($reqId)->requisite(); - $this->assertEquals($reqName, $addedReq->NAME); - $this->assertEquals($this->entityTypeIdCompany, $addedReq->ENTITY_TYPE_ID); - $this->assertEquals($this->requisitePresetId, $addedReq->PRESET_ID); + $this->assertEquals($reqName, $requisiteItemResult->NAME); + $this->assertEquals($this->entityTypeIdCompany, $requisiteItemResult->ENTITY_TYPE_ID); + $this->assertEquals($this->requisitePresetId, $requisiteItemResult->PRESET_ID); $newName = 'new name'; $this->assertTrue($this->sb->getCRMScope()->requisite()->update($reqId, ['NAME' => $newName])->isSuccess()); From cce21536d093a8e5636bd691c161e0c2f071ae64 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Wed, 25 Jun 2025 17:03:16 +0400 Subject: [PATCH 10/17] Add RequisitePresetField class --- .../Service/RequisitePresetField.php | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 src/Services/CRM/Requisites/Service/RequisitePresetField.php diff --git a/src/Services/CRM/Requisites/Service/RequisitePresetField.php b/src/Services/CRM/Requisites/Service/RequisitePresetField.php new file mode 100644 index 00000000..c30bec10 --- /dev/null +++ b/src/Services/CRM/Requisites/Service/RequisitePresetField.php @@ -0,0 +1,194 @@ + + * + * 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\Requisites\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\Requisites\Result\RequisitePresetFieldResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisitePresetFieldsResult; +use Psr\Log\LoggerInterface; + +#[ApiServiceMetadata(new Scope(['crm']))] +class RequisitePresetField extends AbstractService +{ + /** + * Adds a customizable field to the requisites template + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-add.html + * + * @param int $presetId + * @param array{ + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * REQUISITE_ID?: int, + * BANK_DETAIL_ID?: int, + * MC_REQUISITE_ID?: int, + * MC_BANK_DETAIL_ID?: int, + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.add', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-add.html', + 'Adds a customizable field to the requisites template' + )] + public function add(int $presetId, array $fields): AddedItemResult + { + return new AddedItemResult( + $this->core->call( + 'crm.requisite.preset.field.add', + [ + 'preset' => $presetId, + 'fields' => $fields + ] + ) + ); + } + + /** + * Deletes a customizable field from the requisites template. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-delete.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.delete', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-delete.html', + 'Deletes a customizable field from the requisites template' + )] + public function delete(int $id, int $presetId): DeletedItemResult + { + return new DeletedItemResult( + $this->core->call( + 'crm.requisite.preset.field.delete', + [ + 'id' => $id, + 'preset' => $presetId, + ] + ) + ); // ### + } + + /** + * Returns a formal description of the fields of the requisites preset.field. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.fields', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html', + 'Returns a formal description of the fields of the requisites link' + )] + public function fields(): FieldsResult + { + return new FieldsResult($this->core->call('crm.requisite.preset.field.fields')); + } + + /** + * Returns the link between requisites and an object. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html + * + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.get', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html', + 'Returns the link between requisites and an object' + )] + public function get(int $entityTypeId, int $entityId): RequisitePresetFieldResult + { + return new RequisitePresetFieldResult( + $this->core->call( + 'crm.requisite.preset.field.get', + [ + 'entityTypeId' => $entityTypeId, + 'entityId' => $entityId, + ] + ) + ); + } + + /** + * Returns a list of links between requisites based on a filter. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html + * + * @param array $order - order of link items + * @param array $filter - filter array + * @param array $select = ['ENTITY_TYPE_ID','ENTITY_ID','REQUISITE_ID','BANK_DETAIL_ID','MC_REQUISITE_ID','MC_BANK_DETAIL_ID'] + * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.preset.field.list' API call) + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.list', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html', + 'Returns a list of links between requisites based on a filter' + )] + public function list(array $order, array $filter, array $select, int $startItem = 0): RequisitePresetFieldsResult + { + return new RequisitePresetFieldsResult( + $this->core->call( + 'crm.requisite.preset.field.list', + [ + 'order' => $order, + 'filter' => $filter, + 'select' => $select, + 'start' => $startItem, + ] + ) + ); + } + + /** + * Count links by filter + * + * @param array{ + * ENTITY_TYPE_ID?: int, + * ENTITY_ID?: int, + * REQUISITE_ID?: int, + * BANK_DETAIL_ID?: int, + * MC_REQUISITE_ID?: int, + * MC_BANK_DETAIL_ID?: int, + * } $filter + * + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + */ + public function countByFilter(array $filter = []): int + { + return $this->list([], $filter, ['ENTITY_ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + } +} From 19c0bbabd0d74199dbccf14f0223a8a030b78a7a Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Thu, 26 Jun 2025 14:58:12 +0400 Subject: [PATCH 11/17] add methods and results --- .../RequisitePresetAvailableFieldsResult.php | 40 ++++++ .../Result/RequisitePresetFieldResult.php | 33 +++++ .../Result/RequisitePresetFieldsResult.php | 40 ++++++ .../Result/RequisitePresetFiledItemResult.php | 30 ++++ .../Service/RequisitePresetField.php | 131 ++++++++++++------ 5 files changed, 228 insertions(+), 46 deletions(-) create mode 100644 src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisitePresetFieldsResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php new file mode 100644 index 00000000..9a090a92 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class RequisitePresetAvailableFieldsResult + * + * @package Bitrix24\SDK\Services\CRM\Requisites\Result + */ +class RequisitePresetAvailableFieldsResult extends AbstractResult +{ + /** + * @return string[] + * @throws BaseException + */ + public function getAvailableFields(): array + { + $items = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $items[] = $item; + } + + return $items; + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php new file mode 100644 index 00000000..ca38161d --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class RequisitePresetFieldResult + * + * @package Bitrix24\SDK\Services\CRM\Requisites\Result + */ +class RequisitePresetFieldResult extends AbstractResult +{ + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + public function presetfield(): RequisitePresetFieldItemResult + { + return new RequisitePresetFieldItemResult($this->getCoreResponse()->getResponseData()->getResult()); + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFieldsResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFieldsResult.php new file mode 100644 index 00000000..4d945251 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisitePresetFieldsResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +/** + * Class RequisitePresetFieldsResult + * + * @package Bitrix24\SDK\Services\CRM\Requisites\Result + */ +class RequisitePresetFieldsResult extends AbstractResult +{ + /** + * @return RequisitePresetFieldItemResult[] + * @throws BaseException + */ + public function getPresetFields(): array + { + $items = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $items[] = new RequisitePresetFieldItemResult($item); + } + + return $items; + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php new file mode 100644 index 00000000..940039ab --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php @@ -0,0 +1,30 @@ + + * + * 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\Requisites\Result; + +use Bitrix24\SDK\Services\CRM\Common\Result\AbstractCrmItem; + +/** + * Class RequisitePresetFieldItemResult + * + * @property-read int|null $ID + * @property-read string|null $FIELD_NAME + * @property-read string|null $FIELD_TITLE + * @property-read bool|null $IN_SHORT_LIST + * @property-read int|null $SORT + */ +class RequisitePresetFieldItemResult extends AbstractCrmItem +{ + +} diff --git a/src/Services/CRM/Requisites/Service/RequisitePresetField.php b/src/Services/CRM/Requisites/Service/RequisitePresetField.php index c30bec10..b5483d5b 100644 --- a/src/Services/CRM/Requisites/Service/RequisitePresetField.php +++ b/src/Services/CRM/Requisites/Service/RequisitePresetField.php @@ -26,6 +26,7 @@ use Bitrix24\SDK\Services\AbstractService; use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisitePresetFieldResult; use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisitePresetFieldsResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisitePresetAvailableFieldsResult; use Psr\Log\LoggerInterface; #[ApiServiceMetadata(new Scope(['crm']))] @@ -38,12 +39,10 @@ class RequisitePresetField extends AbstractService * * @param int $presetId * @param array{ - * ENTITY_TYPE_ID?: int, - * ENTITY_ID?: int, - * REQUISITE_ID?: int, - * BANK_DETAIL_ID?: int, - * MC_REQUISITE_ID?: int, - * MC_BANK_DETAIL_ID?: int, + * FIELD_NAME?: string, + * FIELD_TITLE?: string, + * SORT?: int, + * IN_SHORT_LIST?: string, * } $fields * * @throws BaseException @@ -60,7 +59,7 @@ public function add(int $presetId, array $fields): AddedItemResult $this->core->call( 'crm.requisite.preset.field.add', [ - 'preset' => $presetId, + 'preset' => ['ID' => $presetId] 'fields' => $fields ] ) @@ -88,24 +87,24 @@ public function delete(int $id, int $presetId): DeletedItemResult 'crm.requisite.preset.field.delete', [ 'id' => $id, - 'preset' => $presetId, + 'preset' => ['ID' => $presetId] ] ) ); // ### } /** - * Returns a formal description of the fields of the requisites preset.field. + * Returns a formal description of the fields describing the custom field in the requisites template. * - * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-fields.html * * @throws BaseException * @throws TransportException */ #[ApiEndpointMetadata( 'crm.requisite.preset.field.fields', - 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-fields.html', - 'Returns a formal description of the fields of the requisites link' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-fields.html', + 'Returns a formal description of the fields describing the custom field in the requisites template' )] public function fields(): FieldsResult { @@ -113,9 +112,9 @@ public function fields(): FieldsResult } /** - * Returns the link between requisites and an object. + * Returns the description of the custom field in the requisites template by identifier. * - * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-get.html * * * @throws BaseException @@ -123,72 +122,112 @@ public function fields(): FieldsResult */ #[ApiEndpointMetadata( 'crm.requisite.preset.field.get', - 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-get.html', - 'Returns the link between requisites and an object' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-get.html', + 'Returns the description of the custom field in the requisites template by identifier' )] - public function get(int $entityTypeId, int $entityId): RequisitePresetFieldResult + public function get(int $id, int $presetId): RequisitePresetFieldResult { return new RequisitePresetFieldResult( $this->core->call( 'crm.requisite.preset.field.get', [ - 'entityTypeId' => $entityTypeId, - 'entityId' => $entityId, + 'id' => $id, + 'preset' => ['ID' => $presetId] ] ) ); } /** - * Returns a list of links between requisites based on a filter. + * Returns a list of all custom fields for a specific requisites template. * - * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-list.html * - * @param array $order - order of link items - * @param array $filter - filter array - * @param array $select = ['ENTITY_TYPE_ID','ENTITY_ID','REQUISITE_ID','BANK_DETAIL_ID','MC_REQUISITE_ID','MC_BANK_DETAIL_ID'] - * @param integer $startItem - entity number to start from (usually returned in 'next' field of previous 'crm.requisite.preset.field.list' API call) + * @param int $presetId * * @throws BaseException * @throws TransportException */ #[ApiEndpointMetadata( 'crm.requisite.preset.field.list', - 'https://apidocs.bitrix24.com/api-reference/crm/requisites/links/crm-requisite-link-list.html', - 'Returns a list of links between requisites based on a filter' + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-list.html', + 'Returns a list of all custom fields for a specific requisites template' )] - public function list(array $order, array $filter, array $select, int $startItem = 0): RequisitePresetFieldsResult + public function list(int $presetId): RequisitePresetFieldsResult { return new RequisitePresetFieldsResult( $this->core->call( 'crm.requisite.preset.field.list', [ - 'order' => $order, - 'filter' => $filter, - 'select' => $select, - 'start' => $startItem, + 'preset' => ['ID' => $presetId] ] ) ); } - + /** - * Count links by filter + * Modifies a custom field in the requisites template. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-update.html * + * @param int $id * @param array{ - * ENTITY_TYPE_ID?: int, - * ENTITY_ID?: int, - * REQUISITE_ID?: int, - * BANK_DETAIL_ID?: int, - * MC_REQUISITE_ID?: int, - * MC_BANK_DETAIL_ID?: int, - * } $filter - * - * @throws \Bitrix24\SDK\Core\Exceptions\BaseException - * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * ID?: int, + * } $presetId + * @param array{ + * FIELD_NAME?: string, + * FIELD_TITLE?: string, + * SORT?: int, + * IN_SHORT_LIST?: string, + * } $fields + * + * @throws BaseException + * @throws TransportException + */ + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.update', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-update.html', + 'Modifies a custom field in the requisites template' + )] + public function update(int $id, int $presetId, array $fields): RequisitePresetFieldResult + { + return new UpdatedItemResult( + $this->core->call( + 'crm.requisite.preset.field.update', + [ + 'id' => $id, + 'preset' => ['ID' => $presetId], + 'fields' => $fields + ] + ) + ); + } + + /** + * Returns fields available for addition to the specified requisites template. + * + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-available-to-add.html + * + * @param int $presetId + * + * @throws BaseException + * @throws TransportException */ - public function countByFilter(array $filter = []): int + #[ApiEndpointMetadata( + 'crm.requisite.preset.field.availabletoadd', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-available-to-add.html', + 'Returns fields available for addition to the specified requisites template' + )] + public function availabletoadd(int $presetId): RequisitePresetAvailableFieldsResult { - return $this->list([], $filter, ['ENTITY_ID'], 1)->getCoreResponse()->getResponseData()->getPagination()->getTotal(); + return new RequisitePresetAvailableFieldsResult( + $this->core->call( + 'crm.requisite.preset.field.availabletoadd', + [ + 'preset' => ['ID' => $presetId] + ] + ) + ); } + } From aae41e743829b18b39adcb7f50d7e762f40f5fa1 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Thu, 26 Jun 2025 15:06:56 +0400 Subject: [PATCH 12/17] run linters and unit tests --- .../RequisitePresetAvailableFieldsResult.php | 7 +----- .../Result/RequisitePresetFiledItemResult.php | 1 - .../Service/RequisitePresetField.php | 22 ++++++------------- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php index 9a090a92..295e2ae3 100644 --- a/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php +++ b/src/Services/CRM/Requisites/Result/RequisitePresetAvailableFieldsResult.php @@ -30,11 +30,6 @@ class RequisitePresetAvailableFieldsResult extends AbstractResult */ public function getAvailableFields(): array { - $items = []; - foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { - $items[] = $item; - } - - return $items; + return $this->getCoreResponse()->getResponseData()->getResult(); } } diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php index 940039ab..8dfa3402 100644 --- a/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php +++ b/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php @@ -26,5 +26,4 @@ */ class RequisitePresetFieldItemResult extends AbstractCrmItem { - } diff --git a/src/Services/CRM/Requisites/Service/RequisitePresetField.php b/src/Services/CRM/Requisites/Service/RequisitePresetField.php index b5483d5b..38a4d20b 100644 --- a/src/Services/CRM/Requisites/Service/RequisitePresetField.php +++ b/src/Services/CRM/Requisites/Service/RequisitePresetField.php @@ -37,7 +37,6 @@ class RequisitePresetField extends AbstractService * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-add.html * - * @param int $presetId * @param array{ * FIELD_NAME?: string, * FIELD_TITLE?: string, @@ -59,7 +58,7 @@ public function add(int $presetId, array $fields): AddedItemResult $this->core->call( 'crm.requisite.preset.field.add', [ - 'preset' => ['ID' => $presetId] + 'preset' => ['ID' => $presetId], 'fields' => $fields ] ) @@ -87,7 +86,7 @@ public function delete(int $id, int $presetId): DeletedItemResult 'crm.requisite.preset.field.delete', [ 'id' => $id, - 'preset' => ['ID' => $presetId] + 'preset' => ['ID' => $presetId], ] ) ); // ### @@ -132,7 +131,7 @@ public function get(int $id, int $presetId): RequisitePresetFieldResult 'crm.requisite.preset.field.get', [ 'id' => $id, - 'preset' => ['ID' => $presetId] + 'preset' => ['ID' => $presetId], ] ) ); @@ -143,7 +142,6 @@ public function get(int $id, int $presetId): RequisitePresetFieldResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-list.html * - * @param int $presetId * * @throws BaseException * @throws TransportException @@ -159,7 +157,7 @@ public function list(int $presetId): RequisitePresetFieldsResult $this->core->call( 'crm.requisite.preset.field.list', [ - 'preset' => ['ID' => $presetId] + 'preset' => ['ID' => $presetId], ] ) ); @@ -170,17 +168,12 @@ public function list(int $presetId): RequisitePresetFieldsResult * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-update.html * - * @param int $id - * @param array{ - * ID?: int, - * } $presetId * @param array{ * FIELD_NAME?: string, * FIELD_TITLE?: string, * SORT?: int, * IN_SHORT_LIST?: string, * } $fields - * * @throws BaseException * @throws TransportException */ @@ -189,7 +182,7 @@ public function list(int $presetId): RequisitePresetFieldsResult 'https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-update.html', 'Modifies a custom field in the requisites template' )] - public function update(int $id, int $presetId, array $fields): RequisitePresetFieldResult + public function update(int $id, int $presetId, array $fields): UpdatedItemResult { return new UpdatedItemResult( $this->core->call( @@ -197,7 +190,7 @@ public function update(int $id, int $presetId, array $fields): RequisitePresetFi [ 'id' => $id, 'preset' => ['ID' => $presetId], - 'fields' => $fields + 'fields' => $fields, ] ) ); @@ -208,7 +201,6 @@ public function update(int $id, int $presetId, array $fields): RequisitePresetFi * * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/presets/fields/crm-requisite-preset-field-available-to-add.html * - * @param int $presetId * * @throws BaseException * @throws TransportException @@ -224,7 +216,7 @@ public function availabletoadd(int $presetId): RequisitePresetAvailableFieldsRes $this->core->call( 'crm.requisite.preset.field.availabletoadd', [ - 'preset' => ['ID' => $presetId] + 'preset' => ['ID' => $presetId], ] ) ); From 60d03aff9aa52ff965151dfb388d4922091cd114 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Thu, 26 Jun 2025 15:09:34 +0400 Subject: [PATCH 13/17] run lint-cs-fixer --- src/Services/CRM/Requisites/Service/RequisitePresetField.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Services/CRM/Requisites/Service/RequisitePresetField.php b/src/Services/CRM/Requisites/Service/RequisitePresetField.php index 38a4d20b..4a9370e2 100644 --- a/src/Services/CRM/Requisites/Service/RequisitePresetField.php +++ b/src/Services/CRM/Requisites/Service/RequisitePresetField.php @@ -162,7 +162,7 @@ public function list(int $presetId): RequisitePresetFieldsResult ) ); } - + /** * Modifies a custom field in the requisites template. * @@ -195,7 +195,7 @@ public function update(int $id, int $presetId, array $fields): UpdatedItemResult ) ); } - + /** * Returns fields available for addition to the specified requisites template. * From fe450ea35f89c6d592e6f22d5c1b971b68ef9984 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Thu, 26 Jun 2025 16:38:41 +0400 Subject: [PATCH 14/17] run preset field tests, linters and unit tests --- Makefile | 4 + phpunit.xml.dist | 3 + src/Services/CRM/CRMServiceBuilder.php | 12 + ...php => RequisitePresetFieldItemResult.php} | 0 .../Result/RequisitePresetFieldResult.php | 2 +- .../Service/RequisiteBankdetailTest.php | 4 +- .../Service/RequisitePresetFieldTest.php | 224 ++++++++++++++++++ 7 files changed, 245 insertions(+), 4 deletions(-) rename src/Services/CRM/Requisites/Result/{RequisitePresetFiledItemResult.php => RequisitePresetFieldItemResult.php} (100%) create mode 100644 tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php diff --git a/Makefile b/Makefile index b30bd923..56526fcd 100644 --- a/Makefile +++ b/Makefile @@ -222,6 +222,10 @@ integration_tests_crm_quote: .PHONY: integration_tests_crm_requisite integration_tests_crm_requisite: docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_requisite + +.PHONY: integration_tests_crm_preset_field +integration_tests_crm_preset_field: + docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_preset_field # work dev environment .PHONY: php-dev-server-up diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d3c87420..48ba5bc8 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -70,6 +70,9 @@ ./tests/Integration/Services/CRM/Requisites/Service/RequisiteLinkTest.php + + ./tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php + diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index 4ace1972..31f1b44d 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -71,6 +71,18 @@ public function requisiteLink(): Requisites\Service\RequisiteLink return $this->serviceCache[__METHOD__]; } + + public function requisitePresetField(): Requisites\Service\RequisitePresetField + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Requisites\Service\RequisitePresetField( + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } public function contactCompany(): Contact\Service\ContactCompany { diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFieldItemResult.php similarity index 100% rename from src/Services/CRM/Requisites/Result/RequisitePresetFiledItemResult.php rename to src/Services/CRM/Requisites/Result/RequisitePresetFieldItemResult.php diff --git a/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php b/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php index ca38161d..66a4239f 100644 --- a/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php +++ b/src/Services/CRM/Requisites/Result/RequisitePresetFieldResult.php @@ -26,7 +26,7 @@ class RequisitePresetFieldResult extends AbstractResult /** * @throws \Bitrix24\SDK\Core\Exceptions\BaseException */ - public function presetfield(): RequisitePresetFieldItemResult + public function presetField(): RequisitePresetFieldItemResult { return new RequisitePresetFieldItemResult($this->getCoreResponse()->getResponseData()->getResult()); } diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php index c1e1db41..bd9d4970 100644 --- a/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteBankdetailTest.php @@ -83,9 +83,7 @@ protected function tearDown(): void public function testAllSystemFieldsAnnotated(): void { $fieldDescriptions = $this->bankService->fields()->getFieldsDescription(); - echo "Fields \n"; - print_r($fieldDescriptions); - + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisiteBankdetailItemResult::class); } diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php new file mode 100644 index 00000000..89ad0843 --- /dev/null +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php @@ -0,0 +1,224 @@ + + * + * 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\Requisites\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Core; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisitePresetFieldItemResult; +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisitePresetField; +use Bitrix24\SDK\Services\ServiceBuilder; +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 Symfony\Component\Uid\Uuid; + +/** + * Class RequisitePresetFieldTest + * + * @package Bitrix24\SDK\Tests\Integration\Services\CRM\Requisite\Service + */ +#[CoversMethod(RequisitePresetField::class,'add')] +#[CoversMethod(RequisitePresetField::class,'delete')] +#[CoversMethod(RequisitePresetField::class,'get')] +#[CoversMethod(RequisitePresetField::class,'list')] +#[CoversMethod(RequisitePresetField::class,'fields')] +#[CoversMethod(RequisitePresetField::class,'update')] +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisites\Service\RequisitePresetField::class)] +class RequisitePresetFieldTest extends TestCase +{ + use CustomBitrix24Assertions; + + protected ServiceBuilder $sb; + + protected RequisitePresetField $presetFieldService; + + protected int $presetId; + + protected function setUp(): void + { + $this->sb = Fabric::getServiceBuilder(); + + $entityTypeRequisiteId = current( + array_filter( + $this->sb->getCRMScope()->enum()->ownerType()->getItems(), + fn($item): bool => $item->SYMBOL_CODE === 'REQUISITE' + ) + )->ID; + + $countryId = current( + array_column( + array_filter( + $this->sb->getCRMScope()->requisitePreset()->countries()->getCountries(), + fn($item): bool => $item->CODE === 'US' + ), + 'ID' + ) + ); + + $name = sprintf('test req tpl %s', time()); + $this->presetId = $this->sb->getCRMScope()->requisitePreset()->add( + $entityTypeRequisiteId, + $countryId, + $name, + [ + 'XML_ID' => Uuid::v4()->toRfc4122(), + 'ACTIVE' => 'Y', + ] + )->getId(); + + $this->presetFieldService = $this->sb->getCRMScope()->requisitePresetField(); + } + + protected function tearDown(): void + { + $this->sb->getCRMScope()->requisitePreset()->delete($this->presetId); + } + + public function testAllSystemFieldsAnnotated(): void + { + $fieldDescriptions = $this->presetFieldService->fields()->getFieldsDescription(); + $propListFromApi = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($fieldDescriptions)); + + $this->assertBitrix24AllResultItemFieldsAnnotated($propListFromApi, RequisitePresetFieldItemResult::class); + } + + public function testAllSystemFieldsHasValidTypeAnnotation():void + { + $allFields = $this->presetFieldService->fields()->getFieldsDescription(); + $systemFieldsCodes = (new Core\Fields\FieldsFilter())->filterSystemFields(array_keys($allFields)); + $systemFields = array_filter($allFields, static fn($code): bool => in_array($code, $systemFieldsCodes, true), ARRAY_FILTER_USE_KEY); + + $this->assertBitrix24AllResultItemFieldsHasValidTypeAnnotation( + $systemFields, + RequisitePresetFieldItemResult::class); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testAdd(): void + { + $addedItemResult = $this->presetFieldService->add( + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => 'TEST', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 580 + ] + ); + self::assertGreaterThanOrEqual(1, $addedItemResult->getId()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testDelete(): void + { + $addedItemResult = $this->presetFieldService->add( + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => 'TEST', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 580 + ] + ); + self::assertTrue($this->presetFieldService->delete($addedItemResult->getId(), $this->presetId)->isSuccess()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testFields(): void + { + self::assertIsArray($this->presetFieldService->fields()->getFieldsDescription()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testGet(): void + { + $addedItemResult = $this->presetFieldService->add( + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => 'TEST', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 580 + ] + ); + self::assertGreaterThanOrEqual( + 1, + $this->presetFieldService->get($addedItemResult->getId(), $this->presetId)->presetField()->ID + ); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testList(): void + { + $this->presetFieldService->add( + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => 'TEST', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 580 + ] + ); + self::assertGreaterThanOrEqual(1, $this->presetFieldService->list($this->presetId)->getPresetFields()); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testUpdate(): void + { + $addedItemResult = $this->presetFieldService->add( + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => 'TEST', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 580 + ] + ); + $newTitle = 'Test2'; + + self::assertTrue( + $this->presetFieldService->update( + $addedItemResult->getId(), + $this->presetId, + [ + 'FIELD_NAME' => 'RQ_NAME', + 'FIELD_TITLE' => $newTitle + ] + )->isSuccess() + ); + self::assertEquals($newTitle, $this->presetFieldService->get($addedItemResult->getId(), $this->presetId)->presetField()->FIELD_TITLE); + } + +} From d056605edde7a2032cc90b61e6d614aad92c50d2 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Thu, 26 Jun 2025 17:02:04 +0400 Subject: [PATCH 15/17] add RequisiteUserfield classes --- src/Services/CRM/CRMServiceBuilder.php | 13 + .../Result/RequisiteUserfieldItemResult.php | 21 ++ .../Result/RequisiteUserfieldResult.php | 28 +++ .../Result/RequisiteUserfieldsResult.php | 35 +++ .../Requisites/Service/RequisiteUserfield.php | 236 ++++++++++++++++++ 5 files changed, 333 insertions(+) create mode 100644 src/Services/CRM/Requisites/Result/RequisiteUserfieldItemResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteUserfieldResult.php create mode 100644 src/Services/CRM/Requisites/Result/RequisiteUserfieldsResult.php create mode 100644 src/Services/CRM/Requisites/Service/RequisiteUserfield.php diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index 31f1b44d..586817e6 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -83,6 +83,19 @@ public function requisitePresetField(): Requisites\Service\RequisitePresetField return $this->serviceCache[__METHOD__]; } + + public function requisiteUserfield(): Requisites\Service\RequisiteUserfield + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Requisites\Service\RequisiteUserfield( + new UserfieldConstraints(), + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } public function contactCompany(): Contact\Service\ContactCompany { diff --git a/src/Services/CRM/Requisites/Result/RequisiteUserfieldItemResult.php b/src/Services/CRM/Requisites/Result/RequisiteUserfieldItemResult.php new file mode 100644 index 00000000..2b94b7f6 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteUserfieldItemResult.php @@ -0,0 +1,21 @@ + + * + * 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\Requisites\Result; + +use Bitrix24\SDK\Services\CRM\Userfield\Result\AbstractUserfieldItemResult; + +class RequisiteUserfieldItemResult extends AbstractUserfieldItemResult +{ +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteUserfieldResult.php b/src/Services/CRM/Requisites/Result/RequisiteUserfieldResult.php new file mode 100644 index 00000000..798e8669 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteUserfieldResult.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\Requisites\Result; + +use Bitrix24\SDK\Core\Result\AbstractResult; + +class RequisiteUserfieldResult extends AbstractResult +{ + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + public function userfieldItem(): RequisiteUserfieldItemResult + { + return new RequisiteUserfieldItemResult($this->getCoreResponse()->getResponseData()->getResult()); + } +} diff --git a/src/Services/CRM/Requisites/Result/RequisiteUserfieldsResult.php b/src/Services/CRM/Requisites/Result/RequisiteUserfieldsResult.php new file mode 100644 index 00000000..370d6c36 --- /dev/null +++ b/src/Services/CRM/Requisites/Result/RequisiteUserfieldsResult.php @@ -0,0 +1,35 @@ + + * + * 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\Requisites\Result; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Result\AbstractResult; + +class RequisiteUserfieldsResult extends AbstractResult +{ + /** + * @return \Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteUserfieldItemResult[] + * @throws BaseException + */ + public function getUserfields(): array + { + $res = []; + foreach ($this->getCoreResponse()->getResponseData()->getResult() as $item) { + $res[] = new RequisiteUserfieldItemResult($item); + } + + return $res; + } +} diff --git a/src/Services/CRM/Requisites/Service/RequisiteUserfield.php b/src/Services/CRM/Requisites/Service/RequisiteUserfield.php new file mode 100644 index 00000000..201b5ca6 --- /dev/null +++ b/src/Services/CRM/Requisites/Service/RequisiteUserfield.php @@ -0,0 +1,236 @@ + + * + * 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\Requisites\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\UpdatedItemResult; +use Bitrix24\SDK\Services\AbstractService; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteUserfieldResult; +use Bitrix24\SDK\Services\CRM\Requisites\Result\RequisiteUserfieldsResult; +use Bitrix24\SDK\Services\CRM\Userfield\Exceptions\UserfieldNameIsTooLongException; +use Bitrix24\SDK\Services\CRM\Userfield\Service\UserfieldConstraints; +use Psr\Log\LoggerInterface; + +#[ApiServiceMetadata(new Scope(['crm']))] +class RequisiteUserfield extends AbstractService +{ + public function __construct(private readonly UserfieldConstraints $userfieldConstraints, CoreInterface $core, LoggerInterface $logger) + { + parent::__construct($core, $logger); + } + + /** + * Returns a list of custom fields for requisites by filter. + * + * @param array{ + * ID?: string, + * ENTITY_ID?: string, + * FIELD_NAME?: string, + * USER_TYPE_ID?: string, + * XML_ID?: string, + * SORT?: string, + * MULTIPLE?: string, + * MANDATORY?: string, + * SHOW_FILTER?: string, + * SHOW_IN_LIST?: string, + * EDIT_IN_LIST?: string, + * IS_SEARCHABLE?: string, + * EDIT_FORM_LABEL?: string, + * LIST_COLUMN_LABEL?: string, + * LIST_FILTER_LABEL?: string, + * ERROR_MESSAGE?: string, + * HELP_MESSAGE?: string, + * LIST?: string, + * SETTINGS?: string, + * } $order + * @param array{ + * ID?: string, + * ENTITY_ID?: string, + * FIELD_NAME?: string, + * USER_TYPE_ID?: string, + * XML_ID?: string, + * SORT?: string, + * MULTIPLE?: string, + * MANDATORY?: string, + * SHOW_FILTER?: string, + * SHOW_IN_LIST?: string, + * EDIT_IN_LIST?: string, + * IS_SEARCHABLE?: string, + * EDIT_FORM_LABEL?: string, + * LIST_COLUMN_LABEL?: string, + * LIST_FILTER_LABEL?: string, + * ERROR_MESSAGE?: string, + * HELP_MESSAGE?: string, + * LIST?: string, + * SETTINGS?: string, + * } $filter + * + * @throws BaseException + * @throws TransportException + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-list.html + */ + #[ApiEndpointMetadata( + 'crm.requisite.userfield.list', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-list.html', + 'Returns a list of custom fields for requisites by filter' + )] + public function list(array $order, array $filter): RequisiteUserfieldsResult + { + return new RequisiteUserfieldsResult( + $this->core->call( + 'crm.requisite.userfield.list', + [ + 'order' => $order, + 'filter' => $filter, + ] + ) + ); + } + + /** + * Creates a new custom field for a requisite. + * + * System limitation for field name - 20 characters. + * Prefix UF_CRM_is always added to the user field name. + * As a result, the actual name length - 13 characters. + * + * @param array{ + * FIELD_NAME?: string, + * USER_TYPE_ID?: string, + * XML_ID?: string, + * SORT?: string, + * MULTIPLE?: string, + * MANDATORY?: string, + * SHOW_FILTER?: string, + * SHOW_IN_LIST?: string, + * EDIT_IN_LIST?: string, + * IS_SEARCHABLE?: string, + * EDIT_FORM_LABEL?: string|array, + * LIST_COLUMN_LABEL?: string|array, + * LIST_FILTER_LABEL?: string|array, + * ERROR_MESSAGE?: string, + * HELP_MESSAGE?: string, + * LIST?: string, + * SETTINGS?: array, + * } $userfieldItemFields + * + * @throws BaseException + * @throws TransportException + * @throws UserfieldNameIsTooLongException + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-add.html + * + */ + #[ApiEndpointMetadata( + 'crm.requisite.userfield.add', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-add.html', + 'Creates a new custom field for a requisite.' + )] + public function add(array $userfieldItemFields): AddedItemResult + { + $this->userfieldConstraints->validName($userfieldItemFields['FIELD_NAME']); + + return new AddedItemResult( + $this->core->call( + 'crm.requisite.userfield.add', + [ + 'fields' => $userfieldItemFields, + ] + ) + ); + } + + /** + * Deletes a custom field for a requisite + * + * + * @throws BaseException + * @throws TransportException + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-delete.html + * + */ + #[ApiEndpointMetadata( + 'crm.requisite.userfield.delete', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-delete.html', + 'Deletes a custom field for a requisite' + )] + public function delete(int $userfieldId): DeletedItemResult + { + return new DeletedItemResult( + $this->core->call( + 'crm.requisite.userfield.delete', + [ + 'id' => $userfieldId, + ] + ) + ); + } + + /** + * Returns a custom field for a requisite by identifier. + * + * + * @throws BaseException + * @throws TransportException + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-get.html + */ + #[ApiEndpointMetadata( + 'crm.requisite.userfield.get', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-get.html', + 'Returns a custom field for a requisite by identifier' + )] + public function get(int $userfieldItemId): RequisiteUserfieldResult + { + return new RequisiteUserfieldResult( + $this->core->call( + 'crm.requisite.userfield.get', + [ + 'id' => $userfieldItemId, + ] + ) + ); + } + + /** + * Modifies an existing custom field for a requisite. + * + * + * @throws BaseException + * @throws TransportException + * @link https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-update.html + */ + #[ApiEndpointMetadata( + 'crm.requisite.userfield.update', + 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-update.html', + 'Modifies an existing custom field for a requisite.' + )] + public function update(int $userfieldItemId, array $userfieldFieldsToUpdate): UpdatedItemResult + { + return new UpdatedItemResult( + $this->core->call( + 'crm.requisite.userfield.update', + [ + 'id' => $userfieldItemId, + 'fields' => $userfieldFieldsToUpdate, + ] + ) + ); + } +} From 8a2567a8e7e70363c9d05dbc810b7045af6c88a8 Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 30 Jun 2025 14:42:24 +0400 Subject: [PATCH 16/17] add and run tests, run linters --- Makefile | 4 + phpstan.neon.dist | 2 + phpunit.xml.dist | 3 + .../Requisites/Service/RequisiteUserfield.php | 2 +- .../Service/RequisiteUserfieldTest.php | 112 ++++++++++++ .../Service/RequisiteUserfieldUseCaseTest.php | 171 ++++++++++++++++++ 6 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldTest.php create mode 100644 tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php diff --git a/Makefile b/Makefile index ad29257d..b41aa4e4 100644 --- a/Makefile +++ b/Makefile @@ -246,6 +246,10 @@ integration_tests_crm_requisite: .PHONY: integration_tests_crm_preset_field integration_tests_crm_preset_field: docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_preset_field + +.PHONY: integration_tests_crm_requisite_userfield +integration_tests_crm_requisite_userfield: + docker-compose run --rm php-cli vendor/bin/phpunit --testsuite integration_tests_crm_requisite_userfield # work dev environment .PHONY: php-dev-server-up diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 4e2ac3d3..90918d01 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -27,6 +27,8 @@ parameters: - tests/Integration/Services/CRM/Lead/Service/LeadUserfieldTest.php - tests/Integration/Services/CRM/Currency - tests/Integration/Services/CRM/Requisites + excludePaths: + - tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php bootstrapFiles: - tests/bootstrap.php parallel: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index ab353182..08deec0b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -91,6 +91,9 @@ ./tests/Integration/Services/CRM/Requisites/Service/RequisitePresetFieldTest.php + + ./tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldTest.php + diff --git a/src/Services/CRM/Requisites/Service/RequisiteUserfield.php b/src/Services/CRM/Requisites/Service/RequisiteUserfield.php index 201b5ca6..96be433c 100644 --- a/src/Services/CRM/Requisites/Service/RequisiteUserfield.php +++ b/src/Services/CRM/Requisites/Service/RequisiteUserfield.php @@ -92,7 +92,7 @@ public function __construct(private readonly UserfieldConstraints $userfieldCons 'https://apidocs.bitrix24.com/api-reference/crm/requisites/user-fields/crm-requisite-userfield-list.html', 'Returns a list of custom fields for requisites by filter' )] - public function list(array $order, array $filter): RequisiteUserfieldsResult + public function list(array $order = [], array $filter = []): RequisiteUserfieldsResult { return new RequisiteUserfieldsResult( $this->core->call( diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldTest.php new file mode 100644 index 00000000..28e34f7f --- /dev/null +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldTest.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\Tests\Integration\Services\CRM\Requisites\Service; + +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteUserfield; +use Bitrix24\SDK\Tests\Builders\Services\CRM\Userfield\SystemUserfieldBuilder; +use Bitrix24\SDK\Services\ServiceBuilder; +use Bitrix24\SDK\Tests\Integration\Fabric; +use Generator; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\Attributes\CoversMethod; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; + +#[CoversClass(RequisiteUserfield::class)] +#[CoversMethod(RequisiteUserfield::class, 'add')] +#[CoversMethod(RequisiteUserfield::class, 'get')] +#[CoversMethod(RequisiteUserfield::class, 'list')] +#[CoversMethod(RequisiteUserfield::class, 'delete')] +#[CoversMethod(RequisiteUserfield::class, 'update')] +class RequisiteUserfieldTest extends TestCase +{ + protected ServiceBuilder $sb; + + protected RequisiteUserfield $userfieldService; + + protected function setUp(): void + { + $this->sb = Fabric::getServiceBuilder(); + $this->userfieldService = $this->sb->getCRMScope()->requisiteUserfield(); + } + + /** + * @throws \Exception + */ + public static function systemUserfieldsDemoDataDataProvider(): Generator + { + yield 'user type id string' => [ + (new SystemUserfieldBuilder())->build(), + ]; + + mt_srand(); + yield 'user type id integer' => [ + (new SystemUserfieldBuilder('integer'))->build(), + ]; + } + + #[DataProvider('systemUserfieldsDemoDataDataProvider')] + public function testAdd(array $newUserFieldItem): void + { + self::assertGreaterThanOrEqual(1, $this->userfieldService->add($newUserFieldItem)->getId()); + } + + #[DataProvider('systemUserfieldsDemoDataDataProvider')] + public function testDelete(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $this->assertTrue($this->userfieldService->delete($newUserfieldId)->isSuccess()); + } + + #[DataProvider('systemUserfieldsDemoDataDataProvider')] + public function testGet(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $requisiteUserfieldItemResult = $this->userfieldService->get($newUserfieldId)->userfieldItem(); + $this->assertEquals($newUserfieldId, $requisiteUserfieldItemResult->ID); + $this->assertEquals($newUserFieldItem['USER_TYPE_ID'], $requisiteUserfieldItemResult->USER_TYPE_ID); + $this->assertEquals('UF_CRM_' . $newUserFieldItem['FIELD_NAME'], $requisiteUserfieldItemResult->FIELD_NAME); + $this->assertEquals($newUserFieldItem['XML_ID'], $requisiteUserfieldItemResult->XML_ID); + } + + #[DataProvider('systemUserfieldsDemoDataDataProvider')] + public function testUpdate(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $requisiteUserfieldItemResult = $this->userfieldService->get($newUserfieldId)->userfieldItem(); + $this->assertEquals($newUserfieldId, $requisiteUserfieldItemResult->ID); + $this->assertEquals($newUserFieldItem['USER_TYPE_ID'], $requisiteUserfieldItemResult->USER_TYPE_ID); + $this->assertEquals('UF_CRM_' . $newUserFieldItem['FIELD_NAME'], $requisiteUserfieldItemResult->FIELD_NAME); + $this->assertEquals($newUserFieldItem['XML_ID'], $requisiteUserfieldItemResult->XML_ID); + + $this->assertTrue( + $this->userfieldService->update( + $newUserfieldId, + [ + 'EDIT_FORM_LABEL' => $newUserFieldItem['EDIT_FORM_LABEL']['en'] . 'QQQ', + ] + )->isSuccess() + ); + + $ufFieldAfter = $this->userfieldService->get($newUserfieldId)->userfieldItem(); + $this->assertEquals($requisiteUserfieldItemResult->EDIT_FORM_LABEL['en'] . 'QQQ', $ufFieldAfter->EDIT_FORM_LABEL['en']); + } + + public function testList(): void + { + $requisiteUserfieldsResult = $this->userfieldService->list([], []); + $this->assertGreaterThanOrEqual(0, count($requisiteUserfieldsResult->getUserfields())); + } + +} diff --git a/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php b/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php new file mode 100644 index 00000000..c2c6a5af --- /dev/null +++ b/tests/Integration/Services/CRM/Requisites/Service/RequisiteUserfieldUseCaseTest.php @@ -0,0 +1,171 @@ + + * + * 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\Requisites\Service; + +use Bitrix24\SDK\Core\Exceptions\BaseException; +use Bitrix24\SDK\Core\Exceptions\TransportException; +use Bitrix24\SDK\Services\CRM\Requisites\Service\Requisite; +use Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteUserfield; +use Bitrix24\SDK\Services\CRM\Company\Service\Company; +use Bitrix24\SDK\Tests\Builders\Services\CRM\CompanyBuilder; +use Bitrix24\SDK\Tests\Builders\Services\CRM\RequisiteBuilder; + +use Bitrix24\SDK\Tests\Integration\Fabric; +use Bitrix24\SDK\Services\ServiceBuilder; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Uid\Uuid; + +#[\PHPUnit\Framework\Attributes\CoversClass(\Bitrix24\SDK\Services\CRM\Requisites\Service\RequisiteUserfield::class)] +class RequisiteUserfieldUseCaseTest extends TestCase +{ + public const COMPANY_OWNER_TYPE_ID = 4; + + protected ServiceBuilder $sb; + + protected Requisite $requisiteService; + + protected RequisiteUserfield $requisiteUserfieldService; + + protected int $requisiteUserfieldId; + + protected Company $companyService; + + private int $companyId = 0; + + protected int $presetId; + + private int $requisiteId = 0; + + /** + * @throws \Bitrix24\SDK\Services\CRM\Userfield\Exceptions\UserfieldNameIsTooLongException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @throws \Bitrix24\SDK\Core\Exceptions\InvalidArgumentException + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + */ + protected function setUp(): void + { + $this->sb = Fabric::getServiceBuilder(); + $this->requisiteService = $this->sb->getCRMScope()->requisite(); + $this->requisiteUserfieldService = $this->sb->getCRMScope()->requisiteUserfield(); + + $fieldName = sprintf('%s%s', substr((string)random_int(0, PHP_INT_MAX), 0, 3), time()); + $this->requisiteUserfieldId = $this->requisiteUserfieldService->add( + [ + 'FIELD_NAME' => $fieldName, + 'EDIT_FORM_LABEL' => [ + 'ru' => 'тест uf тип string', + 'en' => 'test uf type string', + ], + 'LIST_COLUMN_LABEL' => [ + 'ru' => 'тест uf тип string', + 'en' => 'test uf type string', + ], + 'USER_TYPE_ID' => 'string', + 'XML_ID' => 'b24phpsdk_type_string', + 'SETTINGS' => [ + 'DEFAULT_VALUE' => 'hello world', + ], + ] + )->getId(); + + $this->companyService = $this->sb->getCRMScope()->company(); + + $entityTypeRequisiteId = current( + array_filter( + $this->sb->getCRMScope()->enum()->ownerType()->getItems(), + fn($item): bool => $item->SYMBOL_CODE === 'REQUISITE' + ) + )->ID; + + $countryId = current( + array_column( + array_filter( + $this->sb->getCRMScope()->requisitePreset()->countries()->getCountries(), + fn($item): bool => $item->CODE === 'US' + ), + 'ID' + ) + ); + + $name = sprintf('test req tpl %s', time()); + $this->presetId = $this->sb->getCRMScope()->requisitePreset()->add( + $entityTypeRequisiteId, + $countryId, + $name, + [ + 'XML_ID' => Uuid::v4()->toRfc4122(), + 'ACTIVE' => 'Y', + ] + )->getId(); + + [$this->companyId, $this->requisiteId] = $this->addCompanyAndRequisite($this->presetId); + + $this->sb->getCRMScope()->requisitePresetField()->add( + $this->presetId, + [ + 'FIELD_NAME' => 'UF_CRM_'.$fieldName, + 'FIELD_TITLE' => 'TEST USERFIELD', + 'IN_SHORT_LIST' => 'N', + 'SORT' => 590 + ] + ); + } + + protected function tearDown(): void + { + $this->requisiteService->delete($this->requisiteId); + $this->companyService->delete($this->companyId); + $this->requisiteUserfieldService->delete($this->requisiteUserfieldId); + $this->sb->getCRMScope()->requisitePreset()->delete($this->presetId); + } + + /** + * @throws BaseException + * @throws TransportException + */ + public function testOperationsWithUserfieldFromRequisitesItem(): void + { + // get userfield metadata + $requisiteUserfieldItemResult = $this->requisiteUserfieldService->get($this->requisiteUserfieldId)->userfieldItem(); + $ufOriginalFieldName = $requisiteUserfieldItemResult->getOriginalFieldName(); + $ufFieldName = $requisiteUserfieldItemResult->FIELD_NAME; + + // update requisite userfield value + $newUfValue = 'test 2'; + $this->assertTrue( + $this->requisiteService->update( + $this->requisiteId, + [ + $ufFieldName => $newUfValue, + ] + )->isSuccess() + ); + $requisiteItemResult = $this->requisiteService->list([], ['ID' => $this->requisiteId],['*', $ufFieldName])->getRequisites()[0]; + $this->assertEquals($newUfValue, $requisiteItemResult->getUserfieldByFieldName($ufOriginalFieldName)); + } + + protected function addCompanyAndRequisite(int $presetId = 0): array { + $companyId = $this->companyService->add((new CompanyBuilder())->build())->getId(); + $requisiteId = $this->requisiteService->add( + $companyId, + self::COMPANY_OWNER_TYPE_ID, + $presetId, + 'Test requisite '.$presetId, + (new RequisiteBuilder(self::COMPANY_OWNER_TYPE_ID, $companyId, $presetId))->build() + )->getId(); + + return [$companyId, $requisiteId]; + } + +} From dd597d94b5a37a46c8eab5ab3ce1aa3845425c4f Mon Sep 17 00:00:00 2001 From: Vadim Soluyanov Date: Mon, 30 Jun 2025 15:31:43 +0400 Subject: [PATCH 17/17] update changelog --- CHANGELOG.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d77ac4e..e1cc8e07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,39 @@ ### Added +- Added service `CRM\Requisites\Service\RequisiteUserfield` with support methods, + see [add crm.requisite.userfield.* methods](https://github.com/bitrix24/b24phpsdk/issues/188): + - `add` add userfield to requisite + - `get` get userfield to requisite + - `list` list userfields + - `delete` delete userfield + - `update` update userfield +- Added service `CRM\Requisites\Service\RequisiteBankdetail` with support methods: + - `add` add bank detail to requisite + - `get` get bank detail to requisite + - `fields` get fields for bank details + - `list` list bank details + - `delete` delete bank detail + - `update` update bank detail + - `countByFilter` count bank details by filter +- Added service `CRM\Requisites\Service\RequisiteLink` with support methods: + - `register` registers the link between requisites and an object + - `unregister` removes the link between requisites and an object + - `fields` get a formal description of the fields of the requisites link + - `get` returns the link between requisites and an object + - `list` returns a list of links between requisites based on a filter + - `countByFilter` count links by filter +- Added service `CRM\Requisites\Service\RequisitePresetField` with support methods: + - `add` adds a customizable field to the requisites template + - `get` returns the description of the custom field in the requisites template by identifier + - `fields` returns the description of the custom field in the requisites template by identifier + - `list` returns a list of all custom fields for a specific requisites template + - `delete` deletes a customizable field from the requisites template + - `update` modifies a custom field in the requisites template + - `availabletoadd` returns fields available for addition to the specified requisites template - Added service `Services\CRM\Lead\Service\LeadContact` with support methods, see [crm.lead.contact.* methods](https://github.com/bitrix24/b24phpsdk/issues/170): - - `fields` get fiels for lead contact connection + - `fields` get fields for lead contact connection - `setItems` set contacts related with lead - `get` get contacts related to lead - `deleteItems` delete all relations for lead