123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- <?php
- namespace App\Shop\Orders\Repositories;
- use App\Shop\Carts\Repositories\CartRepository;
- use App\Shop\Carts\ShoppingCart;
- use Gloudemans\Shoppingcart\Facades\Cart;
- use Jsdecena\Baserepo\BaseRepository;
- use App\Shop\Employees\Employee;
- use App\Shop\Employees\Repositories\EmployeeRepository;
- use App\Events\OrderCreateEvent;
- use App\Mail\sendEmailNotificationToAdminMailable;
- use App\Mail\SendOrderToCustomerMailable;
- use App\Shop\Orders\Exceptions\OrderInvalidArgumentException;
- use App\Shop\Orders\Exceptions\OrderNotFoundException;
- use App\Shop\Addresses\Address;
- use App\Shop\Couriers\Courier;
- use App\Shop\Orders\Order;
- use App\Shop\Orders\Repositories\Interfaces\OrderRepositoryInterface;
- use App\Shop\Orders\Transformers\OrderTransformable;
- use App\Shop\Products\Product;
- use App\Shop\Products\Repositories\ProductRepository;
- use Illuminate\Database\Eloquent\ModelNotFoundException;
- use Illuminate\Database\QueryException;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\Mail;
- class OrderRepository extends BaseRepository implements OrderRepositoryInterface
- {
- use OrderTransformable;
- /**
- * OrderRepository constructor.
- * @param Order $order
- */
- public function __construct(Order $order)
- {
- parent::__construct($order);
- $this->model = $order;
- }
- /**
- * Create the order
- *
- * @param array $params
- * @return Order
- * @throws OrderInvalidArgumentException
- */
- public function createOrder(array $params) : Order
- {
- try {
- $order = $this->create($params);
- $orderRepo = new OrderRepository($order);
- $orderRepo->buildOrderDetails(Cart::content());
- event(new OrderCreateEvent($order));
- return $order;
- } catch (QueryException $e) {
- throw new OrderInvalidArgumentException($e->getMessage(), 500, $e);
- }
- }
- /**
- * @param array $params
- *
- * @return bool
- * @throws OrderInvalidArgumentException
- */
- public function updateOrder(array $params) : bool
- {
- try {
- return $this->update($params);
- } catch (QueryException $e) {
- throw new OrderInvalidArgumentException($e->getMessage());
- }
- }
- /**
- * @param int $id
- * @return Order
- * @throws OrderNotFoundException
- */
- public function findOrderById(int $id) : Order
- {
- try {
- return $this->findOneOrFail($id);
- } catch (ModelNotFoundException $e) {
- throw new OrderNotFoundException($e);
- }
- }
- /**
- * Return all the orders
- *
- * @param string $order
- * @param string $sort
- * @param array $columns
- * @return Collection
- */
- public function listOrders(string $order = 'id', string $sort = 'desc', array $columns = ['*']) : Collection
- {
- return $this->all($columns, $order, $sort);
- }
- /**
- * @param Order $order
- * @return mixed
- */
- public function findProducts(Order $order) : Collection
- {
- return $order->products;
- }
- /**
- * @param Product $product
- * @param int $quantity
- * @param array $data
- */
- public function associateProduct(Product $product, int $quantity = 1, array $data = [])
- {
- $this->model->products()->attach($product, [
- 'quantity' => $quantity,
- 'product_name' => $product->name,
- 'product_sku' => $product->sku,
- 'product_description' => $product->description,
- 'product_price' => $product->price,
- 'product_attribute_id' => isset($data['product_attribute_id']) ? $data['product_attribute_id']: null,
- ]);
- $product->quantity = ($product->quantity - $quantity);
- $product->save();
- }
- /**
- * Send email to customer
- */
- public function sendEmailToCustomer()
- {
- Mail::to($this->model->customer)
- ->send(new SendOrderToCustomerMailable($this->findOrderById($this->model->id)));
- }
- /**
- * Send email notification to the admin
- */
- public function sendEmailNotificationToAdmin()
- {
- $employeeRepo = new EmployeeRepository(new Employee);
- $employee = $employeeRepo->findEmployeeById(1);
- Mail::to($employee)
- ->send(new sendEmailNotificationToAdminMailable($this->findOrderById($this->model->id)));
- }
- /**
- * @param string $text
- * @return mixed
- */
- public function searchOrder(string $text) : Collection
- {
- if (!empty($text)) {
- return $this->model->searchForOrder($text)->get();
- } else {
- return $this->listOrders();
- }
- }
- /**
- * @return Order
- */
- public function transform()
- {
- return $this->transformOrder($this->model);
- }
- /**
- * @return Collection
- */
- public function listOrderedProducts() : Collection
- {
- return $this->model->products->map(function (Product $product) {
- $product->name = $product->pivot->product_name;
- $product->sku = $product->pivot->product_sku;
- $product->description = $product->pivot->product_description;
- $product->price = $product->pivot->product_price;
- $product->quantity = $product->pivot->quantity;
- $product->product_attribute_id = $product->pivot->product_attribute_id;
- return $product;
- });
- }
- /**
- * @param Collection $items
- */
- public function buildOrderDetails(Collection $items)
- {
- $items->each(function ($item) {
- $productRepo = new ProductRepository(new Product);
- $product = $productRepo->find($item->id);
- if ($item->options->has('product_attribute_id')) {
- $this->associateProduct($product, $item->qty, [
- 'product_attribute_id' => $item->options->product_attribute_id
- ]);
- } else {
- $this->associateProduct($product, $item->qty);
- }
- });
- }
- /**
- * @return Collection $addresses
- */
- public function getAddresses() : Collection
- {
- return $this->model->address()->get();
- }
- /**
- * @return Collection $couriers
- */
- public function getCouriers() : Collection
- {
- return $this->model->courier()->get();
- }
- }
|