diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php index e4fa3666..0fbf2519 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php @@ -13,6 +13,8 @@ use App\Classes\Modules\Bookings\Services\CreatesBooking; use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking; use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; +use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor; + use App\Http\Resources\BookingResource; use ErrorException; @@ -44,19 +46,24 @@ class CreateBookingLogic extends AbstractControllerLogic /** @var FetchesCompany */ private $fetchesCompany; + /** @var BookingToPerfexCRMProcessor */ + private $bookingToPerfexCRMProcessor; + /** * CreateBookingLogic constructor. * @param CanCreateBooking $canCreateBooking * @param CreatesBooking $createsBooking * @param GeneratesBookingMarking $generatesBookingMarking * @param FetchesCompany $fetchesCompany + * @param BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor */ - public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany) + public function __construct(CanCreateBooking $canCreateBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, BookingToPerfexCRMProcessor $bookingToPerfexCRMProcessor) { $this->canCreateBooking = $canCreateBooking; $this->createsBooking = $createsBooking; $this->generatesBookingMarking = $generatesBookingMarking; $this->fetchesCompany = $fetchesCompany; + $this->bookingToPerfexCRMProcessor = $bookingToPerfexCRMProcessor; } @@ -77,7 +84,11 @@ class CreateBookingLogic extends AbstractControllerLogic $booking = $this->createsBooking->execute($company, $object); + if(config('perfexcrm.is_enabled') == 'true'){ + $this->bookingToPerfexCRMProcessor->execute($booking); + } + return $this->resourceResponse(new BookingResource($booking)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Companies/ControllersLogic/CreateIdentificationDocumentLogic.php b/app/Classes/Modules/Companies/ControllersLogic/CreateIdentificationDocumentLogic.php index bbf91ea7..c08dc4ef 100644 --- a/app/Classes/Modules/Companies/ControllersLogic/CreateIdentificationDocumentLogic.php +++ b/app/Classes/Modules/Companies/ControllersLogic/CreateIdentificationDocumentLogic.php @@ -9,6 +9,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Documents\Services\CreatesFiles; +use App\Classes\Modules\PerfexCRM\Processors\NewLeadTaskToPerfexCRMProcessor; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\CompanyType; use App\Classes\ValueObjects\Constants\DocumentType; @@ -42,6 +43,8 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic /** @var UpdatesCompanyStatus */ private $updatesCompanyStatus; + /** @var NewLeadTaskToPerfexCRMProcessor */ + private $newLeadTaskToPerfexCRMProcessor; /** * CreateIdentificationDocumentLogic constructor. @@ -49,13 +52,15 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFile * @param UpdatesCompanyStatus $updatesCompanyStatus + * @param NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor */ - public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus) + public function __construct(FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesCompanyStatus $updatesCompanyStatus, NewLeadTaskToPerfexCRMProcessor $newLeadTaskToPerfexCRMProcessor) { $this->fetchesCompany = $fetchesCompany; $this->createsDocument = $createsDocument; $this->createsFile = $createsFile; $this->updatesCompanyStatus = $updatesCompanyStatus; + $this->newLeadTaskToPerfexCRMProcessor = $newLeadTaskToPerfexCRMProcessor; } /** @@ -78,7 +83,11 @@ class CreateIdentificationDocumentLogic extends AbstractControllerLogic $this->updatesCompanyStatus->execute($company, ApprovalStatus::PENDING_VERIFICATION); + if(config('perfexcrm.is_enabled') == 'true'){ + $this->newLeadTaskToPerfexCRMProcessor->execute($company); + } + return $this->response([]); } -} \ No newline at end of file +} 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..a246d25a 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,27 @@ 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/BookingToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/BookingToPerfexCRMProcessor.php new file mode 100644 index 00000000..5929ea1d --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/BookingToPerfexCRMProcessor.php @@ -0,0 +1,44 @@ +company->reference; + $companyName = $booking->company->name; + $employee = $booking->company->employees()->first(); + $contactEmail = $employee->email; + $contactName = $employee->name; + $bookingMarking = $booking->marking; + + $serviceTypeName = $booking->company->services()->where('id', $booking->service_id)->first()->name; + $projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking; + + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactName, + $contactEmail, + $bookingMarking, + $projectName, + PerfexCRMProjectStatus::NOT_STARTED, + [], + [] + ); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + + return true; + } +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php index 2086276d..767bd894 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php @@ -7,9 +7,11 @@ use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMInvoice; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMInvoicePayment; use App\Classes\Modules\PerfexCRM\Services\ConvertsPerfexCRMLeadToCustomer; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject; +use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMCustomerProject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoiceSingleItemPerfexCRMObject; +use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; use Carbon\Carbon; class CreatePerfexCRMInvoiceProcessor @@ -27,6 +29,9 @@ class CreatePerfexCRMInvoiceProcessor /** @var FetchesPerfexCRMProject */ private $fetchesPerfexCRMProject; + /** @var CreatesPerfexCRMCustomerProject */ + private $createsPerfexCRMCustomerProject; + /** * CreatePerfexCRMInvoiceProcessor constructor. * @param CreatesPerfexCRMInvoice $createsPerfexCRMInvoice @@ -34,12 +39,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,6 +104,12 @@ class CreatePerfexCRMInvoiceProcessor 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']; + } + } //newitems foreach ($purchaseOrder->transactionDetails as $key => $transaction_detail){ diff --git a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php index 9fa2bee4..875dd35f 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,9 @@ 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,16 +178,18 @@ 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..bce779f1 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/NewLeadTaskToPerfexCRMProcessor.php @@ -3,28 +3,32 @@ 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) { + $employee = $company->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/TransactionToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php index c512e6b5..cd7ba6b0 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php @@ -2,40 +2,17 @@ namespace App\Classes\Modules\PerfexCRM\Processors; -use App\Classes\Modules\PerfexCRM\Processors\UpdatePerfexCRMProcessor; -use App\Classes\Modules\PerfexCRM\Processors\InitializePerfexCRMProcessor; -use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\PerfexCRM\DataTransferObjects\InitialPerfexCRMObject; +use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMObject; use App\Classes\ValueObjects\Constants\PerfexCRMTasks; -use App\Models\Transaction; use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\Jobs\InitializePerfexCRM; +use App\Classes\ValueObjects\Constants\TransactionType; +use App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; +use App\Classes\ValueObjects\Constants\PerfexCRMTaskStatus; +use App\Classes\Jobs\UpdatePerfexCRM; +use App\Models\Transaction; class TransactionToPerfexCRMProcessor { - /** @var FetchesCompany */ - private $fetchesCompany; - - /** @var UpdatePerfexCRMProcessor */ - private $updatePerfexCRMProcessor; - - /** @var InitializePerfexCRMProcessor */ - private $initializePerfexCRMProcessor; - - /** - * TransactionToPerfexCRMProcessor constructor. - * @param UpdatePerfexCRMProcessor $updatePerfexCRMProcessor - * @param InitializePerfexCRMProcessor $initializePerfexCRMProcessor - * @param FetchesCompany $fetchesCompany - */ - public function __construct(UpdatePerfexCRMProcessor $updatePerfexCRMProcessor, InitializePerfexCRMProcessor $initializePerfexCRMProcessor, FetchesCompany $fetchesCompany) - { - $this->updatePerfexCRMProcessor = $updatePerfexCRMProcessor; - $this->initializePerfexCRMProcessor = $initializePerfexCRMProcessor; - $this->fetchesCompany = $fetchesCompany; - } - - /** * @param Transaction $model * @param int $status @@ -44,7 +21,8 @@ class TransactionToPerfexCRMProcessor */ public function execute(Transaction $model, int $status) { - if($model->owner instanceof \App\Models\Booking && $status == ApprovalStatus::APPROVED){ + // 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(); @@ -54,64 +32,96 @@ class TransactionToPerfexCRMProcessor $serviceTypeName = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name; $projectName = 'Exchange | '.$serviceTypeName.' | '.$bookingMarking; - $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, - ]; - } - $initialPerfexCRMObject = new InitialPerfexCRMObject( - $companyName, - $companyReference, - $contactName, - $contactEmail, - $bookingMarking, - $projectName, - [], - $tasks - ); + 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, - //$this->initializePerfexCRMProcessor->execute($initialPerfexCRMObject); - InitializePerfexCRM::dispatch($initialPerfexCRMObject); + ]; + } + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactName, + $contactEmail, + $bookingMarking, + $projectName, + PerfexCRMProjectStatus::IN_PROGRESS, + [], + $tasks + ); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + } + } + 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); + } + } + } } + return true; } } diff --git a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php index 0b452d02..24d45506 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php @@ -12,10 +12,13 @@ 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\Services\UpdatesPerfexCRMProject; 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 App\Classes\ValueObjects\Constants\PerfexCRMProjectStatus; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Illuminate\Http\Request; @@ -52,6 +55,11 @@ class UpdatePerfexCRMProcessor /** @var UpdatesPerfexCRMTask */ private $updatesPerfexCRMTask; + /** @var UpdatesPerfexCRMCustomer */ + private $updatesPerfexCRMCustomer; + + /** @var UpdatesPerfexCRMProject */ + private $updatesPerfexCRMProject; /** * @param ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer @@ -64,6 +72,8 @@ class UpdatePerfexCRMProcessor * @param CreatesPerfexCRMCustomer $createsPerfexCRMCustomer * @param CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact * @param UpdatesPerfexCRMTask $updatesPerfexCRMTask + * @param UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer + * @param UpdatesPerfexCRMProject $updatesPerfexCRMProject */ public function __construct(ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer, CreatesPerfexCRMCustomerProject $createsPerfexCRMCustomerProject, @@ -74,7 +84,9 @@ class UpdatePerfexCRMProcessor FetchesPerfexCRMTask $fetchesPerfexCRMTask, CreatesPerfexCRMCustomer $createsPerfexCRMCustomer, CreatesPerfexCRMCustomerContact $createsPerfexCRMCustomerContact, - UpdatesPerfexCRMTask $updatesPerfexCRMTask) + UpdatesPerfexCRMTask $updatesPerfexCRMTask, + UpdatesPerfexCRMCustomer $updatesPerfexCRMCustomer, + UpdatesPerfexCRMProject $updatesPerfexCRMProject) { $this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; $this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject; @@ -86,10 +98,12 @@ class UpdatePerfexCRMProcessor $this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer; $this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact; $this->updatesPerfexCRMTask = $updatesPerfexCRMTask; + $this->updatesPerfexCRMCustomer = $updatesPerfexCRMCustomer; + $this->updatesPerfexCRMProject = $updatesPerfexCRMProject; } /** - * @param PerfexCRMObject $perfexCRMObject + * @param UpdatePerfexCRMObject $updatePerfexCRMObject * @return null|object * @throws \App\Classes\Exceptions\MalformedRequestException */ @@ -97,43 +111,100 @@ class UpdatePerfexCRMProcessor // 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']; + $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); } - // 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; - } + //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 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 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; + //if the project status is anything but PerfexCRMProjectStatus::NOT_STARTED, update the project + if($updatePerfexCRMObject->getProjectStatus() != PerfexCRMProjectStatus::NOT_STARTED) + { + $this->updatesPerfexCRMProject->execute($project, $updatePerfexCRMObject->getProjectStatus()); + } + } - // 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); + $tasks = $updatePerfexCRMObject->getTaskNames(); + if(count($tasks) > 0){ - return null; + //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 + } + } + } + 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_1_DAY_TRANSFER_1 = [ @@ -26,7 +26,7 @@ class PerfexCRMTasks 'milestone' => '', 'reference' => 'TASK_1_DAY_TRANSFER_1', 'on_task_completion' => 'TASK_1_DAY_TRANSFER_2', - 'status' => PerfexCRMStatus::IN_PROGRESS + 'status' => PerfexCRMTaskStatus::IN_PROGRESS ]; public const TASK_1_DAY_TRANSFER_2 = [ 'name' => 'Approve Payment', @@ -119,7 +119,7 @@ class PerfexCRMTasks 'milestone' => '', 'reference' => 'TASK_3_DAY_TRANSFER_1', 'on_task_completion' => 'TASK_3_DAY_TRANSFER_2', - 'status' => PerfexCRMStatus::IN_PROGRESS + 'status' => PerfexCRMTaskStatus::IN_PROGRESS ]; public const TASK_3_DAY_TRANSFER_2 = [ 'name' => 'Approve Payment', @@ -214,7 +214,7 @@ class PerfexCRMTasks 'milestone' => '', 'reference' => 'TASK_1688_PAYMENT_1', 'on_task_completion' => 'TASK_1688_PAYMENT_2', - 'status' => PerfexCRMStatus::IN_PROGRESS + 'status' => PerfexCRMTaskStatus::IN_PROGRESS ]; public const TASK_1688_PAYMENT_2 = [ 'name' => 'Approve Payment', @@ -402,4 +402,54 @@ class PerfexCRMTasks 'status' => '' ]; + + + public const TASK_PURCHASE_ORDER_1 = [ + 'name' => 'Approve Purchase Order', + 'description' => '○ Purpose: To check that the customer submitted a purchase order that complies with our company’s guidelines.
+ ○ Initial Status: In Progress
+ ○ Deadline: Next day
+ ○ Responsible department: Operation
+ ○ 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' => 'TASK_PURCHASE_ORDER_1', + 'on_task_completion' => 'TASK_PURCHASE_ORDER_2', + 'status' => PerfexCRMTaskStatus::IN_PROGRESS + ]; + + public const TASK_PURCHASE_ORDER_2 = [ + 'name' => 'Complete Order bookkeeping', + 'description' => '○ Purpose: To complete the bookkeeping for the booking.
+ ○ Initial Status: Not Started
+ ○ Deadline: Next day
+ ○ Responsible department: Account
+ ○ Next step: None
+ ○ Additional details: ** Any specific requirements or notes for the operation.**
+ ○ Dependencies: Approve Purchase Order and Upload China Bank Slip operation must be completed before this operation can begin.
+ ○ Outcomes: A copy of the documents related to the booking should now all be in the google drive relevant folder.
', + 'milestone' => '', + 'reference' => 'TASK_PURCHASE_ORDER_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 + ]; }