diff --git a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php index 6d9a558c..d89c54e6 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php @@ -7,10 +7,12 @@ use App\Classes\ValueObjects\Constants\PerfexCRMTasks; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; +use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMInvoiceObject; use App\Classes\Jobs\UpdatePerfexCRMInvoice; use App\Classes\Jobs\UpdatePerfexCRM; use App\Models\Transaction; +use Illuminate\Support\Facades\Log; class TransactionToPerfexCRMProcessor { @@ -22,98 +24,85 @@ class TransactionToPerfexCRMProcessor */ public function execute(Transaction $model, int $status) { - // dd(json_encode($status)); - if($model->owner instanceof \App\Models\Booking) { - $companyReference = $model->owner->company->reference; - $companyName = $model->owner->company->name; - $employee = $model->owner->company->employees()->first(); - $contactEmail = $employee->email; - $contactName = $employee->name; - $bookingMarking = $model->owner->marking; + try { + if($model->owner instanceof \App\Models\Booking) { + $companyReference = $model->owner->company->reference; + $companyName = $model->owner->company->name; + $employee = $model->owner->company->employees()->first(); + $contactEmail = $employee->email; + $contactName = $employee->name; + $bookingMarking = $model->owner->marking; - $serviceTypeName = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name; - $projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking; + $serviceTypeName = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name; + $projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking; - if($status == ApprovalStatus::APPROVED) - { - if($model->type == TransactionType::PAYMENT){ - $tasks = [ - PerfexCRMTasks::TASK_1 - ]; - if($model->owner->service_id == 1){ - $tasks = [ - PerfexCRMTasks::TASK_1, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_1, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_2, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_3, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_4, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_5, - PerfexCRMTasks::TASK_1_DAY_TRANSFER_6, - ]; - } - else if($model->owner->service_id == 3){ - $tasks = [ - PerfexCRMTasks::TASK_1, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_1, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_2, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_3, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_4, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_5, - PerfexCRMTasks::TASK_3_DAY_TRANSFER_6, - ]; - } - else if($model->owner->service_id == 4){ - $tasks = [ - PerfexCRMTasks::TASK_1, - PerfexCRMTasks::TASK_1688_PAYMENT_1, - PerfexCRMTasks::TASK_1688_PAYMENT_2, - PerfexCRMTasks::TASK_1688_PAYMENT_3, - PerfexCRMTasks::TASK_1688_PAYMENT_4, - PerfexCRMTasks::TASK_1688_PAYMENT_5, - PerfexCRMTasks::TASK_1688_PAYMENT_6, - PerfexCRMTasks::TASK_1688_PAYMENT_7, - PerfexCRMTasks::TASK_1688_PAYMENT_8, - PerfexCRMTasks::TASK_1688_PAYMENT_9, - PerfexCRMTasks::TASK_1688_PAYMENT_10, - PerfexCRMTasks::TASK_1688_PAYMENT_11, - PerfexCRMTasks::TASK_1688_PAYMENT_12, - PerfexCRMTasks::TASK_1688_PAYMENT_13, + if($status == ApprovalStatus::APPROVED) + { + if($model->type == TransactionType::PAYMENT){ - ]; - } - $updatePerfexCRMObject = new UpdatePerfexCRMObject( - $companyName, - $companyReference, - $contactName, - $contactEmail, - $bookingMarking, - $projectName, - PerfexCRMProjectStatus::IN_PROGRESS, - [], - $tasks - ); - UpdatePerfexCRM::dispatch($updatePerfexCRMObject); - } - - $updatePerfexCRMInvoiceOject = new UpdatePerfexCRMInvoiceObject( - $contactEmail, - $model, - true, - $projectName - ); - UpdatePerfexCRMInvoice::dispatch($updatePerfexCRMInvoiceOject); - } - else if($status == ApprovalStatus::PENDING_VERIFICATION){ - if($model->type == TransactionType::PURCHASE_ORDER){ - $tasks = []; - if($model->owner->service_id == 1 || $model->owner->service_id == 3){ $tasks = [ - PerfexCRMTasks::TASK_PURCHASE_ORDER_1, - PerfexCRMTasks::TASK_PURCHASE_ORDER_2, + PerfexCRMTasks::TASK_1 ]; - } + if($model->owner->service_id == 1){ + $tasks = [ + PerfexCRMTasks::TASK_1, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_1, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_2, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_3, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_4, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_5, + PerfexCRMTasks::TASK_1_DAY_TRANSFER_6, + ]; + } + else if($model->owner->service_id == 3){ + $tasks = [ + PerfexCRMTasks::TASK_1, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_1, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_2, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_3, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_4, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_5, + PerfexCRMTasks::TASK_3_DAY_TRANSFER_6, + ]; + } + else if($model->owner->service_id == 4){ + $tasks = [ + PerfexCRMTasks::TASK_1, + PerfexCRMTasks::TASK_1688_PAYMENT_1, + PerfexCRMTasks::TASK_1688_PAYMENT_2, + PerfexCRMTasks::TASK_1688_PAYMENT_3, + PerfexCRMTasks::TASK_1688_PAYMENT_4, + PerfexCRMTasks::TASK_1688_PAYMENT_5, + PerfexCRMTasks::TASK_1688_PAYMENT_6, + PerfexCRMTasks::TASK_1688_PAYMENT_7, + PerfexCRMTasks::TASK_1688_PAYMENT_8, + PerfexCRMTasks::TASK_1688_PAYMENT_9, + PerfexCRMTasks::TASK_1688_PAYMENT_10, + PerfexCRMTasks::TASK_1688_PAYMENT_11, + PerfexCRMTasks::TASK_1688_PAYMENT_12, + PerfexCRMTasks::TASK_1688_PAYMENT_13, + + ]; + } + + //Add in tasks if customer has no purchase order yet and using 1 days or 3 days transfer service + if($model->owner->service_id == 1 || $model->owner->service_id == 3){ + $booking = $model->booking; + $purchaseOrder = $booking->transactions() + ->where('type', TransactionType::PURCHASE_ORDER) + ->complete() + ->first(); + if(is_null($purchaseOrder)){ + $potask1 = PerfexCRMTasks::TASK_PURCHASE_ORDER_1; + $potask1['status'] = PerfexCRMTaskStatus::NOT_STARTED; + $poTasks = [ + $potask1, + PerfexCRMTasks::TASK_PURCHASE_ORDER_2, + ]; + $tasks = array_merge($tasks, $poTasks); + } + } - if(count($tasks) > 0){ $updatePerfexCRMObject = new UpdatePerfexCRMObject( $companyName, $companyReference, @@ -127,10 +116,47 @@ class TransactionToPerfexCRMProcessor ); UpdatePerfexCRM::dispatch($updatePerfexCRMObject); } + + $updatePerfexCRMInvoiceOject = new UpdatePerfexCRMInvoiceObject( + $contactEmail, + $model, + true, + $projectName + ); + UpdatePerfexCRMInvoice::dispatch($updatePerfexCRMInvoiceOject); + } + else if($status == ApprovalStatus::PENDING_VERIFICATION){ + if($model->type == TransactionType::PURCHASE_ORDER){ + $tasks = []; + if($model->owner->service_id == 1 || $model->owner->service_id == 3){ + $tasks = [ + PerfexCRMTasks::TASK_PURCHASE_ORDER_1, + PerfexCRMTasks::TASK_PURCHASE_ORDER_2, + ]; + } + + if(count($tasks) > 0){ + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactName, + $contactEmail, + $bookingMarking, + $projectName, + PerfexCRMProjectStatus::IN_PROGRESS, + [], + $tasks + ); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + } + } } } } - + catch (\Exception $exception) { + Log::error('TransactionToPerfexCRMProcessor debug:'); + Log::error($exception); + } return true; } } diff --git a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php index 5b859a2b..af39cf62 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php @@ -158,20 +158,23 @@ class UpdatePerfexCRMProcessor } // 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{ - $project = $this->fetchesPerfexCRMProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId); - $projectId = $project->id; + $result = $this->fetchesPerfexCRMProject->execute($updatePerfexCRMObject->getProjectName(), $crmClientId); + if(isset($result->payload)){ + $project = $result->payload[0]; + $projectId = $project['id']; + //cief todo: need to cater in case of project is completed? what situation will an update not require //if the project status is anything but PerfexCRMProjectStatus::NOT_STARTED, update the project - if($updatePerfexCRMObject->getProjectStatus() != PerfexCRMProjectStatus::NOT_STARTED) + if($updatePerfexCRMObject->getProjectStatus() != PerfexCRMProjectStatus::NOT_STARTED && $project['status'] == PerfexCRMProjectStatus::NOT_STARTED) { $this->updatesPerfexCRMProject->execute($project, $updatePerfexCRMObject->getProjectStatus()); } } - + else{ + $result = $this->createsPerfexCRMCustomerProject->execute($updatePerfexCRMObject->getProjectName(), $updatePerfexCRMObject->getProjectStatus(), $crmClientId); + if(isset($result->payload)){ //Here means project creation successful + $projectId = $result->payload['project_id']; + } + } $tasks = $updatePerfexCRMObject->getTaskNames(); if(count($tasks) > 0){ @@ -182,14 +185,16 @@ class UpdatePerfexCRMProcessor 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); + $result = $this->fetchesPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId); if(isset($result->payload)){ - $milestoneId = $result->payload['milestone_id']; + $array = json_decode(json_encode($result->payload[0]), true); + $milestoneId = $array['id']; } else{ - $milestone = $this->fetchesPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId); - $array = json_decode(json_encode($milestone), true); - $milestoneId = $array[0]['id']; + $result = $this->createsPerfexCRMMilestone->execute($tasks[$count]['milestone'], $projectId, $count); + if(isset($result->payload)){ + $milestoneId = $result->payload['milestone_id']; + } } } @@ -199,10 +204,23 @@ class UpdatePerfexCRMProcessor } // 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'], $tasks[$count]['department'], $taskStatus); - if(is_null($result)){ - break; //Breaking the rest of the tasks in array assuming that they are all created as a batch previously + $result = $this->fetchesPerfexCRMTask->execute($tasks[$count]['name'], $milestoneId, 'project', $projectId); + //cief todo: need to cater in case of task is completed? what situation will an update not require + if(isset($result->payload)){ + if($taskStatus != PerfexCRMTaskStatus::NOT_STARTED && $result->payload[0]['status'] == PerfexCRMTaskStatus::NOT_STARTED) + { + $task = $result->payload[0]; + $result = $this->updatesPerfexCRMTask->execute($task['id'], $task['name'], $task['milestone'], $task['rel_id'], $taskStatus); + } } + else{ + $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $tasks[$count]['department'], $taskStatus); + } + + //cief todo: to evaluate if this is still needed + // 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/Services/FetchesPerfexCRMMilestone.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php index 8a5ba559..30ae0737 100644 --- a/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php @@ -16,9 +16,14 @@ class FetchesPerfexCRMMilestone */ public function execute(string $milestoneName, string $projectId) { try{ - $response = Http::withHeaders([ - 'authtoken' => config('perfexcrm.api_key'),]) - ->get(config('perfexcrm.base_url').'/api/milestones/bynameandprojectid/'.rawurlencode($milestoneName).'/'.$projectId); + $data = [ + 'name' => $milestoneName, + 'project_id' => $projectId, + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/milestones/bynameandprojectid', $data); if($response->successful()){ $data = $response->json(); diff --git a/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php index 97707acb..6848705f 100644 --- a/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php @@ -11,14 +11,27 @@ class FetchesPerfexCRMTask /** * @param string $taskName * @param string $milestoneId + * @param string $relType + * @param string $relId * @return null|object * @throws MalformedRequestException */ - public function execute(string $taskName, string $milestoneId) { + public function execute(string $taskName, string $milestoneId, string $relType, string $relId) { try{ - $response = Http::withHeaders([ - 'authtoken' => config('perfexcrm.api_key'),]) - ->get(config('perfexcrm.base_url').'/api/tasks/bynameandmilestoneid/'.rawurlencode($taskName).'/'.$milestoneId); + $data = [ + 'name' => $taskName, + 'rel_type' => $relType, + 'rel_id' => $relId, + ]; + + if($milestoneId != '') { + $newItem = ['milestone' => $milestoneId ]; + $data = array_merge($data, $newItem); + } + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/tasks/customsearch', $data); if($response->successful()){ $data = $response->json();