ShipmentRepository.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace Webkul\Sales\Repositories;
  3. use Illuminate\Container\Container;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Event;
  6. use Webkul\Core\Eloquent\Repository;
  7. use Webkul\Sales\Models\Order;
  8. class ShipmentRepository extends Repository
  9. {
  10. /**
  11. * Create a new repository instance.
  12. *
  13. * @return void
  14. */
  15. public function __construct(
  16. protected OrderRepository $orderRepository,
  17. protected OrderItemRepository $orderItemRepository,
  18. protected ShipmentItemRepository $shipmentItemRepository,
  19. Container $container
  20. ) {
  21. parent::__construct($container);
  22. }
  23. /**
  24. * Specify model class name.
  25. */
  26. public function model(): string
  27. {
  28. return 'Webkul\Sales\Contracts\Shipment';
  29. }
  30. /**
  31. * Create.
  32. *
  33. * @param string $orderState
  34. * @return \Webkul\Sales\Contracts\Shipment
  35. */
  36. public function create(array $data, $orderState = null)
  37. {
  38. DB::beginTransaction();
  39. try {
  40. Event::dispatch('sales.shipment.save.before', $data);
  41. $order = $this->orderRepository->find($data['order_id']);
  42. $shipment = $this->model->create([
  43. 'order_id' => $order->id,
  44. 'total_qty' => 0,
  45. 'total_weight' => 0,
  46. 'carrier_title' => $data['shipment']['carrier_title'],
  47. 'track_number' => $data['shipment']['track_number'],
  48. 'customer_id' => $order->customer_id,
  49. 'customer_type' => $order->customer_type,
  50. 'order_address_id' => $order->shipping_address->id,
  51. 'inventory_source_id' => $data['shipment']['source'],
  52. ]);
  53. $totalQty = $totalWeight = 0;
  54. foreach ($data['shipment']['items'] as $itemId => $inventorySource) {
  55. $qty = $inventorySource[$data['shipment']['source']];
  56. $orderItem = $this->orderItemRepository->find($itemId);
  57. if ($qty > $orderItem->qty_to_ship) {
  58. $qty = $orderItem->qty_to_ship;
  59. }
  60. $totalQty += $qty;
  61. $totalWeight += $orderItem->weight * $qty;
  62. $this->shipmentItemRepository->create([
  63. 'shipment_id' => $shipment->id,
  64. 'order_item_id' => $orderItem->id,
  65. 'name' => $orderItem->name,
  66. 'sku' => $orderItem->getTypeInstance()->getOrderedItem($orderItem)->sku,
  67. 'qty' => $qty,
  68. 'weight' => $orderItem->weight * $qty,
  69. 'price' => $orderItem->price,
  70. 'price_incl_tax' => $orderItem->price_incl_tax,
  71. 'base_price' => $orderItem->base_price,
  72. 'base_price_incl_tax' => $orderItem->base_price_incl_tax,
  73. 'total' => $orderItem->price * $qty,
  74. 'base_total' => $orderItem->base_price * $qty,
  75. 'product_id' => $orderItem->product_id,
  76. 'product_type' => $orderItem->product_type,
  77. 'additional' => $orderItem->additional,
  78. ]);
  79. if ($orderItem->getTypeInstance()->isComposite()) {
  80. foreach ($orderItem->children as $child) {
  81. if (! $child->qty_ordered) {
  82. $finalQty = $qty;
  83. } else {
  84. $finalQty = ($child->qty_ordered / $orderItem->qty_ordered) * $qty;
  85. }
  86. $this->shipmentItemRepository->updateProductInventory([
  87. 'shipment' => $shipment,
  88. 'product' => $child->product,
  89. 'qty' => $finalQty,
  90. 'vendor_id' => $data['vendor_id'] ?? 0,
  91. ]);
  92. $this->orderItemRepository->update(['qty_shipped' => $child->qty_shipped + $finalQty], $child->id);
  93. }
  94. } else {
  95. $this->shipmentItemRepository->updateProductInventory([
  96. 'shipment' => $shipment,
  97. 'product' => $orderItem->product,
  98. 'qty' => $qty,
  99. 'vendor_id' => $data['vendor_id'] ?? 0,
  100. ]);
  101. }
  102. $this->orderItemRepository->update(['qty_shipped' => $orderItem->qty_shipped + $qty], $orderItem->id);
  103. }
  104. $shipment->update([
  105. 'total_qty' => $totalQty,
  106. 'total_weight' => $totalWeight,
  107. 'inventory_source_name' => $shipment->inventory_source->name,
  108. ]);
  109. if (isset($orderState)) {
  110. $this->orderRepository->updateOrderStatus($order, $orderState);
  111. } elseif ($order->hasOpenInvoice()) {
  112. $this->orderRepository->updateOrderStatus($order, Order::STATUS_PENDING_PAYMENT);
  113. } else {
  114. $this->orderRepository->updateOrderStatus($order);
  115. }
  116. Event::dispatch('sales.shipment.save.after', $shipment);
  117. } catch (\Exception $e) {
  118. DB::rollBack();
  119. throw $e;
  120. }
  121. DB::commit();
  122. return $shipment;
  123. }
  124. }