InvoiceProcessor.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace Vertex\Tax\Model\Api\Data\InvoiceRequestBuilder;
  3. use Magento\Sales\Api\Data\InvoiceInterface;
  4. use Magento\Sales\Api\Data\OrderAddressInterface;
  5. use Magento\Sales\Api\Data\OrderInterface;
  6. use Magento\Sales\Api\OrderAddressRepositoryInterface;
  7. use Magento\Sales\Api\OrderRepositoryInterface;
  8. use Magento\Store\Model\ScopeInterface;
  9. use Vertex\Services\Invoice\RequestInterface;
  10. use Vertex\Services\Invoice\RequestInterfaceFactory;
  11. use Vertex\Tax\Model\Api\Data\CustomerBuilder;
  12. use Vertex\Tax\Model\Api\Data\SellerBuilder;
  13. use Vertex\Tax\Model\Api\Utility\DeliveryTerm;
  14. use Vertex\Tax\Model\Config;
  15. use Vertex\Tax\Model\DateTimeImmutableFactory;
  16. /**
  17. * Processes a Magento Invoice and returns a Vertex Invoice Request
  18. */
  19. class InvoiceProcessor
  20. {
  21. /** @var Config */
  22. private $config;
  23. /** @var CustomerBuilder */
  24. private $customerBuilder;
  25. /** @var DateTimeImmutableFactory */
  26. private $dateTimeFactory;
  27. /** @var DeliveryTerm */
  28. private $deliveryTerm;
  29. /** @var InvoiceProcessorInterface */
  30. private $processorPool;
  31. /** @var RequestInterfaceFactory */
  32. private $requestFactory;
  33. /** @var SellerBuilder */
  34. private $sellerBuilder;
  35. /**
  36. * @param RequestInterfaceFactory $requestFactory
  37. * @param DateTimeImmutableFactory $dateTimeFactory
  38. * @param SellerBuilder $sellerBuilder
  39. * @param CustomerBuilder $customerBuilder
  40. * @param DeliveryTerm $deliveryTerm
  41. * @param Config $config
  42. * @param InvoiceProcessorInterface $processorPool
  43. */
  44. public function __construct(
  45. RequestInterfaceFactory $requestFactory,
  46. DateTimeImmutableFactory $dateTimeFactory,
  47. SellerBuilder $sellerBuilder,
  48. CustomerBuilder $customerBuilder,
  49. DeliveryTerm $deliveryTerm,
  50. Config $config,
  51. InvoiceProcessorInterface $processorPool
  52. ) {
  53. $this->requestFactory = $requestFactory;
  54. $this->dateTimeFactory = $dateTimeFactory;
  55. $this->sellerBuilder = $sellerBuilder;
  56. $this->customerBuilder = $customerBuilder;
  57. $this->deliveryTerm = $deliveryTerm;
  58. $this->config = $config;
  59. $this->processorPool = $processorPool;
  60. }
  61. /**
  62. * Create a Vertex Invoice Request from a Magento Invoice
  63. *
  64. * @param InvoiceInterface $invoice
  65. * @return RequestInterface
  66. */
  67. public function process(InvoiceInterface $invoice)
  68. {
  69. // If an invoice is virtual, it simply won't have a shipping address.
  70. /** @var OrderAddressInterface $address */
  71. $address = $invoice->getExtensionAttributes()->getVertexTaxCalculationShippingAddress()
  72. ?: $invoice->getExtensionAttributes()->getVertexTaxCalculationBillingAddress();
  73. /** @var OrderInterface $order */
  74. $order = $invoice->getExtensionAttributes()->getVertexTaxCalculationOrder();
  75. $scopeCode = $invoice->getStoreId();
  76. $seller = $this->sellerBuilder
  77. ->setScopeType(ScopeInterface::SCOPE_STORE)
  78. ->setScopeCode($scopeCode)
  79. ->build();
  80. $customer = $this->customerBuilder->buildFromOrderAddress(
  81. $address,
  82. $order->getCustomerId(),
  83. $order->getCustomerGroupId(),
  84. $scopeCode
  85. );
  86. /** @var RequestInterface $request */
  87. $request = $this->requestFactory->create();
  88. $request->setShouldReturnAssistedParameters(true);
  89. $request->setDocumentNumber($order->getIncrementId());
  90. $request->setDocumentDate($this->dateTimeFactory->create());
  91. $request->setTransactionType(RequestInterface::TRANSACTION_TYPE_SALE);
  92. $request->setSeller($seller);
  93. $request->setCustomer($customer);
  94. $request->setCurrencyCode($invoice->getBaseCurrencyCode());
  95. $this->deliveryTerm->addIfApplicable($request);
  96. if ($this->config->getLocationCode($scopeCode)) {
  97. $request->setLocationCode($this->config->getLocationCode($scopeCode));
  98. }
  99. $request = $this->processorPool->process($request, $invoice);
  100. return $request;
  101. }
  102. }