| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | <?phpnamespace App\Http\Controllers\Admin\Orders;use App\Shop\Addresses\Repositories\Interfaces\AddressRepositoryInterface;use App\Shop\Addresses\Transformations\AddressTransformable;use App\Shop\Couriers\Courier;use App\Shop\Couriers\Repositories\CourierRepository;use App\Shop\Couriers\Repositories\Interfaces\CourierRepositoryInterface;use App\Shop\Customers\Customer;use App\Shop\Customers\Repositories\CustomerRepository;use App\Shop\Customers\Repositories\Interfaces\CustomerRepositoryInterface;use App\Shop\Orders\Order;use App\Shop\Orders\Repositories\Interfaces\OrderRepositoryInterface;use App\Shop\Orders\Repositories\OrderRepository;use App\Shop\OrderStatuses\OrderStatus;use App\Shop\OrderStatuses\Repositories\Interfaces\OrderStatusRepositoryInterface;use App\Shop\OrderStatuses\Repositories\OrderStatusRepository;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use Illuminate\Support\Collection;class OrderController extends Controller{    use AddressTransformable;    /**     * @var OrderRepositoryInterface     */    private $orderRepo;    /**     * @var CourierRepositoryInterface     */    private $courierRepo;    /**     * @var CustomerRepositoryInterface     */    private $customerRepo;    /**     * @var OrderStatusRepositoryInterface     */    private $orderStatusRepo;    public function __construct(        OrderRepositoryInterface $orderRepository,        CourierRepositoryInterface $courierRepository,        CustomerRepositoryInterface $customerRepository,        OrderStatusRepositoryInterface $orderStatusRepository    ) {        $this->orderRepo = $orderRepository;        $this->courierRepo = $courierRepository;        $this->customerRepo = $customerRepository;        $this->orderStatusRepo = $orderStatusRepository;        $this->middleware(['permission:update-order, guard:employee'], ['only' => ['edit', 'update']]);    }    /**     * Display a listing of the resource.     *     * @return \Illuminate\Http\Response     */    public function index()    {        $list = $this->orderRepo->listOrders('created_at', 'desc');        if (request()->has('q')) {            $list = $this->orderRepo->searchOrder(request()->input('q') ?? '');        }        $orders = $this->orderRepo->paginateArrayResults($this->transFormOrder($list), 10);        return view('admin.orders.list', ['orders' => $orders]);    }    /**     * Display the specified resource.     *     * @param  int $orderId     * @return \Illuminate\Http\Response     */    public function show($orderId)    {        $order = $this->orderRepo->findOrderById($orderId);        $orderRepo = new OrderRepository($order);        $order->courier = $orderRepo->getCouriers()->first();        $order->address = $orderRepo->getAddresses()->first();        $items = $orderRepo->listOrderedProducts();        return view('admin.orders.show', [            'order' => $order,            'items' => $items,            'customer' => $this->customerRepo->findCustomerById($order->customer_id),            'currentStatus' => $this->orderStatusRepo->findOrderStatusById($order->order_status_id),            'payment' => $order->payment,            'user' => auth()->guard('employee')->user()        ]);    }    /**     * @param $orderId     *     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View     */    public function edit($orderId)    {        $order = $this->orderRepo->findOrderById($orderId);        $orderRepo = new OrderRepository($order);        $order->courier = $orderRepo->getCouriers()->first();        $order->address = $orderRepo->getAddresses()->first();        $items = $orderRepo->listOrderedProducts();        return view('admin.orders.edit', [            'statuses' => $this->orderStatusRepo->listOrderStatuses(),            'order' => $order,            'items' => $items,            'customer' => $this->customerRepo->findCustomerById($order->customer_id),            'currentStatus' => $this->orderStatusRepo->findOrderStatusById($order->order_status_id),            'payment' => $order->payment,            'user' => auth()->guard('employee')->user()        ]);    }    /**     * @param Request $request     * @param $orderId     *     * @return \Illuminate\Http\RedirectResponse     */    public function update(Request $request, $orderId)    {        $order = $this->orderRepo->findOrderById($orderId);        $orderRepo = new OrderRepository($order);        if ($request->has('total_paid') && $request->input('total_paid') != null) {            $orderData = $request->except('_method', '_token');        } else {            $orderData = $request->except('_method', '_token', 'total_paid');        }        $orderRepo->updateOrder($orderData);        return redirect()->route('admin.orders.edit', $orderId);    }    /**     * Generate order invoice     *     * @param int $id     * @return mixed     */    public function generateInvoice(int $id)    {        $order = $this->orderRepo->findOrderById($id);        $data = [            'order' => $order,            'products' => $order->products,            'customer' => $order->customer,            'courier' => $order->courier,            'address' => $this->transformAddress($order->address),            'status' => $order->orderStatus,            'payment' => $order->paymentMethod        ];        $pdf = app()->make('dompdf.wrapper');        $pdf->loadView('invoices.orders', $data)->stream();        return $pdf->stream();    }    /**     * @param Collection $list     * @return array     */    private function transFormOrder(Collection $list)    {        $courierRepo = new CourierRepository(new Courier());        $customerRepo = new CustomerRepository(new Customer());        $orderStatusRepo = new OrderStatusRepository(new OrderStatus());        return $list->transform(function (Order $order) use ($courierRepo, $customerRepo, $orderStatusRepo) {            $order->courier = $courierRepo->findCourierById($order->courier_id);            $order->customer = $customerRepo->findCustomerById($order->customer_id);            $order->status = $orderStatusRepo->findOrderStatusById($order->order_status_id);            return $order;        })->all();    }}
 |