ValidSampleRequestBuilder.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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\ConfigurationValidator;
  7. use Vertex\Data\AddressInterface;
  8. use Vertex\Data\AddressInterfaceFactory;
  9. use Vertex\Data\CustomerInterface;
  10. use Vertex\Data\CustomerInterfaceFactory;
  11. use Vertex\Data\LineItemInterface;
  12. use Vertex\Data\LineItemInterfaceFactory;
  13. use Vertex\Services\Quote\RequestInterface;
  14. use Vertex\Services\Quote\RequestInterfaceFactory;
  15. use Vertex\Tax\Model\Api\Data\SellerBuilder;
  16. use Vertex\Tax\Model\DateTimeImmutableFactory;
  17. /**
  18. * Tax calculation request verification utility.
  19. *
  20. * This class generates a test request for use in verifying the Vertex tax calculation service.
  21. */
  22. class ValidSampleRequestBuilder
  23. {
  24. const ADDRESS_CITY = 'King of Prussia';
  25. const ADDRESS_COUNTRY_ID = 'USA';
  26. const ADDRESS_POSTCODE = '19406';
  27. const ADDRESS_REGION = 'PA';
  28. const ADDRESS_STREET = '2301 Renaissance Blvd';
  29. const ITEM_PRICE = 10.00;
  30. const ITEM_QTY = 2;
  31. const ITEM_SKU = 'X-MOCK-ITEM';
  32. const ITEM_TAX_CLASS = 'Taxable Goods';
  33. /** @var AddressInterfaceFactory */
  34. private $addressFactory;
  35. /** @var CustomerInterfaceFactory */
  36. private $customerFactory;
  37. /** @var DateTimeImmutableFactory */
  38. private $dateTimeFactory;
  39. /** @var LineItemInterfaceFactory */
  40. private $lineItemFactory;
  41. /** @var RequestInterfaceFactory */
  42. private $requestFactory;
  43. /** @var string */
  44. private $scopeCode;
  45. /** @var string */
  46. private $scopeType;
  47. /** @var SellerBuilder */
  48. private $sellerFactory;
  49. /**
  50. * @param RequestInterfaceFactory $requestFactory
  51. * @param SellerBuilder $sellerFactory
  52. * @param AddressInterfaceFactory $addressFactory
  53. * @param LineItemInterfaceFactory $lineItemFactory
  54. * @param CustomerInterfaceFactory $customerFactory
  55. * @param DateTimeImmutableFactory $dateTimeFactory
  56. */
  57. public function __construct(
  58. RequestInterfaceFactory $requestFactory,
  59. SellerBuilder $sellerFactory,
  60. AddressInterfaceFactory $addressFactory,
  61. LineItemInterfaceFactory $lineItemFactory,
  62. CustomerInterfaceFactory $customerFactory,
  63. DateTimeImmutableFactory $dateTimeFactory
  64. ) {
  65. $this->requestFactory = $requestFactory;
  66. $this->sellerFactory = $sellerFactory;
  67. $this->addressFactory = $addressFactory;
  68. $this->lineItemFactory = $lineItemFactory;
  69. $this->customerFactory = $customerFactory;
  70. $this->dateTimeFactory = $dateTimeFactory;
  71. }
  72. /**
  73. * Generate a mock formatted tax service request.
  74. *
  75. * @return RequestInterface
  76. */
  77. public function build()
  78. {
  79. /** @var RequestInterface $request */
  80. $request = $this->requestFactory->create();
  81. $seller = $this->sellerFactory
  82. ->setScopeCode($this->scopeCode)
  83. ->setScopeType($this->scopeType)
  84. ->build();
  85. $request->setSeller($seller);
  86. $request->setCustomer($this->createCustomer());
  87. $request->setLineItems([$this->createLineItem()]);
  88. $request->setTransactionType(RequestInterface::TRANSACTION_TYPE_SALE);
  89. $request->setDocumentDate($this->dateTimeFactory->create());
  90. return $request;
  91. }
  92. /**
  93. * Set the store code
  94. *
  95. * @param string|null $scopeCode
  96. * @return ValidSampleRequestBuilder
  97. */
  98. public function setScopeCode($scopeCode)
  99. {
  100. $this->scopeCode = $scopeCode;
  101. return $this;
  102. }
  103. /**
  104. * Set the scope type
  105. *
  106. * @param string|null $scopeType
  107. * @return ValidSampleRequestBuilder
  108. */
  109. public function setScopeType($scopeType)
  110. {
  111. $this->scopeType = $scopeType;
  112. return $this;
  113. }
  114. /**
  115. * Prepare the given address with mock data.
  116. *
  117. * @return AddressInterface
  118. */
  119. private function createAddress()
  120. {
  121. /** @var AddressInterface $address */
  122. $address = $this->addressFactory->create();
  123. $address->setStreetAddress([static::ADDRESS_STREET]);
  124. $address->setCity(static::ADDRESS_CITY);
  125. $address->setMainDivision(static::ADDRESS_REGION);
  126. $address->setPostalCode(static::ADDRESS_POSTCODE);
  127. $address->setCountry(static::ADDRESS_COUNTRY_ID);
  128. return $address;
  129. }
  130. /**
  131. * Prepare a Customer Record
  132. *
  133. * @return CustomerInterface
  134. */
  135. private function createCustomer()
  136. {
  137. /** @var CustomerInterface $customer */
  138. $customer = $this->customerFactory->create();
  139. $customer->setDestination($this->createAddress());
  140. return $customer;
  141. }
  142. /**
  143. * Generate a mock quote item.
  144. *
  145. * @return LineItemInterface
  146. */
  147. private function createLineItem()
  148. {
  149. /** @var LineItemInterface $lineItem */
  150. $lineItem = $this->lineItemFactory->create();
  151. $lineItem->setProductCode(static::ITEM_SKU);
  152. $lineItem->setProductClass(static::ITEM_TAX_CLASS);
  153. $lineItem->setQuantity(static::ITEM_QTY);
  154. $lineItem->setUnitPrice(static::ITEM_PRICE);
  155. $lineItem->setExtendedPrice(static::ITEM_PRICE * static::ITEM_QTY);
  156. return $lineItem;
  157. }
  158. }