From af380045957fa55491d53a8652f25a303f260b3b Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 3 Aug 2021 01:17:54 +0800 Subject: [PATCH 1/5] Added contract entity, address to Orders --- .../ControllersLogic/CreateAddressLogic.php | 2 +- .../CompanyModuleObject.php | 14 ++++++- .../CreateCompanyModuleProcessor.php | 13 +++++- .../Services/CreatesCompanyModule.php | 1 + .../Validators/CompanyModuleValidation.php | 6 ++- .../GenerateOrderStepsProcessor.php | 4 +- .../Processors/ConfirmOrderProcessor.php | 4 +- .../Processors/CreateOrderProcessor.php | 40 ++++++++++++------- .../AssignContractEntityProcessor.php | 22 ++-------- .../CreateContractEntityProcessor.php | 13 +----- .../Unity/Services/CreatesContractEntity.php | 4 -- .../Modules/Unity/Services/GetAccessToken.php | 27 ++++++++++--- .../Unity/Services/UpdatesContractEntity.php | 1 - app/Models/Order.php | 4 ++ config/unity.php | 3 +- ...2021_07_22_145827_modify_company_table.php | 3 +- database/seeders/CompaniesTableSeeder.php | 9 ++++- 17 files changed, 102 insertions(+), 68 deletions(-) diff --git a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php index 8fd6fe7f..e8d432b8 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php @@ -76,4 +76,4 @@ class CreateAddressLogic extends AbstractControllerLogic } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Companies/DataTransferObjects/CompanyModuleObject.php b/app/Classes/Modules/Companies/DataTransferObjects/CompanyModuleObject.php index 8dc949fd..da3619c6 100644 --- a/app/Classes/Modules/Companies/DataTransferObjects/CompanyModuleObject.php +++ b/app/Classes/Modules/Companies/DataTransferObjects/CompanyModuleObject.php @@ -18,18 +18,22 @@ class CompanyModuleObject implements DataTransferObject /** @var string */ private $unity_hash_id; + /** @var string */ + private $unity_signature; + /** * CompanyObject constructor. * @param int $companyId * @param int|null $type * @param int|null $status */ - public function __construct(int $companyId, int $type, int $status, ?string $unity_hash_id) + public function __construct(int $companyId, int $type, int $status, ?string $unity_hash_id, ?string $unity_signature) { $this->companyId = $companyId; $this->type = $type; $this->status = $status; $this->unity_hash_id = $unity_hash_id; + $this->unity_signature = $unity_signature; } /** @@ -63,4 +67,12 @@ class CompanyModuleObject implements DataTransferObject { return $this->unity_hash_id; } + + /** + * @return string + */ + public function getUnitySignature(): string + { + return $this->unity_signature; + } } diff --git a/app/Classes/Modules/Companies/Processors/CreateCompanyModuleProcessor.php b/app/Classes/Modules/Companies/Processors/CreateCompanyModuleProcessor.php index 8569db18..cbd21942 100644 --- a/app/Classes/Modules/Companies/Processors/CreateCompanyModuleProcessor.php +++ b/app/Classes/Modules/Companies/Processors/CreateCompanyModuleProcessor.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Companies\Processors; use App\Classes\Modules\Unity\Processors\CreateEntityProcessor; +use App\Classes\Modules\Unity\Processors\CreateEntitySignatureProcessor; use App\Classes\Modules\Companies\DataTransferObjects\CompanyModuleObject; use App\Classes\Modules\Companies\Services\CreatesCompanyModule; use App\Classes\Modules\Companies\Standards\Rules\CanCreateCompanyModule; @@ -20,15 +21,20 @@ class CreateCompanyModuleProcessor private $canCreateCompanyModule; + private $createEntityProcessor; + + private $createUnityEntitySignatureProcessor; + /** * CreateCompanyModuleProcessor constructor. * @param CreatesCompanyModule $createsCompanyModule */ - public function __construct(CanCreateCompanyModule $canCreateCompanyModule, CreatesCompanyModule $createsCompanyModule, CreateEntityProcessor $createUnityEntityProcessor) + public function __construct(CanCreateCompanyModule $canCreateCompanyModule, CreatesCompanyModule $createsCompanyModule, CreateEntityProcessor $createUnityEntityProcessor, CreateEntitySignatureProcessor $createUnityEntitySignatureProcessor) { $this->createsCompanyModule = $createsCompanyModule; $this->createUnityEntityProcessor = $createUnityEntityProcessor; $this->canCreateCompanyModule = $canCreateCompanyModule; + $this->createUnityEntitySignatureProcessor = $createUnityEntitySignatureProcessor; } /** @@ -39,11 +45,14 @@ class CreateCompanyModuleProcessor { $unityEntity = $this->createUnityEntityProcessor->execute($company->name); + $unityEntitySignature = $this->createUnityEntitySignatureProcessor->execute($unityEntity->hash_id); + $company_module_object = new CompanyModuleObject( $company->id, $businessType??BusinessType::IMPORTER, $company->status, - $unityEntity->hash_id + $unityEntity->hash_id, + $unityEntitySignature->hash_id, ); $this->canCreateCompanyModule->passes($company_module_object); diff --git a/app/Classes/Modules/Companies/Services/CreatesCompanyModule.php b/app/Classes/Modules/Companies/Services/CreatesCompanyModule.php index ba974838..fdcafb93 100644 --- a/app/Classes/Modules/Companies/Services/CreatesCompanyModule.php +++ b/app/Classes/Modules/Companies/Services/CreatesCompanyModule.php @@ -21,6 +21,7 @@ class CreatesCompanyModule extends AbstractUpdateRecord $model->type = $object->getType(); $model->status = $object->getStatus(); $model->unity_hash_id = $object->getUnityHashId(); + $model->unity_signature = $object->getUnitySignature(); return $this->handler($model); } diff --git a/app/Classes/Modules/Companies/Standards/Validators/CompanyModuleValidation.php b/app/Classes/Modules/Companies/Standards/Validators/CompanyModuleValidation.php index f12dc234..21961ecb 100644 --- a/app/Classes/Modules/Companies/Standards/Validators/CompanyModuleValidation.php +++ b/app/Classes/Modules/Companies/Standards/Validators/CompanyModuleValidation.php @@ -14,7 +14,8 @@ class CompanyModuleValidation extends AbstractValidation protected function data($object): array { return [ - 'unity_hash_id' => $object->getUnityHashId() + 'unity_hash_id' => $object->getUnityHashId(), + 'unity_signature' => $object->getUnitySignature(), ]; } @@ -25,7 +26,8 @@ class CompanyModuleValidation extends AbstractValidation protected function rules(): array { return [ - 'unity_hash_id' => 'required' + 'unity_hash_id' => 'required', + 'unity_signature' => 'required' ]; } diff --git a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php index 8786e457..d7439e3e 100644 --- a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php +++ b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php @@ -39,7 +39,7 @@ class GenerateOrderStepsProcessor $this->getUnityContractObligationsProcessor = $getUnityContractObligationsProcessor; } - public function execute(Order $order, array $contract_obligation_list=[]){ + public function execute(Order $order, array $contract_obligation_list=[], array $orderRoles=[]){ $obligations = $contract_obligation_list; @@ -48,7 +48,7 @@ class GenerateOrderStepsProcessor foreach($obligations as $step){ $orderSteps[] = new OrderStepsObject( $order->id, - 1, + $orderRoles[0]->company_module_id, $step->name, true, $step->sequence??0, diff --git a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php index d84ba7b0..c9155719 100644 --- a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php @@ -26,7 +26,7 @@ class ConfirmOrderProcessor $this->fetchesOrder = $fetchesOrder; } - public function execute(int $orderId, array $contract_obligation_list = []){ + public function execute(int $orderId, array $contract_obligation_list = [], array $orderRoles=[] ){ $order_object = new OrderObject(0,'','',0,0, '',$orderId,0,0); @@ -34,7 +34,7 @@ class ConfirmOrderProcessor $order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]); - $this->generateOrderStepsProcessor->execute($order, $contract_obligation_list); + $this->generateOrderStepsProcessor->execute($order, $contract_obligation_list, $orderRoles); } } diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index c5b2fc42..bac7a7b8 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -13,6 +13,8 @@ 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 App\Classes\Modules\Orders\Processors\CreateOrderRoleProcessor; +use App\Classes\Modules\Addresses\Processors\CreateOrderAddressProcessor; use Illuminate\Http\Request; class CreateOrderProcessor @@ -31,12 +33,20 @@ class CreateOrderProcessor private $unityCreateContractEntity; - public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor, CreateContractProcessor $unityCreateContract, CreateContractEntityProcessor $unityCreateContractEntity, AssignContractEntityProcessor $unityAssignContractEntity) + private $createOrderRoleProcessor; + + private $createOrderAddressProcessor; + + public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor, CreateOrderRoleProcessor $createOrderRoleProcessor, CreateOrderAddressProcessor $createOrderAddressProcessor, CreateContractProcessor $unityCreateContract, CreateContractEntityProcessor $unityCreateContractEntity, AssignContractEntityProcessor $unityAssignContractEntity) { $this->canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + $this->createOrderRoleProcessor = $createOrderRoleProcessor; $this->confirmOrderProcessor = $confirmOrderProcessor; $this->createOrderStepsProcessor = $createOrderStepsProcessor; + $this->createOrderAddressProcessor = $createOrderAddressProcessor; + $this->unityCreateContract = $unityCreateContract; $this->unityAssignContractEntity = $unityAssignContractEntity; $this->unityCreateContractEntity = $unityCreateContractEntity; @@ -46,34 +56,34 @@ class CreateOrderProcessor $reference_no = rand(1000000, 9999999); + //Call Unity to create contract and get contract reference no (and all the obligations) $contract = $this->unityCreateContract->execute(); - $contract_reference_no = $contract->hash_id; $contract_obligation_list = $contract->contract_obligation_list; - //$e = $this->unityCreateContractEntity->execute($request, $contract_reference_no, $contract_obligation_list); + //Create Order on Shipping Platform + $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); + $order = $this->createsOrder->execute($order_object); + + //Add order roles - Allow entity to process this order + //This processor calls Unity to create Contract Entity ID + $orderRoles = $this->createOrderRoleProcessor->execute($request, $order->id, $contract_reference_no); //Call Unity to assign contract entity to obligation - //$r = $this->unityAssignContractEntity->execute($request, $contract_obligation_list); + $this->unityAssignContractEntity->execute($request, $orderRoles, $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); - - $order = $this->createsOrder->execute($order_object); + //Add address polymorphic + $this->createOrderAddressProcessor->execute($request->get('address_id'), $order); //Add processing to order step //Note: For processing apointee_id is CIEF Freight Forward , id is 1, reserved in company table $this->createOrderStepsProcessor->execute($order, OrderSteps::PROCESSING, 1); //Pre-approved order, no need Admin to process it - $this->confirmOrderProcessor->execute($order->id, $contract_obligation_list); - - //TODO: Add order roles - Allow multiple entity to process this order + //This processor then calls Generate Order Steps + $this->confirmOrderProcessor->execute($order->id, $contract_obligation_list, $orderRoles); return $order; } diff --git a/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php b/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php index 807ea59f..c5308ab1 100644 --- a/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php +++ b/app/Classes/Modules/Unity/Processors/AssignContractEntityProcessor.php @@ -20,29 +20,15 @@ class AssignContractEntityProcessor $this->fetchesCompany = $fetchesCompany; } - public function execute(Request $request, array $obligations){ + public function execute(Request $request, array $contractEntities, 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; + //CIEF Contract Entity Hash ID + $contract_entity_hash_id = $contractEntities[0]->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); + $responses[] = $this->updatesContractEntity->execute($obligation->hash_id, [$contract_entity_hash_id]); } return $responses; diff --git a/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php b/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php index 64030851..7cf14a08 100644 --- a/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php +++ b/app/Classes/Modules/Unity/Processors/CreateContractEntityProcessor.php @@ -20,18 +20,7 @@ class CreateContractEntityProcessor $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; - + public function execute(string $new_contract_id, array $entity_hash_ids){ return $this->createsContractEntity->execute($new_contract_id, $entity_hash_ids); } } diff --git a/app/Classes/Modules/Unity/Services/CreatesContractEntity.php b/app/Classes/Modules/Unity/Services/CreatesContractEntity.php index b835c7f7..f722ee5f 100644 --- a/app/Classes/Modules/Unity/Services/CreatesContractEntity.php +++ b/app/Classes/Modules/Unity/Services/CreatesContractEntity.php @@ -27,10 +27,6 @@ class CreatesContractEntity $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/GetAccessToken.php b/app/Classes/Modules/Unity/Services/GetAccessToken.php index 0c2c118c..7fa9a485 100644 --- a/app/Classes/Modules/Unity/Services/GetAccessToken.php +++ b/app/Classes/Modules/Unity/Services/GetAccessToken.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Unity\Services; use Config; +use Cache; use Illuminate\Support\Facades\Http; class GetAccessToken @@ -15,31 +16,47 @@ class GetAccessToken private $apiKey; + private $cacheName; + + private $cacheTime; + + private $accessToken; + public function __construct() { $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'); + $this->cacheName = 'unity_access_token'; + $this->cacheTime = Config::get('unity.access_token_cache'); + $this->accessToken = $this->getAccessToken(); } public function execute(){ - //Note: Cache access token base on expiry from login not ideal as token may gets overwritten if user login Unity dashboard + //if(!empty($this->getAccessToken())) return $this->getAccessToken(); - $accessToken=''; if(empty($this->apiKey)){ $response = Http::post($this->getAccessTokenEndpoint, [ 'email' => $this->username, 'password' => $this->password , ])->object(); - $accessToken = $response->access_token; + $this->accessToken = $response->access_token; + }else{ - $accessToken = $this->apiKey; + $this->accessToken = $this->apiKey; } //TODO: Throw error if access token not available - return $accessToken; + return $this->accessToken; + } + + private function getAccessToken(){ + $accessToken = $this->accessToken; + return Cache::remember($this->cacheName, $this->cacheTime, function () use ( $accessToken ) { + return $accessToken??''; + }); } } diff --git a/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php b/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php index e02eb788..4b0515eb 100644 --- a/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php +++ b/app/Classes/Modules/Unity/Services/UpdatesContractEntity.php @@ -26,7 +26,6 @@ class UpdatesContractEntity $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/Models/Order.php b/app/Models/Order.php index d0b2c451..5b07a887 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -27,4 +27,8 @@ class Order extends AbstractModel return $this->hasMany(OrderStep::class, 'order_id'); } + public function addresses(): morphMany + { + return $this->morphMany(Address::class, 'owner'); + } } diff --git a/config/unity.php b/config/unity.php index f37b9f34..023f8969 100644 --- a/config/unity.php +++ b/config/unity.php @@ -10,6 +10,7 @@ return [ 'endpoint' => [ 'login' => env('UNITY_LOGIN_ENDPOINT','login'), 'create_entity' => env('UNITY_CREATE_ENTITY_ENDPOINT','entity/store'), + 'create_entity_signature' => env('UNITY_CREATE_ENTITY_SIGNATURE_ENDPOINT','entity-signature/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/generate'), @@ -17,7 +18,7 @@ return [ 'update_obligation_status' => env('UNITY_OB_LIST_ENDPOINT','contract-template-obligation/list'), ], - #'default_auth' => env('UNITY_AUTH','login'), + 'access_token_cache' => env('UNITY_TOKEN_CACHE', 86400), //Set API key empty if using login as auth 'auth' => [ diff --git a/database/migrations/2021_07_22_145827_modify_company_table.php b/database/migrations/2021_07_22_145827_modify_company_table.php index 59bc2b9e..4ee5bbc0 100644 --- a/database/migrations/2021_07_22_145827_modify_company_table.php +++ b/database/migrations/2021_07_22_145827_modify_company_table.php @@ -14,7 +14,8 @@ class ModifyCompanyTable extends Migration public function up() { Schema::table('company_modules', function (Blueprint $table) { - $table->string('unity_hash_id',200)->nullable()->after('status'); + $table->string('unity_hash_id',200)->nullable(false)->after('status'); + $table->string('unity_signature',200)->nullable(false)->after('unity_hash_id'); }); } diff --git a/database/seeders/CompaniesTableSeeder.php b/database/seeders/CompaniesTableSeeder.php index 0a6f86b8..aa68cf6e 100644 --- a/database/seeders/CompaniesTableSeeder.php +++ b/database/seeders/CompaniesTableSeeder.php @@ -6,6 +6,7 @@ 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 App\Classes\Modules\Unity\Processors\CreateEntitySignatureProcessor; use Illuminate\Database\Seeder; @@ -17,9 +18,12 @@ class CompaniesTableSeeder extends Seeder private $createEntityProcessor; - public function __construct(CreateEntityProcessor $createEntityProcessor) + private $createEntitySignatureProcessor; + + public function __construct(CreateEntityProcessor $createEntityProcessor, CreateEntitySignatureProcessor $createEntitySignatureProcessor) { $this->createEntityProcessor = $createEntityProcessor; + $this->createEntitySignatureProcessor = $createEntitySignatureProcessor; } /** @@ -57,6 +61,8 @@ class CompaniesTableSeeder extends Seeder $unityEntity = $this->createEntityProcessor->execute($company['name']); + $unityEntitySignature = $this->createEntitySignatureProcessor->execute($unityEntity->hash_id); + $company = Company::create($company); $companyModule = [ @@ -64,6 +70,7 @@ class CompaniesTableSeeder extends Seeder 'type' => BusinessType::WAREHOUSE, 'status' => ApprovalStatus::APPROVED, 'unity_hash_id' => $unityEntity->hash_id, + 'unity_signature' => $unityEntitySignature->hash_id, ]; if($company['reference']=='CIEF'){ From 7e9b3259c3d5364bd83e44cdc560463179f881dc Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 3 Aug 2021 01:18:34 +0800 Subject: [PATCH 2/5] Added contract entity, address to Orders --- .../CreateOrderAddressProcessor.php | 53 ++++++++++++++++ .../Services/CreatesOrderAddress.php | 27 ++++++++ .../DataTransferObjects/OrderRoleObject.php | 46 ++++++++++++++ .../Processors/CreateOrderRoleProcessor.php | 61 +++++++++++++++++++ .../Orders/Services/CreatesOrderRole.php | 27 ++++++++ .../Standards/Rules/CanCreateOrderRole.php | 39 ++++++++++++ .../Validators/OrderRoleValidation.php | 43 +++++++++++++ .../CreateEntitySignatureProcessor.php | 21 +++++++ .../Unity/Services/CreatesEntitySignature.php | 30 +++++++++ .../2021_08_02_224659_modify_order_roles.php | 32 ++++++++++ 10 files changed, 379 insertions(+) create mode 100644 app/Classes/Modules/Addresses/Processors/CreateOrderAddressProcessor.php create mode 100644 app/Classes/Modules/Addresses/Services/CreatesOrderAddress.php create mode 100644 app/Classes/Modules/Orders/DataTransferObjects/OrderRoleObject.php create mode 100644 app/Classes/Modules/Orders/Processors/CreateOrderRoleProcessor.php create mode 100644 app/Classes/Modules/Orders/Services/CreatesOrderRole.php create mode 100644 app/Classes/Modules/Orders/Standards/Rules/CanCreateOrderRole.php create mode 100644 app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php create mode 100644 app/Classes/Modules/Unity/Processors/CreateEntitySignatureProcessor.php create mode 100644 app/Classes/Modules/Unity/Services/CreatesEntitySignature.php create mode 100644 database/migrations/2021_08_02_224659_modify_order_roles.php diff --git a/app/Classes/Modules/Addresses/Processors/CreateOrderAddressProcessor.php b/app/Classes/Modules/Addresses/Processors/CreateOrderAddressProcessor.php new file mode 100644 index 00000000..6db43e82 --- /dev/null +++ b/app/Classes/Modules/Addresses/Processors/CreateOrderAddressProcessor.php @@ -0,0 +1,53 @@ +fetchesAddress = $fetchesAddress; + $this->canCreateAddress = $canCreateAddress; + $this->createsOrderAddress = $createsOrderAddress; + } + + /** + * @param EmploymentObject $object + * @return Model + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function execute(int $address_id, Order $order): Model { + + $address = $this->fetchesAddress->getRepository()->whereIn('id',[$address_id])->first(); + + + // $this->canCreateAddress->passes($object); + + //Fetches Address & duplicate + + return $this->createsOrderAddress->execute($address, $order); + } + +} diff --git a/app/Classes/Modules/Addresses/Services/CreatesOrderAddress.php b/app/Classes/Modules/Addresses/Services/CreatesOrderAddress.php new file mode 100644 index 00000000..c3699761 --- /dev/null +++ b/app/Classes/Modules/Addresses/Services/CreatesOrderAddress.php @@ -0,0 +1,27 @@ +street_one = $address->street_one; + $model->street_two = $address->street_two; + $model->country_id = $address->country_id; + $model->state_id = $address->state_id; + $model->district_id = $address->district_id; + $model->postcode = $address->postcode; + + return $this->handler($order->addresses(), $model); + + } +} diff --git a/app/Classes/Modules/Orders/DataTransferObjects/OrderRoleObject.php b/app/Classes/Modules/Orders/DataTransferObjects/OrderRoleObject.php new file mode 100644 index 00000000..d87fcda1 --- /dev/null +++ b/app/Classes/Modules/Orders/DataTransferObjects/OrderRoleObject.php @@ -0,0 +1,46 @@ +order_id = $order_id; + $this->company_module_id = $company_module_id; + $this->role_hash_id = $role_hash_id; + $this->role_signature = $role_signature; + } + + public function getOrderId(): int + { + return $this->order_id; + } + + public function getCompanyModuleId(): int + { + return $this->company_module_id; + } + + public function getRoleHashId(): ?string + { + return $this->role_hash_id; + } + + public function getRoleSignature(): ?string + { + return $this->role_signature; + } + +} diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderRoleProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderRoleProcessor.php new file mode 100644 index 00000000..0dd2240a --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/CreateOrderRoleProcessor.php @@ -0,0 +1,61 @@ +canCreateOrderRole = $canCreateOrderRole; + $this->createsOrderRole = $createsOrderRole; + $this->fetchesCompany = $fetchesCompany; + $this->unityCreateContractEntity = $unityCreateContractEntity; + } + + public function execute(Request $request, int $orderId, string $contract_reference_no){ + + $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_company_module = $cief_company->companyModule()->first(); + $contractEntities[] = $this->unityCreateContractEntity->execute( $contract_reference_no, [$cief_company_module->unity_hash_id]); + $contractEntities[0]->{"company_module_id"} = $cief_company_module->id; + + $warehouse_company_module = $warehouse_company->companyModule()->first(); + $contractEntities[] = $this->unityCreateContractEntity->execute( $contract_reference_no, [$warehouse_company_module->unity_hash_id]); + $contractEntities[1]->{"company_module_id"} = $warehouse_company_module->id; + + foreach($contractEntities as $entity){ + $order_role_object = new OrderRoleObject($orderId, $entity->company_module_id, $entity->hash_id, $entity->entity_signature_hash_id); + + $this->canCreateOrderRole->passes($order_role_object); + + $this->createsOrderRole->execute($order_role_object); + } + + return $contractEntities; + } +} diff --git a/app/Classes/Modules/Orders/Services/CreatesOrderRole.php b/app/Classes/Modules/Orders/Services/CreatesOrderRole.php new file mode 100644 index 00000000..387321b9 --- /dev/null +++ b/app/Classes/Modules/Orders/Services/CreatesOrderRole.php @@ -0,0 +1,27 @@ +order_id = $object->getOrderId(); + $model->company_module_id = $object->getCompanyModuleId(); + $model->role_hash_id = $object->getRoleHashId(); + $model->role_signature = $object->getRoleSignature(); + + return $this->handler($model); + } +} diff --git a/app/Classes/Modules/Orders/Standards/Rules/CanCreateOrderRole.php b/app/Classes/Modules/Orders/Standards/Rules/CanCreateOrderRole.php new file mode 100644 index 00000000..98b4cd01 --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Rules/CanCreateOrderRole.php @@ -0,0 +1,39 @@ +orderRoleValidation = $orderRoleValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + protected function validators($object): bool + { + return $this->orderRoleValidation->validate($object); + } + + /** + * @param CompanyObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} diff --git a/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php b/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php new file mode 100644 index 00000000..b578fb9c --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php @@ -0,0 +1,43 @@ + $object->getOrderId(), + 'company_module_id' => $object->getCompanyModuleId(), + 'role_hash_id' => $object->getRoleHashId(), + 'role_signature' => $object->getRoleSignature(), + ]; + } + + /** + * @param string $type + * @return array + */ + protected function rules(?string $type = 'POST'): array + { + return [ + 'order_id' => 'required|exists:orders,id', + 'company_module_id' => 'required|exists:company_modules,id', + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} diff --git a/app/Classes/Modules/Unity/Processors/CreateEntitySignatureProcessor.php b/app/Classes/Modules/Unity/Processors/CreateEntitySignatureProcessor.php new file mode 100644 index 00000000..fba777ce --- /dev/null +++ b/app/Classes/Modules/Unity/Processors/CreateEntitySignatureProcessor.php @@ -0,0 +1,21 @@ +createsEntitySignature = $createsEntitySignature; + } + + public function execute(string $entity_hash_id){ + return $this->createsEntitySignature->execute($entity_hash_id); + } +} diff --git a/app/Classes/Modules/Unity/Services/CreatesEntitySignature.php b/app/Classes/Modules/Unity/Services/CreatesEntitySignature.php new file mode 100644 index 00000000..45dc3895 --- /dev/null +++ b/app/Classes/Modules/Unity/Services/CreatesEntitySignature.php @@ -0,0 +1,30 @@ +createEntitySignatureEndpoint = Config::get('unity.url').Config::get('unity.endpoint.create_entity_signature'); + $this->getAccessToken = $getAccessToken; + } + + public function execute(string $entity_hash_id){ + + $accesToken=$this->getAccessToken->execute(); + + $response = Http::withToken($accesToken)->post($this->createEntitySignatureEndpoint,['entity_id'=>[$entity_hash_id], 'type'=>'1'])->object(); + + return (isset($response->data)) ? $response->data : null; + + } +} diff --git a/database/migrations/2021_08_02_224659_modify_order_roles.php b/database/migrations/2021_08_02_224659_modify_order_roles.php new file mode 100644 index 00000000..9ef5b99e --- /dev/null +++ b/database/migrations/2021_08_02_224659_modify_order_roles.php @@ -0,0 +1,32 @@ +dropColumn('role'); + $table->string('role_hash_id',200)->nullable(true)->after('company_module_id'); + $table->string('role_signature',200)->nullable(true)->after('role_hash_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} From ec1e33887082b1d0514000a5a5fbc5adfb2af486 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 3 Aug 2021 01:43:22 +0800 Subject: [PATCH 3/5] Activate contract --- .../Processors/CreateOrderProcessor.php | 16 +++++++--- .../Processors/ActivateContractProcessor.php | 21 ++++++++++++ .../Unity/Services/ActivatesContract.php | 32 +++++++++++++++++++ config/unity.php | 1 + 4 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 app/Classes/Modules/Unity/Processors/ActivateContractProcessor.php create mode 100644 app/Classes/Modules/Unity/Services/ActivatesContract.php diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index bac7a7b8..d81bb8ff 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -11,6 +11,7 @@ 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\ActivateContractProcessor; use App\Classes\Modules\Unity\Processors\CreateContractEntityProcessor; use App\Classes\Modules\Unity\Processors\AssignContractEntityProcessor; use App\Classes\Modules\Orders\Processors\CreateOrderRoleProcessor; @@ -33,11 +34,13 @@ class CreateOrderProcessor private $unityCreateContractEntity; + private $unityActivateContract; + private $createOrderRoleProcessor; private $createOrderAddressProcessor; - public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor, CreateOrderRoleProcessor $createOrderRoleProcessor, CreateOrderAddressProcessor $createOrderAddressProcessor, CreateContractProcessor $unityCreateContract, CreateContractEntityProcessor $unityCreateContractEntity, AssignContractEntityProcessor $unityAssignContractEntity) + public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor, ConfirmOrderProcessor $confirmOrderProcessor, CreateOrderRoleProcessor $createOrderRoleProcessor, CreateOrderAddressProcessor $createOrderAddressProcessor, CreateContractProcessor $unityCreateContract, CreateContractEntityProcessor $unityCreateContractEntity, AssignContractEntityProcessor $unityAssignContractEntity, ActivateContractProcessor $unityActivateContract) { $this->canCreateOrder = $canCreateOrder; @@ -48,6 +51,7 @@ class CreateOrderProcessor $this->createOrderAddressProcessor = $createOrderAddressProcessor; $this->unityCreateContract = $unityCreateContract; + $this->unityActivateContract = $unityActivateContract; $this->unityAssignContractEntity = $unityAssignContractEntity; $this->unityCreateContractEntity = $unityCreateContractEntity; } @@ -56,17 +60,22 @@ class CreateOrderProcessor $reference_no = rand(1000000, 9999999); - //Call Unity to create contract and get contract reference no (and all the obligations) $contract = $this->unityCreateContract->execute(); $contract_reference_no = $contract->hash_id; $contract_obligation_list = $contract->contract_obligation_list; + //Activate Contract (if not activated then cannot update status) + $activated = $this->unityActivateContract->execute($contract_reference_no); + //Create Order on Shipping Platform $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); $order = $this->createsOrder->execute($order_object); + //Add address (polymorphic) + $this->createOrderAddressProcessor->execute($request->get('address_id'), $order); + //Add order roles - Allow entity to process this order //This processor calls Unity to create Contract Entity ID $orderRoles = $this->createOrderRoleProcessor->execute($request, $order->id, $contract_reference_no); @@ -74,9 +83,6 @@ class CreateOrderProcessor //Call Unity to assign contract entity to obligation $this->unityAssignContractEntity->execute($request, $orderRoles, $contract_obligation_list); - //Add address polymorphic - $this->createOrderAddressProcessor->execute($request->get('address_id'), $order); - //Add processing to order step //Note: For processing apointee_id is CIEF Freight Forward , id is 1, reserved in company table $this->createOrderStepsProcessor->execute($order, OrderSteps::PROCESSING, 1); diff --git a/app/Classes/Modules/Unity/Processors/ActivateContractProcessor.php b/app/Classes/Modules/Unity/Processors/ActivateContractProcessor.php new file mode 100644 index 00000000..62ca4e19 --- /dev/null +++ b/app/Classes/Modules/Unity/Processors/ActivateContractProcessor.php @@ -0,0 +1,21 @@ +activatesContract = $activatesContract; + } + + public function execute($contract_hash_id){ + return $this->activatesContract->execute($contract_hash_id); + } +} diff --git a/app/Classes/Modules/Unity/Services/ActivatesContract.php b/app/Classes/Modules/Unity/Services/ActivatesContract.php new file mode 100644 index 00000000..05f193ae --- /dev/null +++ b/app/Classes/Modules/Unity/Services/ActivatesContract.php @@ -0,0 +1,32 @@ +activateEntityEndpoint = Config::get('unity.url').Config::get('unity.endpoint.activate_contract'); + $this->getAccessToken = $getAccessToken; + } + + public function execute($contract_hash_id){ + + $accessToken=$this->getAccessToken->execute(); + + $this->activateEntityEndpoint = str_replace('{hash}',$contract_hash_id,$this->activateEntityEndpoint); + + $response = Http::withToken($accessToken)->put($this->activateEntityEndpoint)->object(); + + return (isset($response->data)) ? $response->data : null; + + } +} diff --git a/config/unity.php b/config/unity.php index 023f8969..43e47358 100644 --- a/config/unity.php +++ b/config/unity.php @@ -14,6 +14,7 @@ return [ '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/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'), ], From 3f70ead69ad56d72699755c4e57025f6ea8a6b95 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 3 Aug 2021 02:01:20 +0800 Subject: [PATCH 4/5] Activate contract --- .../DataTransferObjects/OrderStepsObject.php | 13 ++++++-- .../Processors/CreateOrderStepsProcessor.php | 2 +- .../GenerateOrderStepsProcessor.php | 4 ++- .../Processors/UpdateOrderStepsProcessor.php | 2 +- .../Services/CreatesManyOrderSteps.php | 3 +- app/Models/OrderStep.php | 2 +- .../2021_08_03_014833_modify_order_steps.php | 30 +++++++++++++++++++ 7 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 database/migrations/2021_08_03_014833_modify_order_steps.php diff --git a/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php b/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php index 4ec1fd41..c039f479 100644 --- a/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php +++ b/app/Classes/Modules/OrderSteps/DataTransferObjects/OrderStepsObject.php @@ -25,7 +25,9 @@ class OrderStepsObject implements DataTransferObject private $completed_date; - public function __construct(int $order_id, int $appointee_id, string $reference, bool $primary, float $sequence, int $status, int $contract_status, ?string $completed_date, int $id=0) + private $hash_id; + + public function __construct(int $order_id, int $appointee_id, string $reference, bool $primary, float $sequence, int $status, int $contract_status, ?string $completed_date, int $id=0, ?string $hash_id) { $this->order_id = $order_id; $this->appointee_id = $appointee_id; @@ -38,6 +40,7 @@ class OrderStepsObject implements DataTransferObject $this->completed_date = $completed_date; $this->id = $id; + $this->hash_id = $hash_id; } public function getOrderId(): int @@ -49,10 +52,12 @@ class OrderStepsObject implements DataTransferObject { return $this->appointee_id; } + public function getReference(): string { return $this->reference; } + public function getPrimary(): bool { return $this->primary; @@ -83,4 +88,8 @@ class OrderStepsObject implements DataTransferObject return $this->id; } -} \ No newline at end of file + public function getHashId(): ?string + { + return $this->hash_id; + } +} diff --git a/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php index 9f781c9a..3edd3a28 100644 --- a/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php +++ b/app/Classes/Modules/OrderSteps/Processors/CreateOrderStepsProcessor.php @@ -37,7 +37,7 @@ class CreateOrderStepsProcessor public function execute(Model $order, string $currentStep, $appointee_id){ - $order_steps_object = new OrderStepsObject($order->id, $appointee_id, $currentStep, true, 0, OrderStatus::PROCESSING, 0, null); + $order_steps_object = new OrderStepsObject($order->id, $appointee_id, $currentStep, true, 0, OrderStatus::PROCESSING, 0, null, 0, null); $this->canCreateOrderStep->passes($order_steps_object); diff --git a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php index d7439e3e..c384626d 100644 --- a/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php +++ b/app/Classes/Modules/OrderSteps/Processors/GenerateOrderStepsProcessor.php @@ -54,7 +54,9 @@ class GenerateOrderStepsProcessor $step->sequence??0, 0, 0, - null + null, + 0, + $step->hash_id ); } diff --git a/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php b/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php index 40903d5d..598b2a8a 100644 --- a/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php +++ b/app/Classes/Modules/OrderSteps/Processors/UpdateOrderStepsProcessor.php @@ -31,7 +31,7 @@ class UpdateOrderStepsProcessor public function execute(string $currentStep){ - $orderStepsObject = new OrderStepsObject(0,0,$currentStep, 0, 0, 1, 1, null); + $orderStepsObject = new OrderStepsObject(0,0,$currentStep, 0, 0, 1, 1, null, 0, null); $this->canUpdateOrderStep->passes($orderStepsObject); diff --git a/app/Classes/Modules/OrderSteps/Services/CreatesManyOrderSteps.php b/app/Classes/Modules/OrderSteps/Services/CreatesManyOrderSteps.php index 7771692d..54e2c295 100644 --- a/app/Classes/Modules/OrderSteps/Services/CreatesManyOrderSteps.php +++ b/app/Classes/Modules/OrderSteps/Services/CreatesManyOrderSteps.php @@ -21,7 +21,8 @@ class CreatesManyOrderSteps extends AbstractUpdateRecord 'primary' => $step->getPrimary(), 'sequence' => $step->getSequence(), 'status' => 0, - 'contract_status' => 0 + 'contract_status' => 0, + 'unity_hash_id' => $step->getHashId(), ]; } $order->orderSteps()->createMany($orderStepsModel); diff --git a/app/Models/OrderStep.php b/app/Models/OrderStep.php index ceedfee5..68995006 100644 --- a/app/Models/OrderStep.php +++ b/app/Models/OrderStep.php @@ -12,5 +12,5 @@ class OrderStep extends AbstractModel protected $dates = ['deleted_at']; - protected $fillable = ['order_id','appointee_id','reference','primary','sequence','status','contract_status','complete_date']; + protected $fillable = ['order_id','appointee_id','reference','primary','sequence','status','contract_status','complete_date','unity_hash_id']; } diff --git a/database/migrations/2021_08_03_014833_modify_order_steps.php b/database/migrations/2021_08_03_014833_modify_order_steps.php new file mode 100644 index 00000000..cc566a9a --- /dev/null +++ b/database/migrations/2021_08_03_014833_modify_order_steps.php @@ -0,0 +1,30 @@ +string('unity_hash_id',200)->nullable(true)->after('contract_status'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} From ec673e7d02fb0f4d8a81db59bc351c7ab0a36628 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 3 Aug 2021 02:03:57 +0800 Subject: [PATCH 5/5] Add company id to address --- resources/views/swagger/json.blade.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index b2923539..757fe409 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -2449,6 +2449,13 @@ "summary": "Create address", "description": "", "parameters": [ + { + "name": "company_id", + "in": "query", + "description": "Company id", + "required": true, + "type": "integer" + }, { "name": "district_id", "in": "query",