diff --git a/app/Classes/Jobs/Commands/V2/FixApprovedPaymentFailedGroupV2CommandJob.php b/app/Classes/Jobs/Commands/V2/FixApprovedPaymentFailedGroupV2CommandJob.php new file mode 100644 index 00000000..2c121c0f --- /dev/null +++ b/app/Classes/Jobs/Commands/V2/FixApprovedPaymentFailedGroupV2CommandJob.php @@ -0,0 +1,70 @@ +outputArray = []; + + $groups = Group::whereNotIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]) + ->whereHas('payment', function ($query) { + $query->whereIn('status', [2, 3]); + })->get(); + + foreach ($groups as $group) { + $transaction = $group->payment; + + $response = Http::withBasicAuth(config('billplz.api_key') . ':', '')->get(config('billplz.base_url') . '/api/v3/bills/' . $transaction->payment_reference); + + dump($transaction->payment_reference); + + if ($response->successful()) { + $data = $response->json(); + if ($data['paid']) { + $status = ApprovalStatus::PENDING_VERIFICATION; + + if ($data['state'] === 'paid') { + $status = ApprovalStatus::APPROVED; + } + + Log::info(Carbon::now() . ' : Fixing ' . $transaction->payment_reference); + (App()->make(CallbackBillplzProcessor::class))->execute($transaction, $status); + } + } else { + Log::info("billplz error"); + } + } + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + + // if ($groups) { + // $this->info(Carbon::now() . ' : Done . ElapsedTime: ' . $elapsedTime); + // } + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + Log::info(Carbon::now() . ': End job - Fix all payment is approved or completed but group failed to be updated. ElapsedTime: ' . $elapsedTime . '.'); + } +} diff --git a/app/Classes/Jobs/Commands/V2/FixBillplzFailedCallbackPaymentV2CommandJob.php b/app/Classes/Jobs/Commands/V2/FixBillplzFailedCallbackPaymentV2CommandJob.php index 77cfd075..eb794f55 100644 --- a/app/Classes/Jobs/Commands/V2/FixBillplzFailedCallbackPaymentV2CommandJob.php +++ b/app/Classes/Jobs/Commands/V2/FixBillplzFailedCallbackPaymentV2CommandJob.php @@ -33,7 +33,6 @@ class FixBillplzFailedCallbackPaymentV2CommandJob implements ShouldQueue // ini_set('memory_limit', '-1'); // $this->outputArray = []; - $start = new Carbon(); $approvalStatusArray = ApprovalStatus::APPROVAL_STATUS_ID; @@ -62,7 +61,7 @@ class FixBillplzFailedCallbackPaymentV2CommandJob implements ShouldQueue (App()->make(CallbackBillplzProcessor::class))->execute($transaction, $status); } }else{ - Log::info("billplz error
"); + Log::info("billplz error"); } $counter++; } diff --git a/app/Classes/Jobs/Commands/V2/FixGroupPaymentProblemV2CommandJob.php b/app/Classes/Jobs/Commands/V2/FixGroupPaymentProblemV2CommandJob.php new file mode 100644 index 00000000..25ba4b36 --- /dev/null +++ b/app/Classes/Jobs/Commands/V2/FixGroupPaymentProblemV2CommandJob.php @@ -0,0 +1,52 @@ +fetchesGroup->execute(['id' => 325]); + $this->info('FixGroupPaymentProblem group: '.json_encode($group)); + if ($group) { + foreach ($group->groupTransactions as $groupTransaction) { + $invoice = $groupTransaction->transaction; + $this->info('FixGroupPaymentProblem group: '.json_encode($invoice)); + $pL = $invoice->owner; + $this->releaseGoodsToCustomerProcessor->execute($pL, $invoice); + } + } + */ + + $order = (App()->make(FetchesOrder::class))->execute(['reference' => '729251424']); + $packingLists = $order->destinationWarehousePackages; + + foreach ($packingLists as $packingList){ + (App()->make(CreateStorageInvoiceDocTransactionFixProcessor::class))->execute($packingList, true); + dd(json_encode($packingList)); + } + + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + Log::info(Carbon::now() . ': End job - Fix Group Payment Problem. ElapsedTime: ' . $elapsedTime . '.'); + } +} diff --git a/app/Classes/Jobs/Commands/V2/FixInvoiceV2CommandJob.php b/app/Classes/Jobs/Commands/V2/FixInvoiceV2CommandJob.php index b2bef3c2..4ea664f1 100644 --- a/app/Classes/Jobs/Commands/V2/FixInvoiceV2CommandJob.php +++ b/app/Classes/Jobs/Commands/V2/FixInvoiceV2CommandJob.php @@ -54,7 +54,14 @@ class FixInvoiceV2CommandJob implements ShouldQueue $invoice->documents()->delete(); - $transaction_invoice_pdf = LaravelMpdf::loadView('pages.pdfs.shipping_invoice', ['invoice_transaction' => $invoice]); + $view = 'pages.pdfs.shipping_invoice'; + $dateToCompare = Carbon::parse(env('SST_START_DATE', '2024-04-01 00:00:00')); + $shippingInvoiceTransactionCreatedDate = Carbon::parse($invoice->created_at); + if ($shippingInvoiceTransactionCreatedDate->isAfter($dateToCompare) && $invoice->tax > 0) { + $view = 'pages.pdfs.shipping_invoice_sst'; + } + + $transaction_invoice_pdf = LaravelMpdf::loadView($view, ['invoice_transaction' => $invoice]); $document_object = new DocumentObject( DocumentType::SHIPPING_INVOICE, diff --git a/app/Classes/Jobs/Commands/V2/FixMissingPackingListV2CommandJob.php b/app/Classes/Jobs/Commands/V2/FixMissingPackingListV2CommandJob.php new file mode 100644 index 00000000..80cb3c3f --- /dev/null +++ b/app/Classes/Jobs/Commands/V2/FixMissingPackingListV2CommandJob.php @@ -0,0 +1,40 @@ +make(FetchPackingListsFromYdPortalProcessor::class))->execute($start, $end); + + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + Log::info(Carbon::now() . ': End job - Fix Missing PackingList. ElapsedTime: ' . $elapsedTime . '.'); + } +} diff --git a/app/Classes/Jobs/Commands/V2/OneTimeTransactionFixBillplzFailedCbV2CommandJob.php b/app/Classes/Jobs/Commands/V2/OneTimeTransactionFixBillplzFailedCbV2CommandJob.php new file mode 100644 index 00000000..92ff26bf --- /dev/null +++ b/app/Classes/Jobs/Commands/V2/OneTimeTransactionFixBillplzFailedCbV2CommandJob.php @@ -0,0 +1,44 @@ +first(); + Log::info(Carbon::now() . ' : One time fix failled callback from billplz for transaction with id 17310 cron started.'); + + if($transaction && $transaction->id == 17310){ + + Log::info(Carbon::now() . ' : 17310.'); + $status = ApprovalStatus::APPROVED; + // $this->callbackBillplzProcessor->execute($transaction, $status); + (App()->make(CallbackBillplzDataPatchProcessor::class))->execute($transaction, $status); + } + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + Log::info(Carbon::now() . ': End job - One time fix failled callback from billplz for transaction with id 17310 cron ended. ElapsedTime: ' . $elapsedTime . '.'); + } +} diff --git a/app/Classes/Jobs/Commands/V2/SendPermitsReminderEmailsV2CommandJob.php b/app/Classes/Jobs/Commands/V2/SendPermitsReminderEmailsV2CommandJob.php index c22a8cc7..50501962 100644 --- a/app/Classes/Jobs/Commands/V2/SendPermitsReminderEmailsV2CommandJob.php +++ b/app/Classes/Jobs/Commands/V2/SendPermitsReminderEmailsV2CommandJob.php @@ -61,7 +61,7 @@ class SendPermitsReminderEmailsV2CommandJob implements ShouldQueue protected function getEmailList(): array { return [ - 'edmond.wuiming2021@gmail.com', + // 'edmond.wuiming2021@gmail.com', 'anithagurl96@gmail.com' ]; } diff --git a/app/Classes/Modules/Billplzs/Processors/CallbackBillplzDataPatchProcessor.php b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzDataPatchProcessor.php new file mode 100644 index 00000000..9843a0d9 --- /dev/null +++ b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzDataPatchProcessor.php @@ -0,0 +1,140 @@ +updatesTransactionStatus = $updatesTransactionStatus; + $this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor; + $this->updateDoFromYDPortalProcessor = $updateDoFromYDPortalProcessor; + $this->updatesWalletBalance = $updatesWalletBalance; + $this->createPaymentTransactionProcessor = $createPaymentTransactionProcessor; + $this->releaseGoodsToCustomerProcessor = $releaseGoodsToCustomerProcessor; + } + + + /** + * @param Request $request + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute($transaction, $status) + { + $invoice = $transaction->owner; + $packingList = $invoice->owner; + + $proceed = $this->checkForGroupPayment($transaction); + if(!$proceed) return false; + + $this->updatesTransactionStatus->execute($transaction, $status); + + Log::info('CallbackBillplzDataPatchProcessor 1'); + + // check if is wallet top up + if ($transaction->owner instanceof Wallet && $status === ApprovalStatus::APPROVED) { + + Log::info('CallbackBillplzDataPatchProcessor 2'); + + $this->updatesWalletBalance->execute($transaction->owner, $transaction->amount); + + $group = Group::where('reference', $transaction->payment_reference)->first(); + + // check if is group payment + if ($group) { + foreach ($group->groupTransactions as $groupTransaction) { + $invoice = $groupTransaction->transaction; + Log::info('CallbackBillplzDataPatchProcessor 3: '.json_encode($invoice)); + + //if($invoice->status !== ApprovalStatus::COMPLETED){ + // $paymentTransaction = $this->createPaymentTransactionProcessor->execute($invoice, PaymentMethodType::WALLET, null, false); + + // if($paymentTransaction && $paymentTransaction->status == ApprovalStatus::APPROVED){ + $pL = $invoice->owner; + $this->releaseGoodsToCustomerProcessor->execute($pL, $invoice, true); + //} + //} + } + + $group->status = $status; + $group->save(); + } + } + + if (!$transaction->owner instanceof Wallet) { + Log::info('CallbackBillplzDataPatchProcessor 3'); + $this->releaseGoodsToCustomerProcessor->execute($packingList, $invoice); + } + + return true; + } + + private function checkForGroupPayment($transaction){ + //This check is targetting group payment that expired and soft deleted + //command:check-storage-invoices must already run for this part of the code to work properly + $group = Group::withTrashed()->where('reference', $transaction->payment_reference)->first(); + if ($group) { + $totalAmountToBePaid = 0; + $actualAmountPaid = $transaction->amount; + + foreach ($group->groupTransactions as $groupTransaction) { + $invoice = $groupTransaction->transaction; + if($invoice->status !== ApprovalStatus::COMPLETED){ + $totalAmountToBePaid += $invoice->amount; + } + } + + if(($totalAmountToBePaid - $actualAmountPaid) < 0.01){ + + } + else{ + Log::channel('storage_invoices')->info('Total amount from current transaction: '.$totalAmountToBePaid); //cief todo: to be removed + Log::channel('storage_invoices')->info('Total amount from paid transaction: '.$transaction->amount); //cief todo: to be removed + return false; + } + } + return true; + } +} diff --git a/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php index 74dfcf23..59829e0d 100644 --- a/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php +++ b/app/Classes/Modules/Billplzs/Processors/CallbackBillplzProcessor.php @@ -37,7 +37,7 @@ class CallbackBillplzProcessor private $releaseGoodsToCustomerProcessor; /** - * CreateUserProcessor constructor. + * CallbackBillplzProcessor constructor. * @param UpdatesTransactionStatus $updatesTransactionStatus * @param UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor * @param UpdateDoFromYDPortalProcessor $updateDoFromYDPortalProcessor diff --git a/app/Classes/Modules/Transactions/Processors/ReleaseGoodsToCustomerProcessor.php b/app/Classes/Modules/Transactions/Processors/ReleaseGoodsToCustomerProcessor.php index 79a426e7..bbf6a000 100644 --- a/app/Classes/Modules/Transactions/Processors/ReleaseGoodsToCustomerProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/ReleaseGoodsToCustomerProcessor.php @@ -45,24 +45,33 @@ class ReleaseGoodsToCustomerProcessor /** * @param $packingList * @param $invoice + * @param $processCompletedInvoices * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute($packingList, $invoice = null) + public function execute($packingList, $invoice = null, $processCompletedInvoices = false) { $result = false; $totalInvoicesAmountPaid = 0.00; $totalInvoicesAmount = 0.00; - $invoiceTransactions = $packingList->transactions()->where('status', [ApprovalStatus::APPROVED])->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get(); + if($processCompletedInvoices){ + //processCompletedInvoices, for manual processing of invoices, e.g. incomplete payment gateway finish with storage invoice + $invoiceTransactions = $packingList->transactions()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get(); + } + else{ + $invoiceTransactions = $packingList->transactions()->where('status', ApprovalStatus::APPROVED)->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get(); + } - //Part 1: Process each single invoice type and get the total of all invoices + //Part 1: Process each single invoice type and get the total of all invoices (STORAGE + SHIPPING) foreach($invoiceTransactions as $invoiceTransaction){ - $totalInvoiceAmountPaid = $invoiceTransaction->transactions->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount'); if ($invoice && $invoice->type == $invoiceTransaction->type) { if(($invoice->amount - $totalInvoiceAmountPaid) < 0.01){ + Log::channel('storage_invoices')->info('ReleaseGoodsToCustomerProcessor updatesTransactionStatus'); $this->updatesTransactionStatus->execute($invoice, ApprovalStatus::COMPLETED); - if($invoice->type == TransactionType::STORAGE_INVOICE){ + //cief todo: remove the following if block + if($invoice->type === TransactionType::STORAGE_INVOICE){ + Log::channel('storage_invoices')->info('ReleaseGoodsToCustomerProcessor createStorageInvoiceDocTransactionProcessor'); $this->createStorageInvoiceDocTransactionProcessor->execute($packingList); } } diff --git a/app/Console/Commands/OneTimeTransactionFixBillplzFailedCallback.php b/app/Console/Commands/OneTimeTransactionFixBillplzFailedCallback.php index 9d4c648d..f3f3c7b7 100644 --- a/app/Console/Commands/OneTimeTransactionFixBillplzFailedCallback.php +++ b/app/Console/Commands/OneTimeTransactionFixBillplzFailedCallback.php @@ -4,6 +4,7 @@ namespace App\Console\Commands; use App\Classes\Modules\Billplzs\Processors\CallbackBillplzProcessor; +use App\Classes\Modules\Billplzs\Processors\CallbackBillplzDataPatchProcessor; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Models\Transaction; use Carbon\Carbon; @@ -32,15 +33,19 @@ class OneTimeTransactionFixBillplzFailedCallback extends Command /** @var CallbackBillplzProcessor */ private $callbackBillplzProcessor; + /** @var CallbackBillplzDataPatchProcessor */ + private $callbackBillplzDataPatchProcessor; + /** * Create a new command instance. * * @return void */ - public function __construct(CallbackBillplzProcessor $callbackBillplzProcessor) + public function __construct(CallbackBillplzProcessor $callbackBillplzProcessor, CallbackBillplzDataPatchProcessor $callbackBillplzDataPatchProcessor) { parent::__construct(); $this->callbackBillplzProcessor = $callbackBillplzProcessor; + $this->callbackBillplzDataPatchProcessor = $callbackBillplzDataPatchProcessor; } /** @@ -55,20 +60,22 @@ class OneTimeTransactionFixBillplzFailedCallback extends Command $this->outputArray = []; $start = new Carbon(); - //Transaction fix with this one time fix command: 15205, 16803 + //Transaction fix with this one time fix command: 15205, 16803, 17310 //This transaction, 16803 has approve payment but not its owner, shipping invoice - $transaction = Transaction::whereIn('id', [16803])->first(); - $this->info(Carbon::now() . ' : One time fix failled callback from billplz for transaction with id 16803 cron started.'); + $transaction = Transaction::whereIn('id', [17310])->first(); + $this->info(Carbon::now() . ' : One time fix failled callback from billplz for transaction with id 17310 cron started.'); - if($transaction && $transaction->id == 16803){ + if($transaction && $transaction->id == 17310){ + $this->info(Carbon::now() . ' : 17310.'); $status = ApprovalStatus::APPROVED; - $this->callbackBillplzProcessor->execute($transaction, $status); + // $this->callbackBillplzProcessor->execute($transaction, $status); + $this->callbackBillplzDataPatchProcessor->execute($transaction, $status); } $end = new Carbon(); $elapsedTime = $start->diff($end)->format('%H:%I:%S'); - $this->info(Carbon::now() . ' : One time fix failled callback from billplz for transaction with id 16803 cron ended. ElapsedTime: ' . $elapsedTime); + $this->info(Carbon::now() . ' : One time fix failled callback from billplz for transaction with id 17310 cron ended. ElapsedTime: ' . $elapsedTime); } } diff --git a/app/Console/Commands/V2/FixApprovedPaymentFailedGroupV2Command.php b/app/Console/Commands/V2/FixApprovedPaymentFailedGroupV2Command.php new file mode 100644 index 00000000..fe5f4973 --- /dev/null +++ b/app/Console/Commands/V2/FixApprovedPaymentFailedGroupV2Command.php @@ -0,0 +1,47 @@ +

Payment Date

-
{{ item.payment_history[item.payment_history.length-1].created_at }}
+
{{ item.payment_history && item.payment_history.length > 0 ? item.payment_history[item.payment_history.length - 1].created_at : '-' }}

Bill Number

-
{{ item.payment_history[item.payment_history.length-1].payment_reference }}
+
{{ item.payment_history && item.payment_history.length > 0 ? item.payment_history[item.payment_history.length - 1].payment_reference : '-' }}