From 1c072d7b962af5a676370656e5f900b51d5f20c2 Mon Sep 17 00:00:00 2001 From: Dillon Date: Fri, 10 Mar 2023 02:41:41 +0800 Subject: [PATCH] CRM create all remaining tasks according to documentation --- .../ControllersLogic/CreateOrderLogic.php | 15 +- .../Processors/CreatePackingListProcessor.php | 11 +- .../InitialPerfexCRMObject.php | 14 +- .../UpdatePerfexCRMObject.php | 49 +++-- .../CreatePerfexCRMInvoiceProcessor.php | 17 +- .../InitializePerfexCRMProcessor.php | 13 +- .../NewLeadTaskToPerfexCRMProcessor.php | 19 +- .../PackingListToPerfexCRMProcessor.php | 51 ++++++ .../TransactionToPerfexCRMProcessor.php | 24 +-- .../Processors/UpdatePerfexCRMProcessor.php | 169 ++++++++++++------ .../CreatesPerfexCRMCustomerProject.php | 4 +- .../Services/UpdatesPerfexCRMProject.php | 43 +++++ .../Constants/PerfexCRMProjectStatus.php | 16 ++ ...xCRMStatus.php => PerfexCRMTaskStatus.php} | 4 +- .../ValueObjects/Constants/PerfexCRMTasks.php | 48 ++++- 15 files changed, 389 insertions(+), 108 deletions(-) create mode 100644 app/Classes/Modules/PerfexCRM/Processors/PackingListToPerfexCRMProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMProject.php create mode 100644 app/Classes/ValueObjects/Constants/PerfexCRMProjectStatus.php rename app/Classes/ValueObjects/Constants/{PerfexCRMStatus.php => PerfexCRMTaskStatus.php} (86%) diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php index 510a2a29..2c4743d2 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php @@ -7,6 +7,7 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Companies\Services\FetchesCompanyModule; +use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor; use App\Classes\Modules\Orders\Processors\CreateOrderProcessor; use App\Classes\Modules\Orders\Services\GeneratesOrderNumber; use App\Classes\ValueObjects\Constants\WarehouseReferences; @@ -39,6 +40,8 @@ class CreateOrderLogic extends AbstractControllerLogic /** @var GeneratesOrderNumber */ private $generatesOrderNumber; + /** @var NewLeadTaskToPerfexCRMProcessor */ + private $newLeadTaskToPerfexCRMProcessor; /** * CreateOrderLogic constructor. * @param FetchesCompany $fetchesCompany @@ -46,22 +49,24 @@ class CreateOrderLogic extends AbstractControllerLogic * @param CreateOrderProcessor $createOrderProcessor * @param FetchesCompanyModule $fetchesCompanyModule * @param GeneratesOrderNumber $generatesOrderNumber + * @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor */ - public function __construct(FetchesCompany $fetchesCompany, FetchesAddress $fetchesAddress, CreateOrderProcessor $createOrderProcessor, FetchesCompanyModule $fetchesCompanyModule, GeneratesOrderNumber $generatesOrderNumber) + public function __construct(FetchesCompany $fetchesCompany, FetchesAddress $fetchesAddress, CreateOrderProcessor $createOrderProcessor, FetchesCompanyModule $fetchesCompanyModule, GeneratesOrderNumber $generatesOrderNumber, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor) { $this->fetchesCompany = $fetchesCompany; $this->fetchesAddress = $fetchesAddress; $this->createOrderProcessor = $createOrderProcessor; $this->fetchesCompanyModule = $fetchesCompanyModule; $this->generatesOrderNumber = $generatesOrderNumber; + $this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor; } public function logic(Request $request) : JsonResponse { - + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); - + $address = $this->fetchesAddress->execute(['id' => $request->input('address_id')]); $originWarehouse = $this->fetchesCompanyModule->execute(['id' => $request->input('warehouse_id')]); @@ -76,6 +81,10 @@ class CreateOrderLogic extends AbstractControllerLogic $order = $this->createOrderProcessor->execute($company, $originWarehouse, $address, $this->generatesOrderNumber->execute()); + if(config('perfexcrm.is_enabled') == 'true'){ + $this->newLeadTaskToPerfexCRMProcessor->execute($company); + } + return $this->resourceResponse(new OrderResource($order)); } } diff --git a/app/Classes/Modules/PackingLists/Processors/CreatePackingListProcessor.php b/app/Classes/Modules/PackingLists/Processors/CreatePackingListProcessor.php index 53a8ecb7..26a42f0b 100644 --- a/app/Classes/Modules/PackingLists/Processors/CreatePackingListProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/CreatePackingListProcessor.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\PackingLists\Processors; use App\Classes\General\Interfaces\Packable; +use App\Classes\Modules\PerfexCRM\Processors\PackingListToPerfexCRMProcessor; use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject; use App\Classes\Modules\PackingLists\Services\CreatesPackingList; use App\Classes\Modules\PackingLists\Standards\Rules\CanCreatePackingList; @@ -25,16 +26,20 @@ class CreatePackingListProcessor /** @var CreatesPackingList */ private $createsPackingList; + /** @var PackingListToPerfexCRMProcessor */ + private $packingListToPerfexCRMProcessor; /** * CreatePackingListProcessor constructor. * @param CanCreatePackingList $canCreatePackingList * @param CreatesPackingList $createsPackingList + * @param PackingListToPerfexCRMProcessor $packingListToPerfexCRMProcessor */ - public function __construct(CanCreatePackingList $canCreatePackingList, CreatesPackingList $createsPackingList) + public function __construct(CanCreatePackingList $canCreatePackingList, CreatesPackingList $createsPackingList, PackingListToPerfexCRMProcessor $packingListToPerfexCRMProcessor) { $this->canCreatePackingList = $canCreatePackingList; $this->createsPackingList = $createsPackingList; + $this->packingListToPerfexCRMProcessor = $packingListToPerfexCRMProcessor; } /** @@ -59,6 +64,10 @@ class CreatePackingListProcessor $object = new PackingListObject($object->getReference().'_01', $appointee_id, $type, ApprovalStatus::PENDING_SUBMISSION); $this->createsPackingList->execute($object, $packingList); + if(config('perfexcrm.is_enabled') == 'true'){ + $this->packingListToPerfexCRMProcessor->execute($packingList); + } + return $packingList; } diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php index 1c4a9db5..66c2c86c 100644 --- a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php @@ -25,6 +25,9 @@ class InitialPerfexCRMObject implements DataTransferObject /** @var string */ private $projectName; + /** @var int */ + private $projectStatus; + /** @var array */ private $milestoneNames; @@ -32,7 +35,7 @@ class InitialPerfexCRMObject implements DataTransferObject private $taskNames; - public function __construct(string $companyName, string $companyReference, string $contactName, string $contactEmail, string $bookingMarking, string $projectName, array $milestoneNames, array $taskNames) + public function __construct(string $companyName, string $companyReference, string $contactName, string $contactEmail, string $bookingMarking, string $projectName, int $projectStatus, array $milestoneNames, array $taskNames) { $this->companyName = $companyName; @@ -41,6 +44,7 @@ class InitialPerfexCRMObject implements DataTransferObject $this->contactEmail = $contactEmail; $this->bookingMarking = $bookingMarking; $this->projectName = $projectName; + $this->projectStatus = $projectStatus; $this->milestoneNames = $milestoneNames; $this->taskNames = $taskNames; } @@ -93,6 +97,14 @@ class InitialPerfexCRMObject implements DataTransferObject return $this->projectName; } + /** + * @return string + */ + public function getProjectStatus(): int + { + return $this->projectStatus; + } + /** * @return array */ diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php index be9328ac..42af2b54 100644 --- a/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php @@ -13,6 +13,9 @@ class UpdatePerfexCRMObject implements DataTransferObject /** @var string */ private $companyReference; + /** @var string */ + private $contactName; + /** @var string */ private $contactEmail; @@ -22,23 +25,28 @@ class UpdatePerfexCRMObject implements DataTransferObject /** @var string */ private $projectName; - /** @var string */ - private $milestoneName; + /** @var int */ + private $projectStatus; - /** @var string */ - private $taskName; + /** @var array */ + private $milestoneNames; + + /** @var array */ + private $taskNames; - public function __construct(string $companyName, string $companyReference, string $contactEmail, string $bookingMarking, string $projectName, string $milestoneName, string $taskName) + public function __construct(string $companyName, string $companyReference, string $contactName, string $contactEmail, string $bookingMarking, string $projectName, int $projectStatus, array $milestoneNames, array $taskNames) { $this->companyName = $companyName; $this->companyReference = $companyReference; + $this->contactName = $contactName; $this->contactEmail = $contactEmail; $this->bookingMarking = $bookingMarking; $this->projectName = $projectName; - $this->milestoneName = $milestoneName; - $this->taskName = $taskName; + $this->projectStatus = $projectStatus; + $this->milestoneNames = $milestoneNames; + $this->taskNames = $taskNames; } /** @@ -57,6 +65,14 @@ class UpdatePerfexCRMObject implements DataTransferObject return $this->companyReference; } + /** + * @return string + */ + public function getContactName(): string + { + return $this->contactName; + } + /** * @return string */ @@ -82,19 +98,26 @@ class UpdatePerfexCRMObject implements DataTransferObject } /** - * @return string + * @return int */ - public function getMilestoneName(): string + public function getProjectStatus(): int { - return $this->milestoneName; + return $this->projectStatus; } /** - * @return string + * @return array */ - public function getTaskName(): string + public function getMilestoneNames(): array { - return $this->taskName; + return $this->milestoneNames; } + /** + * @return array + */ + public function getTaskNames(): array + { + return $this->taskNames; + } } diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php index 0dbd1f1f..00be2fef 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php @@ -10,6 +10,8 @@ use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoiceSingleItemPerfexCRMObject; +use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerProject; +use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; use App\Models\PackingList; use Carbon\Carbon; @@ -28,6 +30,9 @@ class CreatePerfexCRMInvoiceProcessor /** @var FetchesPerfexCRMProject */ private $fetchesPerfexCRMProject; + /** @var CreatesPerfexCRMCustomerProject */ + private $createsPerfexCRMCustomerProject; + /** * CreatePerfexCRMInvoiceProcessor constructor. * @param CreatesPerfexCRMInvoice $createsPerfexCRMInvoice @@ -35,12 +40,14 @@ class CreatePerfexCRMInvoiceProcessor public function __construct(CreatesPerfexCRMInvoice $createsPerfexCRMInvoice, CreatesPerfexCRMInvoicePayment $createsPerfexCRMInvoicePayment, ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer, - FetchesPerfexCRMProject $fetchesPerfexCRMProject) + FetchesPerfexCRMProject $fetchesPerfexCRMProject, + CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject) { $this->createsPerfexCRMInvoice = $createsPerfexCRMInvoice; $this->createsPerfexCRMInvoicePayment = $createsPerfexCRMInvoicePayment; $this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; $this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject; + $this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject; } /** @@ -97,10 +104,16 @@ class CreatePerfexCRMInvoiceProcessor $orderReference = $transaction->owner->owner->reference; $packingListReference = $transaction->owner->reference; $projectName = 'IZYIM | X1 Shipping | '.$orderReference.' | '.$packingListReference; - $project = (App()->make(FetchesPerfexCRMProject::class))->execute($projectName, $clientId); + $project = $this->fetchesPerfexCRMProject->execute($projectName, $clientId); if(!is_null($project)){ $projectId = $project->id; } + else{ + $result = $this->createsPerfexCRMCustomerProject->execute($projectName, PerfexCRMProjectStatus::NOT_STARTED, $clientId); + if(isset($result->payload)){ //Here means project creation successful + $projectId = $result->payload['project_id']; + } + } } } diff --git a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php index b219da54..809dc835 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php @@ -18,7 +18,7 @@ use App\Classes\Modules\PerfexCRM\DataTransferObjects\InitialPerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject; use App\Classes\ValueObjects\Constants\PerfexCRMMilestones; use App\Classes\ValueObjects\Constants\PerfexCRMTasks; -use App\Classes\ValueObjects\Constants\PerfexCRMStatus; +use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; @@ -149,7 +149,7 @@ class InitializePerfexCRMProcessor } // Get existing or create project, project has to exist first before milestone can appear under it - $result = $this->createsPerfexCRMCustomerProject->execute($initialPerfexCRMObject->getProjectName(), $crmClientId); + $result = $this->createsPerfexCRMCustomerProject->execute($initialPerfexCRMObject->getProjectName(), $initialPerfexCRMObject->getProjectStatus(), $crmClientId); if(isset($result->payload)){ //Here means project creation successful $projectId = $result->payload['project_id']; } @@ -157,8 +157,8 @@ class InitializePerfexCRMProcessor $projectId = $this->fetchesPerfexCRMProject->execute($initialPerfexCRMObject->getProjectName(), $crmClientId)->id; } - if(!is_null($result)){ - $tasks = $initialPerfexCRMObject->getTaskNames(); + $tasks = $initialPerfexCRMObject->getTaskNames(); + if(count($tasks) > 0){ //Create tasks with milestone for($count=0; $count < count($tasks); $count++) { @@ -177,13 +177,16 @@ class InitializePerfexCRMProcessor } } - $taskStatus = PerfexCRMStatus::NOT_STARTED; + $taskStatus = PerfexCRMTaskStatus::NOT_STARTED; if($tasks[$count]['status'] != ''){ $taskStatus = $tasks[$count]['status']; } // Get existing or create task $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $taskStatus); + if(is_null($result)){ + break; //Breaking the rest of the tasks in array assuming that they are all created as a batch previously + } } } return true; diff --git a/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php index 9602696d..b882d0c7 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php @@ -3,28 +3,33 @@ namespace App\Classes\Modules\PerfexCRM\Processors; use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateTaskPerfexCRMObject; -use App\Classes\ValueObjects\Constants\PerfexCRMStatus; use App\Classes\Jobs\CreatePerfexCRMSingleTask; +use App\Classes\ValueObjects\Constants\PerfexCRMTasks; +use App\Models\Company; class NewLeadTaskToPerfexCRMProcessor { /** - * @param None + * @param Company $company * @return true * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute() + public function execute(Company $company) { + $companyModule = $company->companyModules()->first(); + $employee = $companyModule->employees()->first(); + $contactEmail = $employee->email; + $createTaskPerfexCRMObject = new CreateTaskPerfexCRMObject( - "dillontest1@gmail.com", - "test is the name of the task", - "this is the description of the task", + $contactEmail, + PerfexCRMTasks::TASK_IDENTIFICATION_1['name'], + PerfexCRMTasks::TASK_IDENTIFICATION_1['description'], "", "", "", "", "", - PerfexCRMStatus::NOT_STARTED + PerfexCRMTasks::TASK_IDENTIFICATION_1['status'] ); CreatePerfexCRMSingleTask::dispatch($createTaskPerfexCRMObject); diff --git a/app/Classes/Modules/PerfexCRM/Processors/PackingListToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/PackingListToPerfexCRMProcessor.php new file mode 100644 index 00000000..775407ed --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/PackingListToPerfexCRMProcessor.php @@ -0,0 +1,51 @@ +owner; + $companyModule = $order->companyModule()->first(); + $connection = $companyModule->inviters()->withPivot('invitee_reference')->first(); + $companyName = $companyModule->name; + $companyReference = $connection ? $connection->pivot->invitee_reference:''; + $employee = $companyModule->employees()->first(); + $contactEmail = $employee->email; + $contactName = $employee->name; + + $orderReference = $packingList->owner->reference; + $packingListReference = $packingList->reference; + $projectName = 'IZYIM | X1 Shipping | '.$orderReference.' | '.$packingListReference; + + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactName, + $contactEmail, + "", + $projectName, + PerfexCRMProjectStatus::NOT_STARTED, + [], + [ + PerfexCRMTasks::TASK_LOADED_CONTAINER_1, + PerfexCRMTasks::TASK_LOADED_CONTAINER_2, + ] + ); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + + return true; + } +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php index 4dcbf2a5..cd2682ec 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php @@ -7,13 +7,12 @@ use App\Classes\Modules\PerfexCRM\Processors\InitializePerfexCRMProcessor; use App\Classes\Modules\PerfexCRM\Services\Init; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject; -use App\Classes\Modules\PerfexCRM\DataTransferObjects\InitialPerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMInvoiceObject; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\ValueObjects\Constants\PerfexCRMMilestones; use App\Classes\ValueObjects\Constants\PerfexCRMTasks; +use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\Jobs\InitializePerfexCRM; use App\Classes\Jobs\UpdatePerfexCRMInvoice; use App\Classes\Jobs\UpdatePerfexCRM; use App\Models\Transaction; @@ -51,28 +50,30 @@ class TransactionToPerfexCRMProcessor */ public function execute(Transaction $model, int $status) { - if($model->owner instanceof \App\Models\Transaction && $status == ApprovalStatus::APPROVED){ - //dd(json_encode($packingList->owner()->first()->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference)); - //dd(json_encode($model->owner->owner->owner()->first()->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference)); - $companyModule = $model->owner->owner->owner()->first()->companyModule()->first(); + if($model->owner instanceof \App\Models\Transaction && $status == ApprovalStatus::APPROVED) + { + $packingList = $model->owner->owner; + $order = $packingList->owner()->first(); + $companyModule = $order->companyModule()->first(); $companyName = $companyModule->name; $companyReference = $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; $employee = $companyModule->employees()->first(); $contactEmail = $employee->email; $contactName = $employee->name; - $orderReference = $model->owner->owner->owner()->first()->reference; - $packingListReference = $model->owner->owner->reference; + $orderReference = $order->reference; + $packingListReference = $packingList->reference; $projectName = 'IZYIM | X1 Shipping | '.$orderReference.' | '.$packingListReference; - $bookingMarking = $model->owner->owner->id."-".$model->owner->owner->owner->id; - $initialPerfexCRMObject = new InitialPerfexCRMObject( + $bookingMarking = $packingList->id."-".$packingList->owner->id; + $updatePerfexCRMObject = new UpdatePerfexCRMObject( $companyName, $companyReference, $contactName, $contactEmail, $bookingMarking, $projectName, + PerfexCRMProjectStatus::IN_PROGRESS, [], [ PerfexCRMTasks::TASK_1, @@ -83,8 +84,7 @@ class TransactionToPerfexCRMProcessor ] ); - //$this->initializePerfexCRMProcessor->execute($initialPerfexCRMObject); - InitializePerfexCRM::dispatch($initialPerfexCRMObject); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); $updatePerfexCRMInvoiceOject = new UpdatePerfexCRMInvoiceObject( $contactEmail, diff --git a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php index 0b452d02..03900ce2 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php @@ -11,11 +11,11 @@ use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMMilestone; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMTask; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomer; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerContact; -use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMTask; +use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMCustomer; use App\Classes\Modules\PerfexCRM\DataTransferObjects\CustomerContactObject; use App\Classes\Exceptions\MalformedRequestException; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject; -use App\Classes\ValueObjects\Constants\PerfexCRMStatus; +use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; @@ -49,11 +49,13 @@ class UpdatePerfexCRMProcessor /** @var CreatesPerfexCRMCustomerContact */ private $createsPerfexCRMCustomerContact; - /** @var UpdatesPerfexCRMTask */ - private $updatesPerfexCRMTask; + /** @var UpdatesPerfexCRM */ + private $updatePerfexCRM; + /** @var UpdatesPerfexCRMCustomer */ + private $updatesPerfexCRMCustomer; - /** + /** * @param ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer * @param CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject * @param CreatesPerfexCRMMilestone $createsPerfexCRMMilestone @@ -63,18 +65,18 @@ class UpdatePerfexCRMProcessor * @param FetchesPerfexCRMTask $fetchesPerfexCRMTask * @param CreatesPerfexCRMCustomer $createsPerfexCRMCustomer * @param CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact - * @param UpdatesPerfexCRMTask $updatesPerfexCRMTask + * @param UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer */ public function __construct(ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer, - CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject, - CreatesPerfexCRMMilestone $createsPerfexCRMMilestone, - CreatesPerfexCRMTask $createsPerfexCRMTask, - FetchesPerfexCRMProject $fetchesPerfexCRMProject, - FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone, - FetchesPerfexCRMTask $fetchesPerfexCRMTask, - CreatesPerfexCRMCustomer $createsPerfexCRMCustomer, - CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact, - UpdatesPerfexCRMTask $updatesPerfexCRMTask) + CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject, + CreatesPerfexCRMMilestone $createsPerfexCRMMilestone, + CreatesPerfexCRMTask $createsPerfexCRMTask, + FetchesPerfexCRMProject $fetchesPerfexCRMProject, + FetchesPerfexCRMMilestone $fetchesPerfexCRMMilestone, + FetchesPerfexCRMTask $fetchesPerfexCRMTask, + CreatesPerfexCRMCustomer $createsPerfexCRMCustomer, + CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact, + UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer) { $this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; $this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject; @@ -85,55 +87,106 @@ class UpdatePerfexCRMProcessor $this->fetchesPerfexCRMTask = $fetchesPerfexCRMTask; $this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer; $this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact; - $this->updatesPerfexCRMTask = $updatesPerfexCRMTask; - } + $this->updatesPerfexCRMCustomer = $updatesPerfexCRMCustomer; + } /** - * @param PerfexCRMObject $perfexCRMObject + * @param UpdatePerfexCRMObject $updatePerfexCRMObject * @return null|object * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(UpdatePerfexCRMObject $updatePerfexCRMObject) { + public function execute(UpdatePerfexCRMObject $updatePerfexCRMObject) { - // Customer has to exist first before Project can appear under it - // Check with Perfex CRM, if this user (email) was previously a lead, should automatically now become a customer - $result = $this->convertsPerfexCRMLeadToCustomer->execute($updatePerfexCRMObject->getContactEmail()); - if(isset($result->payload)){ - $crmClientId = $result->payload['client_id']; + // Customer has to exist first before Project can appear under it + // Check with Perfex CRM, if this user (email) was previously a lead, should automatically now become a customer + $crmCompany = $updatePerfexCRMObject->getCompanyName(); + $result = $this->convertsPerfexCRMLeadToCustomer->execute($updatePerfexCRMObject->getContactEmail()); + if(isset($result->payload)){ + $crmClientId = $result->payload['client_id']; + if (isset($result->payload['company'])) { + $crmCompany = $result->payload['company']; + } + } + else{ + //if reach this point, this means this user is not a official customer nor is a lead in crm + //Create Customer has 2 parts: Create Company (client), Create Contact + $result = $this->createsPerfexCRMCustomer->execute($crmCompany); + if(is_null($result)){ + $crmCompany = $crmCompany." 2"; + $result = $this->createsPerfexCRMCustomer->execute($crmCompany); + } + + $crmClientId = $result->payload['clientId']; + + $customerContactObject = new CustomerContactObject( + $crmClientId, + $updatePerfexCRMObject->getContactName(), + $updatePerfexCRMObject->getContactName(), + $updatePerfexCRMObject->getContactEmail(), + "pU^T@sC#9Q", + "on", + "on" + ); + $result = $this->createsPerfexCRMCustomerContact->execute($customerContactObject); + } + + //Update custom fields to identify company reference from exchange or shipping portal + $value_exists = false; + if (isset($result->payload['customfields'])) { + foreach ($result->payload['customfields'] as $element) { + if ($element['value'] === $updatePerfexCRMObject->getCompanyReference()) { + $value_exists = true; + break; + } + } + } + if(!$value_exists); + { + $result = $this->updatesPerfexCRMCustomer->execute($crmClientId, $crmCompany, $updatePerfexCRMObject->getCompanyReference()); + } + + // Get existing or create project, project has to exist first before milestone can appear under it + $result = $this->createsPerfexCRMCustomerProject->execute($updatePerfexCRMObject->getProjectName(), $updatePerfexCRMObject->getProjectStatus(), $crmClientId); + if(isset($result->payload)){ //Here means project creation successful + $projectId = $result->payload['project_id']; + } + else{ + $projectId = $this->fetchesPerfexCRMProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId)->id; + } + + $tasks = $updatePerfexCRMObject->getTaskNames(); + if(count($tasks) > 0){ + + //Create tasks with milestone + for($count=0; $count < count($tasks); $count++) { + $milestoneId = 0; //By default milestoneId is 0, having this set at individual task is optional + if($tasks[$count]['milestone'] != "") //Create milestone only if it is defined + { + // Get existing or create milestone, milestone has to exist first before task can appear under it + $result = $this->createsPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId, $count); + if(isset($result->payload)){ + $milestoneId = $result->payload['milestone_id']; + } + else{ + $milestone = $this->fetchesPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId); + $array = json_decode(json_encode($milestone), true); + $milestoneId = $array[0]['id']; + } + } + + $taskStatus = PerfexCRMTaskStatus::NOT_STARTED; + if($tasks[$count]['status'] != ''){ + $taskStatus = $tasks[$count]['status']; + } + + // Get existing or create task + $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $taskStatus); + if(is_null($result)){ + break; //Breaking the rest of the tasks in array assuming that they are all created as a batch previously + } + } } - - // Get existing or create project, project has to exist first before milestone can appear under it - $result = $this->createsPerfexCRMCustomerProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId); - if(isset($result->payload)){ - $projectId = $result->payload['project_id']; - } - else{ - $projectId = $this->fetchesPerfexCRMProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId)->id; - } - - // Get existing or create milestone, milestone has to exist first before task can appear under it - $result = $this->createsPerfexCRMMilestone->execute($updatePerfexCRMObject->getMilestoneName(), $projectId); - if(isset($result->payload)){ - $milestoneId = $result->payload['milestone_id']; - } - else{ - $milestone = $this->fetchesPerfexCRMMilestone->execute($updatePerfexCRMObject->getMilestoneName(), $projectId); - $array = json_decode(json_encode($milestone), true); - $milestoneId = $array[0]['id']; - } - - // Get existing or create task - $result = $this->createsPerfexCRMTask->execute($updatePerfexCRMObject->getTaskName(), $milestoneId, $projectId); - if(isset($result->payload)){ - $taskId = $result->payload['task_id']; - } - else{ - $taskId = $this->fetchesPerfexCRMTask->execute($updatePerfexCRMObject->getTaskName(), $milestoneId)->id; - } - - $this->updatesPerfexCRMTask->execute($taskId, $updatePerfexCRMObject->getTaskName(), $milestoneId, $projectId, PerfexCRMStatus::COMPLETED); - - return null; - } + return true; + } } diff --git a/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php index e719ccef..f5d4de3e 100644 --- a/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php @@ -14,7 +14,7 @@ class CreatesPerfexCRMCustomerProject * @return null|object * @throws MalformedRequestException */ - public function execute(string $projectName, string $clientId) { + public function execute(string $projectName, int $status, string $clientId) { try{ $data = [ 'name' => $projectName, @@ -22,7 +22,7 @@ class CreatesPerfexCRMCustomerProject 'billing_type' => 1, 'clientid' => $clientId, 'start_date' => date('Y-m-d'), - 'status' => 1 + 'status' => $status ]; $response = Http::asForm()->withHeaders([ diff --git a/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMProject.php b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMProject.php new file mode 100644 index 00000000..6c016ff0 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMProject.php @@ -0,0 +1,43 @@ + $project->name, + 'clientid' => $project->clientid, + // 'rel_type' => 'customer', + 'billing_type' => 1, + 'start_date' => $project->start_date, + 'status' => $status + ]; + + $response = Http::asJson()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->put(config('perfexcrm.base_url').'/api/projects/'.$project->id, $data); + + if($response->successful()){ + $data = $response->json(); + return (object) $data; + }else{ + Log::error($response); + return null; + } + }catch(\Exception $exception){ + throw new MalformedRequestException('Unable to get correct response from Perfex CRM server: ' . $exception->getMessage()); + } + } +} diff --git a/app/Classes/ValueObjects/Constants/PerfexCRMProjectStatus.php b/app/Classes/ValueObjects/Constants/PerfexCRMProjectStatus.php new file mode 100644 index 00000000..5228699f --- /dev/null +++ b/app/Classes/ValueObjects/Constants/PerfexCRMProjectStatus.php @@ -0,0 +1,16 @@ + 'MILESTONE 1 - Customer Paid', 'reference' => '', 'on_task_completion' => '', - 'status' => PerfexCRMStatus::COMPLETED + 'status' => PerfexCRMTaskStatus::COMPLETED ]; public const TASK_POST_PAYMENT_1 = [ @@ -26,7 +26,7 @@ class PerfexCRMTasks 'milestone' => '', 'reference' => 'TASK_POST_PAYMENT_1', 'on_task_completion' => 'TASK_POST_PAYMENT_2', - 'status' => PerfexCRMStatus::IN_PROGRESS + 'status' => PerfexCRMTaskStatus::IN_PROGRESS ]; public const TASK_POST_PAYMENT_2 = [ 'name' => 'Approve Payment', @@ -73,4 +73,48 @@ class PerfexCRMTasks 'on_task_completion' => '', 'status' => '' ]; + + public const TASK_LOADED_CONTAINER_1 = [ + 'name' => 'Generate Shipping Invoices', + 'description' => '○ Purpose: -
+ ○ Initial Status: In Progress
+ ○ Deadline: Next day
+ ○ Responsible department: Operation
+ ○ Assignee: -
+ ○ Next step: Approve Shipping Invoice change to in progress.
', + 'milestone' => '', + 'reference' => 'TASK_LOADED_CONTAINER_1', + 'on_task_completion' => 'TASK_LOADED_CONTAINER_2', + 'status' => PerfexCRMTaskStatus::IN_PROGRESS + ]; + + public const TASK_LOADED_CONTAINER_2 = [ + 'name' => 'Approve Shipping Invoices', + 'description' => '○ Purpose: -
+ ○ Initial Status: Not Starteds
+ ○ Deadline: Next day
+ ○ Responsible department: Customer Services
+ ○ Next step: -
', + 'milestone' => '', + 'reference' => 'TASK_LOADED_CONTAINER_2', + 'on_task_completion' => '', + 'status' => '' + ]; + + + public const TASK_IDENTIFICATION_1 = [ + 'name' => 'Approve Identification Verification', + 'description' => '○ Purpose: To ensure the customer submit information matches the information in their identification document.
+ ○ Initial Status: In Progress
+ ○ Deadline: Same Day
+ ○ Responsible department: Operation
+ ○ Next step: None
+ ○ Additional details: ** Any specific requirements or notes for the operation.**
+ ○ Dependencies: None
+ ○ Outcomes: Customer account identification is verified
', + 'milestone' => '', + 'reference' => 'TASK_IDENTIFICATION_1', + 'on_task_completion' => '', + 'status' => PerfexCRMTaskStatus::IN_PROGRESS + ]; }