From 9c0772bf65a4d2957ade23c43fe97598d00b754a Mon Sep 17 00:00:00 2001 From: Fairuz Date: Thu, 15 Jul 2021 17:30:12 +0800 Subject: [PATCH] Orders APIs WIP --- .../DataTransferObjects/OrderStepsObject.php | 2 +- .../Processors/CreateOrderStepsProcessor.php | 47 + ...Step.php => UpdateOrderStepsProcessor.php} | 11 +- .../OrderSteps/Services/CreatesOrderSteps.php | 26 + .../OrderSteps/Services/FetchesOrderSteps.php | 2 +- .../OrderSteps/Services/ListsOrderSteps.php | 2 +- .../OrderSteps/Services/UpdatesOrderSteps.php | 25 + .../Standards/Rules/CanCreateOrderStep.php | 41 + .../Standards/Rules/CanUpdateOrderStep.php | 39 + .../Validators/CreateOrderStepValidation.php | 41 + .../Validators/UpdateOrderStepValidation.php | 41 + .../ControllersLogic/ConfirmOrderLogic.php | 45 + .../ControllersLogic/CreateOrderLogic.php | 19 +- .../Processors/ConfirmOrderProcessor.php | 49 + .../Processors/CreateOrderProcessor.php | 42 + .../UpdatesOrderCurrentStepProcessor.php | 7 +- .../ValueObjects/Constants/UnityStatus.php | 13 + .../CompletesOrderStepsController.php | 20 + .../Orders/ConfirmOrderController.php | 20 + app/Http/Resources/OrderResource.php | 5 +- app/Http/Resources/OrderStepsResource.php | 30 +- app/Models/OrderStep.php | 12 +- resources/views/swagger/json.blade.php | 945 +++++++++++++++++- routes/order.php | 15 +- 24 files changed, 1443 insertions(+), 56 deletions(-) create mode 100644 app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php rename app/Classes/Modules/OrderSteps/Processors/{UpdateOrderStep.php => UpdateOrderStepsProcessor.php} (84%) create mode 100644 app/Classes/Modules/OrderSteps/Services/CreatesOrderSteps.php create mode 100644 app/Classes/Modules/OrderSteps/Services/UpdatesOrderSteps.php create mode 100644 app/Classes/Modules/OrderSteps/Standards/Rules/CanCreateOrderStep.php create mode 100644 app/Classes/Modules/OrderSteps/Standards/Rules/CanUpdateOrderStep.php create mode 100644 app/Classes/Modules/OrderSteps/Standards/Validators/CreateOrderStepValidation.php create mode 100644 app/Classes/Modules/OrderSteps/Standards/Validators/UpdateOrderStepValidation.php create mode 100644 app/Classes/Modules/Orders/ControllersLogic/ConfirmOrderLogic.php create mode 100644 app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php create mode 100644 app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php create mode 100644 app/Classes/ValueObjects/Constants/UnityStatus.php create mode 100644 app/Http/Controllers/OrderSteps/CompletesOrderStepsController.php create mode 100644 app/Http/Controllers/Orders/ConfirmOrderController.php diff --git a/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php b/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php index ddd99820..4ec1fd41 100644 --- a/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php +++ b/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php @@ -25,7 +25,7 @@ class OrderStepsObject implements DataTransferObject private $completed_date; - public function __construct(int $order_id, int $appointee_id, string $reference, bool $primary, float $sequence, int $status, int $contract_status, string $completed_date, int $id=0) + public function __construct(int $order_id, int $appointee_id, string $reference, bool $primary, float $sequence, int $status, int $contract_status, ?string $completed_date, int $id=0) { $this->order_id = $order_id; $this->appointee_id = $appointee_id; diff --git a/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php new file mode 100644 index 00000000..b45d528e --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php @@ -0,0 +1,47 @@ +canCreateOrderStep = $canCreateOrderStep; + $this->createsOrderSteps = $createsOrderSteps; + $this->fetchesOrder = $fetchesOrder; + $this->fetchesOrderSteps = $fetchesOrderSteps; + } + + public function execute(Model $order, string $currentStep){ + + $order_steps_object = new OrderStepsObject($order->id, $order->company_module_id, $currentStep, true, 0, OrderStatus::PROCESSING, 0, null); + + $this->canCreateOrderStep->passes($order_steps_object); + + return $this->createsOrderSteps->execute($order_steps_object); + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStep.php b/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php similarity index 84% rename from app/Classes/Modules/OrderSteps/Processors/UpdateOrderStep.php rename to app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php index 5ded78f4..ddbd0a58 100644 --- a/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStep.php +++ b/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php @@ -1,10 +1,11 @@ canUpdateCurrentStep = $canUpdateCurrentStep; $this->updatesOrderCurrentStep = $updatesOrderCurrentStep; @@ -41,8 +42,6 @@ class UpdateOrderStep $order_steps = $this->fetchesOrderSteps->execute(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING, 'order_by' => 'sequence', 'per_page' => 1]); - $order_object->setCurrentStep($currentStep); - $this->updatesOrderCurrentStep->execute($orderId, $currentStep); diff --git a/app/Classes/Modules/OrderSteps/Services/CreatesOrderSteps.php b/app/Classes/Modules/OrderSteps/Services/CreatesOrderSteps.php new file mode 100644 index 00000000..7724b6b5 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Services/CreatesOrderSteps.php @@ -0,0 +1,26 @@ +order_id = $object->getOrderId(); + $model->appointee_id = $object->getAppointeeId(); + $model->reference = $object->getReference(); + $model->primary = $object->getPrimary(); + $model->sequence = $object->getSequence(); + $model->status = $object->getStatus(); + $model->contract_status = $object->getContractStatus(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/OrderSteps/Services/FetchesOrderSteps.php b/app/Classes/Modules/OrderSteps/Services/FetchesOrderSteps.php index 50d506d2..77559b14 100644 --- a/app/Classes/Modules/OrderSteps/Services/FetchesOrderSteps.php +++ b/app/Classes/Modules/OrderSteps/Services/FetchesOrderSteps.php @@ -1,6 +1,6 @@ appointee_id = $object->getAppointeeId(); + $model->reference = $object->getReference(); + $model->primary = $object->getPrimary(); + $model->sequence = $object->getSequence(); + $model->status = $object->getStatus(); + $model->contract_status = $object->getContractStatus(); + $model->complete_date = $object->getCompletedDate(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/OrderSteps/Standards/Rules/CanCreateOrderStep.php b/app/Classes/Modules/OrderSteps/Standards/Rules/CanCreateOrderStep.php new file mode 100644 index 00000000..65bec43a --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Standards/Rules/CanCreateOrderStep.php @@ -0,0 +1,41 @@ +orderValidation = $orderValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + protected function validators($object): bool + { + return $this->orderValidation->validate($object); + } + + /** + * @param CompanyObject $object + * @return bool + */ + protected function criteria($object): bool + { + //Verify account? + //Contract created on Unity + return true; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Standards/Rules/CanUpdateOrderStep.php b/app/Classes/Modules/OrderSteps/Standards/Rules/CanUpdateOrderStep.php new file mode 100644 index 00000000..0ac8488f --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Standards/Rules/CanUpdateOrderStep.php @@ -0,0 +1,39 @@ +orderValidation = $orderValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + protected function validators($object): bool + { + return $this->orderValidation->validate($object); + } + + /** + * @param CompanyObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/OrderSteps/Standards/Validators/CreateOrderStepValidation.php b/app/Classes/Modules/OrderSteps/Standards/Validators/CreateOrderStepValidation.php new file mode 100644 index 00000000..4721a459 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Standards/Validators/CreateOrderStepValidation.php @@ -0,0 +1,41 @@ + 'required' + ]; + } + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} diff --git a/app/Classes/Modules/OrderSteps/Standards/Validators/UpdateOrderStepValidation.php b/app/Classes/Modules/OrderSteps/Standards/Validators/UpdateOrderStepValidation.php new file mode 100644 index 00000000..b2ee8451 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Standards/Validators/UpdateOrderStepValidation.php @@ -0,0 +1,41 @@ + $object->getId(), + 'current_step' => $object->getCurrentStep(), + ]; + } + + /** + * @param string $type + * @return array + */ + protected function rules(?string $type = 'POST'): array + { + return [ + 'id'=> 'required|numeric', + 'current_step'=> 'required', + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} diff --git a/app/Classes/Modules/Orders/ControllersLogic/ConfirmOrderLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ConfirmOrderLogic.php new file mode 100644 index 00000000..47afc1e8 --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/ConfirmOrderLogic.php @@ -0,0 +1,45 @@ +canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + } + + protected function notification():array { + return [ + 'title' => 'Created Order', + 'message' => 'You have successfully created a new Order' + ]; + } + + public function logic(Request $request) : JsonResponse { + $order_object = new OrderObject($request->get('company_module_id'), '', '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING); + + $this->canCreateOrder->passes($order_object); + + $order = $this->createsOrder->execute($order_object); + + return $this->resourceResponse(new OrderResource($order)); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php index 6d976093..cd8d43c9 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\Orders\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\Services\CreatesOrder; +use App\Classes\Modules\Orders\Processors\CreateOrderProcessor; use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder; use App\Classes\ValueObjects\Constants\OrderStatus; use App\Classes\ValueObjects\Constants\OrderSteps; @@ -16,14 +17,11 @@ use Illuminate\Http\JsonResponse; class CreateOrderLogic extends AbstractControllerLogic { - private $canCreateOrder; + private $createOrderProcessor; - private $createsOrder; - - public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder) + public function __construct( CreateOrderProcessor $createsOrderProcessor) { - $this->canCreateOrder = $canCreateOrder; - $this->createsOrder = $createsOrder; + $this->createOrderProcessor = $createsOrderProcessor; } protected function notification():array { @@ -34,11 +32,14 @@ class CreateOrderLogic extends AbstractControllerLogic } public function logic(Request $request) : JsonResponse { - $order_object = new OrderObject($request->get('company_module_id'), '', '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING); - $this->canCreateOrder->passes($order_object); + $order = $this->createOrderProcessor->execute($request); - $order = $this->createsOrder->execute($order_object); + //$order_object = new OrderObject($request->get('company_module_id'), '', '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING); + + //$this->canCreateOrder->passes($order_object); + + //$order = $this->createsOrder->execute($order_object); return $this->resourceResponse(new OrderResource($order)); } diff --git a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php new file mode 100644 index 00000000..f061451b --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php @@ -0,0 +1,49 @@ +canUpdateCurrentStep = $canUpdateCurrentStep; + $this->updatesCurrentStep = $updatesCurrentStep; + $this->fetchesOrder = $fetchesOrder; + $this->fetchesOrderSteps = $fetchesOrderSteps; + } + + public function execute(int $orderId, string $currentStep){ + + $order_object = new OrderObject(0, '', '', 0, 0, $currentStep, $orderId); + + $this->canUpdateCurrentStep->passes($order_object); + + $order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]); + + $order_steps = $this->fetchesOrderSteps->execute(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING, 'order_by' => 'sequence', 'per_page' => 1]); + + $order_object->setCurrentStep($currentStep); + + $order = $this->updatesCurrentStep->execute($order, $order_object); + + + + } +} \ 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..4b2708da --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -0,0 +1,42 @@ +canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + $this->createOrderStepsProcessor = $createOrderStepsProcessor; + } + + public function execute(Request $request){ + + $order_object = new OrderObject($request->get('company_module_id'), $request->get('reference'), '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING); + + $this->canCreateOrder->passes($order_object); + + $order = $this->createsOrder->execute($order_object); + + //Add processing to order step + $this->createOrderStepsProcessor->execute($order, OrderSteps::PROCESSING); + + return $order; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php index ebc21727..a524ff24 100644 --- a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php +++ b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php @@ -1,10 +1,11 @@ canUpdateCurrentStep = $canUpdateCurrentStep; $this->updatesCurrentStep = $updatesCurrentStep; diff --git a/app/Classes/ValueObjects/Constants/UnityStatus.php b/app/Classes/ValueObjects/Constants/UnityStatus.php new file mode 100644 index 00000000..78956432 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/UnityStatus.php @@ -0,0 +1,13 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Orders/ConfirmOrderController.php b/app/Http/Controllers/Orders/ConfirmOrderController.php new file mode 100644 index 00000000..f655ce40 --- /dev/null +++ b/app/Http/Controllers/Orders/ConfirmOrderController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index e63893ae..a04a44db 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -5,6 +5,7 @@ namespace App\Http\Resources; use App\Models\Company; use App\Models\Currency; +use App\Models\OrderStep; use App\Models\SegmentConstant; use Illuminate\Http\Resources\Json\JsonResource; @@ -24,9 +25,9 @@ class OrderResource extends JsonResource 'reference_contract' => (int) $this->type, 'type' => (int) $this->type, 'status' => (int) $this->status, + 'current_step' => $this->current_step, 'company' => new CompanyResource(Company::where('id',$this->companyModule()->first()->company_id)->first()), - + 'order_steps' => OrderStepsResource::collection($this->orderSteps()->get()), ]; - } } diff --git a/app/Http/Resources/OrderStepsResource.php b/app/Http/Resources/OrderStepsResource.php index bdcdf2e2..4b696acf 100644 --- a/app/Http/Resources/OrderStepsResource.php +++ b/app/Http/Resources/OrderStepsResource.php @@ -23,30 +23,14 @@ class OrderStepsResource extends JsonResource { return [ 'id' => $this->id, - 'name' => $this->name, + 'order_id' => $this->order_id, + 'appointee_id' => $this->appointee_id, 'reference' => $this->reference, - 'type' => (int) $this->type, - 'business_type' => (int) $this->business_type, - 'status' => (int) $this->status, - 'contact' => new ContactResource ($this->when($this->has('contacts'), $this->contacts->first())), - 'address' => new AddressResource($this->when($this->has('addresses'), $this->addresses->where('billing', true)->first())), - // 'employee' => new UserResource($this->employees->first()), - // 'identification' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->first()), - // 'bookings' => BookingResource::collection($this->whenLoaded('bookings', $this->bookings()->orderBy('id', 'DESC')->get(), [])), - // 'personal_banks' => BankResource::collection($this->banks->where('type', BankAccountType::PERSONAL)), - // 'recipient_banks' => [ - // 'accounts' => BankResource::collection($this->banks->where('type', BankAccountType::EXTERNAL)), - // 'default' => new BankResource($this->banks->where('type', BankAccountType::EXTERNAL)->where('default', true)->first()) - // ], - // 'segments' => SegmentResource::collection($this->segments), - // 'services' => (new FetchesCompanyServices())->getServices($this->servicesConfigurations()), - // 'currencies' => $this->when($this->business_type === BusinessType::CURRENCY_VENDOR, function(){ - // $segment = SegmentConstant::where('reference', SegmentConstants::SUPPLIER_CURRENCIES)->where('detail->id', $this->id)->first(); - // return $segment ? CurrencyResource::collection(Currency::whereIn('id', $segment->detail->currencies)->get()) : []; - // }) - - + 'primary' => (int) $this->primary, + 'sequence' => (double) $this->sequence, + 'status' =>(int) $this->status, + 'contract_status' =>(int) $this->contract_status, + 'complete_date' => $this->complete_date, ]; - } } diff --git a/app/Models/OrderStep.php b/app/Models/OrderStep.php index e18f5b44..db369575 100644 --- a/app/Models/OrderStep.php +++ b/app/Models/OrderStep.php @@ -2,10 +2,14 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; -class OrderStep extends Model +class OrderStep extends AbstractModel { - use HasFactory; + use SoftDeletes; + + protected $table = 'order_steps'; + + protected $dates = ['deleted_at']; + } diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index c2e3b0aa..95a05ae6 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -1 +1,944 @@ -{"swagger":"2.0","info":{"description":"Shipping Portal to manage parcel","version":"1.0.0","title":"Shipping Portal"},"host":"{{request()->getHttpHost()}}","basePath":"/api/v1","tags":[{"name":"Account","description":"Endpoints related to user module, e.g. login, register."},{"name":"Address","description":"Endpoints related to address module, e.g. create, district."},{"name":"Company","description":"Endpoints related to company module."},{"name":"Flow - Registration","description":"Endpoints related to registration flow."}],"schemes":["http","https"],"paths":{"/address/create":{"post":{"tags":["Address"],"produces":["application/json"],"operationId":"createAddress","summary":"Create address","description":"","parameters":[{"name":"district_id","in":"query","description":"District id","required":true,"type":"integer"},{"name":"street_one","in":"query","description":"Address line 1","required":true,"type":"string"},{"name":"street_two","in":"query","description":"Address line 2","required":true,"type":"string"},{"name":"post_code","in":"query","description":"Postcode of the address","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/delete/{id}":{"delete":{"tags":["Address"],"produces":["application/json"],"operationId":"deleteAddress","summary":"Delete address","description":"","parameters":[{"name":"id","in":"path","description":"District id","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/district/list":{"get":{"tags":["Address"],"produces":["application/json"],"operationId":"listDistrictAddress","summary":"List districts","description":"","parameters":[{"name":"filter","in":"query","description":"Filters","required":false,"type":"array","items":{"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/list":{"get":{"tags":["Address"],"produces":["application/json"],"operationId":"listAddress","summary":"List addresses of logged in user","description":"","parameters":[{"name":"filter","in":"query","description":"Filters","required":false,"type":"array","items":{"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/{id}/show":{"get":{"tags":["Address"],"produces":["application/json"],"operationId":"showAddress","summary":"List addresses of logged in user","description":"","parameters":[{"name":"id","in":"path","description":"Address id","required":true,"type":"integer"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/{id}/default":{"put":{"tags":["Address"],"produces":["application/json"],"operationId":"setDefaultAddress","summary":"Set default address","description":"","parameters":[{"name":"id","in":"path","description":"Address id","required":true,"type":"integer"},{"name":"district_id","in":"query","description":"District id","required":true,"type":"integer"},{"name":"street_one","in":"query","description":"Address line 1","required":true,"type":"string"},{"name":"street_two","in":"query","description":"Address line 2","required":true,"type":"string"},{"name":"post_code","in":"query","description":"Postcode of the address","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/address/update/{id}":{"put":{"tags":["Address"],"produces":["application/json"],"operationId":"setDefaultAddress","summary":"Set default address","description":"","parameters":[{"name":"id","in":"path","description":"Address id","required":true,"type":"integer"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"422":{"description":"Invalid input supplied"}}}},"/account/authentication/login/check_email":{"post":{"tags":["Account","Flow - Registration"],"summary":"Check if email registered","description":"","operationId":"userList","produces":["application/json","application/xml"],"parameters":[{"name":"email","in":"query","description":"email","required":true,"type":"string"}],"responses":{"default":{"description":"successful operation"}}}},"/account/registration/registration":{"post":{"tags":["Account","Flow - Registration"],"produces":["application/json"],"summary":"Register user into the system","description":"","parameters":[{"name":"name","in":"query","description":"The name of user","required":true,"type":"string"},{"name":"email","in":"query","description":"The email for login","required":true,"type":"string","format":"email"},{"name":"password","in":"query","description":"The password for login","required":true,"type":"string","format":"password"},{"name":"password_confirmation","in":"query","description":"The confirmation password for login","required":true,"type":"string","format":"password"},{"name":"type","in":"query","description":"Company Type - PERSONAL_BUSINESS:0 , COMPANY_BUSINESS:1","required":true,"type":"integer"},{"name":"phone","in":"query","description":"Contact phone number","required":true,"type":"string"},{"name":"contact_email","in":"query","description":"Contact email","required":true,"type":"string"},{"name":"company_name","in":"query","description":"The company name - if not defined , name of user will save as the company name","required":false,"type":"string"},{"name":"business_type","in":"query","description":"Business Type - FREIGHT_FORWARDER:1, IMPORTER:2, CURRENCY_VENDOR:3, WAREHOUSE:4","required":false,"default":2,"type":"integer"},{"name":"wechat_id","in":"query","description":"Contact Wechat id","required":false,"type":"string"},{"name":"files[0]","in":"query","description":"File need to convert to base64 example : 'data:application/pdf;base64,{Base64}';","required":true,"type":"string"},{"name":"identification_no","in":"query","description":"Personal identification no or company registration no","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"400":{"description":"Invalid username/password supplied"}}}},"/account/authentication/login/attempt":{"post":{"tags":["Account"],"produces":["application/json"],"summary":"Logs user into the system","operationId":"aaa","description":"","parameters":[{"name":"email","in":"query","description":"The user name for login","required":true,"type":"string"},{"name":"password","in":"query","description":"The password for login in clear text","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"400":{"description":"Invalid username/password supplied"}}}},"/account/authentication/logout":{"get":{"tags":["Account"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","produces":["application/json","application/xml"],"parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/account/user/list":{"get":{"tags":["Account"],"summary":"Logs out current logged in user session","description":"","operationId":"userList","produces":["application/json","application/xml"],"parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/company/list":{"get":{"tags":["Company"],"summary":"List of Companies","description":"example filters={\"WithCompanyModuleType\":4,\"order_by\":{\"column\":\"id\",\"DESC\":true}} | to get list of company with company_module.Type(business type) = 4(Warehouse)","operationId":"companyList","produces":["application/json","application/xml"],"parameters":[{"name":"filters","in":"query","description":"Eloquent Filter","required":false,"type":"array","items":{"type":"string"}}],"responses":{"default":{"description":"successful operation"}}}},"/company/create":{"post":{"tags":["Company"],"summary":"Create company","description":"","operationId":"companyCreate","produces":["application/json","application/xml"],"parameters":[{"name":"type","in":"query","description":"Company Type - PERSONAL_BUSINESS:0 , COMPANY_BUSINESS:1","required":true,"type":"integer","enum":[0,1]},{"name":"business_type","in":"query","description":"Business Type - FREIGHT_FORWARDER:1, IMPORTER:2, CURRENCY_VENDOR:3, WAREHOUSE:4","required":true,"type":"integer","enum":[1,2,3,4]},{"name":"name","in":"query","description":"Fill in name if type = 0","required":false,"type":"string"},{"name":"name","in":"query","description":"Fill in name if type = 0","required":false,"type":"string"},{"name":"company_name","in":"query","description":"Fill in company_name if type = 1","required":false,"type":"string"}],"responses":{"default":{"description":"successful operation"}}}}},"securityDefinitions":{"Authorization":{"type":"apiKey","name":"api_key","in":"header"},"petstore_auth":{"type":"oauth2","authorizationUrl":"https://petstore.swagger.io/oauth/authorize","flow":"implicit","scopes":{"read:pets":"read your pets","write:pets":"modify pets in your account"}}},"definitions":{"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"title":{"type":"string"},"message":{"type":"string"},"payload":{"type":"object"}}}}} \ No newline at end of file +{ +"swagger": "2.0", +"info": { +"description": "Shipping Portal to manage parcel", +"version": "1.0.0", +"title": "Shipping Portal" +}, +"host": "{{request()->getHttpHost()}}", +"basePath": "/api/v1", +"tags": [ +{ +"name": "Account", +"description": "Endpoints related to user module, e.g. login, register." +}, +{ +"name": "Address", +"description": "Endpoints related to address module, e.g. create, district." +}, +{ +"name": "Company", +"description": "Endpoints related to company module." +}, +{ +"name": "Order", +"description": "Endpoints related to order module." +}, +{ +"name": "Flow - Registration", +"description": "Endpoints related to registration flow." +} +], +"schemes": [ +"http", +"https" +], +"paths": { +"/order/create": { +"post": { +"tags": [ +"Order" +], +"produces": [ +"application/json" +], +"operationId": "createOrder", +"summary": "Create order", +"description": "", +"parameters": [ +{ +"name": "company_module_id", +"in": "query", +"description": "Company Module ID", +"required": true, +"type": "integer" +}, +{ +"name": "reference", +"in": "query", +"description": "Internal reference id", +"required": true, +"type": "string" +}, +{ +"name": "reference_contract", +"in": "query", +"description": "Unity contract reference id", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/order/{id}/confirm": { +"put": { +"tags": [ +"Order" +], +"produces": [ +"application/json" +], +"operationId": "createOrder", +"summary": "Admin confirms order", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "Order ID", +"required": true, +"type": "integer" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/order/{id}/step/completes": { +"post": { +"tags": [ +"Order" +], +"produces": [ +"application/json" +], +"operationId": "createOrder", +"summary": "Completes order step", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "Order Id", +"required": true, +"type": "integer" +}, +{ +"name": "reference", +"in": "query", +"description": "Order step reference", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/create": { +"post": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "createAddress", +"summary": "Create address", +"description": "", +"parameters": [ +{ +"name": "district_id", +"in": "query", +"description": "District id", +"required": true, +"type": "integer" +}, +{ +"name": "street_one", +"in": "query", +"description": "Address line 1", +"required": true, +"type": "string" +}, +{ +"name": "street_two", +"in": "query", +"description": "Address line 2", +"required": true, +"type": "string" +}, +{ +"name": "post_code", +"in": "query", +"description": "Postcode of the address", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/delete/{id}": { +"delete": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "deleteAddress", +"summary": "Delete address", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "District id", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/district/list": { +"get": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "listDistrictAddress", +"summary": "List districts", +"description": "", +"parameters": [ +{ +"name": "filter", +"in": "query", +"description": "Filters", +"required": false, +"type": "array", +"items": { +"type": "string" +} +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/list": { +"get": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "listAddress", +"summary": "List addresses of logged in user", +"description": "", +"parameters": [ +{ +"name": "filter", +"in": "query", +"description": "Filters", +"required": false, +"type": "array", +"items": { +"type": "string" +} +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/{id}/show": { +"get": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "showAddress", +"summary": "List addresses of logged in user", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "Address id", +"required": true, +"type": "integer" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/{id}/default": { +"put": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "setDefaultAddress", +"summary": "Set default address", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "Address id", +"required": true, +"type": "integer" +}, +{ +"name": "district_id", +"in": "query", +"description": "District id", +"required": true, +"type": "integer" +}, +{ +"name": "street_one", +"in": "query", +"description": "Address line 1", +"required": true, +"type": "string" +}, +{ +"name": "street_two", +"in": "query", +"description": "Address line 2", +"required": true, +"type": "string" +}, +{ +"name": "post_code", +"in": "query", +"description": "Postcode of the address", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/address/update/{id}": { +"put": { +"tags": [ +"Address" +], +"produces": [ +"application/json" +], +"operationId": "setDefaultAddress", +"summary": "Set default address", +"description": "", +"parameters": [ +{ +"name": "id", +"in": "path", +"description": "Address id", +"required": true, +"type": "integer" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"422": { +"description": "Invalid input supplied" +} +} +} +}, +"/account/authentication/login/check_email": { +"post": { +"tags": [ +"Account", +"Flow - Registration" +], +"summary": "Check if email registered", +"description": "", +"operationId": "userList", +"produces": [ +"application/json", +"application/xml" +], +"parameters": [ +{ +"name": "email", +"in": "query", +"description": "email", +"required": true, +"type": "string" +} +], +"responses": { +"default": { +"description": "successful operation" +} +} +} +}, +"/account/registration/registration": { +"post": { +"tags": [ +"Account", +"Flow - Registration" +], +"produces": [ +"application/json" +], +"summary": "Register user into the system", +"description": "", +"parameters": [ +{ +"name": "name", +"in": "query", +"description": "The name of user", +"required": true, +"type": "string" +}, +{ +"name": "email", +"in": "query", +"description": "The email for login", +"required": true, +"type": "string", +"format": "email" +}, +{ +"name": "password", +"in": "query", +"description": "The password for login", +"required": true, +"type": "string", +"format": "password" +}, +{ +"name": "password_confirmation", +"in": "query", +"description": "The confirmation password for login", +"required": true, +"type": "string", +"format": "password" +}, +{ +"name": "type", +"in": "query", +"description": "Company Type - PERSONAL_BUSINESS:0 , COMPANY_BUSINESS:1", +"required": true, +"type": "integer" +}, +{ +"name": "phone", +"in": "query", +"description": "Contact phone number", +"required": true, +"type": "string" +}, +{ +"name": "contact_email", +"in": "query", +"description": "Contact email", +"required": true, +"type": "string" +}, +{ +"name": "company_name", +"in": "query", +"description": "The company name - if not defined , name of user will save as the company name", +"required": false, +"type": "string" +}, +{ +"name": "business_type", +"in": "query", +"description": "Business Type - FREIGHT_FORWARDER:1, IMPORTER:2, CURRENCY_VENDOR:3, WAREHOUSE:4", +"required": false, +"default": 2, +"type": "integer" +}, +{ +"name": "wechat_id", +"in": "query", +"description": "Contact Wechat id", +"required": false, +"type": "string" +}, +{ +"name": "files[0]", +"in": "query", +"description": "File need to convert to base64 example : 'data:application/pdf;base64,{Base64}';", +"required": true, +"type": "string" +}, +{ +"name": "identification_no", +"in": "query", +"description": "Personal identification no or company registration no", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"400": { +"description": "Invalid username/password supplied" +} +} +} +}, +"/account/authentication/login/attempt": { +"post": { +"tags": [ +"Account" +], +"produces": [ +"application/json" +], +"summary": "Logs user into the system", +"operationId": "aaa", +"description": "", +"parameters": [ +{ +"name": "email", +"in": "query", +"description": "The user name for login", +"required": true, +"type": "string" +}, +{ +"name": "password", +"in": "query", +"description": "The password for login in clear text", +"required": true, +"type": "string" +} +], +"responses": { +"200": { +"description": "successful operation", +"headers": { +"X-Expires-After": { +"type": "string", +"format": "date-time", +"description": "date in UTC when token expires" +}, +"X-Rate-Limit": { +"type": "integer", +"format": "int32", +"description": "calls per hour allowed by the user" +} +}, +"schema": { +"type": "string" +} +}, +"400": { +"description": "Invalid username/password supplied" +} +} +} +}, +"/account/authentication/logout": { +"get": { +"tags": [ +"Account" +], +"summary": "Logs out current logged in user session", +"description": "", +"operationId": "logoutUser", +"produces": [ +"application/json", +"application/xml" +], +"parameters": [], +"responses": { +"default": { +"description": "successful operation" +} +} +} +}, +"/account/user/list": { +"get": { +"tags": [ +"Account" +], +"summary": "Logs out current logged in user session", +"description": "", +"operationId": "userList", +"produces": [ +"application/json", +"application/xml" +], +"parameters": [], +"responses": { +"default": { +"description": "successful operation" +} +} +} +}, +"/company/list": { +"get": { +"tags": [ +"Company" +], +"summary": "List of Companies", +"description": "example filters={\"WithCompanyModuleType\":4,\"order_by\":{\"column\":\"id\",\"DESC\":true}} | to get list of company with company_module.Type(business type) = 4(Warehouse)", +"operationId": "companyList", +"produces": [ +"application/json", +"application/xml" +], +"parameters": [ +{ +"name": "filters", +"in": "query", +"description": "Eloquent Filter", +"required": false, +"type": "array", +"items": { +"type": "string" +} +} +], +"responses": { +"default": { +"description": "successful operation" +} +} +} +}, +"/company/create": { +"post": { +"tags": [ +"Company" +], +"summary": "Create company", +"description": "", +"operationId": "companyCreate", +"produces": [ +"application/json", +"application/xml" +], +"parameters": [ +{ +"name": "type", +"in": "query", +"description": "Company Type - PERSONAL_BUSINESS:0 , COMPANY_BUSINESS:1", +"required": true, +"type": "integer", +"enum": [ +0, +1 +] +}, +{ +"name": "business_type", +"in": "query", +"description": "Business Type - FREIGHT_FORWARDER:1, IMPORTER:2, CURRENCY_VENDOR:3, WAREHOUSE:4", +"required": true, +"type": "integer", +"enum": [ +1, +2, +3, +4 +] +}, +{ +"name": "name", +"in": "query", +"description": "Fill in name if type = 0", +"required": false, +"type": "string" +}, +{ +"name": "name", +"in": "query", +"description": "Fill in name if type = 0", +"required": false, +"type": "string" +}, +{ +"name": "company_name", +"in": "query", +"description": "Fill in company_name if type = 1", +"required": false, +"type": "string" +} +], +"responses": { +"default": { +"description": "successful operation" +} +} +} +} +}, +"securityDefinitions": { +"Authorization": { +"type": "apiKey", +"name": "api_key", +"in": "header" +}, +"petstore_auth": { +"type": "oauth2", +"authorizationUrl": "https://petstore.swagger.io/oauth/authorize", +"flow": "implicit", +"scopes": { +"read:pets": "read your pets", +"write:pets": "modify pets in your account" +} +} +}, +"definitions": { +"ApiResponse": { +"type": "object", +"properties": { +"code": { +"type": "integer", +"format": "int32" +}, +"title": { +"type": "string" +}, +"message": { +"type": "string" +}, +"payload": { +"type": "object" +} +} +} +} +} diff --git a/routes/order.php b/routes/order.php index b9d99f77..738d8a21 100644 --- a/routes/order.php +++ b/routes/order.php @@ -3,14 +3,19 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () { - Route::get('/{id}/show', 'FetchOrderController@fetch')->name('show'); - Route::get('/list', 'ListOrdersController@list')->name('list'); + #Route::get('/{id}/show', 'FetchOrderController@fetch')->name('show'); + #Route::get('/list', 'ListOrdersController@list')->name('list'); Route::post('/create', 'CreateOrderController@create')->name('create'); - Route::put('/update/{id}', 'UpdateOrderController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteOrderController@destroy')->name('delete'); + Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm'); + #Route::put('/update/{id}', 'UpdateOrderController@update')->name('update'); + #Route::delete('/delete/{id}', 'DeleteOrderController@destroy')->name('delete'); - Route::group(['prefix' => '{id}/step', 'as' => 'step.'], function () {}); + Route::group(['prefix' => '{id}/step', 'as' => 'step.'], function () { + + Route::post('/complete', 'CompletesOrderStepsController@complete')->name('create'); + + }); Route::group(['prefix' => '{id}/role', 'as' => 'role.'], function () {}); }); \ No newline at end of file