Skip to content

Commit

Permalink
Merge pull request #34 from rarus/task#30
Browse files Browse the repository at this point in the history
task#30 Реализовать поддержку метода /organization/calculate
  • Loading branch information
rarus-web authored Jul 23, 2018
2 parents 2dba790 + d0ff15a commit b2b4a44
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# bonus-server-php-sdk change log

## 0.3.4 (23.07.2018)
- для сущности `Discounts` в транспорте для роли `Organization` добавлен метод `calculateDiscountsAndBonusDiscounts`

## 0.3.3 (28.06.2018)
- для сущности `Discounts` добавлен транспорт для роли `Organization` с методом `calculateDiscounts`
- добавлен форматер для сущности `ChequeRow`
Expand Down
63 changes: 63 additions & 0 deletions examples/discount.CalculateBonus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
require_once __DIR__ . '/init.php';
require_once '../tests/DemoDataGenerator.php';

use Rarus\BonusServer\Discounts;
use Rarus\BonusServer\Transactions;
use Rarus\BonusServer\Cards;
use Rarus\BonusServer\Shops;

$discountsTransport = Discounts\Transport\Role\Organization\Fabric::getInstance($apiClient, new \Money\Currency('RUB'), $log);
$cardsTransport = Cards\Transport\Role\Organization\Fabric::getInstance($apiClient, new \Money\Currency('RUB'), $log);
$shopTransport = Shops\Transport\Fabric::getInstance($apiClient, new \Money\Currency('RUB'), $log);

$newCard = Cards\DTO\Fabric::createNewInstance((string)random_int(1000000, 100000000), (string)random_int(1000000, 100000000), new \Money\Currency('RUB'));
$card = $cardsTransport->addNewCard($newCard);
$card = $cardsTransport->activate($card);

print(sprintf('сard id: %s' . PHP_EOL, $card->getCardId()->getId()));
print(sprintf('сard code: %s' . PHP_EOL, $card->getCode()));

$newShop = Shops\DTO\Fabric::createNewInstance('Новый магазин');
$shop = $shopTransport->add($newShop);
print(sprintf('shop id: %s' . PHP_EOL, $shop->getShopId()->getId()));
print(sprintf('shop name: %s' . PHP_EOL, $shop->getName()));


// табличная часть транзакции
$discountDocument = new Discounts\DTO\Document();
$discountDocument
->setShopId($shop->getShopId())
->setCard($card)
->setChequeRows(DemoDataGenerator::createChequeRows(random_int(1, 20), new \Money\Currency('RUB')));

print('документ для предрасчёта скидок:' . PHP_EOL);
$estimate = $discountsTransport->calculateDiscountsAndBonusDiscounts($discountDocument);

print('результаты предрасчёта:' . PHP_EOL);
print('Строки документа:' . PHP_EOL);
foreach ($estimate->getDocumentItems() as $documentItem) {
print(sprintf('%s | %s | %s шт. | с ценой %s копеек в валюте %s | итого: %s | процент скидки %s на сумму %s' . PHP_EOL,
$documentItem->getLineNumber(),
$documentItem->getArticleId()->getId(),
$documentItem->getQuantity(),
$documentItem->getPrice()->getAmount(),
$documentItem->getPrice()->getCurrency()->getCode(),
$documentItem->getSum()->getAmount(),
$documentItem->getBonus()->getPercent(),
$documentItem->getBonus()->getSum()->getAmount()
));
}
print('Скидки:' . PHP_EOL);
foreach ($estimate->getDiscountItems() as $discountItem) {
print(sprintf('%s |скидка %s с id %s | тип %s|значение %s| подарки из сегмента - %s|' . PHP_EOL,
$discountItem->getLineNumber(),
$discountItem->getName(),
$discountItem->getDiscountId()->getId(),
$discountItem->getTypeId(),
$discountItem->getValue(),
$discountItem->getGiftSegment() === null ? 'нет подарков ' : $discountItem->getGiftSegment()->getId()

));
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,37 @@ public function calculateDiscounts(BonusServer\Discounts\DTO\Document $discountD

return $estimate;
}

/**
* Метод вызывается для рассчёта скидки на товар для вывода на витрине. При вызове выполняется расчет суммовых и подарочных скидок.
* Метод возвращает список примененных к строкам чека скидок и рассчитанный документ, производится рассчёт бонусных скидок
*
* @param Discounts\DTO\Document $discountDocument
*
* @return Discounts\DTO\Estimate
* @throws BonusServer\Exceptions\ApiClientException
* @throws BonusServer\Exceptions\NetworkException
* @throws BonusServer\Exceptions\UnknownException
*
*/
public function calculateDiscountsAndBonusDiscounts(BonusServer\Discounts\DTO\Document $discountDocument): Discounts\DTO\Estimate
{
$this->log->debug('rarus.bonus.server.Discounts.transport.calculateDiscountsAndBonusDiscounts.start', [
'role' => 'organization',
]);

$requestResult = $this->apiClient->executeApiRequest(
'/organization/calculate',
RequestMethodInterface::METHOD_POST,
Discounts\Formatters\Document::toArray($discountDocument)
);

$estimate = Discounts\DTO\Fabric::initEstimateFromServerResponse($this->getDefaultCurrency(), $requestResult);
$this->log->debug('rarus.bonus.server.Discounts.transport.calculateDiscountsAndBonusDiscounts.start', [
'documentItemsCount' => $estimate->getDocumentItems()->count(),
'discountItemsCount' => $estimate->getDiscountItems()->count(),
]);

return $estimate;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,33 @@ class TransportTest extends \PHPUnit_Framework_TestCase
*/
private $discountTransport;

/**
* @covers \Rarus\BonusServer\Discounts\Transport\Role\Organization\Transport::calculateDiscountsAndBonusDiscounts()
*/
public function testCalculateDiscountsAndBonusDiscountsMethod(): void
{
$newCard = Cards\DTO\Fabric::createNewInstance((string)random_int(1000000, 100000000), (string)random_int(1000000, 100000000), new \Money\Currency('RUB'));
$card = $this->cardTransport->addNewCard($newCard);
$card = $this->cardTransport->activate($card);


$newShop = Shops\DTO\Fabric::createNewInstance('Новый магазин');
$shop = $this->shopTransport->add($newShop);

// табличная часть транзакции
$discountDocument = new Discounts\DTO\Document();
$discountDocument
->setShopId($shop->getShopId())
->setCard($card)
->setChequeRows(\DemoDataGenerator::createChequeRows(random_int(1, 20), \TestEnvironmentManager::getDefaultCurrency()));

$estimate = $this->discountTransport->calculateDiscountsAndBonusDiscounts($discountDocument);
}

/**
* @covers \Rarus\BonusServer\Discounts\Transport\Role\Organization\Transport::calculateDiscounts()
*/
public function testcalculateDiscountsMethod(): void
public function testCalculateDiscountsMethod(): void
{
$newCard = Cards\DTO\Fabric::createNewInstance((string)random_int(1000000, 100000000), (string)random_int(1000000, 100000000), new \Money\Currency('RUB'));
$card = $this->cardTransport->addNewCard($newCard);
Expand Down

0 comments on commit b2b4a44

Please sign in to comment.