diff --git a/app/Classes/Jobs/UpdatePerfexCRMInvoice.php b/app/Classes/Jobs/UpdatePerfexCRMInvoice.php index 8b806b4f..e7902958 100644 --- a/app/Classes/Jobs/UpdatePerfexCRMInvoice.php +++ b/app/Classes/Jobs/UpdatePerfexCRMInvoice.php @@ -6,9 +6,12 @@ use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMInvoiceProcessor; use App\Classes\Modules\PerfexCRM\Services\CreatesPerfexCRMInvoicePayment; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMCustomer; use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMInvoice; +use App\Classes\Modules\PerfexCRM\Services\FetchesPerfexCRMProject; +use App\Classes\Modules\PerfexCRM\Services\UpdatesPerfexCRMInvoice; use App\Classes\Modules\PerfexCRM\DataTransferObjects\UpdatePerfexCRMInvoiceObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject; use App\Classes\ValueObjects\Constants\PerfexCRMInvoiceStatus; +use App\Models\Transaction; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; @@ -20,12 +23,6 @@ class UpdatePerfexCRMInvoice implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - /** @var FetchesPerfexCRMInvoice */ - private $FetchesPerfexCRMInvoice; - - /** @var FetchesPerfexCRMCustomer */ - private $fetchesPerfexCRMCustomer; - /** @var UpdatePerfexCRMInvoiceObject */ private $updatePerfexCRMInvoiceObject; @@ -50,14 +47,33 @@ class UpdatePerfexCRMInvoice implements ShouldQueue $invoice = (App()->make(FetchesPerfexCRMInvoice::class))->execute($customer->userid,"INV-", $transaction->owner->bill_no); if(is_null($invoice)){ - $result = (App()->make(CreatePerfexCRMInvoiceProcessor::class))->execute($transaction->owner); + $result = (App()->make(CreatePerfexCRMInvoiceProcessor::class))->execute($transaction->owner, $this->updatePerfexCRMInvoiceObject->getIsPaid()); $invoiceId = $result->payload['id']; } else{ $invoiceId = $invoice->id; $invoiceStatus = $invoice->status; + + //This only run when invoice already exist and the invoice does not have a PAID status + if($invoiceStatus != PerfexCRMInvoiceStatus::PAID){ + //get project + $projectId = ""; + if($transaction->owner instanceof Transaction){ + $orderReference = $transaction->owner->owner->owner()->first()->reference; + $packingListReference = $transaction->owner->owner->reference; + $projectName = 'IZYIM | X1 Shipping | '.$orderReference.' | '.$packingListReference; + $project = (App()->make(FetchesPerfexCRMProject::class))->execute($projectName, $customer->userid); + if(!is_null($project)){ + $projectId = $project->id; + } + } + + //update invoice + (App()->make(UpdatesPerfexCRMInvoice::class))->execute($invoice, $projectId); + } } + //create invoice payment if($invoiceId != 0 && $invoiceStatus != PerfexCRMInvoiceStatus::PAID){ $date = Carbon::parse($transaction->created_at)->format('Y-m-d'); diff --git a/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMInvoiceObject.php b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMInvoiceObject.php index a3f4fb0b..d19e6153 100644 --- a/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMInvoiceObject.php +++ b/app/Classes/Modules/PerfexCRM/DataTransferObjects/UpdatePerfexCRMInvoiceObject.php @@ -14,10 +14,14 @@ class UpdatePerfexCRMInvoiceObject implements DataTransferObject /** @var Transaction */ private $transaction; - public function __construct(string $email, Transaction $transaction) + /** @var bool */ + private $isPaid; + + public function __construct(string $email, Transaction $transaction, bool $isPaid) { $this->email = $email; $this->transaction = $transaction; + $this->isPaid = $isPaid; } /** @@ -35,4 +39,12 @@ class UpdatePerfexCRMInvoiceObject implements DataTransferObject { return $this->transaction; } + + /** + * @return bool + */ + public function getIsPaid(): bool + { + return $this->isPaid; + } } diff --git a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php index a780f303..0dbd1f1f 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/CreatePerfexCRMInvoiceProcessor.php @@ -6,9 +6,11 @@ use App\Models\Transaction; 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\DataTransferObjects\InvoicePerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoicePaymentPerfexCRMObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\InvoiceSingleItemPerfexCRMObject; +use App\Models\PackingList; use Carbon\Carbon; class CreatePerfexCRMInvoiceProcessor @@ -23,29 +25,35 @@ class CreatePerfexCRMInvoiceProcessor /** @var ConvertsPerfexCRMLeadToCustomer */ private $convertsPerfexCRMLeadToCustomer; + /** @var FetchesPerfexCRMProject */ + private $fetchesPerfexCRMProject; + /** * CreatePerfexCRMInvoiceProcessor constructor. * @param CreatesPerfexCRMInvoice $createsPerfexCRMInvoice */ public function __construct(CreatesPerfexCRMInvoice $createsPerfexCRMInvoice, CreatesPerfexCRMInvoicePayment $createsPerfexCRMInvoicePayment, - ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer) + ConvertsPerfexCRMLeadToCustomer $convertsPerfexCRMLeadToCustomer, + FetchesPerfexCRMProject $fetchesPerfexCRMProject) { $this->createsPerfexCRMInvoice = $createsPerfexCRMInvoice; $this->createsPerfexCRMInvoicePayment = $createsPerfexCRMInvoicePayment; $this->convertsPerfexCRMLeadToCustomer = $convertsPerfexCRMLeadToCustomer; + $this->fetchesPerfexCRMProject = $fetchesPerfexCRMProject; } /** * @param Transaction $transaction + * @param bool $isPaid, default: false * @return null|object * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Transaction $transaction) { + public function execute(Transaction $transaction, bool $isPaid = false) { $clientId = ""; $number = $transaction->bill_no; $prefix = "INV-"; - + //This will remove the prefix if prefix already exist in the string if (substr($number, 0, strlen($prefix)) == $prefix) { $number = substr($number, strlen($prefix)); @@ -71,7 +79,6 @@ class CreatePerfexCRMInvoiceProcessor $billingStreet = $billingStreet.$addresses->state()->first()->name.','; $billingStreet = $billingStreet.$addresses->country()->first()->name; - $projectId = ""; $allowedPaymentModes = []; $invoiceItems = []; @@ -83,6 +90,20 @@ class CreatePerfexCRMInvoiceProcessor $clientId = $result->payload['client_id']; } + //get project + $projectId = ""; //Project only exist in CRM if the customer already made payment + if($isPaid){ + if($transaction->owner instanceof PackingList){ + $orderReference = $transaction->owner->owner->reference; + $packingListReference = $transaction->owner->reference; + $projectName = 'IZYIM | X1 Shipping | '.$orderReference.' | '.$packingListReference; + $project = (App()->make(FetchesPerfexCRMProject::class))->execute($projectName, $clientId); + if(!is_null($project)){ + $projectId = $project->id; + } + } + } + //newitems foreach ($transaction->transactionDetails as $key => $transaction_detail){ $order = $key + 1; diff --git a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php index 2d074624..4dcbf2a5 100644 --- a/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php +++ b/app/Classes/Modules/PerfexCRM/Processors/TransactionToPerfexCRMProcessor.php @@ -89,6 +89,7 @@ class TransactionToPerfexCRMProcessor $updatePerfexCRMInvoiceOject = new UpdatePerfexCRMInvoiceObject( $contactEmail, $model, + true ); UpdatePerfexCRMInvoice::dispatch($updatePerfexCRMInvoiceOject); } diff --git a/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMInvoice.php b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMInvoice.php new file mode 100644 index 00000000..b7ab4b2a --- /dev/null +++ b/app/Classes/Modules/PerfexCRM/Services/UpdatesPerfexCRMInvoice.php @@ -0,0 +1,67 @@ +The Invoice number field is required.<\/p> + //
The Invoice date field is required.<\/p> + //
The Currency field is required.<\/p> + //
The Items field is required.<\/p> + //
The Allow Payment Mode field is required.<\/p> + //
The Billing Street field is required.<\/p> + //
The Sub Total field is required.<\/p> + //
The Total field is required.<\/p> + + $newInvoiceItems = []; + foreach ($invoice->items as $item) { + $item['itemid'] = $item['id']; + unset($item['id']); + $item['order'] = $item['item_order']; + unset($item['item_order']); + array_push($newInvoiceItems,$item); + } + + $data = [ + 'number' => $invoice->number, + 'date' => $invoice->date, + 'duedate' => $invoice->date, + 'currency' => $invoice->currency, + 'subtotal' => $invoice->subtotal, + 'total' => $invoice->total, + 'billing_street' => $invoice->billing_street, + 'shipping_street' => $invoice->billing_street, + 'project_id' => $projectId, + 'items' => $newInvoiceItems, + 'allowed_payment_modes' => $invoice->allowed_payment_modes, + ]; + + $response = Http::asJson()->withHeaders([ + 'authtoken' => config('perfexcrm.api_key')]) + ->put(config('perfexcrm.base_url').'/api/invoices/'.$invoice->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/Modules/Transactions/Processors/ApproveShippingInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/ApproveShippingInvoiceTransactionProcessor.php index e5b7bad0..852205cb 100644 --- a/app/Classes/Modules/Transactions/Processors/ApproveShippingInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/ApproveShippingInvoiceTransactionProcessor.php @@ -16,7 +16,6 @@ use App\Classes\Modules\Documents\Services\CreatesFiles; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\Modules\PerfexCRM\Processors\CreatePerfexCRMInvoiceProcessor; use App\Classes\Jobs\CreatePerfexCRMInvoice; class ApproveShippingInvoiceTransactionProcessor @@ -31,21 +30,17 @@ class ApproveShippingInvoiceTransactionProcessor /** @var CreatesFiles */ private $createsFiles; - /** @var CreatePerfexCRMInvoiceProcessor */ - private $createPerfexCRMInvoiceProcessor; /** * @param UpdatesTransactionStatus $updatesTransactionStatus * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFiles - * @param CreatePerfexCRMInvoiceProcessor $createPerfexCRMInvoiceProcessor */ - public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, CreatesDocument $createsDocument, CreatesFiles $createsFiles, CreatePerfexCRMInvoiceProcessor $createPerfexCRMInvoiceProcessor) + public function __construct(UpdatesTransactionStatus $updatesTransactionStatus, CreatesDocument $createsDocument, CreatesFiles $createsFiles) { $this->updatesTransactionStatus = $updatesTransactionStatus; $this->createsDocument = $createsDocument; $this->createsFiles = $createsFiles; - $this->createPerfexCRMInvoiceProcessor = $createPerfexCRMInvoiceProcessor; }