From 06efb4c169babdca83a9ce7532ae5b1859b95a2e Mon Sep 17 00:00:00 2001 From: Fairuz Date: Thu, 5 Aug 2021 10:52:26 +0800 Subject: [PATCH] Completes Order Steps on Unity --- .../CompletesOrderStepLogic.php | 31 ++++---- .../CompletesOrderStepProcessor.php | 78 +++++++++++++++++++ .../DataTransferObjects/OrderObject.php | 6 ++ .../Processors/ConfirmOrderProcessor.php | 27 ++++++- .../UpdatesOrderCurrentStepProcessor.php | 10 ++- .../Orders/Services/UpdatesCurrentStep.php | 1 + .../Processors/UpdateObligationStatus.php | 21 ----- .../Processors/UpdateObligationsProcessor.php | 21 +++++ .../Modules/Unity/Services/GetAccessToken.php | 18 +++-- .../Services/UpdatesContractObligation.php | 12 +-- .../CompletesOrderStepsController.php | 9 ++- app/Http/Resources/OrderResource.php | 2 +- ...tepsResource.php => OrderStepResource.php} | 2 +- app/Models/OrderStep.php | 18 +++++ config/unity.php | 6 +- resources/views/swagger/json.blade.php | 13 +--- routes/order.php | 11 +-- storage/app/.gitignore | 0 storage/app/public/.gitignore | 0 storage/framework/.gitignore | 0 storage/framework/cache/.gitignore | 0 storage/framework/cache/data/.gitignore | 0 storage/framework/sessions/.gitignore | 0 storage/framework/testing/.gitignore | 0 storage/framework/views/.gitignore | 0 storage/logs/.gitignore | 0 26 files changed, 208 insertions(+), 78 deletions(-) create mode 100644 app/Classes/Modules/OrderSteps/Processors/CompletesOrderStepProcessor.php delete mode 100644 app/Classes/Modules/Unity/Processors/UpdateObligationStatus.php create mode 100644 app/Classes/Modules/Unity/Processors/UpdateObligationsProcessor.php rename app/Http/Resources/{OrderStepsResource.php => OrderStepResource.php} (95%) mode change 100644 => 100755 storage/app/.gitignore mode change 100644 => 100755 storage/app/public/.gitignore mode change 100644 => 100755 storage/framework/.gitignore mode change 100644 => 100755 storage/framework/cache/.gitignore mode change 100644 => 100755 storage/framework/cache/data/.gitignore mode change 100644 => 100755 storage/framework/sessions/.gitignore mode change 100644 => 100755 storage/framework/testing/.gitignore mode change 100644 => 100755 storage/framework/views/.gitignore mode change 100644 => 100755 storage/logs/.gitignore diff --git a/app/Classes/Modules/OrderSteps/ControllersLogic/CompletesOrderStepLogic.php b/app/Classes/Modules/OrderSteps/ControllersLogic/CompletesOrderStepLogic.php index d890dd5a..55aebd59 100644 --- a/app/Classes/Modules/OrderSteps/ControllersLogic/CompletesOrderStepLogic.php +++ b/app/Classes/Modules/OrderSteps/ControllersLogic/CompletesOrderStepLogic.php @@ -1,6 +1,6 @@ canCreateOrder = $canCreateOrder; - $this->createsOrder = $createsOrder; + $this->completeOrderStepProcessor = $completeOrderStepProcessor; } protected function notification():array { return [ - 'title' => 'Created Order', - 'message' => 'You have successfully created a new Order' + 'title' => 'Completed Order Step', + 'message' => 'You have successfully completed a order step' ]; } 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); + $completedOrderStep = $this->completeOrderStepProcessor->execute($request); - $order = $this->createsOrder->execute($order_object); - - return $this->resourceResponse(new OrderResource($order)); + return $this->resourceResponse(new OrderStepResource($completedOrderStep)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/OrderSteps/Processors/CompletesOrderStepProcessor.php b/app/Classes/Modules/OrderSteps/Processors/CompletesOrderStepProcessor.php new file mode 100644 index 00000000..93dd7a91 --- /dev/null +++ b/app/Classes/Modules/OrderSteps/Processors/CompletesOrderStepProcessor.php @@ -0,0 +1,78 @@ +fetchesOrderStep = $fetchesOrderStep; + $this->unityUpdateObligation = $unityUpdateObligation; + $this->canUpdateOrderStep = $canUpdateOrderStep; + $this->updatesOrderStep = $updatesOrderStep; + $this->updatesOrderCurrentStep = $updatesOrderCurrentStep; + } + + public function execute(Request $request) { + + $orderStep = $this->fetchesOrderStep->getRepository()->where('id', $request->get('id'))->first(); + + $contractEntity = $orderStep->orderRole()->where('order_id',$orderStep->order_id)->first(); + + $obligation_hash_id = $orderStep->unity_hash_id; + $contract_entity_signature = $contractEntity->role_signature; + + $completed = $this->unityUpdateObligation->execute($contract_entity_signature, $obligation_hash_id); + + //Unity Contract Obligation Completed Status = 3 + if(isset($completed->status) && $completed->status == OrderStatus::COMPLETE){ + $orderStepObject = new OrderStepsObject( + $orderStep->order->id, + $contractEntity->company_module_id, + $orderStep->reference, + true, + $orderStep->sequence, + OrderStatus::COMPLETE, + OrderStatus::COMPLETE, + $completed->completed_at??date('Y-m-d H:i:s'), + $orderStep->id, + $orderStep->hash_id + ); + + $this->canUpdateOrderStep->passes($orderStepObject); + + $updatedOrderStep = $this->updatesOrderStep->execute($orderStep, $orderStepObject); + + $this->updatesOrderCurrentStep->execute( $orderStep->order->id, $orderStep->reference); + } + + return $orderStep; + + } +} diff --git a/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php b/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php index a792e364..ac872509 100644 --- a/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php +++ b/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php @@ -87,4 +87,10 @@ class OrderObject implements DataTransferObject { $this->current_step = $step; } + + public function setStatus(int $status) + { + $this->status = $status; + } + } diff --git a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php index c9155719..a124ae05 100644 --- a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php @@ -11,6 +11,8 @@ use App\Classes\Modules\OrderSteps\Processors\GenerateOrderStepsProcessor; use App\Classes\ValueObjects\Constants\OrderStatus; use App\Classes\ValueObjects\Constants\OrderSteps; use App\Classes\ValueObjects\Constants\OrderType; +use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject; +use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps; use Illuminate\Http\Request; class ConfirmOrderProcessor @@ -19,11 +21,14 @@ class ConfirmOrderProcessor private $generateOrderStepsProcessor; - public function __construct(CanConfirmOrder $canConfirmOrder, GenerateOrderStepsProcessor $generateOrderStepsProcessor, FetchesOrder $fetchesOrder) + private $updatesOrderCurrentStep; + + public function __construct(CanConfirmOrder $canConfirmOrder, GenerateOrderStepsProcessor $generateOrderStepsProcessor, FetchesOrder $fetchesOrder, UpdatesOrderSteps $updatesOrderStep) { $this->canConfirmOrder = $canConfirmOrder; $this->generateOrderStepsProcessor = $generateOrderStepsProcessor; $this->fetchesOrder = $fetchesOrder; + $this->updatesOrderStep = $updatesOrderStep; } public function execute(int $orderId, array $contract_obligation_list = [], array $orderRoles=[] ){ @@ -34,6 +39,26 @@ class ConfirmOrderProcessor $order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]); + //Only Processing Step is created at this point + $orderStep = $order->orderSteps[0]; + + $orderStepObject = new OrderStepsObject( + $order->id, + 0, + $orderStep->reference, + true, + $orderStep->sequence, + OrderStatus::COMPLETE, + 0, + date('Y-m-d H:i:s'), + $orderStep->id, + $orderStep->hash_id + ); + + //Update PROCESSING to completed + $updatedOrderStep = $this->updatesOrderStep->execute($orderStep, $orderStepObject); + + //Generate Order Steps base on Contract from Unity $this->generateOrderStepsProcessor->execute($order, $contract_obligation_list, $orderRoles); } diff --git a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php index cf6dc55c..3c63c930 100644 --- a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php +++ b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php @@ -38,7 +38,15 @@ class UpdatesOrderCurrentStepProcessor $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]); + //Count steps / obligations that pending + $order_steps_processing = $this->fetchesOrderSteps->getRepository()->where(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING])->count(); + + //If no more steps / obligations, then update Order status to complete (Contract fullfilled) + if($order_steps_processing==0){ + $order_object->setStatus(OrderStatus::COMPLETE); + }else{ + $order_object->setStatus($order->status); + } $order_object->setCurrentStep($currentStep); diff --git a/app/Classes/Modules/Orders/Services/UpdatesCurrentStep.php b/app/Classes/Modules/Orders/Services/UpdatesCurrentStep.php index 0da528b9..78fe4885 100644 --- a/app/Classes/Modules/Orders/Services/UpdatesCurrentStep.php +++ b/app/Classes/Modules/Orders/Services/UpdatesCurrentStep.php @@ -11,6 +11,7 @@ class UpdatesCurrentStep extends AbstractUpdateRecord public function execute(Order $model, OrderObject $object) { + $model->status = $object->getStatus(); $model->current_step = $object->getCurrentStep(); return $this->handler($model); diff --git a/app/Classes/Modules/Unity/Processors/UpdateObligationStatus.php b/app/Classes/Modules/Unity/Processors/UpdateObligationStatus.php deleted file mode 100644 index 951b52fb..00000000 --- a/app/Classes/Modules/Unity/Processors/UpdateObligationStatus.php +++ /dev/null @@ -1,21 +0,0 @@ -getContractObligations = $getContractObligations; - } - - public function execute(){ - return $this->getContractObligations->execute(); - } -} diff --git a/app/Classes/Modules/Unity/Processors/UpdateObligationsProcessor.php b/app/Classes/Modules/Unity/Processors/UpdateObligationsProcessor.php new file mode 100644 index 00000000..0d07c7c7 --- /dev/null +++ b/app/Classes/Modules/Unity/Processors/UpdateObligationsProcessor.php @@ -0,0 +1,21 @@ +updatesContractObligations = $updatesContractObligations; + } + + public function execute($contract_entity_signature, $obligation_hash_id){ + return $this->updatesContractObligations->execute($contract_entity_signature, $obligation_hash_id); + } +} diff --git a/app/Classes/Modules/Unity/Services/GetAccessToken.php b/app/Classes/Modules/Unity/Services/GetAccessToken.php index 7fa9a485..40cf5883 100644 --- a/app/Classes/Modules/Unity/Services/GetAccessToken.php +++ b/app/Classes/Modules/Unity/Services/GetAccessToken.php @@ -30,12 +30,12 @@ class GetAccessToken $this->apiKey = Config::get('unity.auth.api_key.key'); $this->cacheName = 'unity_access_token'; $this->cacheTime = Config::get('unity.access_token_cache'); - $this->accessToken = $this->getAccessToken(); + $this->accessToken = ""; } public function execute(){ - //if(!empty($this->getAccessToken())) return $this->getAccessToken(); + if(!empty($this->getCachedAccessToken())) return $this->getCachedAccessToken(); if(empty($this->apiKey)){ $response = Http::post($this->getAccessTokenEndpoint, [ @@ -43,20 +43,22 @@ class GetAccessToken 'password' => $this->password , ])->object(); $this->accessToken = $response->access_token; - }else{ $this->accessToken = $this->apiKey; } + $this->cacheAccessToken(); + //TODO: Throw error if access token not available return $this->accessToken; } - private function getAccessToken(){ - $accessToken = $this->accessToken; - return Cache::remember($this->cacheName, $this->cacheTime, function () use ( $accessToken ) { - return $accessToken??''; - }); + private function getCachedAccessToken(){ + return Cache::store('file')->get($this->cacheName); + } + + private function cacheAccessToken(){ + Cache::store('file')->put($this->cacheName, $this->accessToken, $this->cacheTime); } } diff --git a/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php index 8a1997b6..70246a66 100644 --- a/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php +++ b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php @@ -10,19 +10,21 @@ class UpdatesContractObligation { private $getAccessToken; - private $createEntityEndpoint; + private $updateContractStatusEndpoint; public function __construct(GetAccessToken $getAccessToken) { - $this->createEntityEndpoint = Config::get('unity.url').Config::get('unity.create_entity_endpoint'); + $this->updateContractStatusEndpoint = Config::get('unity.url').Config::get('unity.endpoint.update_obligation_status'); $this->getAccessToken = $getAccessToken; } - public function execute($entity_name){ + public function execute($contract_entity_signature, $obligation_hash_id){ - $accesToken=$this->getAccessToken->execute(); + $accessToken=$this->getAccessToken->execute(); - $response = Http::withToken($accesToken)->post($this->createEntityEndpoint,['name'=>$entity_name])->object(); + $this->updateContractStatusEndpoint = str_replace('{hash}',$obligation_hash_id,$this->updateContractStatusEndpoint); + + $response = Http::withToken($accessToken)->put($this->updateContractStatusEndpoint,['entity_signature_id'=>$contract_entity_signature])->object(); return (isset($response->data)) ? $response->data : null; diff --git a/app/Http/Controllers/OrderSteps/CompletesOrderStepsController.php b/app/Http/Controllers/OrderSteps/CompletesOrderStepsController.php index 7a6510b4..f0b95e85 100644 --- a/app/Http/Controllers/OrderSteps/CompletesOrderStepsController.php +++ b/app/Http/Controllers/OrderSteps/CompletesOrderStepsController.php @@ -1,8 +1,8 @@ request->add(['id'=>$id]); return $logic->execute($request); } -} \ No newline at end of file +} diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index 9a7785e2..97a2571e 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -29,7 +29,7 @@ class OrderResource extends JsonResource 'current_step' => $this->current_step, 'company' => new CompanyResource(Company::where('id',$this->companyModule()->first()->company_id)->first()), 'address' => new AddressResource($this->when($this->has('addresses'), $this->addresses->where('owner_id', $this->id)->first())), - 'order_steps' => OrderStepsResource::collection($this->orderSteps()->get()), + 'order_steps' => OrderStepResource::collection($this->orderSteps()->get()), ]; } } diff --git a/app/Http/Resources/OrderStepsResource.php b/app/Http/Resources/OrderStepResource.php similarity index 95% rename from app/Http/Resources/OrderStepsResource.php rename to app/Http/Resources/OrderStepResource.php index 4b696acf..a04f306d 100644 --- a/app/Http/Resources/OrderStepsResource.php +++ b/app/Http/Resources/OrderStepResource.php @@ -11,7 +11,7 @@ use App\Models\Currency; use App\Models\SegmentConstant; use Illuminate\Http\Resources\Json\JsonResource; -class OrderStepsResource extends JsonResource +class OrderStepResource extends JsonResource { /** * Transform the resource into an array. diff --git a/app/Models/OrderStep.php b/app/Models/OrderStep.php index 68995006..34a1ecdc 100644 --- a/app/Models/OrderStep.php +++ b/app/Models/OrderStep.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\Relations\BelongsTo; class OrderStep extends AbstractModel { @@ -13,4 +14,21 @@ class OrderStep extends AbstractModel protected $dates = ['deleted_at']; protected $fillable = ['order_id','appointee_id','reference','primary','sequence','status','contract_status','complete_date','unity_hash_id']; + + public function companyModule(): belongsTo + { + return $this->belongsTo(CompanyModule::class, 'appointee_id', 'id'); + } + + public function orderRole(): belongsTo + { + return $this->belongsTo(OrderRole::class, 'appointee_id', 'company_module_id'); + } + + + public function order(): belongsTo + { + return $this->belongsTo(Order::class, 'order_id', 'id'); + } + } diff --git a/config/unity.php b/config/unity.php index 43e47358..9b85c764 100644 --- a/config/unity.php +++ b/config/unity.php @@ -16,7 +16,7 @@ return [ 'create_contract' => env('UNITY_OB_LIST_ENDPOINT','contract/generate'), 'activate_contract' => 'contract/active/{hash}', 'assign_entity' => env('UNITY_OB_LIST_ENDPOINT','contract-obligation/assign-contract-entity/{hash}'), - 'update_obligation_status' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'), + 'update_obligation_status' => env('UNITY_OB_LIST_ENDPOINT','contract-obligation/update-complete/{hash}'), ], 'access_token_cache' => env('UNITY_TOKEN_CACHE', 86400), @@ -41,9 +41,9 @@ return [ 'on_error_email' => env('UNITY_ON_ERROR_EMAIL','dev@shipping.com,dev@unity.com'), - 'contract_template_id' => env('UNITY_CONTRACT_TEMPLATE_ID', 102), + 'contract_template_id' => env('UNITY_CONTRACT_TEMPLATE_ID', 105), - 'contract_template_hash_id' => env('UNITY_CONTRACT_TEMPLATE_HASH_ID', 'Kp3qzMV82mqA2PZg6eX0'), + 'contract_template_hash_id' => env('UNITY_CONTRACT_TEMPLATE_HASH_ID', 'zDMkNBK3dpej1Zpg7yv9'), 'contract_template_cache' => env('UNITY_CONTRACT_TEMPLATE_CACHE','60'), diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 757fe409..6b2edae9 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -2385,8 +2385,8 @@ } } }, - "/order/{id}/step/completes": { - "post": { + "/order/step/{id}/complete": { + "put": { "tags": [ "Order" ], @@ -2400,16 +2400,9 @@ { "name": "id", "in": "path", - "description": "Order Id", + "description": "Order step Id", "required": true, "type": "integer" - }, - { - "name": "reference", - "in": "query", - "description": "Order step reference", - "required": true, - "type": "string" } ], "responses": { diff --git a/routes/order.php b/routes/order.php index b2e951a6..04d6b8ef 100644 --- a/routes/order.php +++ b/routes/order.php @@ -10,12 +10,9 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f #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::post('/complete', 'CompletesOrderStepsController@complete')->name('create'); - - }); - Route::group(['prefix' => '{id}/role', 'as' => 'role.'], function () {}); }); + +Route::group(['prefix' => 'order/step/{id}', 'as' => 'order.step.', 'namespace' => 'OrderSteps'], function () { + Route::put('complete', 'CompletesOrderStepsController@complete')->name('complete'); +}); diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755