diff --git a/app/Classes/Jobs/CreatePerfexCRMSingleTask.php b/app/Classes/Jobs/CreatePerfexCRMSingleTask.php new file mode 100644 index 00000000..586efe0f --- /dev/null +++ b/app/Classes/Jobs/CreatePerfexCRMSingleTask.php @@ -0,0 +1,42 @@ +createTaskPerfexCRMObject = $createTaskPerfexCRMObject; + } + + public function handle() + { + $lead = (App()->make(FetchesPerfexCRMLead::class))->execute($this->createTaskPerfexCRMObject->getEmail()); + if(!is_null($lead)) + { + $this->createTaskPerfexCRMObject->setLeadId($lead->id); + (App()->make(CreatePerfexCRMTaskProcessor::class))->execute($this->createTaskPerfexCRMObject); + } + } +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/CreateTaskPerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/CreateTaskPerfexCRMObject.php new file mode 100644 index 00000000..70bae013 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/CreateTaskPerfexCRMObject.php @@ -0,0 +1,127 @@ +email = $email; + $this->name = $name; + $this->description = $description; + $this->leadId = $leadId; + $this->projectId = $projectId; + $this->milestoneId = $milestoneId; + $this->reference = $reference; + $this->onTaskCompletion = $onTaskCompletion; + $this->status = $status; + } + + /** + * @return string + */ + public function getEmail(): string + { + return $this->email; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return string + */ + public function getLeadId(): string + { + return $this->leadId; + } + + public function setLeadId(string $leadId) + { + $this->leadId = $leadId; + } + + /** + * @return string + */ + public function getProjectId(): string + { + return $this->projectId; + } + + /** + * @return string + */ + public function getMilestoneId(): string + { + return $this->milestoneId; + } + + /** + * @return string + */ + public function getReference(): string + { + return $this->reference; + } + + /** + * @return string + */ + public function getOnTaskCompletion(): string + { + return $this->onTaskCompletion; + } + + /** + * @return string + */ + public function getStatus(): string + { + return $this->status; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMTaskProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMTaskProcessor.php new file mode 100644 index 00000000..965f6f34 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMTaskProcessor.php @@ -0,0 +1,41 @@ +createsPerfexCRMTask = $createsPerfexCRMTask; + } + + /** + * @param CreateTaskPerfexCRMObject $createTaskPerfexCRMObject + * @return true + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(CreateTaskPerfexCRMObject $createTaskPerfexCRMObject) { + $this->createsPerfexCRMTask->execute( + $createTaskPerfexCRMObject->getName(), + $createTaskPerfexCRMObject->getDescription(), + $createTaskPerfexCRMObject->getLeadId(), + $createTaskPerfexCRMObject->getMilestoneId(), + $createTaskPerfexCRMObject->getProjectId(), + $createTaskPerfexCRMObject->getReference(), + $createTaskPerfexCRMObject->getOnTaskCompletion(), + $createTaskPerfexCRMObject->getStatus(), + ); + return true; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php index 298e86d8..b219da54 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php @@ -178,14 +178,14 @@ class InitializePerfexCRMProcessor } $taskStatus = PerfexCRMStatus::NOT_STARTED; - if($tasks[$count]['name'] == PerfexCRMTasks::TASK_1['name']){ - $taskStatus = PerfexCRMStatus::COMPLETED; + if($tasks[$count]['status'] != ''){ + $taskStatus = $tasks[$count]['status']; } // Get existing or create task - $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $milestoneId, $projectId, $tasks[$count]['reference'], $taskStatus); + $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $tasks[$count]['description'], '', $milestoneId, $projectId, $tasks[$count]['reference'], $tasks[$count]['on_task_completion'], $taskStatus); } - } + } return true; } diff --git a/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php new file mode 100644 index 00000000..9602696d --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php @@ -0,0 +1,34 @@ + $taskName, + 'description' => $taskDescription, 'milestone' => $milestoneId, 'startdate' => date('Y-m-d'), 'rel_type' => 'project', 'rel_id' => $projectId, 'status' => $status, 'is_system_created' => 1, - 'reference' => $reference + 'reference' => $reference, + 'on_task_completion' => $on_task_completion ]; + if($leadId != '') { + $data = [ + 'name' => $taskName, + 'description' => $taskDescription, + 'milestone' => $milestoneId, + 'startdate' => date('Y-m-d'), + 'rel_type' => 'lead', + 'rel_id' => $leadId, + 'status' => $status, + 'is_system_created' => 1, + 'reference' => $reference, + 'on_task_completion' => $on_task_completion + ]; + } + $response = Http::asForm()->withHeaders([ 'authtoken' => config('perfexcrm.api_key')]) ->post(config('perfexcrm.base_url').'/api/tasks',$data); diff --git a/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMLead.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMLead.php new file mode 100644 index 00000000..df9c754d --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMLead.php @@ -0,0 +1,34 @@ + config('perfexcrm.api_key'),]) + ->get(config('perfexcrm.base_url').'/api/leads/byemail/'.$email); + + 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/Modules/Transactions/Services/UpdatesTransactionStatus.php b/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php index f311f09b..2928f36f 100644 --- a/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php +++ b/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php @@ -5,19 +5,25 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Models\Transaction; use App\Classes\Modules\PerfexCRM\Processors\TransactionToPerfexCRMProcessor; +use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor; class UpdatesTransactionStatus extends AbstractUpdateRecord { /** @var TransactionToPerfexCRMProcessor */ private $transactionToPerfexCRMProcessor; + /** @var NewLeadTaskToPerfexCRMProcessor */ + private $newLeadTaskToPerfexCRMProcessor; + /** * UpdatesTransactionStatus constructor. * @param TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor + * @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor */ - public function __construct(TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor) + public function __construct(TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor) { $this->transactionToPerfexCRMProcessor = $transactionToPerfexCRMProcessor; + $this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor; } /** @@ -30,6 +36,7 @@ class UpdatesTransactionStatus extends AbstractUpdateRecord { if(config('perfexcrm.is_enabled') == 'true'){ $this->transactionToPerfexCRMProcessor->execute($model, $status); + // $this->newLeadTaskToPerfexCRMProcessor->execute(); } $model->status = $status; return $this->handler($model); diff --git a/app/Classes/ValueObjects/Constants/PerfexCRMTasks.php b/app/Classes/ValueObjects/Constants/PerfexCRMTasks.php index b1abecec..9bac0332 100644 --- a/app/Classes/ValueObjects/Constants/PerfexCRMTasks.php +++ b/app/Classes/ValueObjects/Constants/PerfexCRMTasks.php @@ -6,52 +6,71 @@ class PerfexCRMTasks { public const TASK_1 = [ 'name' => 'Customer Paid', + 'description' => '', 'milestone' => 'MILESTONE 1 - Customer Paid', - 'reference' => '' + 'reference' => '', + 'on_task_completion' => '', + 'status' => PerfexCRMStatus::COMPLETED ]; - public const TASK_2 = [ - 'name' => 'TASK B', - 'milestone' => 'MILESTONE 2 - Order Placed', - 'reference' => '' - ]; - public const TASK_3 = [ - 'name' => 'TASK C', - 'milestone' => 'MILESTONE 3 - Purchase Order Approved', - 'reference' => '' - ]; - public const TASK_4 = [ - 'name' => 'TASK D', - 'milestone' => 'MILESTONE 4', - 'reference' => '' - ]; - public const TASK_5 = [ - 'name' => 'TASK E', - 'milestone' => 'MILESTONE 5', - 'reference' => '' - ]; - public const TASK_6 = [ - 'name' => 'TASK F', + + public const TASK_POST_PAYMENT_1 = [ + 'name' => 'Map Bank Transaction Record', + 'description' => '○ Purpose: To map a transaction to bank transaction in the bank statement
+ ○ Initial Status: In Progress
+ ○ Deadline: Same day
+ ○ Responsible department: Accounts
+ ○ Next step: Change the status of the Approve payment status to "In Progress" upon successful completion of the operation.
+ ○ Additional details: ** Any specific requirements or notes for the operation.**
+ ○ Dependencies: None
+ ○ Outcomes: Bank transaction is mapped successfully, allowing the next steps in the process to be initiated.
', 'milestone' => '', - 'reference' => 'THIS_IS_TASK_NUMBER_6' + 'reference' => 'TASK_POST_PAYMENT_1', + 'on_task_completion' => 'TASK_POST_PAYMENT_2', + 'status' => PerfexCRMStatus::IN_PROGRESS ]; - public const TASK_7 = [ - 'name' => 'TASK G', + public const TASK_POST_PAYMENT_2 = [ + 'name' => 'Approve Payment', + 'description' => '○ Purpose: To verify and approve the customer\'s payment on IZYIM
+ ○ Initial Status: Not Started
+ ○ Deadline:Same day
+ ○ Responsible department: Accounts
+ ○ Next step: Change the status of the Issue Shipping Autocount Invoice operation to "In Progress"
+ ○ Additional details: When the payment method is FPX or Wallet this task is performed automatically by the system.
+ ○ Dependencies: Map Transaction operation must be completed before this operation can begin.
+ ○ Outcomes: The payment will be approved in IZYIM, which will release the customer’s goods for delivery.
', 'milestone' => '', - 'reference' => 'THIS_IS_TASK_NUMBER_7' + 'reference' => 'TASK_POST_PAYMENT_2', + 'on_task_completion' => 'TASK_POST_PAYMENT_3', + 'status' => '' ]; - public const TASK_8 = [ - 'name' => 'TASK H', + public const TASK_POST_PAYMENT_3 = [ + 'name' => 'Issue Shipping Autocount Invoince', + 'description' => '○ Purpose: To issue an invoice for the customer\'s payment in accounting software.
+ ○ Initial Status: Not Started
+ ○ Deadline: Next day
+ ○ Responsible department: Accounts
+ ○ Next step: Change the status of the Knockoff Invoice operation to "In Progress" upon successful completion.
+ ○ Additional details: ** Any specific requirements or notes for the operation.**
+ ○ Dependencies: Approve Payment operation must be completed before this operation can begin.
+ ○ Outcomes: An invoice will be issued in accounting software for the customer\'s payment.
', 'milestone' => '', - 'reference' => 'THIS_IS_TASK_NUMBER_8' + 'reference' => 'TASK_POST_PAYMENT_3', + 'on_task_completion' => 'TASK_POST_PAYMENT_4', + 'status' => '' ]; - public const TASK_9 = [ - 'name' => 'TASK I', + public const TASK_POST_PAYMENT_4 = [ + 'name' => 'Knockoff Invoice', + 'description' => '○ Purpose: The purpose of this operation is to issue the official receipt and knockoff with invoice for the customer\'s payment.
+ ○ Initial Status: Not Started
+ ○ Deadline: Next day.
+ ○ Responsible Department: Accounts
+ ○ Next Step: None
+ ○ Additional Details: ** Any specific requirements or notes for the operation.**
+ ○ Dependencies: Issue Shipping Autocount Invoice operation must be completed before this operation can begin.
+ ○ Outcomes: The customer’s payment is applied to the accounting software invoice and invoice is marked as paid.
', 'milestone' => '', - 'reference' => 'THIS_IS_TASK_NUMBER_9' - ]; - public const TASK_10 = [ - 'name' => 'TASK J', - 'milestone' => '', - 'reference' => 'THIS_IS_TASK_NUMBER_10' + 'reference' => 'TASK_POST_PAYMENT_4', + 'on_task_completion' => '', + 'status' => '' ]; }