OrderProcessor.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;
  3. use Magento\Sales\Api\Data\OrderAddressInterface;
  4. use Magento\Sales\Api\Data\OrderInterface;
  5. use Magento\Sales\Model\Order;
  6. use Magento\Store\Model\ScopeInterface;
  7. use Vertex\Services\Invoice\RequestInterface;
  8. use Vertex\Services\Invoice\RequestInterfaceFactory;
  9. use Vertex\Tax\Model\Api\Data\CustomerBuilder;
  10. use Vertex\Tax\Model\Api\Data\SellerBuilder;
  11. use Vertex\Tax\Model\Api\Utility\DeliveryTerm;
  12. use Vertex\Tax\Model\Config;
  13. use Vertex\Tax\Model\DateTimeImmutableFactory;
  14. /**
  15. * Processes a Magento Order and returns a Vertex Invoice Request
  16. */
  17. class OrderProcessor
  18. {
  19. /** @var Config */
  20. private $config;
  21. /** @var CustomerBuilder */
  22. private $customerBuilder;
  23. /** @var DateTimeImmutableFactory */
  24. private $dateTimeFactory;
  25. /** @var DeliveryTerm */
  26. private $deliveryTerm;
  27. /** @var OrderProcessorInterface */
  28. private $processorPool;
  29. /** @var RequestInterfaceFactory */
  30. private $requestFactory;
  31. /** @var SellerBuilder */
  32. private $sellerBuilder;
  33. /**
  34. * @param RequestInterfaceFactory $requestFactory
  35. * @param DateTimeImmutableFactory $dateTimeFactory
  36. * @param SellerBuilder $sellerBuilder
  37. * @param CustomerBuilder $customerBuilder
  38. * @param DeliveryTerm $deliveryTerm
  39. * @param Config $config
  40. * @param OrderProcessorInterface $processorPool
  41. */
  42. public function __construct(
  43. RequestInterfaceFactory $requestFactory,
  44. DateTimeImmutableFactory $dateTimeFactory,
  45. SellerBuilder $sellerBuilder,
  46. CustomerBuilder $customerBuilder,
  47. DeliveryTerm $deliveryTerm,
  48. Config $config,
  49. OrderProcessorInterface $processorPool
  50. ) {
  51. $this->requestFactory = $requestFactory;
  52. $this->dateTimeFactory = $dateTimeFactory;
  53. $this->sellerBuilder = $sellerBuilder;
  54. $this->customerBuilder = $customerBuilder;
  55. $this->deliveryTerm = $deliveryTerm;
  56. $this->config = $config;
  57. $this->processorPool = $processorPool;
  58. }
  59. /**
  60. * Create a Vertex Invoice Request from a Magento Order
  61. *
  62. * @param OrderInterface $order
  63. * @return RequestInterface
  64. */
  65. public function process(OrderInterface $order)
  66. {
  67. $address = $order->getIsVirtual() ? $order->getBillingAddress() : $this->getShippingFromOrder($order);
  68. $scopeCode = $order->getStoreId();
  69. $seller = $this->sellerBuilder
  70. ->setScopeType(ScopeInterface::SCOPE_STORE)
  71. ->setScopeCode($scopeCode)
  72. ->build();
  73. $customer = $this->customerBuilder->buildFromOrderAddress(
  74. $address,
  75. $address !== null ? $address->getCustomerId() : null,
  76. $order->getCustomerGroupId(),
  77. $scopeCode
  78. );
  79. /** @var RequestInterface $request */
  80. $request = $this->requestFactory->create();
  81. $request->setDocumentNumber($order->getIncrementId());
  82. $request->setDocumentDate($this->dateTimeFactory->create());
  83. $request->setTransactionType(RequestInterface::TRANSACTION_TYPE_SALE);
  84. $request->setSeller($seller);
  85. $request->setCustomer($customer);
  86. $request->setCurrencyCode($order->getBaseCurrencyCode());
  87. $this->deliveryTerm->addIfApplicable($request);
  88. if ($this->config->getLocationCode($scopeCode)) {
  89. $request->setLocationCode($this->config->getLocationCode($scopeCode));
  90. }
  91. $request = $this->processorPool->process($request, $order);
  92. return $request;
  93. }
  94. /**
  95. * Retrieve the shipping address from an Order
  96. *
  97. * @param OrderInterface $order
  98. * @return OrderAddressInterface|null
  99. */
  100. private function getShippingFromOrder(OrderInterface $order)
  101. {
  102. if ($order instanceof Order && $order->getShippingAddress()) {
  103. return $order->getShippingAddress();
  104. }
  105. return $order->getExtensionAttributes() !== null
  106. && $order->getExtensionAttributes()->getShippingAssignments()
  107. && $order->getExtensionAttributes()->getShippingAssignments()[0]
  108. && $order->getExtensionAttributes()->getShippingAssignments()[0]->getShipping()
  109. ? $order->getExtensionAttributes()->getShippingAssignments()[0]->getShipping()->getAddress()
  110. : null;
  111. }
  112. }