From 88949f58e49034e554e802205049f93be9e29442 Mon Sep 17 00:00:00 2001 From: mesilov Date: Sun, 28 Nov 2021 21:31:41 +0300 Subject: [PATCH] first deal userfields build Signed-off-by: mesilov --- CHANGELOG.md | 6 +- src/Services/CRM/CRMServiceBuilder.php | 15 ++ .../CRM/Deal/Result/DealItemResult.php | 10 + .../Deal/Result/DealUserfieldItemResult.php | 12 + .../CRM/Deal/Result/DealUserfieldResult.php | 19 ++ .../CRM/Deal/Result/DealUserfieldsResult.php | 26 +++ src/Services/CRM/Deal/Service/Deal.php | 2 +- .../CRM/Deal/Service/DealUserfield.php | 205 ++++++++++++++++++ .../CRM/Deal/Service/DealUserfieldTest.php | 142 ++++++++++++ .../Deal/Service/DealUserfieldUseCaseTest.php | 92 ++++++++ 10 files changed, 527 insertions(+), 2 deletions(-) create mode 100644 src/Services/CRM/Deal/Result/DealUserfieldItemResult.php create mode 100644 src/Services/CRM/Deal/Result/DealUserfieldResult.php create mode 100644 src/Services/CRM/Deal/Result/DealUserfieldsResult.php create mode 100644 src/Services/CRM/Deal/Service/DealUserfield.php create mode 100644 tests/Integration/Services/CRM/Deal/Service/DealUserfieldTest.php create mode 100644 tests/Integration/Services/CRM/Deal/Service/DealUserfieldUseCaseTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index cfe372e0..a7836731 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,12 @@ * add method `countByFilter` for all related services, see issue [Добавить для всех сущностей метод подсчёта количества элементов по фильтру #228](https://github.com/mesilov/bitrix24-php-sdk/issues/228) * add in scope «CRM» Userfield service and integration test -* add in scope «CRM» ContactUserfield service and integration test +* add in scope «CRM» ContactUserfield service and integration test, see + issue [Добавить для всех сущностей метод подсчёта количества элементов по фильтру #231](https://github.com/mesilov/bitrix24-php-sdk/issues/231) * add method getUserfieldByFieldName for `ContactItemResult` +* add in scope «CRM» DealUserfield service and integration test, see + issue [Добавить для всех сущностей метод подсчёта количества элементов по фильтру #232](https://github.com/mesilov/bitrix24-php-sdk/issues/232) +* add method getUserfieldByFieldName for `DealItemResult` * add exception `UserfieldNotFoundException` ### Removed diff --git a/src/Services/CRM/CRMServiceBuilder.php b/src/Services/CRM/CRMServiceBuilder.php index 672fabf9..82b5040e 100644 --- a/src/Services/CRM/CRMServiceBuilder.php +++ b/src/Services/CRM/CRMServiceBuilder.php @@ -70,6 +70,21 @@ public function deal(): Deal\Service\Deal return $this->serviceCache[__METHOD__]; } + /** + * @return \Bitrix24\SDK\Services\CRM\Deal\Service\DealUserfield + */ + public function dealUserfield(): Deal\Service\DealUserfield + { + if (!isset($this->serviceCache[__METHOD__])) { + $this->serviceCache[__METHOD__] = new Deal\Service\DealUserfield( + $this->core, + $this->log + ); + } + + return $this->serviceCache[__METHOD__]; + } + /** * @return Contact\Service\Contact */ diff --git a/src/Services/CRM/Deal/Result/DealItemResult.php b/src/Services/CRM/Deal/Result/DealItemResult.php index e0341648..0737bca9 100644 --- a/src/Services/CRM/Deal/Result/DealItemResult.php +++ b/src/Services/CRM/Deal/Result/DealItemResult.php @@ -47,4 +47,14 @@ */ class DealItemResult extends AbstractCrmItem { + /** + * @param string $userfieldName + * + * @return mixed|null + * @throws \Bitrix24\SDK\Services\CRM\Userfield\Exceptions\UserfieldNotFoundException + */ + public function getUserfieldByFieldName(string $userfieldName) + { + return $this->getKeyWithUserfieldByFieldName($userfieldName); + } } \ No newline at end of file diff --git a/src/Services/CRM/Deal/Result/DealUserfieldItemResult.php b/src/Services/CRM/Deal/Result/DealUserfieldItemResult.php new file mode 100644 index 00000000..7531eae9 --- /dev/null +++ b/src/Services/CRM/Deal/Result/DealUserfieldItemResult.php @@ -0,0 +1,12 @@ +getCoreResponse()->getResponseData()->getResult()->getResultData()); + } +} \ No newline at end of file diff --git a/src/Services/CRM/Deal/Result/DealUserfieldsResult.php b/src/Services/CRM/Deal/Result/DealUserfieldsResult.php new file mode 100644 index 00000000..af523d1a --- /dev/null +++ b/src/Services/CRM/Deal/Result/DealUserfieldsResult.php @@ -0,0 +1,26 @@ +getCoreResponse()->getResponseData()->getResult()->getResultData() as $item) { + $res[] = new DealUserfieldItemResult($item); + } + + return $res; + } +} \ No newline at end of file diff --git a/src/Services/CRM/Deal/Service/Deal.php b/src/Services/CRM/Deal/Service/Deal.php index fac6432e..5f37aa57 100644 --- a/src/Services/CRM/Deal/Service/Deal.php +++ b/src/Services/CRM/Deal/Service/Deal.php @@ -236,7 +236,7 @@ public function list(array $order, array $filter, array $select, int $startItem * @throws BaseException * @throws TransportException */ - public function update(int $id, array $fields, array $params): UpdatedItemResult + public function update(int $id, array $fields, array $params = []): UpdatedItemResult { return new UpdatedItemResult( $this->core->call( diff --git a/src/Services/CRM/Deal/Service/DealUserfield.php b/src/Services/CRM/Deal/Service/DealUserfield.php new file mode 100644 index 00000000..e250db76 --- /dev/null +++ b/src/Services/CRM/Deal/Service/DealUserfield.php @@ -0,0 +1,205 @@ +core->call( + 'crm.deal.userfield.list', + [ + 'order' => $order, + 'filter' => $filter, + ] + ) + ); + } + + /** + * Created new user field for deals. + * + * 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, + * LIST_COLUMN_LABEL?: string, + * LIST_FILTER_LABEL?: string, + * ERROR_MESSAGE?: string, + * HELP_MESSAGE?: string, + * LIST?: string, + * SETTINGS?: string, + * } $userfieldItemFields + * + * @return \Bitrix24\SDK\Core\Result\AddedItemResult + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @throws UserfieldNameIsTooLongException + * @link https://training.bitrix24.com/rest_help/crm/deals/crm_deal_userfield_add.php + * + */ + public function add(array $userfieldItemFields): AddedItemResult + { + if (strlen($userfieldItemFields['FIELD_NAME']) > 13) { + throw new UserfieldNameIsTooLongException( + sprintf( + 'userfield name %s is too long %s, maximum length - 13 characters', + $userfieldItemFields['FIELD_NAME'], + strlen($userfieldItemFields['FIELD_NAME']) + ) + ); + } + + return new AddedItemResult( + $this->core->call( + 'crm.deal.userfield.add', + [ + 'fields' => $userfieldItemFields, + ] + ) + ); + } + + /** + * Deleted userfield for deals + * + * @param int $userfieldId + * + * @return \Bitrix24\SDK\Core\Result\DeletedItemResult + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @link https://training.bitrix24.com/rest_help/crm/deals/crm_deal_userfield_delete.php + * + */ + public function delete(int $userfieldId): DeletedItemResult + { + return new DeletedItemResult( + $this->core->call( + 'crm.deal.userfield.delete', + [ + 'id' => $userfieldId, + ] + ) + ); + } + + /** + * Returns a userfield for deal by ID. + * + * @param int $userfieldItemId + * + * @return \Bitrix24\SDK\Services\CRM\Deal\Result\DealUserfieldResult + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @link https://training.bitrix24.com/rest_help/crm/deals/crm_deal_userfield_get.php + */ + public function get(int $userfieldItemId): DealUserfieldResult + { + return new DealUserfieldResult( + $this->core->call( + 'crm.deal.userfield.get', + [ + 'id' => $userfieldItemId, + ] + ) + ); + } + + /** + * Updates an existing user field for deals. + * + * @param int $userfieldItemId + * @param array $userfieldFieldsToUpdate + * + * @return \Bitrix24\SDK\Core\Result\UpdatedItemResult + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @link https://training.bitrix24.com/rest_help/crm/deals/crm_deal_userfield_update.php + */ + public function update(int $userfieldItemId, array $userfieldFieldsToUpdate): UpdatedItemResult + { + return new UpdatedItemResult( + $this->core->call( + 'crm.deal.userfield.update', + [ + 'id' => $userfieldItemId, + 'fields' => $userfieldFieldsToUpdate, + ] + ) + ); + } +} \ No newline at end of file diff --git a/tests/Integration/Services/CRM/Deal/Service/DealUserfieldTest.php b/tests/Integration/Services/CRM/Deal/Service/DealUserfieldTest.php new file mode 100644 index 00000000..3055e8bc --- /dev/null +++ b/tests/Integration/Services/CRM/Deal/Service/DealUserfieldTest.php @@ -0,0 +1,142 @@ + [ + [ + 'FIELD_NAME' => sprintf('%s%s', substr((string)random_int(0, PHP_INT_MAX), 0, 3), time()), + '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' => [], + ], + ]; + + mt_srand(); + yield 'user type id integer' => [ + [ + 'FIELD_NAME' => sprintf('%s%s', substr((string)random_int(0, PHP_INT_MAX), 0, 3), time()), + 'EDIT_FORM_LABEL' => [ + 'ru' => 'тест uf тип integer', + 'en' => 'test uf type integer', + ], + 'LIST_COLUMN_LABEL' => [ + 'ru' => 'тест uf тип integer', + 'en' => 'test uf type integer', + ], + 'USER_TYPE_ID' => 'integer', + 'XML_ID' => 'b24phpsdk_type_integer', + 'SETTINGS' => [], + ], + ]; + } + + /** + * @param array $newUserFieldItem + * + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @throws \Bitrix24\SDK\Services\CRM\Userfield\Exceptions\UserfieldNameIsTooLongException + * @covers ContactUserfield::add + * @dataProvider systemUserfieldsDemoDataDataProvider + */ + public function testAdd(array $newUserFieldItem): void + { + self::assertGreaterThanOrEqual(1, $this->userfieldService->add($newUserFieldItem)->getId()); + } + + /** + * @param array $newUserFieldItem + * + * @dataProvider systemUserfieldsDemoDataDataProvider + * @covers ContactUserfield::delete + */ + public function testDelete(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $this->assertTrue($this->userfieldService->delete($newUserfieldId)->isSuccess()); + } + + /** + * @param array $newUserFieldItem + * + * @dataProvider systemUserfieldsDemoDataDataProvider + * @covers ContactUserfield::get + */ + public function testGet(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $ufField = $this->userfieldService->get($newUserfieldId)->userfieldItem(); + $this->assertEquals($newUserfieldId, $ufField->ID); + $this->assertEquals($newUserFieldItem['USER_TYPE_ID'], $ufField->USER_TYPE_ID); + $this->assertEquals('UF_CRM_' . $newUserFieldItem['FIELD_NAME'], $ufField->FIELD_NAME); + $this->assertEquals($newUserFieldItem['XML_ID'], $ufField->XML_ID); + } + + /** + * @param array $newUserFieldItem + * + * @dataProvider systemUserfieldsDemoDataDataProvider + * @covers ContactUserfield::update + */ + public function testUpdate(array $newUserFieldItem): void + { + $newUserfieldId = $this->userfieldService->add($newUserFieldItem)->getId(); + $ufFieldBefore = $this->userfieldService->get($newUserfieldId)->userfieldItem(); + $this->assertEquals($newUserfieldId, $ufFieldBefore->ID); + $this->assertEquals($newUserFieldItem['USER_TYPE_ID'], $ufFieldBefore->USER_TYPE_ID); + $this->assertEquals('UF_CRM_' . $newUserFieldItem['FIELD_NAME'], $ufFieldBefore->FIELD_NAME); + $this->assertEquals($newUserFieldItem['XML_ID'], $ufFieldBefore->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($ufFieldBefore->EDIT_FORM_LABEL['en'] . 'QQQ', $ufFieldAfter->EDIT_FORM_LABEL['en']); + } + + /** + * @throws \Bitrix24\SDK\Core\Exceptions\BaseException + * @throws \Bitrix24\SDK\Core\Exceptions\TransportException + * @covers \Bitrix24\SDK\Services\CRM\Contact\Service\ContactUserfield::list + */ + public function testList(): void + { + $ufFields = $this->userfieldService->list([], []); + $this->assertGreaterThanOrEqual(0, count($ufFields->getUserfields())); + } + + public function setUp(): void + { + $this->userfieldService = Fabric::getServiceBuilder()->getCRMScope()->dealUserfield(); + } +} \ No newline at end of file diff --git a/tests/Integration/Services/CRM/Deal/Service/DealUserfieldUseCaseTest.php b/tests/Integration/Services/CRM/Deal/Service/DealUserfieldUseCaseTest.php new file mode 100644 index 00000000..88f9d1a1 --- /dev/null +++ b/tests/Integration/Services/CRM/Deal/Service/DealUserfieldUseCaseTest.php @@ -0,0 +1,92 @@ +dealUserfieldService->get($this->dealUserfieldId)->userfieldItem(); + $ufOriginalFieldName = $ufMetadata->getOriginalFieldName(); + $ufFieldName = $ufMetadata->FIELD_NAME; + + // add deal with uf value + $fieldNameValue = 'test field value'; + $newDealId = $this->dealService->add( + [ + 'TITLE' => 'test deal', + $ufFieldName => $fieldNameValue, + ] + )->getId(); + $deal = $this->dealService->get($newDealId)->deal(); + $this->assertEquals($fieldNameValue, $deal->getUserfieldByFieldName($ufOriginalFieldName)); + + // update deal userfield value + $newUfValue = 'test 2'; + $this->assertTrue( + $this->dealService->update( + $deal->ID, + [ + $ufFieldName => $newUfValue, + ] + )->isSuccess() + ); + $updatedDeal = $this->dealService->get($deal->ID)->deal(); + $this->assertEquals($newUfValue, $updatedDeal->getUserfieldByFieldName($ufOriginalFieldName)); + } + + /** + * @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 + */ + public function setUp(): void + { + $this->dealService = Fabric::getServiceBuilder()->getCRMScope()->deal(); + $this->dealUserfieldService = Fabric::getServiceBuilder()->getCRMScope()->dealUserfield(); + + $this->dealUserfieldId = $this->dealUserfieldService->add( + [ + 'FIELD_NAME' => sprintf('%s%s', substr((string)random_int(0, PHP_INT_MAX), 0, 3), time()), + '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(); + } + + public function tearDown(): void + { + $this->dealUserfieldService->delete($this->dealUserfieldId); + } +} \ No newline at end of file