diff --git a/app/Classes/Jobs/FetchOrdersFromYDPortalJob.php b/app/Classes/Jobs/FetchOrdersFromYDPortalJob.php index 1ee59548..ef0276dc 100644 --- a/app/Classes/Jobs/FetchOrdersFromYDPortalJob.php +++ b/app/Classes/Jobs/FetchOrdersFromYDPortalJob.php @@ -13,6 +13,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Log; class FetchOrdersFromYDPortalJob implements ShouldQueue { @@ -29,12 +30,17 @@ class FetchOrdersFromYDPortalJob implements ShouldQueue */ public function handle() { + Log::info('FetchOrdersFromYDPortalJob starts'); + Log::info('FetchPackingListsFromYdPortalProcessor starts'); (App()->make(FetchPackingListsFromYdPortalProcessor::class))->execute(); + Log::info('FetchContainersFromYdPortalProcessor starts'); (App()->make(FetchContainersFromYdPortalProcessor::class))->execute(); + Log::info('FetchContainersUpdatesFromYdPortalProcessor starts'); (App()->make(FetchContainersUpdatesFromYdPortalProcessor::class))->execute(); + Log::info('FetchDeliveryUpdatesFromYdPortalProcessor starts'); (App()->make(FetchDeliveryUpdatesFromYdPortalProcessor::class))->execute(); - -// (App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute(); + Log::info('FetchOrdersFromYDPortalJob ends'); + // (App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute(); } } diff --git a/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php b/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php index 9fd483bc..6584a96a 100644 --- a/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php +++ b/app/Classes/Modules/Exports/Services/ExportsPaymentTransactions.php @@ -31,6 +31,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading return [ 'DocNo', 'DocDate', + 'PaymentDate', 'DebtorCode', 'Ref', 'ShipInfo', @@ -59,12 +60,12 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading { $start_date = $this->request->input('startDate', null); if ($start_date) { - $start_date = Carbon::parse($this->request->input('startDate'))->format('Y-m-d'); + $start_date = Carbon::parse($start_date)->startOfDay(); } $end_date = $this->request->input('endDate', null); if ($end_date) { - $end_date = Carbon::parse($this->request->input('endDate'))->format('Y-m-d'); + $end_date = Carbon::parse($end_date)->endOfDay(); } $query = Transaction::query(); @@ -77,30 +78,31 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading $approvalStatus = ApprovalStatus::APPROVED; } - // $query->where('type', TransactionType::SHIPPING_INVOICE)->whereIn('status', [$approvalStatus]); - $query->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->whereIn('status', [$approvalStatus]); + // Adjusted the query to include both types and status + $query->whereIn('type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE]) + ->where('status', $approvalStatus); - if($start_date && $end_date) { - $query->whereBetween('updated_at', [ - Carbon::parse($start_date)->format('Y-m-d 0:00:00'), - Carbon::parse($end_date)->format('Y-m-d 23:59:59') - ]); - } - elseif($start_date && !$end_date) { - $query->whereHas('transactions', function($transaction) use ($start_date) { - $transaction->where('type', TransactionType::PAYMENT)->where('updated_at', '>=', Carbon::parse($start_date)->format('Y-m-d 0:00:00')); + if ($start_date && $end_date) { + $query->whereHas('transactions', function($transaction) use ($start_date, $end_date) { + $transaction->where('type', TransactionType::PAYMENT) + ->whereBetween('updated_at', [$start_date, $end_date]); }); - - } - elseif(!$start_date && $end_date) { + } elseif ($start_date) { + $query->whereHas('transactions', function($transaction) use ($start_date) { + $transaction->where('type', TransactionType::PAYMENT) + ->where('updated_at', '>=', $start_date); + }); + } elseif ($end_date) { $query->whereHas('transactions', function($transaction) use ($end_date) { - $transaction->where('type', TransactionType::PAYMENT)->where('updated_at', '>=', Carbon::parse($end_date)->format('Y-m-d 0:00:00')); + $transaction->where('type', TransactionType::PAYMENT) + ->where('updated_at', '<=', $end_date); }); } return $query; } + public function map($transaction): array { $container = $transaction->owner->containers()->first(); @@ -142,6 +144,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading $rows[] = [ $firstItem ? '<>' : '', $transaction->created_at->format('m/d/Y H:m'), + $transaction->transactions()->where('type', TransactionType::PAYMENT)->first()->updated_at->format('m/d/Y H:m'), $company->debtor, $order->reference, $order->reference, @@ -166,7 +169,7 @@ class ExportsPaymentTransactions implements FromQuery, WithHeadings, WithHeading return [ '<>', - $transaction->created_at->format('m/d/Y H:m'), + $transaction->transactions()->where('type', TransactionType::PAYMENT)->first()->updated_at->format('m/d/Y H:m'), $company->debtor, $order->reference, $order->reference, diff --git a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryUpdatesFromYdPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryUpdatesFromYdPortalProcessor.php index 84c24561..a023673b 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryUpdatesFromYdPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryUpdatesFromYdPortalProcessor.php @@ -76,6 +76,7 @@ class FetchDeliveryUpdatesFromYdPortalProcessor try { $client = new \GuzzleHttp\Client(['cookies' => true, 'headers' => ['Cookie' => 'utc_offset=480']]); + Log::info('Delivery tracking sTrackingNo: '. $packingList->reference); $request = $client->request('get', 'https://main.universe.com.my/Tracking/User/Paging?sEcho=1&sTrackingNo='.$packingList->reference.'&sOrgId=sti', ['timeout' => 3]); $deliveryTracking = json_decode($request->getBody()->getContents()); foreach (array_reverse($deliveryTracking->aaData) as $trackingRow) { @@ -119,7 +120,7 @@ class FetchDeliveryUpdatesFromYdPortalProcessor } } - + Log::info('FetchDeliveryUpdatesFromYdPortalProcessor ends'); } } diff --git a/app/Classes/Modules/PackingLists/Processors/FetchPackingListsFromYdPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchPackingListsFromYdPortalProcessor.php index 563a2712..d376878d 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchPackingListsFromYdPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchPackingListsFromYdPortalProcessor.php @@ -138,7 +138,13 @@ class FetchPackingListsFromYdPortalProcessor $receiveDate = Carbon::parse(substr(preg_replace("/[^0-9]/", "", $row->expressno), 0, 8)); - $customerno = preg_split('(-|\(|\)|\/)', $row->customerno); + $customerno = $row->customerno; + // Check if $customerno contains '正确唛头YD' and extract the part after it + if (strpos($customerno, '正确唛头YD') !== false) { + $customerno = explode('正确唛头YD', $customerno)[1]; + } + + $customerno = preg_split('/[-()\/]/', $customerno); $orderNumber = $customerno[array_key_last($customerno)]; $allow_contract = true; diff --git a/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php index ad5e79ab..8ceb0100 100644 --- a/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreatePaymentTransactionProcessor.php @@ -114,7 +114,7 @@ class CreatePaymentTransactionProcessor /** @var Wallet $wallet */ $wallet = $company_module->wallets()->first(); - if((float) number_format(($wallet->amount - $amount),2) < 0){ + if((float) number_format(($wallet->amount - $amount),2) < -0.01){ throw new MalformedRequestException('Insufficient wallet balance. Please Top up your wallet.'); } diff --git a/app/Console/Commands/FixApprovedPaymentFailedGroup.php b/app/Console/Commands/FixApprovedPaymentFailedGroup.php new file mode 100644 index 00000000..97dfac24 --- /dev/null +++ b/app/Console/Commands/FixApprovedPaymentFailedGroup.php @@ -0,0 +1,94 @@ +callbackBillplzProcessor = $callbackBillplzProcessor; + } + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + ini_set('memory_limit', '-1'); + + $this->outputArray = []; + $start = new Carbon(); + + $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; + } + + $this->info(Carbon::now() . ' : Fixing ' . $transaction->payment_reference); + $this->callbackBillplzProcessor->execute($transaction, $status); + } + } else { + $this->info("billplz error
"); + } + } + + $end = new Carbon(); + $elapsedTime = $start->diff($end)->format('%H:%I:%S'); + + if ($groups) { + $this->info(Carbon::now() . ' : Done . ElapsedTime: ' . $elapsedTime); + } + } +} diff --git a/app/Console/Commands/FixMissingPackingList.php b/app/Console/Commands/FixMissingPackingList.php new file mode 100644 index 00000000..1953fb57 --- /dev/null +++ b/app/Console/Commands/FixMissingPackingList.php @@ -0,0 +1,54 @@ +make(FetchPackingListsFromYdPortalProcessor::class))->execute($start, $end); + } +} diff --git a/app/Console/Commands/SendPermitsReminderEmails.php b/app/Console/Commands/SendPermitsReminderEmails.php index 1126d7fb..a0d09844 100644 --- a/app/Console/Commands/SendPermitsReminderEmails.php +++ b/app/Console/Commands/SendPermitsReminderEmails.php @@ -76,7 +76,7 @@ class SendPermitsReminderEmails extends Command protected function getEmailList(): array { return [ - 'edmond.wuiming2021@gmail.com', + // 'edmond.wuiming2021@gmail.com', 'anithagurl96@gmail.com' ]; } diff --git a/app/Http/Resources/TransactionWithStorageResource.php b/app/Http/Resources/TransactionWithStorageResource.php index 52f35fdf..4b3a377c 100644 --- a/app/Http/Resources/TransactionWithStorageResource.php +++ b/app/Http/Resources/TransactionWithStorageResource.php @@ -147,7 +147,7 @@ class TransactionWithStorageResource extends JsonResource } private function getReferenceForGroupPayment($groups){ - if(count($groups)){ + if (is_array($groups) && count($groups) > 0) { $firstGroup = $groups[0]; return $firstGroup['reference']; } diff --git a/app/Models/Group.php b/app/Models/Group.php index 276b0aa5..188b0fe5 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -84,4 +84,12 @@ class Group extends Model implements Documentable, Transactionable { return $this->BelongsTo(Currency::class, 'original_currency_id', 'id'); } + + /** + * @return hasOne + */ + public function payment() + { + return $this->hasOne(Transaction::class, 'payment_reference', 'reference'); + } } diff --git a/resources/assets/vue/components/paymentsBilling/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/paymentsBilling/elements/PaymentHistoryComponent.vue index 94f23bc5..e7a08882 100644 --- a/resources/assets/vue/components/paymentsBilling/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/paymentsBilling/elements/PaymentHistoryComponent.vue @@ -92,6 +92,22 @@ +
+
+
Payment Method
+
+ {{ convertPaymentMethodToText(item.payment_method) }} +
+
+
+
Created At
+
{{ item.created_at }}
+
+
+
Updated At
+
{{ item.updated_at }}
+
+