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
namespace App\Classes\Modules\Orders\ControllersLogic;
namespace App\Classes\Modules\OrderSteps\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
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\OrderSteps;
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\JsonResponse;
class CompletesOrderStepLogic extends AbstractControllerLogic
{
private $canCreateOrder;
private $completeOrderStepProcessor;
private $createsOrder;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder)
public function __construct(CompletesOrderStepProcessor $completeOrderStepProcessor)
{
$this->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));
}
}
@@ -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;
}
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\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);
}
@@ -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);
@@ -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);
@@ -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->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);
}
}
@@ -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;
@@ -1,8 +1,8 @@
<?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\Request;
@@ -13,8 +13,9 @@ class CompletesOrderStepsController
* @param CreateOrderLogic $logic
* @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);
}
}
+1 -1
View File
@@ -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()),
];
}
}
@@ -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.
+18
View File
@@ -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');
}
}
+3 -3
View File
@@ -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'),
+3 -10
View File
@@ -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": {
+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::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');
});
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