diff --git a/src/Model/Entity/Integration/Bot/BotConfiguration.php b/src/Model/Entity/Integration/Bot/BotConfiguration.php index 475d797..ed8d102 100644 --- a/src/Model/Entity/Integration/Bot/BotConfiguration.php +++ b/src/Model/Entity/Integration/Bot/BotConfiguration.php @@ -50,4 +50,12 @@ class BotConfiguration * @JMS\SerializedName("name") */ public $name; + + /** + * @var string + * + * @JMS\Type("string") + * @JMS\SerializedName("endpointUrl") + */ + public $endpointUrl; } diff --git a/src/Model/Entity/Loyalty/BonusDetail.php b/src/Model/Entity/Loyalty/BonusDetail.php new file mode 100644 index 0000000..16e3e84 --- /dev/null +++ b/src/Model/Entity/Loyalty/BonusDetail.php @@ -0,0 +1,37 @@ +") + * @JMS\SerializedName("date") + */ + public $date; + + /** + * @var float + * + * @JMS\Type("float") + * @JMS\SerializedName("amount") + */ + public $amount; +} diff --git a/src/Model/Entity/Loyalty/Loyalty.php b/src/Model/Entity/Loyalty/Loyalty.php index 18310f4..4a28f29 100644 --- a/src/Model/Entity/Loyalty/Loyalty.php +++ b/src/Model/Entity/Loyalty/Loyalty.php @@ -22,6 +22,14 @@ use RetailCrm\Api\Component\Serializer\Annotation as JMS; */ class Loyalty { + /** + * @var \RetailCrm\Api\Model\Entity\Loyalty\LoyaltyLevel[] + * + * @JMS\Type("array") + * @JMS\SerializedName("levels") + */ + public $levels; + /** * @var bool * diff --git a/src/Model/Entity/Loyalty/LoyaltyLevel.php b/src/Model/Entity/Loyalty/LoyaltyLevel.php index da8b7ff..fc56e2f 100644 --- a/src/Model/Entity/Loyalty/LoyaltyLevel.php +++ b/src/Model/Entity/Loyalty/LoyaltyLevel.php @@ -43,6 +43,14 @@ class LoyaltyLevel */ public $name; + /** + * @var int + * + * @JMS\Type("int") + * @JMS\SerializedName("sum") + */ + public $sum; + /** * @var float * diff --git a/src/Model/Filter/Loyalty/LoyaltyAccountBonusApiFilterType.php b/src/Model/Filter/Loyalty/LoyaltyAccountBonusApiFilterType.php new file mode 100644 index 0000000..f4ef2e1 --- /dev/null +++ b/src/Model/Filter/Loyalty/LoyaltyAccountBonusApiFilterType.php @@ -0,0 +1,29 @@ +") + * @Form\SerializedName("date") + */ + public $date; +} diff --git a/src/Model/Request/Loyalty/BonusAccountDetailsRequest.php b/src/Model/Request/Loyalty/BonusAccountDetailsRequest.php new file mode 100644 index 0000000..e25e803 --- /dev/null +++ b/src/Model/Request/Loyalty/BonusAccountDetailsRequest.php @@ -0,0 +1,49 @@ +") + * @JMS\SerializedName("bonuses") + */ + public $bonuses; +} diff --git a/src/Model/Response/Loyalty/LoyaltyBonusStatisticResponse.php b/src/Model/Response/Loyalty/LoyaltyBonusStatisticResponse.php new file mode 100644 index 0000000..2cee423 --- /dev/null +++ b/src/Model/Response/Loyalty/LoyaltyBonusStatisticResponse.php @@ -0,0 +1,29 @@ +status = 'bonus_status'; + * $request->id = 1; + * $request->limit = 2; + * $request->page = 1; + * $request->filter = new LoyaltyAccountBonusApiFilterType(); + * $request->filter->date = new DateTime(); + * + * $response = $client->loyalty->getBonusAccountDetails( + * $request->status, + * $request->id, + * $request + * ); + * } catch (ApiExceptionInterface $exception) { + * echo sprintf( + * 'Error from RetailCRM API (status code: %d): %s', + * $exception->getStatusCode(), + * $exception->getMessage() + * ); + * + * if (count($exception->getErrorResponse()->errors) > 0) { + * echo PHP_EOL . 'Errors: ' . implode(', ', $exception->getErrorResponse()->errors); + * } + * + * return; + * } + * + * echo 'Total bonus amount: ' . $response->statistic->totalAmount; + * ``` + * + * @param int $id + * @param string $status + * @param \RetailCrm\Api\Model\Request\Loyalty\BonusAccountDetailsRequest $request + * + * @return \RetailCrm\Api\Model\Response\Loyalty\BonusAccountDetailsResponse + * @throws \RetailCrm\Api\Exception\Api\AccountDoesNotExistException + * @throws \RetailCrm\Api\Exception\Api\ApiErrorException + * @throws \RetailCrm\Api\Exception\Api\MissingCredentialsException + * @throws \RetailCrm\Api\Exception\Api\MissingParameterException + * @throws \RetailCrm\Api\Exception\Api\ValidationException + * @throws \RetailCrm\Api\Exception\Client\HandlerException + * @throws \RetailCrm\Api\Exception\Client\HttpClientException + * @throws \RetailCrm\Api\Interfaces\ApiExceptionInterface + * @throws \RetailCrm\Api\Interfaces\ClientExceptionInterface + */ + public function getBonusAccountDetails( + int $id, + string $status, + BonusAccountDetailsRequest $request + ): BonusAccountDetailsResponse { + /** @var BonusAccountDetailsResponse $response */ + $response = $this->sendRequest( + RequestMethod::GET, + 'loyalty/account/' . $id . '/bonus/' . $status . '/details', + $request, + BonusAccountDetailsResponse::class + ); + + return $response; + } } diff --git a/tests/src/ResourceGroup/LoyaltyTest.php b/tests/src/ResourceGroup/LoyaltyTest.php index 9a6a2bc..bdd6bd5 100644 --- a/tests/src/ResourceGroup/LoyaltyTest.php +++ b/tests/src/ResourceGroup/LoyaltyTest.php @@ -20,15 +20,19 @@ use RetailCrm\Api\Enum\NumericBoolean; use RetailCrm\Api\Enum\RequestMethod; use RetailCrm\Api\Model\Entity\CustomersCorporate\SerializedEntityCustomer; use RetailCrm\Api\Model\Entity\CustomersCorporate\SerializedRelationAbstractCustomer; +use RetailCrm\Api\Model\Entity\Loyalty\BonusDetail; use RetailCrm\Api\Model\Entity\Loyalty\LoyaltyAccount; use RetailCrm\Api\Model\Entity\Loyalty\SerializedCreateLoyaltyAccount; use RetailCrm\Api\Model\Entity\Loyalty\SerializedOrder; use RetailCrm\Api\Model\Entity\Loyalty\SerializedOrderDelivery; use RetailCrm\Api\Model\Entity\Loyalty\SerializedOrderProduct; use RetailCrm\Api\Model\Entity\Loyalty\SerializedOrderProductOffer; +use RetailCrm\Api\Model\Entity\Pagination; use RetailCrm\Api\Model\Filter\Loyalty\LoyaltyAccountApiFilterType; +use RetailCrm\Api\Model\Filter\Loyalty\LoyaltyAccountBonusApiFilterType; use RetailCrm\Api\Model\Filter\Loyalty\LoyaltyAccountBonusOperationsApiFilterType; use RetailCrm\Api\Model\Filter\Loyalty\LoyaltyApiFilterType; +use RetailCrm\Api\Model\Request\Loyalty\BonusAccountDetailsRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltiesRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltyAccountCreateRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltyAccountEditRequest; @@ -36,6 +40,8 @@ use RetailCrm\Api\Model\Request\Loyalty\LoyaltyAccountsRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltyBonusCreditRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltyBonusOperationsRequest; use RetailCrm\Api\Model\Request\Loyalty\LoyaltyCalculateRequest; +use RetailCrm\Api\Model\Response\Loyalty\BonusAccountDetailsResponse; +use RetailCrm\Api\Model\Response\Loyalty\LoyaltyBonusStatisticResponse; use RetailCrm\TestUtils\Factory\TestClientFactory; use RetailCrm\TestUtils\TestCase\AbstractApiResourceGroupTestCase; @@ -825,4 +831,47 @@ EOF; self::assertModelEqualsToResponse($json, $response); } + + public function testGetBonusAccountDetails(): void + { + $json = <<<'EOF' +{ + "statistic": { + "totalAmount": 2.1 + }, + "bonuses": [ + { + "date": "2021-03-17 18:08:02", + "amount": 1.2 + } + ], + "pagination": { + "limit": 10, + "totalCount": 20, + "currentPage": 2, + "totalPageCount": 30 + }, + "success": true +} +EOF; + + $mock = static::createApiMockBuilder('loyalty/account/4/bonus/bonus_status/details'); + $mock->matchMethod(RequestMethod::GET) + ->reply(200) + ->withBody($json); + + $request = new BonusAccountDetailsRequest(); + $request->status = 'bonus_status'; + $request->id = 1; + $request->limit = 2; + $request->page = 1; + $request->filter = new LoyaltyAccountBonusApiFilterType(); + $request->filter->date = new DateTime(); + + + $client = TestClientFactory::createClient($mock->getClient()); + $response = $client->loyalty->getBonusAccountDetails(4, 'bonus_status', $request); + + self::assertModelEqualsToResponse($json, $response); + } }