From 58ae950a719f0b0dab9a4259a0342e345d33b6fa Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Fri, 8 Sep 2023 14:49:39 +0800 Subject: [PATCH 01/13] bulk download invoices --- .../BulkDownloadCustomerInvoicesLogic.php | 55 +++++++++++++++++++ ...BulkDownloadCustomerInvoicesController.php | 20 +++++++ .../customer_invoices_bulk_download.blade.php | 35 ++++++++++++ routes/web.php | 6 ++ 4 files changed, 116 insertions(+) create mode 100644 app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php create mode 100644 app/Http/Controllers/Companies/BulkDownloadCustomerInvoicesController.php create mode 100644 resources/views/pages/customer_invoices_bulk_download.blade.php diff --git a/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php b/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php new file mode 100644 index 00000000..25821b03 --- /dev/null +++ b/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php @@ -0,0 +1,55 @@ +input('marking'))->first(); + + $startDate = $request->input('startDate'); + $endDate = $request->input('endDate'); + if ($company) { + $invoicebookings = $company->bookings()->whereDate('created_at', '>=', $startDate) + ->whereDate('created_at', '<=', $endDate) + ->whereHas('transactions', function ($query) { + $query->where('transactions.type', TransactionType::INVOICE) + ->whereIn('transactions.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + })->orderBy('created_at')->get(); + + + $zip_file = "invoices_{$startDate}_to_{$endDate}_{$company->reference}.zip"; + + $zip = new ZipArchive(); + if ($zip->open($zip_file, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE)) { + foreach($invoicebookings as $booking) { + $invoice_file = $booking->documents()->where('document_type', DocumentType::INVOICE)->whereNull('deleted_at')->first()->files()->first(); + $zip->addFile(Storage::disk('documents')->path($invoice_file->file->file_info->original->file), 'invoice-' . $booking->created_at->format('d_m_Y') . '_' . $booking->marking . '.pdf'); + } + + $zip->close(); + while (ob_get_level()) { + ob_end_clean(); + } + + return response()->download($zip_file); + } + } + } +} diff --git a/app/Http/Controllers/Companies/BulkDownloadCustomerInvoicesController.php b/app/Http/Controllers/Companies/BulkDownloadCustomerInvoicesController.php new file mode 100644 index 00000000..4d6944d4 --- /dev/null +++ b/app/Http/Controllers/Companies/BulkDownloadCustomerInvoicesController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/resources/views/pages/customer_invoices_bulk_download.blade.php b/resources/views/pages/customer_invoices_bulk_download.blade.php new file mode 100644 index 00000000..faae46a5 --- /dev/null +++ b/resources/views/pages/customer_invoices_bulk_download.blade.php @@ -0,0 +1,35 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+ @csrf +
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index a9e51a50..3a541f2d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -141,6 +141,12 @@ Route::get('/purchase_orders', function () { return view('pages.purchase_orders'); })->name('purchase_orders'); +Route::get('/customers/invoices', function () { + return view('pages.customer_invoices_bulk_download'); +})->name('customers.invoices'); + +Route::post('/customers/invoices', 'Companies\BulkDownloadCustomerInvoicesController@download')->name('customers.invoices'); + Route::get('/support', function () { return view('pages.customer_support', [ 'marking' => null, From be2e00297b1dc379bf0adb105097a0f6f4f0d85f Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Mon, 11 Sep 2023 20:43:21 +0800 Subject: [PATCH 02/13] fix if customer or no invoices found --- .../BulkDownloadCustomerInvoicesLogic.php | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php b/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php index 25821b03..1c9caddb 100644 --- a/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php +++ b/app/Classes/Modules/Companies/ControllersLogic/BulkDownloadCustomerInvoicesLogic.php @@ -34,22 +34,28 @@ class BulkDownloadCustomerInvoicesLogic })->orderBy('created_at')->get(); - $zip_file = "invoices_{$startDate}_to_{$endDate}_{$company->reference}.zip"; - - $zip = new ZipArchive(); - if ($zip->open($zip_file, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE)) { - foreach($invoicebookings as $booking) { - $invoice_file = $booking->documents()->where('document_type', DocumentType::INVOICE)->whereNull('deleted_at')->first()->files()->first(); - $zip->addFile(Storage::disk('documents')->path($invoice_file->file->file_info->original->file), 'invoice-' . $booking->created_at->format('d_m_Y') . '_' . $booking->marking . '.pdf'); - } - - $zip->close(); - while (ob_get_level()) { - ob_end_clean(); - } + if (count($invoicebookings) > 0) { + $zip_file = "invoices_{$startDate}_to_{$endDate}_{$company->reference}.zip"; - return response()->download($zip_file); + $zip = new ZipArchive(); + if ($zip->open($zip_file, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE)) { + foreach($invoicebookings as $booking) { + $invoice_file = $booking->documents()->where('document_type', DocumentType::INVOICE)->whereNull('deleted_at')->first()->files()->first(); + $zip->addFile(Storage::disk('documents')->path($invoice_file->file->file_info->original->file), 'invoice-' . $booking->created_at->format('d_m_Y') . '_' . $booking->marking . '.pdf'); + } + + $zip->close(); + while (ob_get_level()) { + ob_end_clean(); + } + + return response()->download($zip_file); + } + } else { + return response("No invoices found for this customer in the given date range."); } + } else { + return response("Customer not found"); } } } From c87466723b7916bb25dd845dc7ab9adbf8eb013f Mon Sep 17 00:00:00 2001 From: Steve Ng Date: Wed, 27 Sep 2023 23:52:01 +0800 Subject: [PATCH 03/13] fix error in route statements.transactions.details --- .../Filters/HasAccountStatementId.php | 2 +- .../Resources/BankStatementDetailResource.php | 31 +++++++++++++++++++ .../StatementTransactionsDetailsComponent.vue | 3 +- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 app/Http/Resources/BankStatementDetailResource.php diff --git a/app/Classes/General/Eloquent/Filters/HasAccountStatementId.php b/app/Classes/General/Eloquent/Filters/HasAccountStatementId.php index 05cfe9d8..a405be23 100644 --- a/app/Classes/General/Eloquent/Filters/HasAccountStatementId.php +++ b/app/Classes/General/Eloquent/Filters/HasAccountStatementId.php @@ -15,7 +15,7 @@ class HasAccountStatementId implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->whereHas('statementTransaction', function ($query) use ($value) { + return $builder->whereHas('transaction', function ($query) use ($value) { $query->where('account_statement_id', $value); }); } diff --git a/app/Http/Resources/BankStatementDetailResource.php b/app/Http/Resources/BankStatementDetailResource.php new file mode 100644 index 00000000..5087b00b --- /dev/null +++ b/app/Http/Resources/BankStatementDetailResource.php @@ -0,0 +1,31 @@ +transaction; + $accountStatement = $transaction->statement; + return [ + 'id' => $this->id, + 'date' => Carbon::parse($transaction->posting_date)->format('Y-m-d'), + 'transaction_description_1' => $transaction->transaction_description, + 'pay_for' => $transaction->transaction_description_2, + 'system_references' => $this->system, + 'amount' => $transaction->amount, + 'account_statement_date_from' => Carbon::parse($accountStatement->date_from)->format('Y-m-d'), + 'account_statement_date_to' => Carbon::parse($accountStatement->date_to)->format('Y-m-d'), + ]; + } +} diff --git a/resources/assets/vue/components/accounting/sections/StatementTransactionsDetailsComponent.vue b/resources/assets/vue/components/accounting/sections/StatementTransactionsDetailsComponent.vue index 9a5e0058..a0fb4a67 100644 --- a/resources/assets/vue/components/accounting/sections/StatementTransactionsDetailsComponent.vue +++ b/resources/assets/vue/components/accounting/sections/StatementTransactionsDetailsComponent.vue @@ -77,7 +77,8 @@ {{item.id}} {{item.date}} - {{item.transaction_description_1 | truncate(30, '...')}} + {{item.transaction_description_1 | truncate(30, '...')}} + {{item.pay_for}} {{item.system_references}} {{item.amount}} From 4c972e63cfee75197d3be6b1f3c32c3f80d5229c Mon Sep 17 00:00:00 2001 From: edmondlang Date: Thu, 28 Sep 2023 19:20:11 +0800 Subject: [PATCH 04/13] fix invoice number has decimals --- .../Transactions/Services/GeneratesTransactionBillNumber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php b/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php index 943da696..0041d011 100644 --- a/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php +++ b/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php @@ -34,7 +34,7 @@ class GeneratesTransactionBillNumber $attempt = 0; while ($attempt < 10) { // Retry up to 10 times - $billNumber = $prefix . $date->format('Y') . $date->format('m') . '-' . microtime(true); + $billNumber = $prefix . $date->format('Y') . $date->format('m') . '-' . intval(microtime(true)); if (!$this->checksIfTransactionBillNumberExists->execute($billNumber)) { return $billNumber; } From b0caccc0c1e05616d183b6e6fe94b1ca4743d138 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Thu, 28 Sep 2023 20:37:37 +0800 Subject: [PATCH 05/13] update generate booking marking to 6 digits --- .../Modules/Bookings/Services/GeneratesBookingMarking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php b/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php index 3e58e945..72f921a6 100644 --- a/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php +++ b/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php @@ -24,7 +24,7 @@ class GeneratesBookingMarking */ public function execute(): int { - $marking = mt_rand(20000, 99999); + $marking = mt_rand(100000, 999999); return !$this->bookingMarkingExists->execute($marking) ? $marking : self::execute(); } From 95298234304c2f0daddc78e9385a51b32138c814 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Fri, 29 Sep 2023 11:21:36 +0800 Subject: [PATCH 06/13] update generate bill number to random 10 digits --- .../Transactions/Services/GeneratesTransactionBillNumber.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php b/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php index 0041d011..57b68277 100644 --- a/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php +++ b/app/Classes/Modules/Transactions/Services/GeneratesTransactionBillNumber.php @@ -34,7 +34,8 @@ class GeneratesTransactionBillNumber $attempt = 0; while ($attempt < 10) { // Retry up to 10 times - $billNumber = $prefix . $date->format('Y') . $date->format('m') . '-' . intval(microtime(true)); + // $billNumber = $prefix . $date->format('Y') . $date->format('m') . '-' . intval(microtime(true)); + $billNumber = $prefix . $date->format('Y') . $date->format('m') . '-' . mt_rand(1000000000, 9999999999); if (!$this->checksIfTransactionBillNumberExists->execute($billNumber)) { return $billNumber; } From ec83540a4056a0a1303d8632fc69cf6de888d462 Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Sat, 30 Sep 2023 12:48:49 +0800 Subject: [PATCH 07/13] wallet pagination filters --- .../Eloquent/Filters/CreatedAfterOrEqual.php | 4 +- .../Eloquent/Filters/CreatedBeforeOrEqual.php | 4 +- .../General/Eloquent/Filters/OwnerId.php | 3 +- .../General/Eloquent/Filters/OwnerType.php | 3 +- .../General/Eloquent/Filters/StatusIn.php | 3 +- .../Filters/WithBookingMarkingLike.php | 29 +++++++++ .../elements/CustomerTransactionComponent.vue | 65 ++++++++++++++++++- 7 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/WithBookingMarkingLike.php diff --git a/app/Classes/General/Eloquent/Filters/CreatedAfterOrEqual.php b/app/Classes/General/Eloquent/Filters/CreatedAfterOrEqual.php index 7e563aee..9df98f40 100644 --- a/app/Classes/General/Eloquent/Filters/CreatedAfterOrEqual.php +++ b/app/Classes/General/Eloquent/Filters/CreatedAfterOrEqual.php @@ -16,6 +16,8 @@ class CreatedAfterOrEqual implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->where('created_at', '>=', Carbon::parse($value)); + $table = $builder->getModel()->getTable(); + $startDate = Carbon::createFromFormat('d-m-Y', $value)->startOfDay(); + return $builder->where("{$table}.created_at", '>=', $startDate); } } \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/CreatedBeforeOrEqual.php b/app/Classes/General/Eloquent/Filters/CreatedBeforeOrEqual.php index ed97b48f..5b349540 100644 --- a/app/Classes/General/Eloquent/Filters/CreatedBeforeOrEqual.php +++ b/app/Classes/General/Eloquent/Filters/CreatedBeforeOrEqual.php @@ -15,6 +15,8 @@ class CreatedBeforeOrEqual implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->where('created_at', '<=', Carbon::parse($value)); + $table = $builder->getModel()->getTable(); + $endDate = Carbon::createFromFormat('d-m-Y', $value)->endOfDay(); + return $builder->where("{$table}.created_at", '<=', $endDate); } } diff --git a/app/Classes/General/Eloquent/Filters/OwnerId.php b/app/Classes/General/Eloquent/Filters/OwnerId.php index eac7e32d..c2dfa685 100644 --- a/app/Classes/General/Eloquent/Filters/OwnerId.php +++ b/app/Classes/General/Eloquent/Filters/OwnerId.php @@ -14,7 +14,8 @@ class OwnerId implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->where('owner_id', $value); + $table = $builder->getModel()->getTable(); + return $builder->where("{$table}.owner_id", $value); } } \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/OwnerType.php b/app/Classes/General/Eloquent/Filters/OwnerType.php index 6a13fb08..3feedccd 100644 --- a/app/Classes/General/Eloquent/Filters/OwnerType.php +++ b/app/Classes/General/Eloquent/Filters/OwnerType.php @@ -14,7 +14,8 @@ class OwnerType implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->where('owner_type', $value); + $table = $builder->getModel()->getTable(); + return $builder->where("{$table}.owner_type", $value); } } \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/StatusIn.php b/app/Classes/General/Eloquent/Filters/StatusIn.php index cbfdfbd0..85425802 100644 --- a/app/Classes/General/Eloquent/Filters/StatusIn.php +++ b/app/Classes/General/Eloquent/Filters/StatusIn.php @@ -14,7 +14,8 @@ class StatusIn implements Filter */ public static function apply(Builder $builder, $value) { - return $builder->whereIn('status', $value); + $table = $builder->getModel()->getTable(); + return $builder->whereIn("{$table}.status", $value); } } \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithBookingMarkingLike.php b/app/Classes/General/Eloquent/Filters/WithBookingMarkingLike.php new file mode 100644 index 00000000..ed35cc31 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithBookingMarkingLike.php @@ -0,0 +1,29 @@ +join('transactions as t2', 't2.payment_reference', '=', 'transactions.bill_no') + ->join('bookings', function ($join) use ($value) { + $join->on('bookings.id', '=', 't2.owner_id') + ->where('bookings.marking', 'LIKE', '%'.$value.'%'); + }) + ->addSelect(['transactions.*','t2.owner_id as bookingId', 'bookings.marking as bookingMarking']); + } +} \ No newline at end of file diff --git a/resources/assets/vue/components/wallets/elements/CustomerTransactionComponent.vue b/resources/assets/vue/components/wallets/elements/CustomerTransactionComponent.vue index 1250432b..aeb045ce 100644 --- a/resources/assets/vue/components/wallets/elements/CustomerTransactionComponent.vue +++ b/resources/assets/vue/components/wallets/elements/CustomerTransactionComponent.vue @@ -1,6 +1,29 @@