Merge branch '248_order_steps_apis' into 'master'

248 order steps apis

See merge request CIEFWorldwideSdnBhd/shipping-portal!28
This commit is contained in:
Fairuz
2021-08-02 03:51:04 +00:00
18 changed files with 337 additions and 38 deletions
@@ -39,11 +39,11 @@ class GenerateOrderStepsProcessor
$this->getUnityContractObligationsProcessor = $getUnityContractObligationsProcessor;
}
public function execute(Order $order){
public function execute(Order $order, array $contract_obligation_list=[]){
$obligations = $this->getUnityContractObligationsProcessor->execute();
$obligations = $contract_obligation_list;
//TODO: Update Appointee ID to Entity User base on hash key
//TODO: Collect hash_id & search company module table for appointee id
foreach($obligations as $step){
$orderSteps[] = new OrderStepsObject(
@@ -51,7 +51,7 @@ class GenerateOrderStepsProcessor
1,
$step->name,
true,
$step->sequence,
$step->sequence??0,
0,
0,
null
@@ -21,7 +21,11 @@ class OrderObject implements DataTransferObject
private $current_step;
public function __construct(int $company_module_id, ?string $reference, string $reference_contract, int $type, int $status, string $current_step, int $id=0)
private $address_id;
private $warehouse_id;
public function __construct(int $company_module_id, ?string $reference, string $reference_contract, int $type, int $status, string $current_step, int $id=0, int $address_id, int $warehouse_id)
{
$this->company_module_id = $company_module_id;
$this->reference = $reference;
@@ -30,6 +34,8 @@ class OrderObject implements DataTransferObject
$this->status = $status;
$this->current_step = $current_step;
$this->id = $id;
$this->address_id = $address_id;
$this->warehouse_id = $warehouse_id;
}
public function getId(): int
@@ -67,6 +73,16 @@ class OrderObject implements DataTransferObject
return $this->current_step;
}
public function getWarehouseId(): int
{
return $this->warehouse_id;
}
public function getAddressId(): int
{
return $this->address_id;
}
public function setCurrentStep(string $step)
{
$this->current_step = $step;
@@ -26,15 +26,15 @@ class ConfirmOrderProcessor
$this->fetchesOrder = $fetchesOrder;
}
public function execute(int $orderId){
public function execute(int $orderId, array $contract_obligation_list = []){
$order_object = new OrderObject(0,'','',0,0, '',$orderId);
$order_object = new OrderObject(0,'','',0,0, '',$orderId,0,0);
$this->canConfirmOrder->passes($order_object);
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]);
$this->generateOrderStepsProcessor->execute($order);
$this->generateOrderStepsProcessor->execute($order, $contract_obligation_list);
}
}
@@ -10,6 +10,9 @@ use App\Classes\Modules\OrderSteps\Processors\CreateOrderStepsProcessor;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use App\Classes\Modules\Unity\Processors\CreateContractProcessor;
use App\Classes\Modules\Unity\Processors\CreateContractEntityProcessor;
use App\Classes\Modules\Unity\Processors\AssignContractEntityProcessor;
use Illuminate\Http\Request;
class CreateOrderProcessor
@@ -22,22 +25,42 @@ class CreateOrderProcessor
private $createOrderStepsProcessor;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor)
private $unityCreateContract;
private $unityAssignContractEntity;
private $unityCreateContractEntity;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor, CreateContractProcessor $unityCreateContract, CreateContractEntityProcessor $unityCreateContractEntity, AssignContractEntityProcessor $unityAssignContractEntity)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
$this->confirmOrderProcessor = $confirmOrderProcessor;
$this->createOrderStepsProcessor = $createOrderStepsProcessor;
$this->unityCreateContract = $unityCreateContract;
$this->unityAssignContractEntity = $unityAssignContractEntity;
$this->unityCreateContractEntity = $unityCreateContractEntity;
}
public function execute(Request $request){
$reference_no = rand(1000000, 9999999);
//TODO: Call Unity to create contract and get contract reference no (and all the obligations)
//$contract_reference_no = 99;
//Call Unity to create contract and get contract reference no (and all the obligations)
$contract = $this->unityCreateContract->execute();
$order_object = new OrderObject($request->get('company_module_id'), $reference_no, '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING);
$contract_reference_no = $contract->hash_id;
$contract_obligation_list = $contract->contract_obligation_list;
//$e = $this->unityCreateContractEntity->execute($request, $contract_reference_no, $contract_obligation_list);
//Call Unity to assign contract entity to obligation
//$r = $this->unityAssignContractEntity->execute($request, $contract_obligation_list);
//echo('??');
//dd($e);
$order_object = new OrderObject($request->get('company_module_id'), $contract_reference_no, '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING, 0, $request->get('address_id'), $request->get('warehouse_id'));
$this->canCreateOrder->passes($order_object);
@@ -48,7 +71,7 @@ class CreateOrderProcessor
$this->createOrderStepsProcessor->execute($order, OrderSteps::PROCESSING, 1);
//Pre-approved order, no need Admin to process it
$this->confirmOrderProcessor->execute($order->id);
$this->confirmOrderProcessor->execute($order->id, $contract_obligation_list);
//TODO: Add order roles - Allow multiple entity to process this order
@@ -32,7 +32,7 @@ class UpdatesOrderCurrentStepProcessor
public function execute(int $orderId, string $currentStep){
$order_object = new OrderObject(0, '', '', 0, 0, $currentStep, $orderId);
$order_object = new OrderObject(0, '', '', 0, 0, $currentStep, $orderId,0,0);
$this->canUpdateCurrentStep->passes($order_object);
@@ -17,6 +17,8 @@ class OrderValidation extends AbstractValidation
'company_module_id' => $object->getCompanyModuleId(),
'reference' => $object->getReference(),
'reference_contract' => $object->getReferenceContract(),
'warehouse_id' => $object->getWarehouseId(),
'address_id' => $object->getAddressId(),
];
}
@@ -29,6 +31,8 @@ class OrderValidation extends AbstractValidation
if ($type == 'POST') {
return [
'company_module_id' => 'required',
'warehouse_id'=>'required',
'address_id'=>'required',
'reference' => '',
'reference_contract' => ''
];
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\UpdatesContractEntity;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use Illuminate\Http\Request;
class AssignContractEntityProcessor
{
private $updatesContractEntity;
private $fetchesCompany;
public function __construct( UpdatesContractEntity $updatesContractEntity, FetchesCompany $fetchesCompany)
{
$this->updatesContractEntity = $updatesContractEntity;
$this->fetchesCompany = $fetchesCompany;
}
public function execute(Request $request, array $obligations){
$responses = [];
$companies = $this->fetchesCompany->getRepository()->whereIn('id',[1, $request->get('warehouse_id')])->get();
$cief_company = $companies[0]->id == 1 ? $companies[0] : $companies[1];
$warehouse_company = $companies[0]->id != 1 ? $companies[0] : $companies[1];
$cief_unity_hash_id = $cief_company->companyModule()->first()->unity_hash_id;
$warehouse_unity_hash_id = $warehouse_company->companyModule()->first()->unity_hash_id;
foreach($obligations as $obligation){
$entities_hash_id = [];
$entities_hash_id[] = $cief_unity_hash_id;
if(in_array($obligation->name,['WAREHOUSE_RECEIVING','WAREHOUSE_LOAD_CONTAINER'])){
$entities_hash_id[] = $warehouse_unity_hash_id ;
}
$responses[] = $this->updatesContractEntity->execute($obligation->hash_id, $entities_hash_id);
}
return $responses;
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\CreatesContractEntity;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use Illuminate\Http\Request;
class CreateContractEntityProcessor
{
private $createsContractEntity;
private $fetchesCompany;
public function __construct(CreatesContractEntity $createsContractEntity, FetchesCompany $fetchesCompany)
{
$this->createsContractEntity = $createsContractEntity;
$this->fetchesCompany = $fetchesCompany;
}
public function execute(Request $request, string $new_contract_id, array $obligations){
$entity_hash_ids = [];
$companies = $this->fetchesCompany->getRepository()->whereIn('id',[1, $request->get('warehouse_id')])->get();
$cief_company = $companies[0]->id == 1 ? $companies[0] : $companies[1];
$warehouse_company = $companies[0]->id != 1 ? $companies[0] : $companies[1];
$entity_hash_ids[] = $cief_company->companyModule()->first()->unity_hash_id;
$entity_hash_ids[] = $warehouse_company->companyModule()->first()->unity_hash_id;
return $this->createsContractEntity->execute($new_contract_id, $entity_hash_ids);
}
}
@@ -4,18 +4,18 @@ namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetContractObligations;
use App\Classes\Modules\Unity\Services\CreatesContract;
class CreateContractProcessor
{
private $getContractObligations;
private $createsContract;
public function __construct(GetContractObligations $getContractObligations)
public function __construct(CreatesContract $createsContract)
{
$this->getContractObligations = $getContractObligations;
$this->createsContract = $createsContract;
}
public function execute(){
return $this->getContractObligations->execute();
return $this->createsContract->execute();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetAccessToken;
class CreatesContract
{
private $getAccessToken;
private $createEntityEndpoint;
private $contract_hash_id;
public function __construct(GetAccessToken $getAccessToken)
{
$this->createEntityEndpoint = Config::get('unity.url').Config::get('unity.endpoint.create_contract');
$this->getAccessToken = $getAccessToken;
$this->contract_hash_id = Config::get('unity.contract_template_hash_id');
}
public function execute(){
$accessToken=$this->getAccessToken->execute();
$response = Http::withToken($accessToken)->post($this->createEntityEndpoint,['contract_template_id'=>[$this->contract_hash_id]])->object();
return (isset($response->data)) ? $response->data : null;
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetAccessToken;
class CreatesContractEntity
{
private $getAccessToken;
private $createContractEntityEndpoint;
private $contract_hash_id;
public function __construct(GetAccessToken $getAccessToken)
{
$this->createContractEntityEndpoint = Config::get('unity.url').Config::get('unity.endpoint.create_contract_entity');
$this->getAccessToken = $getAccessToken;
$this->contract_hash_id = Config::get('unity.contract_template_hash_id');
}
public function execute(string $new_contract_id, array $entity_hash_ids){
$accesToken=$this->getAccessToken->execute();
$response = Http::withToken($accesToken)->post($this->createContractEntityEndpoint,['contract_id'=>[$new_contract_id],'entity_id'=>$entity_hash_ids])->object();
echo($new_contract_id.'<br/>');
echo($this->createContractEntityEndpoint);
dd($response );
return (isset($response->data)) ? $response->data : null;
}
}
@@ -14,7 +14,7 @@ class CreatesEntity
public function __construct(GetAccessToken $getAccessToken)
{
$this->createEntityEndpoint = Config::get('unity.url').Config::get('unity.create_entity_endpoint');
$this->createEntityEndpoint = Config::get('unity.url').Config::get('unity.endpoint.create_entity');
$this->getAccessToken = $getAccessToken;
}
@@ -7,31 +7,39 @@ use Illuminate\Support\Facades\Http;
class GetAccessToken
{
private $unityConfig;
private $getAccessTokenEndpoint;
private $username;
private $password;
private $apiKey;
public function __construct()
{
$this->unityConfig = Config::get('unity');
$this->getAccessTokenEndpoint = Config::get('unity.url').Config::get('unity.endpoint.login');
$this->username = Config::get('unity.auth.login.username');
$this->password = Config::get('unity.auth.login.password');
$this->apiKey = Config::get('unity.auth.api_key.key');
}
public function execute(){
//TODO: Cache access token base on expiry for login version
//Note: Cache access token base on expiry from login not ideal as token may gets overwritten if user login Unity dashboard
$accesToken='';
if($this->unityConfig['default_auth']=='login'){
$loginDetails = $this->unityConfig['auth']['login'];
$response = Http::post($this->unityConfig['url'].$this->unityConfig['endpoint']['login'], [
'email' => $loginDetails['username'],
'password' => $loginDetails['password'],
$accessToken='';
if(empty($this->apiKey)){
$response = Http::post($this->getAccessTokenEndpoint, [
'email' => $this->username,
'password' => $this->password ,
])->object();
$accesToken = $response->access_token;
$accessToken = $response->access_token;
}else{
$accesToken = $this->unityConfig['auth']['api_key']['key'];
$accessToken = $this->apiKey;
}
//TODO: Throw error if access token not available
return $accesToken;
return $accessToken;
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetAccessToken;
class UpdatesContractEntity
{
private $getAccessToken;
private $assignEntityEndpoint;
public function __construct(GetAccessToken $getAccessToken)
{
$this->assignEntityEndpoint = Config::get('unity.url').Config::get('unity.endpoint.assign_entity');
$this->getAccessToken = $getAccessToken;
}
public function execute(string $obligation_hash_id, array $entity_hash_id){
$accessToken=$this->getAccessToken->execute();
$this->assignEntityEndpoint = str_replace('{hash}',$obligation_hash_id,$this->assignEntityEndpoint);
$response = Http::withToken($accessToken)->put( $this->assignEntityEndpoint,['contract_entity_id'=>$entity_hash_id])->object();
dd($response);
return (isset($response->data)) ? $response->data : null;
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetAccessToken;
class UpdatesContractObligation
{
private $getAccessToken;
private $createEntityEndpoint;
public function __construct(GetAccessToken $getAccessToken)
{
$this->createEntityEndpoint = Config::get('unity.url').Config::get('unity.create_entity_endpoint');
$this->getAccessToken = $getAccessToken;
}
public function execute($entity_name){
$accesToken=$this->getAccessToken->execute();
$response = Http::withToken($accesToken)->post($this->createEntityEndpoint,['name'=>$entity_name])->object();
return (isset($response->data)) ? $response->data : null;
}
}
+8 -5
View File
@@ -10,13 +10,16 @@ return [
'endpoint' => [
'login' => env('UNITY_LOGIN_ENDPOINT','login'),
'create_entity' => env('UNITY_CREATE_ENTITY_ENDPOINT','entity/store'),
'create_contract_entity' => env('UNITY_CREATE_ENTITY_ENDPOINT','contract-entity/store'),
'get_contract_obligations' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'),
'create_contract' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'),
'create_contract' => env('UNITY_OB_LIST_ENDPOINT','contract/generate'),
'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'),
],
'default_auth' => env('UNITY_AUTH','login'),
#'default_auth' => env('UNITY_AUTH','login'),
//Set API key empty if using login as auth
'auth' => [
'api_key' => [
@@ -30,15 +33,15 @@ return [
],
'get_ob_endpoint' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'),
#'get_ob_endpoint' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'),
'create_entity_endpoint' => env('UNITY_CREATE_ENTITY_ENDPOINT','entity/store'),
#'create_entity_endpoint' => env('UNITY_CREATE_ENTITY_ENDPOINT','entity/store'),
'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_hash_id' => env('UNITY_CONTRACT_TEMPLATE_HASH_ID', '5lpn70mA2VmgxoekgYrJ'),
'contract_template_hash_id' => env('UNITY_CONTRACT_TEMPLATE_HASH_ID', 'Kp3qzMV82mqA2PZg6eX0'),
'contract_template_cache' => env('UNITY_CONTRACT_TEMPLATE_CACHE','60'),
+12 -1
View File
@@ -5,6 +5,7 @@ namespace Database\Seeders;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\CompanyType;
use App\Classes\ValueObjects\Constants\BusinessType;
use App\Classes\Modules\Unity\Processors\CreateEntityProcessor;
use Illuminate\Database\Seeder;
@@ -13,6 +14,14 @@ use App\Models\CompanyModule;
class CompaniesTableSeeder extends Seeder
{
private $createEntityProcessor;
public function __construct(CreateEntityProcessor $createEntityProcessor)
{
$this->createEntityProcessor = $createEntityProcessor;
}
/**
* Run the database seeds.
*
@@ -20,7 +29,6 @@ class CompaniesTableSeeder extends Seeder
*/
public function run()
{
$companies = [
[
'id' => 1, //Reserve ID
@@ -47,12 +55,15 @@ class CompaniesTableSeeder extends Seeder
if (!empty($companies)) {
foreach ($companies as $company) {
$unityEntity = $this->createEntityProcessor->execute($company['name']);
$company = Company::create($company);
$companyModule = [
'company_id' => $company->id,
'type' => BusinessType::WAREHOUSE,
'status' => ApprovalStatus::APPROVED,
'unity_hash_id' => $unityEntity->hash_id,
];
if($company['reference']=='CIEF'){
+14
View File
@@ -2299,6 +2299,20 @@
"description": "Company Module ID",
"required": true,
"type": "integer"
},
{
"name": "warehouse_id",
"in": "query",
"description": "Warehouse ID",
"required": true,
"type": "integer"
},
{
"name": "address_id",
"in": "query",
"description": "Address ID",
"required": true,
"type": "integer"
}
],
"responses": {