From 63f06709239416170ad8bd2df2cf0e69a812e62c Mon Sep 17 00:00:00 2001 From: Dillon Date: Tue, 3 Jan 2023 15:41:30 +0800 Subject: [PATCH] PerfexCRM Integration --- app/Classes/Jobs/InitializePerfexCRM.php | 33 ++++ app/Classes/Jobs/UpdatePerfexCRM.php | 33 ++++ .../ControllersLogic/CreateCustomerLogic.php | 16 +- .../CustomerContactObject.php | 99 +++++++++++ .../InitialPerfexCRMObject.php | 100 +++++++++++ .../InvoicePaymentPerfexCRMObject.php | 86 ++++++++++ .../InvoicePerfexCRMObject.php | 145 ++++++++++++++++ .../InvoiceSingleItemPerfexCRMObject.php | 86 ++++++++++ .../UpdatePerfexCRMObject.php | 100 +++++++++++ .../CreatePerfexCRMInvoiceProcessor.php | 159 ++++++++++++++++++ .../CreatePerfexCRMLeadProcessor.php | 36 ++++ .../InitializePerfexCRMProcessor.php | 155 +++++++++++++++++ .../TransactionToPerfexCRMProcessor.php | 140 +++++++++++++++ .../Processors/UpdatePerfexCRMProcessor.php | 156 +++++++++++++++++ .../ConvertsPerfexCRMLeadToCustomer.php | 34 ++++ .../Services/CreatesPerfexCRMCustomer.php | 37 ++++ .../CreatesPerfexCRMCustomerContact.php | 44 +++++ .../CreatesPerfexCRMCustomerProject.php | 43 +++++ .../Services/CreatesPerfexCRMInvoice.php | 60 +++++++ .../CreatesPerfexCRMInvoicePayment.php | 43 +++++ .../Services/CreatesPerfexCRMLead.php | 41 +++++ .../Services/CreatesPerfexCRMMilestone.php | 46 +++++ .../Services/CreatesPerfexCRMTask.php | 47 ++++++ .../Services/FetchesPerfexCRMMilestone.php | 35 ++++ .../Services/FetchesPerfexCRMProject.php | 35 ++++ .../Services/FetchesPerfexCRMTask.php | 35 ++++ .../Services/UpdatesPerfexCRMTask.php | 48 ++++++ .../CreateInvoiceTransactionProcessor.php | 11 +- .../Services/UpdatesTransactionStatus.php | 15 +- .../Constants/PerfexCRMMilestones.php | 12 ++ .../ValueObjects/Constants/PerfexCRMTasks.php | 57 +++++++ config/perfexcrm.php | 6 + 32 files changed, 1988 insertions(+), 5 deletions(-) create mode 100644 app/Classes/Jobs/InitializePerfexCRM.php create mode 100644 app/Classes/Jobs/UpdatePerfexCRM.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/CustomerContactObject.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePaymentPerfexCRMObject.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePerfexCRMObject.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoiceSingleItemPerfexCRMObject.php create mode 100644 app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php create mode 100644 app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMLeadProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/ConvertsPerfexCRMLeadToCustomer.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomer.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerContact.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoice.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoicePayment.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMLead.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMMilestone.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMTask.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMProject.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php create mode 100644 app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMTask.php create mode 100644 app/Classes/ValueObjects/Constants/PerfexCRMMilestones.php create mode 100644 app/Classes/ValueObjects/Constants/PerfexCRMTasks.php create mode 100644 config/perfexcrm.php diff --git a/app/Classes/Jobs/InitializePerfexCRM.php b/app/Classes/Jobs/InitializePerfexCRM.php new file mode 100644 index 00000000..ac77f87e --- /dev/null +++ b/app/Classes/Jobs/InitializePerfexCRM.php @@ -0,0 +1,33 @@ +initialPerfexCRMObject = $initialPerfexCRMObject; + } + + public function handle() + { + (App()->make(InitializePerfexCRMProcessor::class))->execute($this->initialPerfexCRMObject); + } +} diff --git a/app/Classes/Jobs/UpdatePerfexCRM.php b/app/Classes/Jobs/UpdatePerfexCRM.php new file mode 100644 index 00000000..cbc686e3 --- /dev/null +++ b/app/Classes/Jobs/UpdatePerfexCRM.php @@ -0,0 +1,33 @@ +updatePerfexCRMObject = $updatePerfexCRMObject; + } + + public function handle() + { + (App()->make(UpdatePerfexCRMProcessor::class))->execute($this->updatePerfexCRMObject); + } +} diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php index 2c732126..101f9cba 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php @@ -12,6 +12,7 @@ use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor; use App\Classes\Modules\Companies\Processors\CreateCompanyProcessor; use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; +use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMLeadProcessor; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\BusinessType; use App\Classes\ValueObjects\Constants\CompanyType; @@ -56,6 +57,9 @@ class CreateCustomerLogic extends AbstractControllerLogic /** @var GenerateEmailVerificationAttemptProcessor */ private $generateEmailVerificationAttemptProcessor; + /** @var CreatePerfexCRMLeadProcessor */ + private $createPerfexCRMLeadProcessor; + /** * CreateCustomerLogic constructor. * @param CreateUserProcessor $createUserProcessor @@ -65,8 +69,10 @@ class CreateCustomerLogic extends AbstractControllerLogic * @param AssignSegmentProcessor $assignSegmentProcessor * @param AuthenticationProcessor $authenticationProcessor * @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor + * @param CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor */ - public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor) + public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor, + CreatePerfexCRMLeadProcessor $createPerfexCRMLeadProcessor) { $this->createUserProcessor = $createUserProcessor; $this->createCompanyProcessor = $createCompanyProcessor; @@ -75,6 +81,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->assignSegmentProcessor = $assignSegmentProcessor; $this->authenticationProcessor = $authenticationProcessor; $this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor; + $this->createPerfexCRMLeadProcessor = $createPerfexCRMLeadProcessor; } /** @@ -101,9 +108,12 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->assignSegmentProcessor->execute($company); - $this->generateEmailVerificationAttemptProcessor->execute($user); + $this->createPerfexCRMLeadProcessor->execute($request); + + //cief TODO: This line is intentionally commented because otherwise frontend cannot load/hit error + //$this->generateEmailVerificationAttemptProcessor->execute($user); return $this->response($this->authenticationProcessor->execute($request)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/CustomerContactObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/CustomerContactObject.php new file mode 100644 index 00000000..3530524d --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/CustomerContactObject.php @@ -0,0 +1,99 @@ +customerId = $customerId; + $this->firstname = $firstname; + $this->lastname = $lastname; + $this->email = $email; + $this->password = $password; + $this->isPrimary = $isPrimary; + $this->sendSetPasswordEmail = $sendSetPasswordEmail; + } + + /** + * @return int + */ + public function getCustomerId(): int + { + return $this->customerId; + } + + /** + * @return string + */ + public function getFirstName(): string + { + return $this->firstname; + } + + /** + * @return string + */ + public function getLastName(): string + { + return $this->lastname; + } + + /** + * @return string + */ + public function getEmail(): string + { + return $this->email; + } + + /** + * @return string + */ + public function getPassword(): string + { + return $this->password; + } + + /** + * @return string + */ + public function getIsPrimary(): string + { + return $this->isPrimary; + } + + /** + * @return string + */ + public function getSendSetPasswordEmail(): string + { + return $this->sendSetPasswordEmail; + } +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php new file mode 100644 index 00000000..00a913a0 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InitialPerfexCRMObject.php @@ -0,0 +1,100 @@ +companyName = $companyName; + $this->companyReference = $companyReference; + $this->contactEmail = $contactEmail; + $this->bookingMarking = $bookingMarking; + $this->projectName = $projectName; + $this->milestoneNames = $milestoneNames; + $this->taskNames = $taskNames; + } + + /** + * @return string + */ + public function getCompanyName(): string + { + return $this->companyName; + } + + /** + * @return string + */ + public function getCompanyReference(): string + { + return $this->companyReference; + } + + /** + * @return string + */ + public function getContactEmail(): string + { + return $this->contactEmail; + } + + /** + * @return string + */ + public function getBookingMarking(): string + { + return $this->bookingMarking; + } + + /** + * @return string + */ + public function getProjectName(): string + { + return $this->projectName; + } + + /** + * @return array + */ + public function getMilestoneNames(): array + { + return $this->milestoneNames; + } + + /** + * @return array + */ + public function getTaskNames(): array + { + return $this->taskNames; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePaymentPerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePaymentPerfexCRMObject.php new file mode 100644 index 00000000..3d34c540 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePaymentPerfexCRMObject.php @@ -0,0 +1,86 @@ +invoiceId = $invoiceId; + $this->amount = $amount; + $this->date = $date; + $this->paymentMode = $paymentMode; + $this->transactionId = $transactionId; + $this->note = $note; + } + + /** + * @return int + */ + public function getInvoiceId(): int + { + return $this->invoiceId; + } + + /** + * @return float + */ + public function getAmount(): float + { + return $this->amount; + } + + /** + * @return string + */ + public function getDate(): string + { + return $this->date; + } + + /** + * @return int + */ + public function getPaymentMode(): int + { + return $this->paymentMode; + } + + /** + * @return string + */ + public function getTransactionId(): string + { + return $this->transactionId; + } + + /** + * @return string + */ + public function getNote(): string + { + return $this->note; + } +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePerfexCRMObject.php new file mode 100644 index 00000000..7e204ff8 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoicePerfexCRMObject.php @@ -0,0 +1,145 @@ +clientId = $clientId; + $this->number = $number; + $this->date = $date; + $this->dueDate = $dueDate; + $this->currency = $currency; + $this->subTotal = $subTotal; + $this->total = $total; + $this->billingStreet = $billingStreet; + $this->projectId = $projectId; + $this->allowedPaymentModes = $allowedPaymentModes; + $this->invoiceItems = $invoiceItems; + } + + /** + * @return int + */ + public function getClientId(): int + { + return $this->clientId; + } + + /** + * @return string + */ + public function getNumber(): string + { + return $this->number; + } + + /** + * @return string + */ + public function getDate(): string + { + return $this->date; + } + + /** + * @return string + */ + public function getDueDate(): string + { + return $this->dueDate; + } + + /** + * @return string + */ + public function getCurrency(): string + { + return $this->currency; + } + + /** + * @return float + */ + public function getSubTotal(): float + { + return $this->subTotal; + } + + /** + * @return float + */ + public function getTotal(): float + { + return $this->total; + } + + /** + * @return string + */ + public function getBillingStreet(): string + { + return $this->billingStreet; + } + + /** + * @return string + */ + public function getProjectId(): string + { + return $this->projectId; + } + + /** + * @return array + */ + public function getAllowedPaymentModes(): array + { + return $this->allowedPaymentModes; + } + + /** + * @return array + */ + public function getInvoiceItems(): array + { + return $this->invoiceItems; + } +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoiceSingleItemPerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoiceSingleItemPerfexCRMObject.php new file mode 100644 index 00000000..4f92895d --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/InvoiceSingleItemPerfexCRMObject.php @@ -0,0 +1,86 @@ +description = $description; + $this->longDescription = $longDescription; + $this->qty = $qty; + $this->rate = $rate; + $this->order = $order; + $this->unit = $unit; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return string + */ + public function getLongDescription(): string + { + return $this->longDescription; + } + + /** + * @return int + */ + public function getQty(): int + { + return $this->qty; + } + + /** + * @return float + */ + public function getRate(): float + { + return $this->rate; + } + + /** + * @return int + */ + public function getOrder(): int + { + return $this->order; + } + + /** + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } +} diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php new file mode 100644 index 00000000..be9328ac --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMObject.php @@ -0,0 +1,100 @@ +companyName = $companyName; + $this->companyReference = $companyReference; + $this->contactEmail = $contactEmail; + $this->bookingMarking = $bookingMarking; + $this->projectName = $projectName; + $this->milestoneName = $milestoneName; + $this->taskName = $taskName; + } + + /** + * @return string + */ + public function getCompanyName(): string + { + return $this->companyName; + } + + /** + * @return string + */ + public function getCompanyReference(): string + { + return $this->companyReference; + } + + /** + * @return string + */ + public function getContactEmail(): string + { + return $this->contactEmail; + } + + /** + * @return string + */ + public function getBookingMarking(): string + { + return $this->bookingMarking; + } + + /** + * @return string + */ + public function getProjectName(): string + { + return $this->projectName; + } + + /** + * @return string + */ + public function getMilestoneName(): string + { + return $this->milestoneName; + } + + /** + * @return string + */ + public function getTaskName(): string + { + return $this->taskName; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php new file mode 100644 index 00000000..5cc3d1b4 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php @@ -0,0 +1,159 @@ +createsPerfexCRMInvoice = $createsPerfexCRMInvoice; + $this->createsPerfexCRMInvoicePayment = $createsPerfexCRMInvoicePayment; + $this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; + } + + /** + * @param $transaction + * @param $purchaseOrder + * @param $supplier + * @return null|object + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute($transaction, $purchaseOrder, $supplier) { + $clientId = ""; + $number = $transaction->bill_no; + $prefix = "INV-"; + if (substr($number, 0, strlen($prefix)) == $prefix) { + $number = substr($number, strlen($prefix)); + } + + $date = Carbon::parse($transaction->booking->created_at)->format('Y-m-d'); + $dueDate = Carbon::parse($transaction->booking->created_at)->format('Y-m-d'); + $currency = 1; //cief TODO: To look into Malaysia and Chinese currency + $subTotal = 0.00; + $total = 0.00; + + $billingStreet = ""; + $addresses = $supplier->addresses()->where('billing', '=', true)->first(); + + $billingStreet = $billingStreet.$addresses->street_one; + $billingStreet = $billingStreet.$addresses->street_two.','; + $billingStreet = $billingStreet.$addresses->district()->first()->name.','; + $billingStreet = $billingStreet.$addresses->postcode; + $billingStreet = $billingStreet.$addresses->state()->first()->name.','; + $billingStreet = $billingStreet.$addresses->country()->first()->name; + + $projectId = ""; + $allowedPaymentModes = []; + $invoiceItems = []; + + $email = $supplier->employees()->first()->email; + $email = 'dillon36@yahoo.com'; //cief TODO: To be updated to user actual email address + $result = $this->convertsPerfexCRMLeadToCustomer->execute($email); + if(isset($result->payload)){ + $clientId = $result->payload['client_id']; + } + + //newitems + foreach ($purchaseOrder->transactionDetails as $key => $transaction_detail){ + $order = $key + 1; + $stockCode = $transaction_detail->product_code; + $description = $transaction_detail->product_name; + $quantity = $transaction_detail->quantity; + $unitPrice = 0.00; + if($transaction->booking()->first()->fix_currency_id !== 1) + $unitPrice = (1/$transaction->currency_rate) * $transaction_detail->price; + else + $unitPrice = $transaction_detail->price; + + //$totalAmount = 0.00; + if($transaction->booking()->first()->fix_currency_id !== 1){ + + //$totalAmount = (float)number_format( (1/$transaction->currency_rate) * $transaction_detail->price, 2,'.','')*$transaction_detail->quantity; + $subTotal += (1/$transaction->currency_rate) * $transaction_detail->price * $transaction_detail->quantity; + } + else + { + //$totalAmount = (float)number_format($transaction_detail->price, 2,'.','')*$transaction_detail->quantity; + $subTotal += $transaction_detail->price * $transaction_detail->quantity; + } + + //string $description, string $longDescription, int $qty, int $rate, int $order, string $unit + $invoiceSingleItem = new InvoiceSingleItemPerfexCRMObject( + $description, + "", + $quantity, + $unitPrice, + $order, + "" + ); + array_push($invoiceItems, $invoiceSingleItem); + } + + if($transaction->booking()->first()->fix_currency_id !== 1){ + $total = ((1/$transaction->currency_rate) * $transaction->amount) + $transaction->service_charge + $transaction->tax; + } + else{ + $total = $transaction->amount + $transaction->service_charge + $transaction->tax; + } + + //cief TODO: To be updated, temporarily hardcoded allow payment modes + array_push($allowedPaymentModes, 1, 2); + + $invoicePerfexCRMObject = new InvoicePerfexCRMObject( + $clientId, + $number, + $date, + $dueDate, + $currency, + $subTotal, + $total, + $billingStreet, + $projectId, + $allowedPaymentModes, + $invoiceItems + ); + + $result = $this->createsPerfexCRMInvoice->execute($invoicePerfexCRMObject); + + //If there is a checking whether an payment to an invoice need to be generated, do it here + if(true && $result->payload['id']){ + $invoicePaymentPerfexCRMObject = new InvoicePaymentPerfexCRMObject( + $result->payload['id'], + $total, + $date, + 1, + "", + "" + ); + $this->createsPerfexCRMInvoicePayment->execute($invoicePaymentPerfexCRMObject); + } + + return true; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMLeadProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMLeadProcessor.php new file mode 100644 index 00000000..b7b96773 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMLeadProcessor.php @@ -0,0 +1,36 @@ +createsPerfexCRMLead = $createsPerfexCRMLead; + } + + /** + * @param Request $request + * @return null|object + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Request $request) { + return $this->createsPerfexCRMLead->execute($request->input('name'), $request->input('email')); + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php new file mode 100644 index 00000000..12b4a6d4 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/InitializePerfexCRMProcessor.php @@ -0,0 +1,155 @@ +convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; + $this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject; + $this->createsPerfexCRMMilestone = $createsPerfexCRMMilestone; + $this->createsPerfexCRMTask = $createsPerfexCRMTask; + $this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject; + $this->fetchesPerfexCRMMilestone = $fetchesPerfexCRMMilestone; + $this->fetchesPerfexCRMTask = $fetchesPerfexCRMTask; + $this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer; + $this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact; + } + + /** + * @param InitialPerfexCRMObject $initialPerfexCRMObject + * @return null|object + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(InitialPerfexCRMObject $initialPerfexCRMObject) { + + // 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($initialPerfexCRMObject->getContactEmail()); + if(isset($result->payload)){ + $crmClientId = $result->payload['client_id']; + } + 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($initialPerfexCRMObject->getCompanyName()); + $crmClientId = $result->payload['clientId']; + + $customerContactObject = new CustomerContactObject( + $crmClientId, + $initialPerfexCRMObject->getCompanyName(), + $initialPerfexCRMObject->getCompanyName(), + $initialPerfexCRMObject->getContactEmail(), + "123456abcabc", + "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($initialPerfexCRMObject->getProjectName(), $crmClientId); + if(isset($result->payload)){ //Here means project creation successful + $projectId = $result->payload['project_id']; + } + else{ + $projectId = $this->fetchesPerfexCRMProject->execute($initialPerfexCRMObject->getProjectName(), $crmClientId)->id; + } + + if(!is_null($result)){ + $tasks = $initialPerfexCRMObject->getTaskNames(); + + //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']; + } + } + + // Get existing or create task + $result = $this->createsPerfexCRMTask->execute($tasks[$count]['name'], $milestoneId, $projectId, $tasks[$count]['reference']); + } + } + return true; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php new file mode 100644 index 00000000..6c55c529 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php @@ -0,0 +1,140 @@ +updatePerfexCRMProcessor = $updatePerfexCRMProcessor; + $this->initializePerfexCRMProcessor = $initializePerfexCRMProcessor; + $this->fetchesCompany = $fetchesCompany; + } + + + /** + * @param Transaction $model + * @param int $status + * @return \Illuminate\Database\Eloquent\Model + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(Transaction $model, int $status) + { + $companyName = "dillon36"; //cief TODO: To be updated by removing this line to user actual company name + if(!is_null($model->owner->company)){ + //For owner_type > App\Models\Booking + $companyReference = $model->owner->company->reference; + } + else{ + //For owner_type > App\Models\Wallet + $companyReference = $model->owner->owner->reference; + $company = $this->fetchesCompany->execute(['id' => $model->owner->owner->id]); + $email = $company->employees()->first()->email; + } + $contactEmail = "dillon36@yahoo.com"; //cief TODO: To be updated to user actual email address + $bookingMarking = $model->owner->marking; + if($model->owner instanceof \App\Models\Booking && $model->payment_reference != null && $status == ApprovalStatus::APPROVED){ + + $initialPerfexCRMObject = new InitialPerfexCRMObject( + $companyName, + $companyReference, + $contactEmail, + $bookingMarking, + $companyReference.'-'.$bookingMarking, + [], + [ + PerfexCRMTasks::TASK_1, + PerfexCRMTasks::TASK_2, + PerfexCRMTasks::TASK_3, + PerfexCRMTasks::TASK_4, + PerfexCRMTasks::TASK_5, + PerfexCRMTasks::TASK_6, + PerfexCRMTasks::TASK_7, + PerfexCRMTasks::TASK_8, + PerfexCRMTasks::TASK_9, + PerfexCRMTasks::TASK_10, + ] + ); + + //$this->initializePerfexCRMProcessor->execute($initialPerfexCRMObject); + InitializePerfexCRM::dispatch($initialPerfexCRMObject); + + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactEmail, + $bookingMarking, + $companyReference.'-'.$bookingMarking, + PerfexCRMTasks::TASK_1['milestone'], + PerfexCRMTasks::TASK_1['name'] + ); + + //Mark task in Perfex CRM as done (5 means completed task) + // $this->updatePerfexCRMProcessor->execute($updatePerfexCRMObject); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + } + else if($model->owner instanceof \App\Models\Booking && $status == ApprovalStatus::APPROVED){ + + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactEmail, + $bookingMarking, + $companyReference.'-'.$bookingMarking, + PerfexCRMTasks::TASK_3['milestone'], + PerfexCRMTasks::TASK_3['name'] + ); + + //Mark task in Perfex CRM as done (5 means completed task) + // $this->updatePerfexCRMProcessor->execute($updatePerfexCRMObject); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + } + else if($model->owner instanceof \App\Models\Booking && $status == ApprovalStatus::PENDING_VERIFICATION){ + + $updatePerfexCRMObject = new UpdatePerfexCRMObject( + $companyName, + $companyReference, + $contactEmail, + $bookingMarking, + $companyReference.'-'.$bookingMarking, + PerfexCRMTasks::TASK_2['milestone'], + PerfexCRMTasks::TASK_2['name'] + ); + + //Mark task in Perfex CRM as done (5 means completed task) + //$this->updatePerfexCRMProcessor->execute($updatePerfexCRMObject); + UpdatePerfexCRM::dispatch($updatePerfexCRMObject); + } + return true; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php new file mode 100644 index 00000000..031fdb4f --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Processors/UpdatePerfexCRMProcessor.php @@ -0,0 +1,156 @@ +convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; + $this->createsPerfexCRMCustomerProject = $createsPerfexCRMCustomerProject; + $this->createsPerfexCRMMilestone = $createsPerfexCRMMilestone; + $this->createsPerfexCRMTask = $createsPerfexCRMTask; + $this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject; + $this->fetchesPerfexCRMMilestone = $fetchesPerfexCRMMilestone; + $this->fetchesPerfexCRMTask = $fetchesPerfexCRMTask; + $this->createsPerfexCRMCustomer = $createsPerfexCRMCustomer; + $this->createsPerfexCRMCustomerContact = $createsPerfexCRMCustomerContact; + $this->updatesPerfexCRMTask = $updatesPerfexCRMTask; + } + + /** + * @param PerfexCRMObject $perfexCRMObject + * @return null|object + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + 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']; + } + 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($updatePerfexCRMObject->getCompanyName()); + $crmClientId = $result->payload['clientId']; + + $customerContactObject = new CustomerContactObject( + $crmClientId, + $updatePerfexCRMObject->getCompanyName(), + $updatePerfexCRMObject->getCompanyName(), + $updatePerfexCRMObject->getContactEmail(), + "123456abcabc", + "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; + } + + // 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; + } + + //cief TODO: To update task status dynamically, now is hardcoded 5 (5 means completed task) + $this->updatesPerfexCRMTask->execute($taskId, $updatePerfexCRMObject->getTaskName(), $milestoneId, $projectId, 5); + + return null; + } + +} diff --git a/app/Classes/Modules/PerfexCRM/Services/ConvertsPerfexCRMLeadToCustomer.php b/app/Classes/Modules/PerfexCRM/Services/ConvertsPerfexCRMLeadToCustomer.php new file mode 100644 index 00000000..e6e7323e --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/ConvertsPerfexCRMLeadToCustomer.php @@ -0,0 +1,34 @@ + config('perfexcrm.api_key'),]) + ->get(config('perfexcrm.base_url').'/api/leads/convertocustomer/'.$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/PerfexCRM/Services/CreatesPerfexCRMCustomer.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomer.php new file mode 100644 index 00000000..e5a19ce3 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomer.php @@ -0,0 +1,37 @@ + $companyName + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/customers',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerContact.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerContact.php new file mode 100644 index 00000000..600b928e --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerContact.php @@ -0,0 +1,44 @@ + $customerContactObject->getCustomerId(), + 'firstname' => $customerContactObject->getFirstName(), + 'lastname' => $customerContactObject->getLastName(), + 'email' => $customerContactObject->getEmail(), //$email + 'password' => $customerContactObject->getPassword(), + 'is_primary' => $customerContactObject->getIsPrimary(), + 'send_set_password_email' => $customerContactObject->getSendSetPasswordEmail(), + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/contacts',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php new file mode 100644 index 00000000..e719ccef --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMCustomerProject.php @@ -0,0 +1,43 @@ + $projectName, + 'rel_type' => 'customer', + 'billing_type' => 1, + 'clientid' => $clientId, + 'start_date' => date('Y-m-d'), + 'status' => 1 + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/projects',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoice.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoice.php new file mode 100644 index 00000000..196e3130 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoice.php @@ -0,0 +1,60 @@ + $invoicePerfexCRMObject->getClientId(), + 'number' => $invoicePerfexCRMObject->getNumber(), + 'date' => $invoicePerfexCRMObject->getDate(), + 'duedate' => $invoicePerfexCRMObject->getDueDate(), + 'currency' => $invoicePerfexCRMObject->getCurrency(), + 'subtotal' => $invoicePerfexCRMObject->getSubTotal(), + 'total' => $invoicePerfexCRMObject->getTotal(), + 'billing_street' => $invoicePerfexCRMObject->getBillingStreet(), + 'project_id' => $invoicePerfexCRMObject->getProjectId(), + 'allowed_payment_modes[0]' => 1, + 'allowed_payment_modes[1]' => 2, + ]; + + for($count=0; $count < count($invoicePerfexCRMObject->getInvoiceItems()); $count++) { + $oneItem = [ + "newitems[".$count."][description]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->description, + "newitems[".$count."][long_description]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->longDescription, + "newitems[".$count."][qty]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->qty, + "newitems[".$count."][rate]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->rate, + "newitems[".$count."][order]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->order, + "newitems[".$count."][unit]" => $invoicePerfexCRMObject->getInvoiceItems()[$count]->unit, + ]; + $data = array_merge($data, $oneItem); + } + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/invoices',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoicePayment.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoicePayment.php new file mode 100644 index 00000000..035cc1b8 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMInvoicePayment.php @@ -0,0 +1,43 @@ + $invoicePaymentPerfexCRMObject->getInvoiceId(), + 'amount' => $invoicePaymentPerfexCRMObject->getAmount(), + 'date' => $invoicePaymentPerfexCRMObject->getDate(), + 'paymentmode' => $invoicePaymentPerfexCRMObject->getPaymentMode(), + 'transactionid' => $invoicePaymentPerfexCRMObject->getTransactionId(), + 'note' => $invoicePaymentPerfexCRMObject->getNote(), + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/invoices/recordpayment',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMLead.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMLead.php new file mode 100644 index 00000000..07db48a8 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMLead.php @@ -0,0 +1,41 @@ + $name, + 'email' => $email, + 'source' => 3, + 'status' => 2 + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/leads/byemail',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMMilestone.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMMilestone.php new file mode 100644 index 00000000..80cb49bf --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMMilestone.php @@ -0,0 +1,46 @@ + $milestoneName, + 'project_id' => $projectId, + 'due_date' => date('Y-m-d'), + 'start_date' => date('Y-m-d') + ]; + + if($milestoneOrder != ""){ + $data['milestone_order'] = $milestoneOrder; + } + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/milestones',$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/Modules/PerfexCRM/Services/CreatesPerfexCRMTask.php b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMTask.php new file mode 100644 index 00000000..7e340c26 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/CreatesPerfexCRMTask.php @@ -0,0 +1,47 @@ + $taskName, + 'milestone' => $milestoneId, + 'startdate' => date('Y-m-d'), + 'rel_type' => 'project', + 'rel_id' => $projectId, + 'status' => $status, + 'is_system_created' => 1, + 'reference' => $reference + ]; + + $response = Http::asForm()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->post(config('perfexcrm.base_url').'/api/tasks',$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/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php new file mode 100644 index 00000000..8a5ba559 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMMilestone.php @@ -0,0 +1,35 @@ + config('perfexcrm.api_key'),]) + ->get(config('perfexcrm.base_url').'/api/milestones/bynameandprojectid/'.rawurlencode($milestoneName).'/'.$projectId); + + 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/PerfexCRM/Services/FetchesPerfexCRMProject.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMProject.php new file mode 100644 index 00000000..41115be8 --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMProject.php @@ -0,0 +1,35 @@ + config('perfexcrm.api_key'),]) + ->get(config('perfexcrm.base_url').'/api/projects/bynameandclientid/'.$projectName.'/'.$clientId); + + 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/PerfexCRM/Services/FetchesPerfexCRMTask.php b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php new file mode 100644 index 00000000..97707acb --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/FetchesPerfexCRMTask.php @@ -0,0 +1,35 @@ + config('perfexcrm.api_key'),]) + ->get(config('perfexcrm.base_url').'/api/tasks/bynameandmilestoneid/'.rawurlencode($taskName).'/'.$milestoneId); + + 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/PerfexCRM/Services/UpdatesPerfexCRMTask.php b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMTask.php new file mode 100644 index 00000000..928f9c5a --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMTask.php @@ -0,0 +1,48 @@ + $taskName, + 'milestone' => $milestoneId, + 'startdate' => date('Y-m-d'), + 'duedate' => date('Y-m-d'), + 'rel_type' => 'project', + 'rel_id' => $projectId, + 'status' => $status, + 'repeat_every' => '', + ]; + + $response = Http::asJson()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->put(config('perfexcrm.base_url').'/api/tasks/'.$taskId, $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/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php index 6da2f352..0129ab32 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php @@ -13,6 +13,7 @@ use App\Classes\Modules\Bookings\Services\CalculatesBookingCurrencyAverageRate; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Bookings\Services\UpdatesBookingStatus; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMInvoiceProcessor; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\SegmentConstants; use App\Classes\ValueObjects\Constants\TransactionType; @@ -55,6 +56,9 @@ class CreateInvoiceTransactionProcessor /** @var CreateInvoiceDocumentProcessor */ private $invoiceDocumentProcessor; + /** @var CreatePerfexCRMInvoiceProcessor */ + private $createPerfexCRMInvoiceProcessor; + /** * CreateInvoiceTransactionProcessor constructor. * @param ListsTransactions $listsTransactions @@ -68,8 +72,9 @@ class CreateInvoiceTransactionProcessor * @param FetchesCompany $fetchesCompany * @param UpdatesBookingStatus $updatesBookingStatus * @param CreateInvoiceDocumentProcessor $invoiceDocumentProcessor + * @param CreatePerfexCRMInvoiceProcessor $createPerfexCRMInvoiceProcessor */ - public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingTransferredAmount $calculatesBookingTransferredAmount, FetchesServiceConfigurations $fetchesServiceConfigurations, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, UpdatesBookingStatus $updatesBookingStatus, CreateInvoiceDocumentProcessor $invoiceDocumentProcessor) + public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingTransferredAmount $calculatesBookingTransferredAmount, FetchesServiceConfigurations $fetchesServiceConfigurations, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, UpdatesBookingStatus $updatesBookingStatus, CreateInvoiceDocumentProcessor $invoiceDocumentProcessor, CreatePerfexCRMInvoiceProcessor $createPerfexCRMInvoiceProcessor) { $this->listsTransactions = $listsTransactions; $this->createsTransaction = $createsTransaction; @@ -82,6 +87,7 @@ class CreateInvoiceTransactionProcessor $this->fetchesCompany = $fetchesCompany; $this->updatesBookingStatus = $updatesBookingStatus; $this->invoiceDocumentProcessor = $invoiceDocumentProcessor; + $this->createPerfexCRMInvoiceProcessor = $createPerfexCRMInvoiceProcessor; } @@ -198,6 +204,9 @@ class CreateInvoiceTransactionProcessor // supply deliver order $this->invoiceDocumentProcessor->execute($supplier_deliver_order_transaction, $purchaseOrder, $supplier, DocumentType::SUPPLIER_DELIVER_ORDER); + // update perfex crm + $this->createPerfexCRMInvoiceProcessor->execute($invoice_transaction, $purchaseOrder, $supplier); + $this->updatesBookingStatus->execute($booking, ApprovalStatus::COMPLETED); } } diff --git a/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php b/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php index ec0bb673..82329cf4 100644 --- a/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php +++ b/app/Classes/Modules/Transactions/Services/UpdatesTransactionStatus.php @@ -4,9 +4,21 @@ namespace App\Classes\Modules\Transactions\Services; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Models\Transaction; +use App\Classes\Modules\PerfexCRM\Processors\TransactionToPerfexCRMProcessor; class UpdatesTransactionStatus extends AbstractUpdateRecord { + /** @var TransactionToPerfexCRMProcessor */ + private $transactionToPerfexCRMProcessor; + + /** + * UpdatesTransactionStatus constructor. + * @param TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor + */ + public function __construct(TransactionToPerfexCRMProcessor $transactionToPerfexCRMProcessor) + { + $this->transactionToPerfexCRMProcessor = $transactionToPerfexCRMProcessor; + } /** * @param Transaction $model @@ -16,8 +28,9 @@ class UpdatesTransactionStatus extends AbstractUpdateRecord */ public function execute(Transaction $model, int $status) { + $this->transactionToPerfexCRMProcessor->execute($model, $status); $model->status = $status; return $this->handler($model); } -} \ No newline at end of file +} diff --git a/app/Classes/ValueObjects/Constants/PerfexCRMMilestones.php b/app/Classes/ValueObjects/Constants/PerfexCRMMilestones.php new file mode 100644 index 00000000..70b5fee3 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/PerfexCRMMilestones.php @@ -0,0 +1,12 @@ + 'TASK A', + 'milestone' => 'MILESTONE 1 - Customer Paid', + 'reference' => '' + ]; + 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', + 'milestone' => '', + 'reference' => 'THIS_IS_TASK_NUMBER_6' + ]; + public const TASK_7 = [ + 'name' => 'TASK G', + 'milestone' => '', + 'reference' => 'THIS_IS_TASK_NUMBER_7' + ]; + public const TASK_8 = [ + 'name' => 'TASK H', + 'milestone' => '', + 'reference' => 'THIS_IS_TASK_NUMBER_8' + ]; + public const TASK_9 = [ + 'name' => 'TASK I', + 'milestone' => '', + 'reference' => 'THIS_IS_TASK_NUMBER_9' + ]; + public const TASK_10 = [ + 'name' => 'TASK J', + 'milestone' => '', + 'reference' => 'THIS_IS_TASK_NUMBER_10' + ]; +} diff --git a/config/perfexcrm.php b/config/perfexcrm.php new file mode 100644 index 00000000..aa3f00de --- /dev/null +++ b/config/perfexcrm.php @@ -0,0 +1,6 @@ + env('PERFEXCRM_BASE_URL', 'http://192.168.1.102:8084'), //cief todo: Update crm api domain here + 'api_key' => env('PERFEXCRM_API_KEY', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiZGlsbG9uIiwibmFtZSI6ImRldmVsb3BtZW50IiwiQVBJX1RJTUUiOjE2NzAwNjM0OTB9.ClR07m_QvvOHe4-hsTFAyXLvLCkXcym3cQpq0V8PHLo'), +];