CartData.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?php
  2. namespace Webkul\BagistoApi\Dto;
  3. use ApiPlatform\Metadata\ApiProperty;
  4. use Symfony\Component\Serializer\Annotation\Groups;
  5. /**
  6. * Shopping cart data transfer object
  7. */
  8. class CartData
  9. {
  10. #[Groups(['query', 'mutation'])]
  11. public ?int $id = null;
  12. #[Groups(['query', 'mutation'])]
  13. #[ApiProperty(description: 'Cart token for guest users')]
  14. public ?string $cartToken = null;
  15. #[Groups(['query', 'mutation'])]
  16. public ?int $customerId = null;
  17. #[Groups(['query', 'mutation'])]
  18. public ?int $channelId = null;
  19. #[Groups(['query', 'mutation'])]
  20. public ?int $itemsCount = null;
  21. /**
  22. * Individual cart items - array of CartItemData DTO objects
  23. *
  24. * @var array<CartItemData>|null
  25. */
  26. #[Groups(['query', 'mutation'])]
  27. #[ApiProperty(description: 'Individual cart items')]
  28. public ?array $items = [];
  29. #[Groups(['query', 'mutation'])]
  30. #[ApiProperty(description: 'Subtotal before discounts and taxes')]
  31. public ?float $subtotal = null;
  32. #[Groups(['query', 'mutation'])]
  33. public ?float $baseSubtotal = null;
  34. #[Groups(['query', 'mutation'])]
  35. #[ApiProperty(description: 'Total discount amount')]
  36. public ?float $discountAmount = null;
  37. #[Groups(['query', 'mutation'])]
  38. public ?float $baseDiscountAmount = null;
  39. #[Groups(['query', 'mutation'])]
  40. #[ApiProperty(description: 'Total tax amount')]
  41. public ?float $taxAmount = null;
  42. #[Groups(['query', 'mutation'])]
  43. public ?float $baseTaxAmount = null;
  44. #[Groups(['query', 'mutation'])]
  45. #[ApiProperty(description: 'Shipping cost')]
  46. public ?float $shippingAmount = null;
  47. #[Groups(['query', 'mutation'])]
  48. public ?float $baseShippingAmount = null;
  49. #[Groups(['query', 'mutation'])]
  50. #[ApiProperty(description: 'Grand total')]
  51. public ?float $grandTotal = null;
  52. #[Groups(['query', 'mutation'])]
  53. public ?float $baseGrandTotal = null;
  54. #[Groups(['query', 'mutation'])]
  55. #[ApiProperty(description: 'Formatted subtotal price')]
  56. public ?string $formattedSubtotal = null;
  57. #[Groups(['query', 'mutation'])]
  58. #[ApiProperty(description: 'Formatted discount amount')]
  59. public ?string $formattedDiscountAmount = null;
  60. #[Groups(['query', 'mutation'])]
  61. #[ApiProperty(description: 'Formatted tax amount')]
  62. public ?string $formattedTaxAmount = null;
  63. #[Groups(['query', 'mutation'])]
  64. #[ApiProperty(description: 'Formatted shipping amount')]
  65. public ?string $formattedShippingAmount = null;
  66. #[Groups(['query', 'mutation'])]
  67. #[ApiProperty(description: 'Formatted grand total price')]
  68. public ?string $formattedGrandTotal = null;
  69. #[Groups(['query', 'mutation'])]
  70. #[ApiProperty(description: 'Applied coupon code')]
  71. public ?string $couponCode = null;
  72. #[Groups(['query', 'mutation'])]
  73. public ?bool $success = null;
  74. #[Groups(['query', 'mutation'])]
  75. public ?string $message = null;
  76. #[Groups(['query', 'mutation'])]
  77. public ?array $carts = null;
  78. #[Groups(['query', 'mutation'])]
  79. #[ApiProperty(description: 'Unique session token for guest cart')]
  80. public ?string $sessionToken = null;
  81. #[Groups(['query', 'mutation'])]
  82. #[ApiProperty(description: 'Is this a guest cart')]
  83. public bool $isGuest = false;
  84. #[Groups(['query', 'mutation'])]
  85. #[ApiProperty(description: 'Total quantity of all items')]
  86. public ?int $itemsQty = null;
  87. #[Groups(['query', 'mutation'])]
  88. #[ApiProperty(description: 'Subtotal including tax')]
  89. public ?float $subTotalInclTax = null;
  90. #[Groups(['query', 'mutation'])]
  91. #[ApiProperty(description: 'Base subtotal including tax')]
  92. public ?float $baseSubTotalInclTax = null;
  93. #[Groups(['query', 'mutation'])]
  94. #[ApiProperty(description: 'Formatted subtotal including tax')]
  95. public ?string $formattedSubTotalInclTax = null;
  96. #[Groups(['query', 'mutation'])]
  97. #[ApiProperty(description: 'Tax total')]
  98. public ?float $taxTotal = null;
  99. #[Groups(['query', 'mutation'])]
  100. #[ApiProperty(description: 'Formatted tax total')]
  101. public ?string $formattedTaxTotal = null;
  102. #[Groups(['query', 'mutation'])]
  103. #[ApiProperty(description: 'Shipping amount including tax')]
  104. public ?float $shippingAmountInclTax = null;
  105. #[Groups(['query', 'mutation'])]
  106. #[ApiProperty(description: 'Base shipping amount including tax')]
  107. public ?float $baseShippingAmountInclTax = null;
  108. #[Groups(['query', 'mutation'])]
  109. #[ApiProperty(description: 'Formatted shipping amount including tax')]
  110. public ?string $formattedShippingAmountInclTax = null;
  111. #[Groups(['query', 'mutation'])]
  112. #[ApiProperty(description: 'Billing address')]
  113. public ?array $billingAddress = null;
  114. #[Groups(['query', 'mutation'])]
  115. #[ApiProperty(description: 'Shipping address')]
  116. public ?array $shippingAddress = null;
  117. #[Groups(['query', 'mutation'])]
  118. #[ApiProperty(description: 'Applied taxes')]
  119. public ?array $appliedTaxes = null;
  120. #[Groups(['query', 'mutation'])]
  121. #[ApiProperty(description: 'Has stockable items')]
  122. public ?bool $haveStockableItems = null;
  123. #[Groups(['query', 'mutation'])]
  124. #[ApiProperty(description: 'Payment method code')]
  125. public ?string $paymentMethod = null;
  126. #[Groups(['query', 'mutation'])]
  127. #[ApiProperty(description: 'Payment method title')]
  128. public ?string $paymentMethodTitle = null;
  129. #[Groups(['query', 'mutation'])]
  130. #[ApiProperty(readable: true, writable: false, description: 'Selected shipping rate')]
  131. public ?string $selectedShippingRate = null;
  132. #[Groups(['query', 'mutation'])]
  133. #[ApiProperty(readable: true, writable: false, description: 'Selected shipping rate title')]
  134. public ?string $selectedShippingRateTitle = null;
  135. #[Groups(['query', 'mutation'])]
  136. #[ApiProperty(description: 'Payment redirect URL (if payment gateway redirect needed)')]
  137. public ?string $paymentRedirectUrl = null;
  138. #[Groups(['query', 'mutation'])]
  139. #[ApiProperty(description: 'Order ID after order creation')]
  140. public ?string $orderId = null;
  141. #[Groups(['query', 'mutation'])]
  142. #[ApiProperty(description: 'Redirect URL for buy now checkout')]
  143. public ?string $redirectUri = null;
  144. public function getSelectedShippingRate(): ?string
  145. {
  146. return $this->selectedShippingRate;
  147. }
  148. public function setSelectedShippingRate(?string $selectedShippingRate): void
  149. {
  150. $this->selectedShippingRate = $selectedShippingRate;
  151. }
  152. public function getSelectedShippingRateTitle(): ?string
  153. {
  154. return $this->selectedShippingRateTitle;
  155. }
  156. public function setSelectedShippingRateTitle(?string $selectedShippingRateTitle): void
  157. {
  158. $this->selectedShippingRateTitle = $selectedShippingRateTitle;
  159. }
  160. public static function fromModel(\Webkul\Checkout\Models\Cart $cart): self
  161. {
  162. $data = new self;
  163. $data->id = $cart->id;
  164. $data->cartToken = (string) $cart->id;
  165. $data->customerId = $cart->customer_id;
  166. $data->isGuest = ! $cart->customer_id;
  167. $data->channelId = $cart->channel_id;
  168. $data->itemsCount = $cart->items()->count();
  169. $data->itemsQty = (int) ($cart->items_qty ?? 0);
  170. $items = $cart->items()
  171. ->with(['product'])
  172. ->get()
  173. ->map(fn ($item) => CartItemData::fromModel($item));
  174. $data->items = $items->toArray();
  175. $data->subtotal = (float) core()->convertPrice($cart->base_sub_total ?? 0);
  176. $data->baseSubtotal = (float) ($cart->base_sub_total ?? 0);
  177. $data->formattedSubtotal = core()->currency($cart->base_sub_total ?? 0);
  178. $data->subTotalInclTax = (float) core()->convertPrice($cart->base_sub_total_incl_tax ?? $cart->base_sub_total ?? 0);
  179. $data->baseSubTotalInclTax = (float) ($cart->base_sub_total_incl_tax ?? $cart->base_sub_total ?? 0);
  180. $data->formattedSubTotalInclTax = core()->currency($cart->base_sub_total_incl_tax ?? $cart->base_sub_total ?? 0);
  181. $data->taxAmount = (float) core()->convertPrice($cart->base_tax_amount ?? 0);
  182. $data->baseTaxAmount = (float) ($cart->base_tax_amount ?? 0);
  183. $data->taxTotal = (float) core()->convertPrice($cart->base_tax_total ?? $cart->base_tax_amount ?? 0);
  184. $data->formattedTaxTotal = core()->currency($cart->base_tax_total ?? $cart->base_tax_amount ?? 0);
  185. $data->formattedTaxAmount = core()->currency($cart->base_tax_amount ?? 0);
  186. $data->discountAmount = (float) core()->convertPrice($cart->base_discount_amount ?? 0);
  187. $data->baseDiscountAmount = (float) ($cart->base_discount_amount ?? 0);
  188. $data->formattedDiscountAmount = core()->currency($cart->base_discount_amount ?? 0);
  189. $data->shippingAmount = (float) core()->convertPrice($cart->base_shipping_amount ?? 0);
  190. $data->baseShippingAmount = (float) ($cart->base_shipping_amount ?? 0);
  191. $data->formattedShippingAmount = core()->currency($cart->base_shipping_amount ?? 0);
  192. $data->shippingAmountInclTax = (float) core()->convertPrice($cart->base_shipping_amount_incl_tax ?? $cart->base_shipping_amount ?? 0);
  193. $data->baseShippingAmountInclTax = (float) ($cart->base_shipping_amount_incl_tax ?? $cart->base_shipping_amount ?? 0);
  194. $data->formattedShippingAmountInclTax = core()->currency($cart->base_shipping_amount_incl_tax ?? $cart->base_shipping_amount ?? 0);
  195. $data->grandTotal = (float) core()->convertPrice($cart->base_grand_total ?? 0);
  196. $data->baseGrandTotal = (float) ($cart->base_grand_total ?? 0);
  197. $data->formattedGrandTotal = core()->currency($cart->base_grand_total ?? 0);
  198. $additional = $cart->additional ?
  199. (is_string($cart->additional) ? json_decode($cart->additional, true) : $cart->additional) : [];
  200. $data->couponCode = $additional['coupon_code'] ?? null;
  201. if ($cart->billing_address) {
  202. $data->billingAddress = [
  203. 'id' => $cart->billing_address->id,
  204. 'firstName' => $cart->billing_address->first_name,
  205. 'lastName' => $cart->billing_address->last_name,
  206. 'email' => $cart->billing_address->email,
  207. 'address' => $cart->billing_address->address,
  208. 'city' => $cart->billing_address->city,
  209. 'state' => $cart->billing_address->state,
  210. 'country' => $cart->billing_address->country,
  211. 'postcode' => $cart->billing_address->postcode,
  212. 'phone' => $cart->billing_address->phone,
  213. ];
  214. }
  215. if ($cart->shipping_address) {
  216. $data->shippingAddress = [
  217. 'id' => $cart->shipping_address->id,
  218. 'firstName' => $cart->shipping_address->first_name,
  219. 'lastName' => $cart->shipping_address->last_name,
  220. 'email' => $cart->shipping_address->email,
  221. 'address' => $cart->shipping_address->address,
  222. 'city' => $cart->shipping_address->city,
  223. 'state' => $cart->shipping_address->state,
  224. 'country' => $cart->shipping_address->country,
  225. 'postcode' => $cart->shipping_address->postcode,
  226. 'phone' => $cart->shipping_address->phone,
  227. ];
  228. }
  229. if ($cart->payment) {
  230. $data->paymentMethod = $cart->payment->method;
  231. $data->paymentMethodTitle = core()->getConfigData('sales.payment_methods.'.$cart->payment->method.'.title');
  232. }
  233. try {
  234. $taxes = collect(\Webkul\Tax\Facades\Tax::getTaxRatesWithAmount($cart, true))->map(function ($rate) {
  235. return core()->currency($rate ?? 0);
  236. })->toArray();
  237. $data->appliedTaxes = $taxes;
  238. } catch (\Exception $e) {
  239. $data->appliedTaxes = [];
  240. }
  241. $data->haveStockableItems = $cart->haveStockableItems();
  242. if ($cart->selected_shipping_rate) {
  243. $data->selectedShippingRate = $cart->selected_shipping_rate->method ?? null;
  244. $data->selectedShippingRateTitle = $cart->selected_shipping_rate->method_title ?? null;
  245. } else {
  246. $data->selectedShippingRate = null;
  247. $data->selectedShippingRateTitle = null;
  248. }
  249. return $data;
  250. }
  251. public static function collection(iterable $carts): array
  252. {
  253. $cartDataCollection = [];
  254. foreach ($carts as $cart) {
  255. $cartDataCollection[] = self::fromModel($cart);
  256. }
  257. return $cartDataCollection;
  258. }
  259. public function getItems(): ?array
  260. {
  261. return $this->items;
  262. }
  263. public function setItems(?array $items): void
  264. {
  265. $this->items = $items;
  266. }
  267. #[Groups(['query', 'mutation'])]
  268. #[ApiProperty(description: 'Redirect URL for payment gateway')]
  269. public ?string $redirectUrl = null;
  270. #[Groups(['query', 'mutation'])]
  271. #[ApiProperty(description: 'Order ID after successful order creation')]
  272. public ?string $orderIncrementId = null;
  273. #[Groups(['query', 'mutation'])]
  274. #[ApiProperty(description: 'Payment transaction ID returned by gateway')]
  275. public ?string $paymentTransactionId = null;
  276. }