diff --git a/src/Rarus/BonusServer/Discounts/DTO/Estimate.php b/src/Rarus/BonusServer/Discounts/DTO/Estimate.php index acc79b4..4f14544 100644 --- a/src/Rarus/BonusServer/Discounts/DTO/Estimate.php +++ b/src/Rarus/BonusServer/Discounts/DTO/Estimate.php @@ -24,10 +24,15 @@ final class Estimate */ private $discountItems; /** - * @var \Rarus\BonusServer\Cards\DTO\PaymentDistribution\PaymentDistributionCollection|null + * @var PaymentDistributionCollection|null */ private $paymentDistributionCollection; + /** + * @var DiscountItemCollection + */ + private $chequeDiscounts; + /** * @var int|null */ @@ -74,7 +79,7 @@ public function setDocumentItems(DocumentItemCollection $documentItems): Estimat } /** - * @param \Rarus\BonusServer\Cards\DTO\PaymentDistribution\PaymentDistributionCollection $paymentDistributionCollection + * @param PaymentDistributionCollection $paymentDistributionCollection * * @return Estimate */ @@ -86,7 +91,7 @@ public function setPaymentDistributionCollection( } /** - * @return \Rarus\BonusServer\Cards\DTO\PaymentDistribution\PaymentDistributionCollection|null + * @return PaymentDistributionCollection|null */ public function getPaymentDistributionCollection(): ?PaymentDistributionCollection { @@ -111,4 +116,15 @@ public function getMaxPayment(): ?int { return $this->maxPayment; } + + public function getChequeDiscounts(): DiscountItemCollection + { + return $this->chequeDiscounts; + } + + public function setChequeDiscounts(DiscountItemCollection $chequeDiscounts): Estimate + { + $this->chequeDiscounts = $chequeDiscounts; + return $this; + } } diff --git a/src/Rarus/BonusServer/Discounts/DTO/Fabric.php b/src/Rarus/BonusServer/Discounts/DTO/Fabric.php index 611bcb0..3dda565 100644 --- a/src/Rarus/BonusServer/Discounts/DTO/Fabric.php +++ b/src/Rarus/BonusServer/Discounts/DTO/Fabric.php @@ -62,6 +62,14 @@ public static function initEstimateFromServerResponse(Currency $currency, array $est->setPaymentDistributionCollection($paymentDistributionCollection); } + $chequeItemCollection = new Discounts\DTO\DiscountItems\DiscountItemCollection(); + if (!empty($arEstimate['cheque_discounts'])) { + foreach ($arEstimate['cheque_discounts'] as $discountItem) { + $chequeItemCollection->attach(Discounts\DTO\DiscountItems\Fabric::initFromServerResponse($currency, $discountItem)); + } + } + $est->setChequeDiscounts($chequeItemCollection); + if (!empty($arEstimate['max_payment'])) { $est->setMaxPayment((int)$arEstimate['max_payment']); } diff --git a/src/Rarus/BonusServer/Discounts/Formatters/DiscountRow.php b/src/Rarus/BonusServer/Discounts/Formatters/DiscountRow.php index bb324ac..2a3de91 100644 --- a/src/Rarus/BonusServer/Discounts/Formatters/DiscountRow.php +++ b/src/Rarus/BonusServer/Discounts/Formatters/DiscountRow.php @@ -8,6 +8,7 @@ use Money\Formatter\DecimalMoneyFormatter; use Rarus\BonusServer\Discounts\DTO\DiscountItems\DiscountItem; use Rarus\BonusServer\Transactions; +use Rarus\BonusServer\Util\MoneyParser; /** * Class DiscountRow @@ -29,4 +30,13 @@ public static function toArray(DiscountItem $discountItem): array 'discount_value' => $discountItem->getValue(), ]; } + + public static function toCalculateHistory(DiscountItem $discountItem): array + { + return [ + 'line_number' => $discountItem->getLineNumber(), + 'discount_id' => $discountItem->getDiscountId()->getId() ?: '', + 'discount_summ' => (float)MoneyParser::convertMoneyToString($discountItem->getSum()) + ]; + } } diff --git a/src/Rarus/BonusServer/Transactions/DTO/AbstractTransaction.php b/src/Rarus/BonusServer/Transactions/DTO/AbstractTransaction.php index 244cb44..1571607 100644 --- a/src/Rarus/BonusServer/Transactions/DTO/AbstractTransaction.php +++ b/src/Rarus/BonusServer/Transactions/DTO/AbstractTransaction.php @@ -10,6 +10,7 @@ use Rarus\BonusServer\Holds\DTO\HoldId; use Rarus\BonusServer\Shops\DTO\ShopId; use Rarus\BonusServer\Transactions\DTO\CashRegister\CashRegister; +use Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection; use Rarus\BonusServer\Transactions\DTO\ChequeRows\ChequeRowCollection; use Rarus\BonusServer\Transactions\DTO\Document\Document; use Rarus\BonusServer\Transactions\DTO\PaymentTypes\PaymentTypeCollection; @@ -67,13 +68,18 @@ abstract class AbstractTransaction */ protected $discountItemCollection; /** - * @var \Rarus\BonusServer\Transactions\DTO\PaymentTypes\PaymentTypeCollection|null + * @var PaymentTypeCollection|null */ protected $paymentTypeCollection; /** - * @var \Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection|null + * @var CertPaymentCollection|null */ protected $certPaymentCollection; + + /** + * @var DiscountItemCollection|null + */ + protected $calculateHistoryCollection; /** * @var HoldId|null */ @@ -180,12 +186,13 @@ public function getDiscountItemCollection(): ?DiscountItemCollection /** * @param DiscountItemCollection $discountItemCollection */ - public function setDiscountItemCollection(DiscountItemCollection $discountItemCollection): void + public function setDiscountItemCollection(DiscountItemCollection $discountItemCollection): AbstractTransaction { $this->discountItemCollection = $discountItemCollection; + return $this; } /** - * @return \Rarus\BonusServer\Transactions\DTO\PaymentTypes\PaymentTypeCollection + * @return PaymentTypeCollection */ public function getPaymentTypeCollection(): ?PaymentTypeCollection { @@ -193,7 +200,7 @@ public function getPaymentTypeCollection(): ?PaymentTypeCollection } /** - * @param \Rarus\BonusServer\Transactions\DTO\PaymentTypes\PaymentTypeCollection $paymentTypeCollection + * @param PaymentTypeCollection $paymentTypeCollection */ public function setPaymentTypeCollection( PaymentTypeCollection $paymentTypeCollection @@ -202,19 +209,30 @@ public function setPaymentTypeCollection( } /** - * @return \Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection|null + * @return CertPaymentCollection|null */ - public function getCertPaymentCollection(): ?\Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection + public function getCertPaymentCollection(): ?CertPaymentCollection { return $this->certPaymentCollection; } /** - * @param \Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection|null $certPaymentCollection + * @param CertPaymentCollection|null $certPaymentCollection */ public function setCertPaymentCollection( - ?\Rarus\BonusServer\Transactions\DTO\CertPayments\CertPaymentCollection $certPaymentCollection + ?CertPaymentCollection $certPaymentCollection ): void { $this->certPaymentCollection = $certPaymentCollection; } + + public function getCalculateHistoryCollection(): ?DiscountItemCollection + { + return $this->calculateHistoryCollection; + } + + public function setCalculateHistoryCollection(?DiscountItemCollection $calculateHistoryCollection + ): AbstractTransaction { + $this->calculateHistoryCollection = $calculateHistoryCollection; + return $this; + } } diff --git a/src/Rarus/BonusServer/Transactions/DTO/ChequeRows/ChequeRow.php b/src/Rarus/BonusServer/Transactions/DTO/ChequeRows/ChequeRow.php index 05c70a5..7a3b0dc 100644 --- a/src/Rarus/BonusServer/Transactions/DTO/ChequeRows/ChequeRow.php +++ b/src/Rarus/BonusServer/Transactions/DTO/ChequeRows/ChequeRow.php @@ -42,6 +42,10 @@ final class ChequeRow * @var Money */ private $discount; + /** + * @var Money|null + */ + private $bonusPaymentSum; /** * @return int @@ -182,4 +186,15 @@ public function setDiscount(Money $discount): ChequeRow return $this; } + + public function getBonusPaymentSum(): ?Money + { + return $this->bonusPaymentSum; + } + + public function setBonusPaymentSum(?Money $bonusPaymentSum): ChequeRow + { + $this->bonusPaymentSum = $bonusPaymentSum; + return $this; + } } diff --git a/src/Rarus/BonusServer/Transactions/DTO/Products/Fabric.php b/src/Rarus/BonusServer/Transactions/DTO/Products/Fabric.php index 4ab1563..e0e9e32 100644 --- a/src/Rarus/BonusServer/Transactions/DTO/Products/Fabric.php +++ b/src/Rarus/BonusServer/Transactions/DTO/Products/Fabric.php @@ -33,7 +33,7 @@ public static function initProductRowFromServerResponse(Currency $currency, arra ->setName((string)$arResponse['item_name']) ->setQuantity((int)$arResponse['quantity']) ->setPrice($moneyParser->parse((string)$arResponse['price'], $currency->getCode())) - ->setDiscount($moneyParser->parse((string)$arResponse['price'], $currency->getCode())); + ->setDiscount($moneyParser->parse((string)$arResponse['discount'], $currency->getCode())); return $productRow; } diff --git a/src/Rarus/BonusServer/Transactions/DTO/SalesHistory/Fabric.php b/src/Rarus/BonusServer/Transactions/DTO/SalesHistory/Fabric.php index 192e8cb..874de4e 100644 --- a/src/Rarus/BonusServer/Transactions/DTO/SalesHistory/Fabric.php +++ b/src/Rarus/BonusServer/Transactions/DTO/SalesHistory/Fabric.php @@ -9,10 +9,12 @@ use Money\Currencies\ISOCurrencies; use Money\Parser\DecimalMoneyParser; use Rarus\BonusServer\Cards\DTO\CardId; +use Rarus\BonusServer\Exceptions\ApiClientException; use Rarus\BonusServer\Shops\DTO\ShopId; use Rarus\BonusServer\Transactions\DTO\Document\DocumentId; use Rarus\BonusServer\Transactions\DTO\CashRegister\CashRegisterId; use Rarus\BonusServer\Transactions; +use Rarus\BonusServer\Util\DateTimeParser; /** * Class Fabric @@ -23,16 +25,13 @@ class Fabric { /** * @param Currency $currency - * @param array $arResponse - * + * @param array $arResponse + * @param \DateTimeZone $dateTimeZone * @return HistoryItem - * @throws \Rarus\BonusServer\Exceptions\ApiClientException + * @throws ApiClientException */ - public static function initHistoryItemFromServerResponse(Currency $currency, array $arResponse): HistoryItem + public static function initHistoryItemFromServerResponse(Currency $currency, array $arResponse, \DateTimeZone $dateTimeZone): HistoryItem { - $operationDate = new \DateTime(); - $operationDate->setTimestamp((int)$arResponse['date']); - $moneyParser = new DecimalMoneyParser(new ISOCurrencies()); $productRowCollection = new Transactions\DTO\Products\ProductRowCollection(); @@ -43,7 +42,7 @@ public static function initHistoryItemFromServerResponse(Currency $currency, arr $operation = new HistoryItem(); $operation ->setLineNumber((int)$arResponse['row_number']) - ->setDate($operationDate) + ->setDate(DateTimeParser::parseTimestampFromServerResponse((string)$arResponse['date'], $dateTimeZone)) ->setDocumentId(new DocumentId((string)$arResponse['doc_id'])) ->setCardId(new CardId((string)$arResponse['card_id'])) ->setShopId(new ShopId((string)$arResponse['shop_id'])) @@ -57,9 +56,7 @@ public static function initHistoryItemFromServerResponse(Currency $currency, arr ->setProducts($productRowCollection); if ($arResponse['date_calculate_local'] !== 0) { - $operationDate = new \DateTime(); - $operationDate->setTimestamp((int)$arResponse['date_calculate_local']); - $operation->setDateCalculate($operationDate); + $operation->setDateCalculate(DateTimeParser::parseTimestampFromServerResponse((string)$arResponse['date_calculate_local'], $dateTimeZone)); } return $operation; diff --git a/src/Rarus/BonusServer/Transactions/Formatters/ChequeRow.php b/src/Rarus/BonusServer/Transactions/Formatters/ChequeRow.php index 50456a8..313bba4 100644 --- a/src/Rarus/BonusServer/Transactions/Formatters/ChequeRow.php +++ b/src/Rarus/BonusServer/Transactions/Formatters/ChequeRow.php @@ -29,6 +29,9 @@ public static function toArray(Transactions\DTO\ChequeRows\ChequeRow $chequeRow) 'price' => (float)MoneyParser::convertMoneyToString($chequeRow->getPrice()), 'summ' => (float)MoneyParser::convertMoneyToString($chequeRow->getSum()), 'discount_summ' => (float)MoneyParser::convertMoneyToString($chequeRow->getDiscount()), + 'bonus_payment_sum' => $chequeRow->getBonusPaymentSum() ? (float)MoneyParser::convertMoneyToString( + $chequeRow->getBonusPaymentSum() + ) : null ]; } } diff --git a/src/Rarus/BonusServer/Transactions/Formatters/Sale.php b/src/Rarus/BonusServer/Transactions/Formatters/Sale.php index 891adb4..b5ff875 100644 --- a/src/Rarus/BonusServer/Transactions/Formatters/Sale.php +++ b/src/Rarus/BonusServer/Transactions/Formatters/Sale.php @@ -49,6 +49,13 @@ public static function toArray(Transactions\DTO\Sale $saleTrx): array } } + $arCalculateHistory = []; + if ($saleTrx->getCalculateHistoryCollection()) { + foreach ($saleTrx->getCalculateHistoryCollection() as $discount) { + $arCalculateHistory[] = DiscountRow::toCalculateHistory($discount); + } + } + return [ 'operation_type' => 'sale', 'level_up' => true, @@ -69,7 +76,8 @@ public static function toArray(Transactions\DTO\Sale $saleTrx): array 'cert_payments' => $arCertPayments, 'hold_id' => $saleTrx->getHoldId() ? $saleTrx->getHoldId()->getId() : null, 'hold_used' => $saleTrx->isHoldUsed(), - 'test' => $saleTrx->isTest() + 'test' => $saleTrx->isTest(), + 'calculate_history' => $arCalculateHistory ]; } } diff --git a/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/Transport.php b/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/Transport.php index 1780d5a..ff573d5 100644 --- a/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/Transport.php +++ b/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/Transport.php @@ -5,6 +5,11 @@ namespace Rarus\BonusServer\Transactions\Transport\Role\Organization; use Rarus\BonusServer; +use Rarus\BonusServer\Exceptions\ApiClientException; +use Rarus\BonusServer\Exceptions\NetworkException; +use Rarus\BonusServer\Exceptions\UnknownException; +use Rarus\BonusServer\Transactions\DTO\Document\DocumentId; +use Rarus\BonusServer\Transactions\DTO\SalesHistory\HistoryItem; use Rarus\BonusServer\Transport\DTO\Pagination; use Rarus\BonusServer\Transactions\DTO\SalesHistory\HistoryItemCollection; use Fig\Http\Message\RequestMethodInterface; @@ -60,7 +65,8 @@ public function getSalesHistoryByCard(BonusServer\Cards\DTO\Card $card, ?\DateTi foreach ((array)$requestResult['sales'] as $arSaleItem) { $historySalesCollection->attach(BonusServer\Transactions\DTO\SalesHistory\Fabric::initHistoryItemFromServerResponse( $this->getDefaultCurrency(), - $arSaleItem + $arSaleItem, + $this->apiClient->getTimezone() )); } $historySalesCollection->rewind(); @@ -77,6 +83,42 @@ public function getSalesHistoryByCard(BonusServer\Cards\DTO\Card $card, ?\DateTi return $historySalesCollection; } + /** + * @param DocumentId $documentId + * @return HistoryItem|null + * @throws ApiClientException + * @throws NetworkException + * @throws UnknownException + */ + public function getSaleHistoryByDocumentId(BonusServer\Transactions\DTO\Document\DocumentId $documentId): ?HistoryItem + { + $this->log->debug('rarus.bonus.server.transactions.transport.organization.getSaleHistoryByDocumentId.start', [ + 'documentId' => $documentId->getId() + ]); + + try { + $requestResult = $this->apiClient->executeApiRequest( + sprintf('/organization/sale_info?doc_id=%s&card_info=true&cheque_items_info=true&payment_info=true&transactions_not_accrued_info=true', $documentId->getId()), + RequestMethodInterface::METHOD_GET + ); + + if (!empty($requestResult['sales'])) { + return (BonusServer\Transactions\DTO\SalesHistory\Fabric::initHistoryItemFromServerResponse( + $this->getDefaultCurrency(), + $requestResult['sales'][0], + $this->apiClient->getTimezone() + )); + } + } catch (BonusServer\Exceptions\ApiClientException $exception) { + // если транзакции не найдены, то сервер возвращает 404 статус выставив 114 код в данном случае мы его подавляем + if ($exception->getCode() !== 114) { + throw $exception; + } + } + + return null; + } + /** * @param BonusServer\Cards\DTO\Card $card * @param \DateTime|null $dateFrom @@ -159,7 +201,7 @@ public function addSaleTransaction(BonusServer\Transactions\DTO\Sale $saleTransa 'cardId' => $saleTransaction->getCardId()->getId(), 'shopId' => $saleTransaction->getShopId()->getId(), 'doc_id' => $saleTransaction->getDocument()->getId(), - 'hold_id' => $saleTransaction->getHoldId()->getId(), + 'hold_id' => $saleTransaction->getHoldId() ? $saleTransaction->getHoldId()->getId() : null, 'bonus_payment' => $saleTransaction->getBonusPayment(), 'kkm_id' => $saleTransaction->getCashRegister()->getId(), 'dateCalculate' => $dateCalculate === null ? null : $dateCalculate->format(\DATE_ATOM), diff --git a/tests/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/TransportTest.php b/tests/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/TransportTest.php index c8343ef..cec7edb 100644 --- a/tests/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/TransportTest.php +++ b/tests/src/Rarus/BonusServer/Transactions/Transport/Role/Organization/TransportTest.php @@ -59,6 +59,34 @@ public function testGetSalesHistoryByCard(): void $this->cardTransport->delete($card, true); } + public function testGetSaleHistoryByDocumentId(): 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); + + // конструируем транзакцию + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + $this->transactionTransport->addSaleTransaction(\DemoDataGenerator::createNewSaleTransaction($card, $shop, \TestEnvironmentManager::getDefaultCurrency())); + + $historyCollection = $this->transactionTransport->getSalesHistoryByCard($card); + $historyItem = $historyCollection->current(); + $docId = $historyItem->getDocumentId(); + $historyItem = $this->transactionTransport->getSaleHistoryByDocumentId($docId); + + $this->assertInstanceOf(Transactions\DTO\SalesHistory\HistoryItem::class, $historyItem); + + $this->shopTransport->delete($shop); + $this->cardTransport->delete($card, true); + } + /** * @covers \Rarus\BonusServer\Transactions\Transport\Role\Organization\Transport::addSaleTransaction() */