OrderController.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace App\Http\Controllers\Admin\Orders;
  3. use App\Shop\Addresses\Repositories\Interfaces\AddressRepositoryInterface;
  4. use App\Shop\Addresses\Transformations\AddressTransformable;
  5. use App\Shop\Couriers\Courier;
  6. use App\Shop\Couriers\Repositories\CourierRepository;
  7. use App\Shop\Couriers\Repositories\Interfaces\CourierRepositoryInterface;
  8. use App\Shop\Customers\Customer;
  9. use App\Shop\Customers\Repositories\CustomerRepository;
  10. use App\Shop\Customers\Repositories\Interfaces\CustomerRepositoryInterface;
  11. use App\Shop\Orders\Order;
  12. use App\Shop\Orders\Repositories\Interfaces\OrderRepositoryInterface;
  13. use App\Shop\Orders\Repositories\OrderRepository;
  14. use App\Shop\OrderStatuses\OrderStatus;
  15. use App\Shop\OrderStatuses\Repositories\Interfaces\OrderStatusRepositoryInterface;
  16. use App\Shop\OrderStatuses\Repositories\OrderStatusRepository;
  17. use App\Http\Controllers\Controller;
  18. use Illuminate\Http\Request;
  19. use Illuminate\Support\Collection;
  20. class OrderController extends Controller
  21. {
  22. use AddressTransformable;
  23. /**
  24. * @var OrderRepositoryInterface
  25. */
  26. private $orderRepo;
  27. /**
  28. * @var CourierRepositoryInterface
  29. */
  30. private $courierRepo;
  31. /**
  32. * @var CustomerRepositoryInterface
  33. */
  34. private $customerRepo;
  35. /**
  36. * @var OrderStatusRepositoryInterface
  37. */
  38. private $orderStatusRepo;
  39. public function __construct(
  40. OrderRepositoryInterface $orderRepository,
  41. CourierRepositoryInterface $courierRepository,
  42. CustomerRepositoryInterface $customerRepository,
  43. OrderStatusRepositoryInterface $orderStatusRepository
  44. ) {
  45. $this->orderRepo = $orderRepository;
  46. $this->courierRepo = $courierRepository;
  47. $this->customerRepo = $customerRepository;
  48. $this->orderStatusRepo = $orderStatusRepository;
  49. $this->middleware(['permission:update-order, guard:employee'], ['only' => ['edit', 'update']]);
  50. }
  51. /**
  52. * Display a listing of the resource.
  53. *
  54. * @return \Illuminate\Http\Response
  55. */
  56. public function index()
  57. {
  58. $list = $this->orderRepo->listOrders('created_at', 'desc');
  59. if (request()->has('q')) {
  60. $list = $this->orderRepo->searchOrder(request()->input('q') ?? '');
  61. }
  62. $orders = $this->orderRepo->paginateArrayResults($this->transFormOrder($list), 10);
  63. return view('admin.orders.list', ['orders' => $orders]);
  64. }
  65. /**
  66. * Display the specified resource.
  67. *
  68. * @param int $orderId
  69. * @return \Illuminate\Http\Response
  70. */
  71. public function show($orderId)
  72. {
  73. $order = $this->orderRepo->findOrderById($orderId);
  74. $orderRepo = new OrderRepository($order);
  75. $order->courier = $orderRepo->getCouriers()->first();
  76. $order->address = $orderRepo->getAddresses()->first();
  77. $items = $orderRepo->listOrderedProducts();
  78. return view('admin.orders.show', [
  79. 'order' => $order,
  80. 'items' => $items,
  81. 'customer' => $this->customerRepo->findCustomerById($order->customer_id),
  82. 'currentStatus' => $this->orderStatusRepo->findOrderStatusById($order->order_status_id),
  83. 'payment' => $order->payment,
  84. 'user' => auth()->guard('employee')->user()
  85. ]);
  86. }
  87. /**
  88. * @param $orderId
  89. *
  90. * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
  91. */
  92. public function edit($orderId)
  93. {
  94. $order = $this->orderRepo->findOrderById($orderId);
  95. $orderRepo = new OrderRepository($order);
  96. $order->courier = $orderRepo->getCouriers()->first();
  97. $order->address = $orderRepo->getAddresses()->first();
  98. $items = $orderRepo->listOrderedProducts();
  99. return view('admin.orders.edit', [
  100. 'statuses' => $this->orderStatusRepo->listOrderStatuses(),
  101. 'order' => $order,
  102. 'items' => $items,
  103. 'customer' => $this->customerRepo->findCustomerById($order->customer_id),
  104. 'currentStatus' => $this->orderStatusRepo->findOrderStatusById($order->order_status_id),
  105. 'payment' => $order->payment,
  106. 'user' => auth()->guard('employee')->user()
  107. ]);
  108. }
  109. /**
  110. * @param Request $request
  111. * @param $orderId
  112. *
  113. * @return \Illuminate\Http\RedirectResponse
  114. */
  115. public function update(Request $request, $orderId)
  116. {
  117. $order = $this->orderRepo->findOrderById($orderId);
  118. $orderRepo = new OrderRepository($order);
  119. if ($request->has('total_paid') && $request->input('total_paid') != null) {
  120. $orderData = $request->except('_method', '_token');
  121. } else {
  122. $orderData = $request->except('_method', '_token', 'total_paid');
  123. }
  124. $orderRepo->updateOrder($orderData);
  125. return redirect()->route('admin.orders.edit', $orderId);
  126. }
  127. /**
  128. * Generate order invoice
  129. *
  130. * @param int $id
  131. * @return mixed
  132. */
  133. public function generateInvoice(int $id)
  134. {
  135. $order = $this->orderRepo->findOrderById($id);
  136. $data = [
  137. 'order' => $order,
  138. 'products' => $order->products,
  139. 'customer' => $order->customer,
  140. 'courier' => $order->courier,
  141. 'address' => $this->transformAddress($order->address),
  142. 'status' => $order->orderStatus,
  143. 'payment' => $order->paymentMethod
  144. ];
  145. $pdf = app()->make('dompdf.wrapper');
  146. $pdf->loadView('invoices.orders', $data)->stream();
  147. return $pdf->stream();
  148. }
  149. /**
  150. * @param Collection $list
  151. * @return array
  152. */
  153. private function transFormOrder(Collection $list)
  154. {
  155. $courierRepo = new CourierRepository(new Courier());
  156. $customerRepo = new CustomerRepository(new Customer());
  157. $orderStatusRepo = new OrderStatusRepository(new OrderStatus());
  158. return $list->transform(function (Order $order) use ($courierRepo, $customerRepo, $orderStatusRepo) {
  159. $order->courier = $courierRepo->findCourierById($order->courier_id);
  160. $order->customer = $customerRepo->findCustomerById($order->customer_id);
  161. $order->status = $orderStatusRepo->findOrderStatusById($order->order_status_id);
  162. return $order;
  163. })->all();
  164. }
  165. }