CreditmemoProcessor.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. /**
  3. * @copyright Vertex. All rights reserved. https://www.vertexinc.com/
  4. * @author Mediotype https://www.mediotype.com/
  5. */
  6. namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;
  7. use Magento\Framework\Intl\DateTimeFactory;
  8. use Magento\Sales\Api\Data\CreditmemoInterface;
  9. use Magento\Sales\Api\OrderAddressRepositoryInterface;
  10. use Magento\Sales\Api\OrderRepositoryInterface;
  11. use Magento\Store\Model\ScopeInterface;
  12. use Vertex\Services\Invoice\RequestInterface;
  13. use Vertex\Services\Invoice\RequestInterfaceFactory;
  14. use Vertex\Tax\Model\Api\Data\CustomerBuilder;
  15. use Vertex\Tax\Model\Api\Data\SellerBuilder;
  16. use Vertex\Tax\Model\Api\Utility\DeliveryTerm;
  17. use Vertex\Tax\Model\Config;
  18. /**
  19. * Processes a Magento Creditmemo and returns a Vertex Invoice Request
  20. */
  21. class CreditmemoProcessor
  22. {
  23. /** @var Config */
  24. private $config;
  25. /** @var CustomerBuilder */
  26. private $customerBuilder;
  27. /** @var DateTimeFactory */
  28. private $dateTimeFactory;
  29. /** @var DeliveryTerm */
  30. private $deliveryTerm;
  31. /** @var OrderAddressRepositoryInterface */
  32. private $orderAddressRepository;
  33. /** @var OrderRepositoryInterface */
  34. private $orderRepository;
  35. /** @var CreditmemoProcessorInterface */
  36. private $processorPool;
  37. /** @var RequestInterfaceFactory */
  38. private $requestFactory;
  39. /** @var SellerBuilder */
  40. private $sellerBuilder;
  41. /**
  42. * @param OrderAddressRepositoryInterface $orderAddressRepository
  43. * @param SellerBuilder $sellerBuilder
  44. * @param CustomerBuilder $customerBuilder
  45. * @param RequestInterfaceFactory $requestFactory
  46. * @param Config $config
  47. * @param DeliveryTerm $deliveryTerm
  48. * @param DateTimeFactory $dateTimeFactory
  49. * @param CreditmemoProcessorInterface $processorPool
  50. * @param OrderRepositoryInterface $orderRepository
  51. */
  52. public function __construct(
  53. OrderAddressRepositoryInterface $orderAddressRepository,
  54. SellerBuilder $sellerBuilder,
  55. CustomerBuilder $customerBuilder,
  56. RequestInterfaceFactory $requestFactory,
  57. Config $config,
  58. DeliveryTerm $deliveryTerm,
  59. DateTimeFactory $dateTimeFactory,
  60. CreditmemoProcessorInterface $processorPool,
  61. OrderRepositoryInterface $orderRepository
  62. ) {
  63. $this->orderAddressRepository = $orderAddressRepository;
  64. $this->sellerBuilder = $sellerBuilder;
  65. $this->customerBuilder = $customerBuilder;
  66. $this->requestFactory = $requestFactory;
  67. $this->config = $config;
  68. $this->deliveryTerm = $deliveryTerm;
  69. $this->dateTimeFactory = $dateTimeFactory;
  70. $this->processorPool = $processorPool;
  71. $this->orderRepository = $orderRepository;
  72. }
  73. /**
  74. * Process a Magento Creditmemo and return a Vertex Invoice Request
  75. *
  76. * @param CreditmemoInterface $creditmemo
  77. * @return RequestInterface
  78. */
  79. public function process(CreditmemoInterface $creditmemo)
  80. {
  81. $address = $creditmemo->getShippingAddressId()
  82. ? $this->orderAddressRepository->get($creditmemo->getShippingAddressId())
  83. : $this->orderAddressRepository->get($creditmemo->getBillingAddressId());
  84. $order = $this->orderRepository->get($creditmemo->getOrderId());
  85. $scopeCode = $creditmemo->getStoreId();
  86. $seller = $this->sellerBuilder
  87. ->setScopeType(ScopeInterface::SCOPE_STORE)
  88. ->setScopeCode($scopeCode)
  89. ->build();
  90. $customer = $this->customerBuilder->buildFromOrderAddress(
  91. $address,
  92. $order->getCustomerId(),
  93. $order->getCustomerGroupId(),
  94. $scopeCode
  95. );
  96. /** @var RequestInterface $request */
  97. $request = $this->requestFactory->create();
  98. $request->setShouldReturnAssistedParameters(true);
  99. $request->setDocumentNumber($order->getIncrementId());
  100. $request->setDocumentDate($this->dateTimeFactory->create());
  101. $request->setTransactionType(RequestInterface::TRANSACTION_TYPE_SALE);
  102. $request->setSeller($seller);
  103. $request->setCustomer($customer);
  104. $request->setCurrencyCode($creditmemo->getBaseCurrencyCode());
  105. $this->deliveryTerm->addIfApplicable($request);
  106. if ($this->config->getLocationCode($scopeCode)) {
  107. $request->setLocationCode($this->config->getLocationCode($scopeCode));
  108. }
  109. $request = $this->processorPool->process($request, $creditmemo);
  110. return $request;
  111. }
  112. }