mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/shipping-portal.git
synced 2026-08-19 04:24:12 +00:00
Completes Order Steps on Unity
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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()),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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.
|
||||
@@ -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
@@ -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'),
|
||||
|
||||
|
||||
@@ -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
@@ -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
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Reference in New Issue
Block a user