Completes Order Steps on Unity

This commit is contained in:
Fairuz
2021-08-05 10:52:26 +08:00
parent 503a550637
commit 06efb4c169
26 changed files with 208 additions and 78 deletions
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Classes\Modules\Orders\ControllersLogic; namespace App\Classes\Modules\OrderSteps\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
@@ -9,37 +9,36 @@ use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder;
use App\Classes\ValueObjects\Constants\OrderStatus; use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps; use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType; use App\Classes\ValueObjects\Constants\OrderType;
use App\Http\Resources\OrderResource; use App\Http\Resources\OrderStepResource;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\OrderSteps\Processors\CompletesOrderStepProcessor;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class CompletesOrderStepLogic extends AbstractControllerLogic class CompletesOrderStepLogic extends AbstractControllerLogic
{ {
private $canCreateOrder; private $completeOrderStepProcessor;
private $createsOrder; public function __construct(CompletesOrderStepProcessor $completeOrderStepProcessor)
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder)
{ {
$this->canCreateOrder = $canCreateOrder; $this->completeOrderStepProcessor = $completeOrderStepProcessor;
$this->createsOrder = $createsOrder;
} }
protected function notification():array { protected function notification():array {
return [ return [
'title' => 'Created Order', 'title' => 'Completed Order Step',
'message' => 'You have successfully created a new Order' 'message' => 'You have successfully completed a order step'
]; ];
} }
public function logic(Request $request) : JsonResponse { 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 OrderStepResource($completedOrderStep));
return $this->resourceResponse(new OrderResource($order));
} }
} }
@@ -0,0 +1,78 @@
<?php
namespace App\Classes\Modules\OrderSteps\Processors;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps;
use App\Classes\Modules\OrderSteps\Standards\Rules\CanUpdateOrderStep;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use App\Http\Resources\OrderStepResource;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\Unity\Processors\UpdateObligationsProcessor;
use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class CompletesOrderStepProcessor
{
private $fetchesOrderStep;
private $unityUpdateObligation;
private $updateOrderStepProcessors;
private $updatesOrderCurrentStep;
public function __construct(FetchesOrderSteps $fetchesOrderStep, UpdateObligationsProcessor $unityUpdateObligation, CanUpdateOrderStep $canUpdateOrderStep, UpdatesOrderSteps $updatesOrderStep, UpdatesOrderCurrentStepProcessor $updatesOrderCurrentStep)
{
$this->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;
}
}
@@ -87,4 +87,10 @@ class OrderObject implements DataTransferObject
{ {
$this->current_step = $step; $this->current_step = $step;
} }
public function setStatus(int $status)
{
$this->status = $status;
}
} }
@@ -11,6 +11,8 @@ use App\Classes\Modules\OrderSteps\Processors\GenerateOrderStepsProcessor;
use App\Classes\ValueObjects\Constants\OrderStatus; use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps; use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType; use App\Classes\ValueObjects\Constants\OrderType;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ConfirmOrderProcessor class ConfirmOrderProcessor
@@ -19,11 +21,14 @@ class ConfirmOrderProcessor
private $generateOrderStepsProcessor; 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->canConfirmOrder = $canConfirmOrder;
$this->generateOrderStepsProcessor = $generateOrderStepsProcessor; $this->generateOrderStepsProcessor = $generateOrderStepsProcessor;
$this->fetchesOrder = $fetchesOrder; $this->fetchesOrder = $fetchesOrder;
$this->updatesOrderStep = $updatesOrderStep;
} }
public function execute(int $orderId, array $contract_obligation_list = [], array $orderRoles=[] ){ 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()]); $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); $this->generateOrderStepsProcessor->execute($order, $contract_obligation_list, $orderRoles);
} }
@@ -38,7 +38,15 @@ class UpdatesOrderCurrentStepProcessor
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]); $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); $order_object->setCurrentStep($currentStep);
@@ -11,6 +11,7 @@ class UpdatesCurrentStep extends AbstractUpdateRecord
public function execute(Order $model, OrderObject $object) { public function execute(Order $model, OrderObject $object) {
$model->status = $object->getStatus();
$model->current_step = $object->getCurrentStep(); $model->current_step = $object->getCurrentStep();
return $this->handler($model); return $this->handler($model);
@@ -1,21 +0,0 @@
<?php
namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetContractObligations;
class UpdateObligationsProcessor
{
private $getContractObligations;
public function __construct(GetContractObligations $getContractObligations)
{
$this->getContractObligations = $getContractObligations;
}
public function execute(){
return $this->getContractObligations->execute();
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\UpdatesContractObligation;
class UpdateObligationsProcessor
{
private $updatesContractObligations;
public function __construct(UpdatesContractObligation $updatesContractObligations)
{
$this->updatesContractObligations = $updatesContractObligations;
}
public function execute($contract_entity_signature, $obligation_hash_id){
return $this->updatesContractObligations->execute($contract_entity_signature, $obligation_hash_id);
}
}
@@ -30,12 +30,12 @@ class GetAccessToken
$this->apiKey = Config::get('unity.auth.api_key.key'); $this->apiKey = Config::get('unity.auth.api_key.key');
$this->cacheName = 'unity_access_token'; $this->cacheName = 'unity_access_token';
$this->cacheTime = Config::get('unity.access_token_cache'); $this->cacheTime = Config::get('unity.access_token_cache');
$this->accessToken = $this->getAccessToken(); $this->accessToken = "";
} }
public function execute(){ public function execute(){
//if(!empty($this->getAccessToken())) return $this->getAccessToken(); if(!empty($this->getCachedAccessToken())) return $this->getCachedAccessToken();
if(empty($this->apiKey)){ if(empty($this->apiKey)){
$response = Http::post($this->getAccessTokenEndpoint, [ $response = Http::post($this->getAccessTokenEndpoint, [
@@ -43,20 +43,22 @@ class GetAccessToken
'password' => $this->password , 'password' => $this->password ,
])->object(); ])->object();
$this->accessToken = $response->access_token; $this->accessToken = $response->access_token;
}else{ }else{
$this->accessToken = $this->apiKey; $this->accessToken = $this->apiKey;
} }
$this->cacheAccessToken();
//TODO: Throw error if access token not available //TODO: Throw error if access token not available
return $this->accessToken; return $this->accessToken;
} }
private function getAccessToken(){ private function getCachedAccessToken(){
$accessToken = $this->accessToken; return Cache::store('file')->get($this->cacheName);
return Cache::remember($this->cacheName, $this->cacheTime, function () use ( $accessToken ) { }
return $accessToken??'';
}); private function cacheAccessToken(){
Cache::store('file')->put($this->cacheName, $this->accessToken, $this->cacheTime);
} }
} }
@@ -10,19 +10,21 @@ class UpdatesContractObligation
{ {
private $getAccessToken; private $getAccessToken;
private $createEntityEndpoint; private $updateContractStatusEndpoint;
public function __construct(GetAccessToken $getAccessToken) 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; $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; return (isset($response->data)) ? $response->data : null;
@@ -1,8 +1,8 @@
<?php <?php
namespace App\Http\Controllers\Orders; namespace App\Http\Controllers\OrderSteps;
use App\Classes\Modules\Orders\ControllersLogic\CompletesOrderStepLogic; use App\Classes\Modules\OrderSteps\ControllersLogic\CompletesOrderStepLogic;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
@@ -13,8 +13,9 @@ class CompletesOrderStepsController
* @param CreateOrderLogic $logic * @param CreateOrderLogic $logic
* @return JsonResponse * @return JsonResponse
*/ */
public function complete(Request $request, CompletesOrderStepLogic $logic): JsonResponse public function complete(Request $request, int $id, CompletesOrderStepLogic $logic): JsonResponse
{ {
$request->request->add(['id'=>$id]);
return $logic->execute($request); return $logic->execute($request);
} }
} }
+1 -1
View File
@@ -29,7 +29,7 @@ class OrderResource extends JsonResource
'current_step' => $this->current_step, 'current_step' => $this->current_step,
'company' => new CompanyResource(Company::where('id',$this->companyModule()->first()->company_id)->first()), '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())), '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()),
]; ];
} }
} }
@@ -11,7 +11,7 @@ use App\Models\Currency;
use App\Models\SegmentConstant; use App\Models\SegmentConstant;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
class OrderStepsResource extends JsonResource class OrderStepResource extends JsonResource
{ {
/** /**
* Transform the resource into an array. * Transform the resource into an array.
+18
View File
@@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class OrderStep extends AbstractModel class OrderStep extends AbstractModel
{ {
@@ -13,4 +14,21 @@ class OrderStep extends AbstractModel
protected $dates = ['deleted_at']; protected $dates = ['deleted_at'];
protected $fillable = ['order_id','appointee_id','reference','primary','sequence','status','contract_status','complete_date','unity_hash_id']; 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');
}
} }
+3 -3
View File
@@ -16,7 +16,7 @@ return [
'create_contract' => env('UNITY_OB_LIST_ENDPOINT','contract/generate'), 'create_contract' => env('UNITY_OB_LIST_ENDPOINT','contract/generate'),
'activate_contract' => 'contract/active/{hash}', 'activate_contract' => 'contract/active/{hash}',
'assign_entity' => env('UNITY_OB_LIST_ENDPOINT','contract-obligation/assign-contract-entity/{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), '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'), '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'), 'contract_template_cache' => env('UNITY_CONTRACT_TEMPLATE_CACHE','60'),
+3 -10
View File
@@ -2385,8 +2385,8 @@
} }
} }
}, },
"/order/{id}/step/completes": { "/order/step/{id}/complete": {
"post": { "put": {
"tags": [ "tags": [
"Order" "Order"
], ],
@@ -2400,16 +2400,9 @@
{ {
"name": "id", "name": "id",
"in": "path", "in": "path",
"description": "Order Id", "description": "Order step Id",
"required": true, "required": true,
"type": "integer" "type": "integer"
},
{
"name": "reference",
"in": "query",
"description": "Order step reference",
"required": true,
"type": "string"
} }
], ],
"responses": { "responses": {
+4 -7
View File
@@ -10,12 +10,9 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f
#Route::put('/update/{id}', 'UpdateOrderController@update')->name('update'); #Route::put('/update/{id}', 'UpdateOrderController@update')->name('update');
#Route::delete('/delete/{id}', 'DeleteOrderController@destroy')->name('delete'); #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' => '{id}/role', 'as' => 'role.'], function () {});
}); });
Route::group(['prefix' => 'order/step/{id}', 'as' => 'order.step.', 'namespace' => 'OrderSteps'], function () {
Route::put('complete', 'CompletesOrderStepsController@complete')->name('complete');
});
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
View File
View File
View File
View File
View File
Regular → Executable
View File