From ddbf83465e1d0a20ec3bca21fe3558235ce4fedd Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 13 Jul 2021 11:58:03 +0800 Subject: [PATCH] Orders APIs WIP --- .../Processors/AbstractStepProcessor.php | 46 +++++ .../OrderSteps/Processors/ConfirmsOrder.php | 56 ++++++ .../OrderSteps/Processors/DeliverOrder.php | 56 ++++++ .../OrderSteps/Processors/ShipOrder.php | 59 +++++++ .../Processors/WarehouseArrivalOrder.php | 52 ++++++ .../Processors/WarehousePackOrder.php | 60 +++++++ .../Processors/WarehouseReceivesOrder.php | 65 +++++++ .../Processors/WarehouseUnpackingOrder.php | 51 ++++++ .../ControllersLogic/CreateOrderLogic.php | 36 ++++ .../Processors/CreateOrderProcessor.php | 31 ++++ .../ValueObjects/Constants/OrderSteps.php | 160 ++++++++++++++++++ .../Orders/CreateOrderController.php | 20 +++ routes/api.php | 4 +- routes/order.php | 16 ++ 14 files changed, 710 insertions(+), 2 deletions(-) create mode 100644 app/Classes/Modules/OrderSteps/Processors/AbstractStepProcessor.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/ConfirmsOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/DeliverOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/ShipOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/WarehouseArrivalOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/WarehousePackOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/WarehouseReceivesOrder.php create mode 100644 app/Classes/Modules/OrderSteps/Processors/WarehouseUnpackingOrder.php create mode 100644 app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php create mode 100644 app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php create mode 100644 app/Classes/ValueObjects/Constants/OrderSteps.php create mode 100644 app/Http/Controllers/Orders/CreateOrderController.php create mode 100644 routes/order.php diff --git a/app/Classes/Modules/OrderSteps/Processors/AbstractStepProcessor.php b/app/Classes/Modules/OrderSteps/Processors/AbstractStepProcessor.php new file mode 100644 index 00000000..e96065b5 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/AbstractStepProcessor.php @@ -0,0 +1,46 @@ +validator()){ + return new JsonResponse(['message' => 'Updating step validation has failed due to missing requirements'], HttpStatus::VALIDATION_FAILED); + } + + (new CompletesOrderStep())->execute($orderId, $step); + + /** notification */ + + + return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED); + + } catch (\Exception $exception){ + + throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}"); + + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/ConfirmsOrder.php b/app/Classes/Modules/OrderSteps/Processors/ConfirmsOrder.php new file mode 100644 index 00000000..24ce20bc --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/ConfirmsOrder.php @@ -0,0 +1,56 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + * @throws \App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException + */ + public function execute(): JsonResponse { + + (new generateOrderSteps())->execute($this->orderId); + + return $this->handler($this->orderId, $this->step); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/DeliverOrder.php b/app/Classes/Modules/OrderSteps/Processors/DeliverOrder.php new file mode 100644 index 00000000..1e5a9738 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/DeliverOrder.php @@ -0,0 +1,56 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + if(!DeliveryArrangement::where('order_id', $this->orderId)->exists()) { + return false; + } + + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + return $this->handler($this->orderId, $this->step); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/ShipOrder.php b/app/Classes/Modules/OrderSteps/Processors/ShipOrder.php new file mode 100644 index 00000000..85bba60f --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/ShipOrder.php @@ -0,0 +1,59 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + + /** + * @return bool + */ + public function validator(): bool { + + if(!ShippingArrangement::where('order_id', $this->orderId)->exists()) { + return false; + } + + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + return $this->handler($this->orderId, $this->step); + } + + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/WarehouseArrivalOrder.php b/app/Classes/Modules/OrderSteps/Processors/WarehouseArrivalOrder.php new file mode 100644 index 00000000..e7376c18 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/WarehouseArrivalOrder.php @@ -0,0 +1,52 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + return $this->handler($this->orderId, $this->step); + } + + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/WarehousePackOrder.php b/app/Classes/Modules/OrderSteps/Processors/WarehousePackOrder.php new file mode 100644 index 00000000..eab2db4b --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/WarehousePackOrder.php @@ -0,0 +1,60 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + + $packingList = PackingList::where('order_id', $this->orderId)->first(); + + if(!$packingList->confirmed) { + return false; + } + + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + + return $this->handler($this->orderId, $this->step); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/WarehouseReceivesOrder.php b/app/Classes/Modules/OrderSteps/Processors/WarehouseReceivesOrder.php new file mode 100644 index 00000000..f032429c --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/WarehouseReceivesOrder.php @@ -0,0 +1,65 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + Mail::send('emails.received_orders_email', [], function ($message) { + $message->from('noreply@izyin.com', 'IZYIM'); + $message->to('uldvstar@gmail.com', 'Omair Saleh')->subject('Received orders report '.now()->format('dd/mm/YY')); + $message->attach( + Excel::download(Order::find($this->orderId), + 'report_'.now()->format('dd_mm_YY').'.xlsx') + ->getFile(), ['as' => 'report_'.now()->format('dd/mm/YY').'.xlsx']); + + }); + + return $this->handler($this->orderId, $this->step); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/WarehouseUnpackingOrder.php b/app/Classes/Modules/OrderSteps/Processors/WarehouseUnpackingOrder.php new file mode 100644 index 00000000..352d2235 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/WarehouseUnpackingOrder.php @@ -0,0 +1,51 @@ +orderId = $orderId; + $this->step = new StepObject(self::STEP_REFERENCE, $completeDate); + + } + + /** + * @return bool + */ + public function validator(): bool { + return true; + } + + + /** + * @return JsonResponse + * @throws InternalServerErrorException + */ + public function execute(): JsonResponse { + return $this->handler($this->orderId, $this->step); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php new file mode 100644 index 00000000..ce34fee1 --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php @@ -0,0 +1,36 @@ +createOrderProcessor = $createOrderProcessor; + $this->createOrderStepsProcessor = $createOrderStepsProcessor; + } + + protected function notification():array { + return [ + 'title' => 'Created Order', + 'message' => 'You have successfully created a new Order' + ]; + } + + public function logic(Request $request) { + $this->createOrderProcessor->execute($request); + + $this->createOrderStepsProcessor->execute($order_id, $request); + + //return resources JSON + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php new file mode 100644 index 00000000..896d7dd8 --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -0,0 +1,31 @@ +canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + } + + public function execute(Request $request) { + + //Data object + + + $this->createOrderProcessor->execute($request); + + + //return resources JSON + } +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/OrderSteps.php b/app/Classes/ValueObjects/Constants/OrderSteps.php new file mode 100644 index 00000000..7a7f6845 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/OrderSteps.php @@ -0,0 +1,160 @@ + [ + 'initial_name' => 'processing order', + 'final_name' => 'order confirmed', + 'description' => 'Order created and pending confirmation', + 'sequence' => 0 + ] + ]; + + public const ORDER_PRIMARY_MODULAR_STEPS = [ + OrderSteps::ORDER_SHIPPING_STEP => [ + 'initial_name' => 'shipping', + 'final_name' => 'shipped out', + 'description' => 'Order is Loaded to Container, waiting for Shipment', + 'sequence' => 1 + ], + OrderSteps::ORDER_DELIVERY_STEP => [ + 'initial_name' => 'delivery', + 'final_name' => 'Received', + 'description' => 'Order out for delivery soon', + 'sequence' => 2 + ], + ]; + + public const ORDER_MODULAR_STEPS = [ + OrderSteps::ORDER_MODULE_WAREHOUSE => [ + 'china_warehouse' => [ + 'previous' => OrderSteps::ORDER_PROCESSING_STEP, + 'next' => OrderSteps::ORDER_SHIPPING_STEP, + 'steps' => [ + OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP => [ + 'initial_name' => 'pending supplier', + 'final_name' => 'arrived at warehouse', + 'description' => 'Waiting for supplier to deliver order to warehouse' + ], + OrderSteps::ORDER_WAREHOUSE_PACKING_STEP => [ + 'initial_name' => 'packing', + 'final_name' => 'packed', + 'description' => 'Packing order into shipping container' + ] + ] + ], + 'malaysia_warehouse' => [ + 'previous' => OrderSteps::ORDER_SHIPPING_STEP, + 'next' => OrderSteps::ORDER_DELIVERY_STEP, + 'steps' => [ + OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP => [ + 'initial_name' => 'pending arrival', + 'final_name' => 'arrived at warehouse', + 'description' => 'Waiting for order\'s arrival & custom clearance' + ], + OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP => [ + 'initial_name' => 'unpacking', + 'final_name' => 'unpacked', + 'description' => 'Unpacking order from shipping container' + ] + ] + ] + ], + OrderSteps::ORDER_MODULE_NO_WAREHOUSE => [ + 'pending_arrival' => [ + 'previous' => OrderSteps::ORDER_PROCESSING_STEP, + 'next' => OrderSteps::ORDER_SHIPPING_STEP, + 'steps' => [ + OrderSteps::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER => [ + 'initial_name' => 'pending supplier', + 'final_name' => 'supplier packed order', + 'description' => 'Waiting for supplier to pack order for shipping' + ] + ] + ] + + ], + ]; + + public const COMPANY_ORDER_PROCESSING = [ + OrderSteps::ORDER_PROCESSING_STEP, + OrderSteps::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER, + OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP + ]; + + public const COMPANY_ORDER_SHIPPING = [ + OrderSteps::ORDER_WAREHOUSE_PACKING_STEP, + OrderSteps::ORDER_SHIPPING_STEP + ]; + + public const COMPANY_ORDER_RECEIVING = [ + OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP, + OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP, + OrderSteps::ORDER_DELIVERY_STEP + + ]; + + public const WAREHOUSE_RECEIVING_CATEGORY = 'receiving'; + public const WAREHOUSE_SHIPPING_CATEGORY = 'shipping'; + public const WAREHOUSE_COMPLETE_CATEGORY = 'complete'; + public const WAREHOUSE_CANCEL_CATEGORY = 'cancel'; + + public const WAREHOUSE_ORDER_RECEIVING = [ + OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP + ]; + + public const WAREHOUSE_ORDER_SHIPPING = [ + OrderSteps::ORDER_WAREHOUSE_PACKING_STEP, + OrderSteps::ORDER_SHIPPING_STEP, + ]; + + public const WAREHOUSE_ORDER_COMPLETE = [ + OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP, + OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP, + OrderSteps::ORDER_DELIVERY_STEP + ]; + + public const STEP_PROCESSOR = [ + OrderSteps::ORDER_PROCESSING_STEP => ConfirmsOrder::class, + OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP => WarehouseReceivesOrder::class, + OrderSteps::ORDER_WAREHOUSE_PACKING_STEP => WarehousePackOrder::class, + OrderSteps::ORDER_SHIPPING_STEP => ShipOrder::class, + OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP => WarehouseArrivalOrder::class, + OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP => WarehouseUnpackingOrder::class, + OrderSteps::ORDER_DELIVERY_STEP => DeliverOrder::class, + ]; + +} \ No newline at end of file diff --git a/app/Http/Controllers/Orders/CreateOrderController.php b/app/Http/Controllers/Orders/CreateOrderController.php new file mode 100644 index 00000000..bfeb5b22 --- /dev/null +++ b/app/Http/Controllers/Orders/CreateOrderController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 351c0f24..cf91126b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -40,8 +40,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function // // require __DIR__ . '/bank.php'; // -// require __DIR__ . '/booking.php'; -// + require __DIR__ . '/order.php'; + require __DIR__ . '/currency.php'; require __DIR__ . '/address.php'; diff --git a/routes/order.php b/routes/order.php new file mode 100644 index 00000000..7ac0a7d6 --- /dev/null +++ b/routes/order.php @@ -0,0 +1,16 @@ + 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () { + Route::get('/{id}/show', 'FetchCompanyController@fetch')->name('show'); + Route::get('/list', 'ListCompaniesController@list')->name('list'); + Route::post('/create', 'CreateCompanyController@create')->name('create'); + Route::put('/update/{id}', 'UpdateCompanyController@update')->name('update'); + Route::delete('/delete/{id}', 'DeleteCompanyController@destroy')->name('delete'); + + + Route::group(['prefix' => '{id}/step', 'as' => 'step.'], function () {}); + + Route::group(['prefix' => '{id}/role', 'as' => 'role.'], function () {}); +}); \ No newline at end of file