diff --git a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php index 343c0ad0..8786e457 100644 --- a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php +++ b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php @@ -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 diff --git a/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php b/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php index 21b5f733..a792e364 100644 --- a/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php +++ b/app/Classes/Modules/Orders/DataTransferObjects/OrderObject.php @@ -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; diff --git a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php index 2bf0ea54..d84ba7b0 100644 --- a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php @@ -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); } } diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index 884eda4d..c5b2fc42 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -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 diff --git a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php index 8a5005e3..cf6dc55c 100644 --- a/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php +++ b/app/Classes/Modules/Orders/Processors/UpdatesOrderCurrentStepProcessor.php @@ -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); diff --git a/app/Classes/Modules/Orders/Standards/Validators/OrderValidation.php b/app/Classes/Modules/Orders/Standards/Validators/OrderValidation.php index bba459d6..53e38ff8 100644 --- a/app/Classes/Modules/Orders/Standards/Validators/OrderValidation.php +++ b/app/Classes/Modules/Orders/Standards/Validators/OrderValidation.php @@ -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' => '' ]; diff --git a/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php b/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php new file mode 100644 index 00000000..807ea59f --- /dev/null +++ b/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php @@ -0,0 +1,50 @@ +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; + } +} diff --git a/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php b/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php new file mode 100644 index 00000000..64030851 --- /dev/null +++ b/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php @@ -0,0 +1,37 @@ +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); + } +} diff --git a/app/Classes/Modules/Unity/Processors/CreateContractProcessor.php b/app/Classes/Modules/Unity/Processors/CreateContractProcessor.php index 70756d75..19a86060 100644 --- a/app/Classes/Modules/Unity/Processors/CreateContractProcessor.php +++ b/app/Classes/Modules/Unity/Processors/CreateContractProcessor.php @@ -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(); } } diff --git a/app/Classes/Modules/Unity/Services/CreatesContract.php b/app/Classes/Modules/Unity/Services/CreatesContract.php new file mode 100644 index 00000000..43451b1b --- /dev/null +++ b/app/Classes/Modules/Unity/Services/CreatesContract.php @@ -0,0 +1,33 @@ +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; + + } +} diff --git a/app/Classes/Modules/Unity/Services/CreatesContractEntity.php b/app/Classes/Modules/Unity/Services/CreatesContractEntity.php new file mode 100644 index 00000000..b835c7f7 --- /dev/null +++ b/app/Classes/Modules/Unity/Services/CreatesContractEntity.php @@ -0,0 +1,37 @@ +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.'
'); + + echo($this->createContractEntityEndpoint); + dd($response ); + return (isset($response->data)) ? $response->data : null; + + } +} diff --git a/app/Classes/Modules/Unity/Services/CreatesEntity.php b/app/Classes/Modules/Unity/Services/CreatesEntity.php index d6dc7d7f..4cd13130 100644 --- a/app/Classes/Modules/Unity/Services/CreatesEntity.php +++ b/app/Classes/Modules/Unity/Services/CreatesEntity.php @@ -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; } diff --git a/app/Classes/Modules/Unity/Services/GetAccessToken.php b/app/Classes/Modules/Unity/Services/GetAccessToken.php index fe1e78be..0c2c118c 100644 --- a/app/Classes/Modules/Unity/Services/GetAccessToken.php +++ b/app/Classes/Modules/Unity/Services/GetAccessToken.php @@ -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; } } diff --git a/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php b/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php new file mode 100644 index 00000000..e02eb788 --- /dev/null +++ b/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php @@ -0,0 +1,33 @@ +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; + + } +} diff --git a/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php new file mode 100644 index 00000000..8a1997b6 --- /dev/null +++ b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php @@ -0,0 +1,30 @@ +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; + + } +} diff --git a/config/unity.php b/config/unity.php index 7408dc8c..f37b9f34 100644 --- a/config/unity.php +++ b/config/unity.php @@ -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'), diff --git a/database/seeders/CompaniesTableSeeder.php b/database/seeders/CompaniesTableSeeder.php index fcb6a33a..0a6f86b8 100644 --- a/database/seeders/CompaniesTableSeeder.php +++ b/database/seeders/CompaniesTableSeeder.php @@ -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'){ diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 2a23ab93..b2923539 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -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": {