From 97a8e34f3dffc8207a44395ae134f4493e94b39d Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Mon, 13 May 2024 09:58:28 +0800 Subject: [PATCH 01/21] initial commit --- .../Services/ExportCurrencyVendorOrder.php | 44 +++++++++++ .../ExportCustomersToExcelController.php | 7 ++ .../currency_vendor_order_inner.blade.php | 77 +++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 app/Classes/Modules/Exports/Services/ExportCurrencyVendorOrder.php create mode 100644 resources/views/pages/pdfs/currency_vendor_order_inner.blade.php diff --git a/app/Classes/Modules/Exports/Services/ExportCurrencyVendorOrder.php b/app/Classes/Modules/Exports/Services/ExportCurrencyVendorOrder.php new file mode 100644 index 00000000..2d3a79f9 --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportCurrencyVendorOrder.php @@ -0,0 +1,44 @@ +request = $request; + } + + public function view(): View + { + $id = $this->request->route('id'); + + $group = Group::findOrFail($id); + + $supplier = $group->issuerCompany; + + $transferFeeTransactions = $group->transactions()->with([ + 'transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + } + ])->get()->pluck('transactions')->flatten(); + + return view('pages.pdfs.currency_vendor_order_inner', [ + 'transactions' => $group->transactions, + 'transferFeeTransactions' => $transferFeeTransactions, + 'supplier' => $supplier + ]); + } +} diff --git a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php index 0f351c7d..c7354a0d 100644 --- a/app/Http/Controllers/Exports/ExportCustomersToExcelController.php +++ b/app/Http/Controllers/Exports/ExportCustomersToExcelController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Exports; +use App\Classes\Modules\Exports\Services\ExportCurrencyVendorOrder; use App\Classes\Modules\Exports\Services\ExportsCustomers; use App\Classes\Modules\Exports\Services\ExportsTransactions; use App\Classes\Modules\Exports\Services\ExportsBookingTransactions; @@ -36,6 +37,12 @@ class ExportCustomersToExcelController public function export(ExportsCustomers $exportsCustomers, Request $request){ return $exportsCustomers->download('customers.csv', Excel::CSV, ['Content-Type' => 'text/csv']); } + public function exportCurrencyVendorOrder(ExportCurrencyVendorOrder $exportCurrencyVendorOrder, Request $request){ + $exportCurrencyVendorOrder = new ExportCurrencyVendorOrder($request); + $response = $exportCurrencyVendorOrder->download('CurrencyVendorOrder.xls', Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + return $response; + } public function transactions(ExportsTransactions $exportsTransactions, Request $request){ return $exportsTransactions->download('transactions.csv', Excel::CSV, ['Content-Type' => 'text/csv']); diff --git a/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php b/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php new file mode 100644 index 00000000..bd289a94 --- /dev/null +++ b/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php @@ -0,0 +1,77 @@ + + + + + + + + +
{{$supplier->name}}{{\Carbon\Carbon::now('Asia/Singapore')->format('d-m-Y h:s')}}
+
+ + + + + + + + + + @foreach($transactions as $transaction) + + + + + + + + @endforeach + +
ReferenceMarkingRateAmountBank in Details
{{$transaction->owner->owner->marking}}{{$transaction->owner->owner->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}Account Holder Name: {{$transaction->owner->owner->bank->holder_name}}
{{$transaction->owner->owner->bank->bank_name}}: {{$transaction->owner->owner->bank->account_no}} +
Branch: {{$transaction->owner->owner->bank->bank_branch}}@if($transaction->original_currency->short_code === 'USD')
Swift Code: {{$transaction->owner->owner->bank->swift}}@endif
Bank in Amount: {{$transaction->original_currency->short_code}} {{$transaction->original_amount}}
+ + + + + @php + $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); + @endphp + + + + + @php + $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); + @endphp + + + + + @php + $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); + @endphp + + + + + @php + $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); + @endphp + + + + + @php + $service_charge = number_format((float)$transactions->sum('service_charge'), 2, '.', ''); + @endphp + + + + + @php + $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); + @endphp + + + +
Sub total booking amount: {{$transaction->original_currency->short_code}} {{$sub_total_booking_amount}}
Transfer fee: {{$transaction->original_currency->short_code}} {{$transfer_fee}}
Total booking amount: {{$transaction->original_currency->short_code}} {{$total_booking_amount}}
Sub total amount: MYR {{$sub_total_amount}}
Service charge: MYR {{$service_charge}}
Total amount: MYR {{$total_amount}}
From 79178698cbf0baf7cd497401cb5b30968b1edcbf Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Mon, 13 May 2024 09:59:04 +0800 Subject: [PATCH 02/21] refactor: Export Buttons to top row --- .../elements/TransactionGroupComponent.vue | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 680a9550..00f4fb37 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -17,7 +17,24 @@ {{item.issuer_name}} +
+
Export
+ + + + + + + + + +
+
Currency Rate
@@ -79,11 +96,6 @@
- - - From a8a7d0eccd36371dbb638295ed98ba8e67a70d4d Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Mon, 13 May 2024 09:59:29 +0800 Subject: [PATCH 03/21] refactor: export currency vendor order routes --- routes/web.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/routes/web.php b/routes/web.php index 0d14a526..e9cb8051 100644 --- a/routes/web.php +++ b/routes/web.php @@ -536,6 +536,24 @@ Route::get('/group/text/{id}', function($id){ } })->name('group.text'); +route::get('/export/excel/{id}', 'Exports\ExportCustomersToExcelController@exportCurrencyVendorOrder'); +route:: get('/group/excel/{id}',function ($id) { + + echo '

Download Spreadsheet

'; + + $group = \App\Models\Group::where('id', $id)->first(); + + $supplier = $group->issuerCompany; + + $transferFeeTransactions = $group->transactions()->with([ + 'transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + }])->get()->pluck('transactions')->flatten(); + + return view('pages.pdfs.currency_vendor_order', ['transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier]); + +})->name('group.excel'); + Route::get('/wallet/audit', function (Request $request) { $wallets = \App\Models\Wallet::all(); From 1c8d135074036365a23096d1d09ad82ece8347db Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Wed, 15 May 2024 17:38:57 +0800 Subject: [PATCH 04/21] feat: pdf export --- .../elements/TransactionGroupComponent.vue | 20 +++++++++++-- routes/web.php | 28 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 00f4fb37..275fa514 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -19,20 +19,34 @@
Export
- + + + + + + - + -
+ + +
diff --git a/routes/web.php b/routes/web.php index e9cb8051..978a2716 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,5 +1,6 @@ name('group.text'); +route::get('/group/pdf/{id}', function ($id) { + $group = \App\Models\Group::where('id', $id)->first(); + $supplier = $group->issuerCompany; + + $transferFeeTransactions = $group->transactions() + ->with(['transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + }]) + ->get() + ->pluck('transactions') + ->flatten(); + + $html = view('pages.pdfs.currency_vendor_order', [ + 'transactions' => $group->transactions, + 'transferFeeTransactions' => $transferFeeTransactions, + 'supplier' => $supplier + ])->render(); + + $dompdf = new Dompdf(); + $dompdf->loadHtml($html); + $dompdf->setPaper('A4', 'portrait'); + $dompdf->render(); + + return $dompdf->stream("group_pdf_{$id}.pdf"); +})->name('group.pdf'); + route::get('/export/excel/{id}', 'Exports\ExportCustomersToExcelController@exportCurrencyVendorOrder'); route:: get('/group/excel/{id}',function ($id) { From 7fd8d2f1b5e6a5f5174b0d4638d5d6c7fb7f8eda Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 12:25:26 +0800 Subject: [PATCH 05/21] initial commit --- ...plier_deliver_order_groupInvoice.blade.php | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php diff --git a/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php b/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php new file mode 100644 index 00000000..5bc6eedd --- /dev/null +++ b/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.base_pdf') + +
+ + + + +
+ {{ $supplier->name }} +
+
+ + + + + +
+ Delivery Order + + PO#: {{$group->reference}}
+ Ref#: {{$supplier->reference}}
+ Date: {{$group->created_at}} +
+ +
+ + + + + +
+ + Buyer + +
+ + CIEF Worldwide Sdn Bhd (1134596-M) + +
+ No. 72-3, Jalan Jalil 1,
+ The Earth Bukit Jalil,
+ 57000 Kuala Lumpur +
+
+ Tel: 03-8082 1252 +
+
+ +
+ + + + + + + + + + + + + + + + @foreach($transactions as $key => $transaction) + + + + + + + @php + $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); + $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); + $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); + $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); + $service_charge = number_format((float)$transactions->sum('service_charge'), 2, '.', ''); + $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); + @endphp + + + @endforeach + + +
NoMarkingDescriptionCurrency RateUnit Price (RM)Total Amount
(RM)
{{ $key + 1 }}{{$transaction->owner->owner->marking}}Please refer to the appedix reference no: {{$transaction->owner->owner->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}MYR {{$total_amount}}
From b49a44c99bb20440ecaa770bafe0a0374fa92740 Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 12:25:53 +0800 Subject: [PATCH 06/21] feat: invoice export --- .../elements/TransactionGroupComponent.vue | 6 ++-- routes/web.php | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 275fa514..615be555 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -40,12 +40,12 @@ - + - --> +
diff --git a/routes/web.php b/routes/web.php index 978a2716..abcf8429 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,6 +3,7 @@ use App\Classes\Modules\Transactions\ControllersLogic\DownloadMockUpWhiteFormPdfLogic; use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor; use App\Http\Controllers\Accounting\BankStatementController; +use App\Models\Group; use App\Models\Remark; use Carbon\Carbon; use App\Models\User; @@ -564,6 +565,35 @@ route::get('/group/pdf/{id}', function ($id) { return $dompdf->stream("group_pdf_{$id}.pdf"); })->name('group.pdf'); +Route::get('/group/invoice/{id}', function ($id) { + + $group = Group::findOrFail($id); + + $supplier = $group->issuerCompany; + + $transferFeeTransactions = $group->transactions() + ->with(['transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + }]) + ->get() + ->pluck('transactions') + ->flatten(); + + $html = view('pages.pdfs.supplier_deliver_order_groupInvoice', [ + 'group'=> $group, + 'transactions' => $group->transactions, + 'transferFeeTransactions' => $transferFeeTransactions, + 'supplier' => $supplier + ])->render(); + + $dompdf = new Dompdf(); + $dompdf->loadHtml($html); + $dompdf->setPaper('A4', 'portrait'); + $dompdf->render(); + + return $dompdf->stream("invoice_pdf_{$supplier->name}.pdf"); +})->name('group.invoice'); + route::get('/export/excel/{id}', 'Exports\ExportCustomersToExcelController@exportCurrencyVendorOrder'); route:: get('/group/excel/{id}',function ($id) { From 6686bf43ee41baca2a48fd40a4a01d1105d0e7ac Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 19:17:10 +0800 Subject: [PATCH 07/21] feat: realign and changed icons --- .../elements/TransactionGroupComponent.vue | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 615be555..1ff74398 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -17,35 +17,36 @@ {{item.issuer_name}}
-
-
Export
- - - - - - - - - - - - - - - - - - - +
+
Export
+
From f65702d72b0a7f9fbe11f87db364c8da10d4cbc4 Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 19:18:07 +0800 Subject: [PATCH 08/21] refactor: renamed blade.php to supplier_deliver_order_group_invoice --- ...lier_deliver_order_group_invoice.blade.php | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php diff --git a/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php b/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php new file mode 100644 index 00000000..5bc6eedd --- /dev/null +++ b/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php @@ -0,0 +1,85 @@ +@extends('layouts.base_pdf') + +
+ + + + +
+ {{ $supplier->name }} +
+
+ + + + + +
+ Delivery Order + + PO#: {{$group->reference}}
+ Ref#: {{$supplier->reference}}
+ Date: {{$group->created_at}} +
+ +
+ + + + + +
+ + Buyer + +
+ + CIEF Worldwide Sdn Bhd (1134596-M) + +
+ No. 72-3, Jalan Jalil 1,
+ The Earth Bukit Jalil,
+ 57000 Kuala Lumpur +
+
+ Tel: 03-8082 1252 +
+
+ +
+ + + + + + + + + + + + + + + + @foreach($transactions as $key => $transaction) + + + + + + + @php + $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); + $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); + $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); + $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); + $service_charge = number_format((float)$transactions->sum('service_charge'), 2, '.', ''); + $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); + @endphp + + + @endforeach + + +
NoMarkingDescriptionCurrency RateUnit Price (RM)Total Amount
(RM)
{{ $key + 1 }}{{$transaction->owner->owner->marking}}Please refer to the appedix reference no: {{$transaction->owner->owner->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}MYR {{$total_amount}}
From 94680e3cbb6d6244aabbb4cc4af2bba923b68f40 Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 19:19:07 +0800 Subject: [PATCH 09/21] renamed blade.php --- ...plier_deliver_order_groupInvoice.blade.php | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php diff --git a/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php b/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php deleted file mode 100644 index 5bc6eedd..00000000 --- a/resources/views/pages/pdfs/supplier_deliver_order_groupInvoice.blade.php +++ /dev/null @@ -1,85 +0,0 @@ -@extends('layouts.base_pdf') - -
- - - - -
- {{ $supplier->name }} -
-
- - - - - -
- Delivery Order - - PO#: {{$group->reference}}
- Ref#: {{$supplier->reference}}
- Date: {{$group->created_at}} -
- -
- - - - - -
- - Buyer - -
- - CIEF Worldwide Sdn Bhd (1134596-M) - -
- No. 72-3, Jalan Jalil 1,
- The Earth Bukit Jalil,
- 57000 Kuala Lumpur -
-
- Tel: 03-8082 1252 -
-
- -
- - - - - - - - - - - - - - - - @foreach($transactions as $key => $transaction) - - - - - - - @php - $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); - $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); - $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); - $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); - $service_charge = number_format((float)$transactions->sum('service_charge'), 2, '.', ''); - $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); - @endphp - - - @endforeach - - -
NoMarkingDescriptionCurrency RateUnit Price (RM)Total Amount
(RM)
{{ $key + 1 }}{{$transaction->owner->owner->marking}}Please refer to the appedix reference no: {{$transaction->owner->owner->company->reference}}{{$transaction->currency_rate}}{{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}MYR {{$total_amount}}
From 16a6954a76e76dbde3d2a07913172ca1f80ac93f Mon Sep 17 00:00:00 2001 From: Aqqil Azman Date: Thu, 16 May 2024 19:19:55 +0800 Subject: [PATCH 10/21] changed route view for supplier_order_groupInvoice ti ...group_invoice --- routes/web.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/web.php b/routes/web.php index dd784df5..9df839f4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -580,7 +580,7 @@ Route::get('/group/invoice/{id}', function ($id) { ->pluck('transactions') ->flatten(); - $html = view('pages.pdfs.supplier_deliver_order_groupInvoice', [ + $html = view('pages.pdfs.supplier_deliver_order_group_invoice', [ 'group'=> $group, 'transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, From e88cdf75f69e049aaa21d74ef589cdeddbb65196 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sat, 18 May 2024 11:25:40 +0800 Subject: [PATCH 11/21] code review - correct indentation & add tooltip --- resources/assets/vue/app.js | 7 +++ .../bookings/elements/PaymentComponent.vue | 2 +- .../elements/TransactionGroupComponent.vue | 51 +++++++++---------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js index abb7a17e..39e22279 100644 --- a/resources/assets/vue/app.js +++ b/resources/assets/vue/app.js @@ -34,6 +34,13 @@ Vue.use(VueTheMask); Vue.use(filters); Vue.directive('closable', closable); +Vue.directive('tooltip', function(el, binding){ + $(el).tooltip({ + title: binding.value, + placement: binding.arg, + trigger: 'hover' + }) +}) Vue.mixin({ methods: { route: route diff --git a/resources/assets/vue/components/bookings/elements/PaymentComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentComponent.vue index 1db46493..1f9a606f 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentComponent.vue @@ -13,7 +13,7 @@ -
+
diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 1ff74398..24794be1 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -19,37 +19,32 @@
-
Currency Rate
From 56f89113a8a2a62cd0c19687f7e3cab38c30d3a1 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Mon, 20 May 2024 02:34:44 +0800 Subject: [PATCH 12/21] Vue Polling - Sync code from Shipping Portal, Refactor code to use vuex --- .../general/elements/ListPollingComponent.vue | 89 +++--------- .../assets/vue/vuex/modules/jobPolling.js | 134 ++++++++++++++++++ resources/assets/vue/vuex/store.js | 4 +- 3 files changed, 156 insertions(+), 71 deletions(-) create mode 100644 resources/assets/vue/vuex/modules/jobPolling.js diff --git a/resources/assets/vue/components/general/elements/ListPollingComponent.vue b/resources/assets/vue/components/general/elements/ListPollingComponent.vue index fcd3b8b8..ab1ed945 100644 --- a/resources/assets/vue/components/general/elements/ListPollingComponent.vue +++ b/resources/assets/vue/components/general/elements/ListPollingComponent.vue @@ -74,9 +74,6 @@ data(){ return { filters: this.options, - pollingInterval: null, - isPolling: false, - isFetchingResult: false, isLoading: false, } }, @@ -87,13 +84,26 @@ computed: { pendingList () { return this.$store.getters.isInCompleteQueue(this.section); - } + }, + getJob() { + return this.$store.getters.getJob(this.section); + }, + getJobAttemptCount() { + return this.$store.getters.getJobAttemptCount(this.section); + }, }, watch: { pendingList(inComplete){ if(inComplete){ this.fetchList(); } + }, + getJobAttemptCount(newValue, oldValue) { + // console.log('Old value:', JSON.stringify(oldValue)); + // console.log('New value:', JSON.stringify(newValue)); + if(this.getJob){ + this.fetchJobResult(this.getJob.isLastAttempt); + } } }, methods: { @@ -101,7 +111,7 @@ let listDecorators = this.$store.getters.getListDetails(this.section); let url = this.endpoint + '?page=' + listDecorators.page + '&filters=' + JSON.stringify(listDecorators.filters); this.isLoading = true; - this.submitJob(url); + this.$store.dispatch('submitJobRequest', {'url': url, 'name': this.section}); }, //cief todo: remove? // updateFilters(filters){ @@ -125,78 +135,17 @@ to: result.meta.to, total: result.meta.total }; - - this.stopPolling(); this.$store.dispatch('completeList', {'name': this.section, 'data': result.data}); + this.$store.dispatch('stopPollingJobResultByJobId', {'jobId': this.getJob.jobId}); this.$refs.pagination.makePagination(result.meta, result.links); this.isLoading = false; }, errorHandler(error){ - this.isFetchingResult = false; - this.isPolling = false; - }, - startPolling(jobId, maxAttempts = 8) { - let attempts = 0; - let interval = 10000; // Initial interval - - const resetPollingInterval = (customInterval) => { - this.pollingInterval = setInterval(pollJobResult, customInterval); - }; - - const pollJobResult = () => { - if (this.isPolling || this.isFetchingResult) { - return; - } - this.isPolling = true; - - attempts++; - if(attempts === 1){ - this.stopPolling(); - resetPollingInterval(5000); - } - - if (attempts > maxAttempts) { - this.stopPolling(); - this.isLoading = false; - console.log(`Reached maximum attempts (${maxAttempts}). Polling stopped.`); - return; - } - - if(attempts === maxAttempts){ - this.fetchJobResult(jobId, true); - } - else{ - this.fetchJobResult(jobId); - } - }; - - // pollJobResult(); // Initial call - this.pollingInterval = setInterval(pollJobResult, interval); - }, - stopPolling() { - clearInterval(this.pollingInterval); - this.pollingInterval = null; - this.isPolling = false; - this.isFetchingResult = false; - }, - submitJob(url){ - try { - this.$store.dispatch('crudRequest', {endpoint: url, method: 'get'}).then(response => { - let success = response.ok; - response.json().then(response => { - if(!success){return;} - let jobId = response.payload.data.job_id; - if(jobId){ - this.startPolling(jobId); - } - }); - }) - } catch (error) { - console.error('Error submitJob', error); - } + // console.log("Error: " + JSON.stringify(error)); + this.$store.dispatch('updatePollingJobResultByJobId', {'jobId': this.getJob.jobId, 'isPolling': false, 'isFetchingResult': false }); }, fetchJobResult(jobId, isLastAttempt = false) { - this.isFetchingResult = true; + this.$store.dispatch('updatePollingJobResultByJobId', {'jobId': this.getJob.jobId, 'isFetchingResult': true }); try { let anotherEndpoint = route('api.job.fetch', jobId); if(isLastAttempt){ diff --git a/resources/assets/vue/vuex/modules/jobPolling.js b/resources/assets/vue/vuex/modules/jobPolling.js new file mode 100644 index 00000000..1fc03d4c --- /dev/null +++ b/resources/assets/vue/vuex/modules/jobPolling.js @@ -0,0 +1,134 @@ + +const state = { + pollingJobResults: [] +}; + +export default { + state, + getters: { + getJob: (state) => (name) => { + return state.pollingJobResults.find(item => item.name === name);; + }, + getJobAttemptCount: (state) => (name) => { + let job = state.pollingJobResults.find(item => item.name === name); + return job ? job.pollingAttemptsCount : 0; + }, + }, + mutations: { + ADD_POLLING_JOB_RESULT(state, {jobId, name, pollingAttemptsCount, isPolling, isFetchingResult, maxAttempts, pollJobResult, interval}) { + let intervalId = setInterval(() => { + if (pollJobResult) { + pollJobResult(state); + } + }, interval); + state.pollingJobResults.push({ jobId, name, pollingAttemptsCount, isPolling, isFetchingResult, maxAttempts, intervalId}); + }, + UPDATE_POLLING_JOB_RESULT(state, { jobId, pollingAttemptsCount, isPolling, isFetchingResult, isLastAttempt}) { + const index = state.pollingJobResults.findIndex(s => s.jobId === jobId); + if (index !== -1) { + const updatedPollingJobResults = [...state.pollingJobResults]; + updatedPollingJobResults[index] = { ...updatedPollingJobResults[index], + jobId, + pollingAttemptsCount: pollingAttemptsCount !== undefined ? pollingAttemptsCount : updatedPollingJobResults[index].pollingAttemptsCount, + isPolling: isPolling !== undefined ? isPolling : updatedPollingJobResults[index].isPolling, + isFetchingResult: isFetchingResult !== undefined ? isFetchingResult : updatedPollingJobResults[index].isFetchingResult, + isLastAttempt: isLastAttempt !== undefined ? isLastAttempt : updatedPollingJobResults[index].isLastAttempt, + }; + state.pollingJobResults = updatedPollingJobResults; + } + }, + REMOVE_POLLING_JOB_RESULT_BY_JOBID(state, jobId) { + const index = state.pollingJobResults.findIndex(s => s.jobId === jobId); + if (index !== -1) { + clearInterval(state.pollingJobResults[index].intervalId); + state.pollingJobResults.splice(index, 1); + } + }, + // REMOVE_POLLING_JOB_RESULT_BY_JOBID_2(state, jobId) { + // const index = state.pollingJobResults.findIndex(s => s.jobId === jobId); + // if (index !== -1) { + // clearInterval(state.pollingJobResults[index].intervalId); + // //state.pollingJobResults.splice(index, 1); + // } + // }, + REMOVE_POLLING_JOB_RESULT_BY_NAME(state, name) { + const index = state.pollingJobResults.findIndex(s => s.name === name); + if (index !== -1) { + clearInterval(state.pollingJobResults[index].intervalId); + state.pollingJobResults.splice(index, 1); + } + }, + }, + actions: { + submitJobRequest({ dispatch }, { url, name }){ + dispatch('crudRequestV2', { + endpoint: url, + method: 'get', + + }).then(response => { + let success = response.ok; + response.json().then(response => { + if(!success){return;} + let jobId = response.payload.data.job_id; + if(jobId){ + let pollingAttemptsCount = 0; + dispatch('startPolling', { jobId, name, pollingAttemptsCount }); + } + }); + }) + }, + + stopPollingJobResultByJobId({ commit }, { jobId }){ + commit('REMOVE_POLLING_JOB_RESULT_BY_JOBID', jobId); + }, + + stopPollingJobResultByName({ commit }, { name }){ + commit('REMOVE_POLLING_JOB_RESULT_BY_NAME', name); + }, + + startPolling({ state, commit, dispatch }, { jobId, name, pollingAttemptsCount, maxAttempts = 8}) { + let interval = 10000; + + // console.log(`startPolling jobId: ${jobId}, pollingAttemptsCount: ${pollingAttemptsCount}, name: ${name}`); + + const pollJobResult = (state) => { + //console.log(`MONITOR state ${JSON.stringify(state)}`); + const index = state.pollingJobResults.findIndex(s => s.jobId === jobId); + if (index !== -1) { + pollingAttemptsCount = state.pollingJobResults[index].pollingAttemptsCount; + if (state.pollingJobResults[index].isPolling || state.pollingJobResults[index].isFetchingResult) { + return; + } + } + else{ + return; + } + + pollingAttemptsCount++; + if(pollingAttemptsCount === 1){ + commit("REMOVE_POLLING_JOB_RESULT_BY_JOBID", jobId ); + commit("ADD_POLLING_JOB_RESULT", { jobId, name, pollingAttemptsCount, isPolling: false, isFetchingResult: false, maxAttempts, pollJobResult, interval: 5000}); + } + + if (pollingAttemptsCount > maxAttempts) { + //console.log(`Reached maximum attempts (${maxAttempts}). Polling stopped.`); + commit("REMOVE_POLLING_JOB_RESULT_BY_JOBID", jobId ); + return; + } + + if(pollingAttemptsCount === maxAttempts){ + commit('UPDATE_POLLING_JOB_RESULT', { jobId, pollingAttemptsCount, isPolling: true, isFetchingResult: false, isLastAttempt: true }); + } + else{ + commit('UPDATE_POLLING_JOB_RESULT', { jobId, pollingAttemptsCount, isPolling: true, isFetchingResult: false, isLastAttempt: false}); + } + } + commit("ADD_POLLING_JOB_RESULT", { jobId, name, pollingAttemptsCount, isPolling: false, isFetchingResult: false, maxAttempts, pollJobResult, interval}); + + }, + + updatePollingJobResultByJobId({ commit }, { jobId, isPolling, isFetchingResult }){ + commit('UPDATE_POLLING_JOB_RESULT', { jobId, isPolling, isFetchingResult }); + } + } +} diff --git a/resources/assets/vue/vuex/store.js b/resources/assets/vue/vuex/store.js index ff10c673..907e20e4 100644 --- a/resources/assets/vue/vuex/store.js +++ b/resources/assets/vue/vuex/store.js @@ -7,6 +7,7 @@ import crudRequest from './modules/crudRequest' import crudRequestV2 from './modules/crudRequestV2' import authentication from './modules/authentication' import loadRequestQueue from './modules/loadRequestQueue' +import jobPolling from './modules/jobPolling' Vue.use(Vuex); @@ -18,6 +19,7 @@ export default new Vuex.Store({ createNotification, crudRequest, crudRequestV2, - authentication + authentication, + jobPolling } }) From 1550ebb3cbc59161f8ba6fd519896b7180f55084 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Mon, 20 May 2024 03:05:36 +0800 Subject: [PATCH 13/21] Vue Polling - Sync code from Shipping Portal, Refactor code to use vuex --- .../vue/components/general/elements/ListPollingComponent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/vue/components/general/elements/ListPollingComponent.vue b/resources/assets/vue/components/general/elements/ListPollingComponent.vue index ab1ed945..3cb55535 100644 --- a/resources/assets/vue/components/general/elements/ListPollingComponent.vue +++ b/resources/assets/vue/components/general/elements/ListPollingComponent.vue @@ -147,9 +147,9 @@ fetchJobResult(jobId, isLastAttempt = false) { this.$store.dispatch('updatePollingJobResultByJobId', {'jobId': this.getJob.jobId, 'isFetchingResult': true }); try { - let anotherEndpoint = route('api.job.fetch', jobId); + let anotherEndpoint = route('api.job.fetch', this.getJob.jobId); if(isLastAttempt){ - anotherEndpoint = route('api.job.fetch.last.attempt', jobId, isLastAttempt); + anotherEndpoint = route('api.job.fetch.last.attempt', this.getJob.jobId, isLastAttempt); } this.poll(anotherEndpoint, 'get', this.section, false, false); //cief todo: Uncaught (in promise) null } catch (error) { From 3f5c735a43a6274b3dee3ab8be8761ae227a0c5a Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 20 May 2024 11:41:21 +0800 Subject: [PATCH 14/21] update export currency vendor order --- .../elements/TransactionGroupComponent.vue | 19 +++----- .../currency_vendor_order_inner.blade.php | 12 ++--- ...lier_deliver_order_group_invoice.blade.php | 4 +- routes/web.php | 45 +------------------ 4 files changed, 16 insertions(+), 64 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue index 24794be1..2e7c30c5 100644 --- a/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue +++ b/resources/assets/vue/components/bookings/elements/TransactionGroupComponent.vue @@ -21,24 +21,19 @@
Export
diff --git a/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php b/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php index bd289a94..e477c538 100644 --- a/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php +++ b/resources/views/pages/pdfs/currency_vendor_order_inner.blade.php @@ -32,42 +32,42 @@ - + @php $sub_total_booking_amount = number_format((float)$transactions->sum('original_amount'), 2, '.', ''); @endphp - + @php $transfer_fee = number_format((float)$transferFeeTransactions->sum('service_charge'), 2, '.', ''); @endphp - + @php $total_booking_amount = number_format((float) ($transactions->sum('original_amount') + $transfer_fee), 2, '.', ''); @endphp - + @php $sub_total_amount = number_format((float)$transactions->sum('amount') + ($transfer_fee * 1/$transactions[0]->currency_rate), 2, '.', ''); @endphp - + @php $service_charge = number_format((float)$transactions->sum('service_charge'), 2, '.', ''); @endphp - + @php $total_amount = number_format((float)$sub_total_amount + $service_charge, 2, '.', ''); @endphp diff --git a/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php b/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php index 5bc6eedd..bdc56409 100644 --- a/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php +++ b/resources/views/pages/pdfs/supplier_deliver_order_group_invoice.blade.php @@ -12,7 +12,7 @@
Sub total booking amount: Sub total booking amount: {{$transaction->original_currency->short_code}} {{$sub_total_booking_amount}}
Transfer fee: Transfer fee: {{$transaction->original_currency->short_code}} {{$transfer_fee}}
Total booking amount: Total booking amount: {{$transaction->original_currency->short_code}} {{$total_booking_amount}}
Sub total amount: Sub total amount: MYR {{$sub_total_amount}}
Service charge: Service charge: MYR {{$service_charge}}
Total amount: Total amount:
- + @php diff --git a/routes/web.php b/routes/web.php index 9df839f4..6d92fce9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -294,6 +294,7 @@ Route::get('/export/imported-receipt-mapped', 'Exports\ExportCustomersToExcelCon Route::get('/export/analytic/booking', 'Exports\ExportAnalyticToExcelController@bookingData'); Route::get('/export/analytic/bills', 'Exports\ExportAnalyticToExcelController@billingData'); Route::get('/export/customers/leads', 'Exports\ExportCustomersToExcelController@leadsData')->name('leads.export'); +route::get('/export/excel/{id}', 'Exports\ExportCustomersToExcelController@exportCurrencyVendorOrder')->name('group.excel'); Route::get('/products', function (\App\Classes\Modules\Exports\Services\ExportsProducts $exportsProducts) { $bookings = Booking::where(function($query){ @@ -540,32 +541,6 @@ Route::get('/group/text/{id}', function($id){ } })->name('group.text'); -route::get('/group/pdf/{id}', function ($id) { - $group = \App\Models\Group::where('id', $id)->first(); - $supplier = $group->issuerCompany; - - $transferFeeTransactions = $group->transactions() - ->with(['transactions' => function ($transaction) { - return $transaction->where('type', TransactionType::TRANSFER_FEE); - }]) - ->get() - ->pluck('transactions') - ->flatten(); - - $html = view('pages.pdfs.currency_vendor_order', [ - 'transactions' => $group->transactions, - 'transferFeeTransactions' => $transferFeeTransactions, - 'supplier' => $supplier - ])->render(); - - $dompdf = new Dompdf(); - $dompdf->loadHtml($html); - $dompdf->setPaper('A4', 'portrait'); - $dompdf->render(); - - return $dompdf->stream("group_pdf_{$id}.pdf"); -})->name('group.pdf'); - Route::get('/group/invoice/{id}', function ($id) { $group = Group::findOrFail($id); @@ -595,24 +570,6 @@ Route::get('/group/invoice/{id}', function ($id) { return $dompdf->stream("invoice_pdf_{$supplier->name}.pdf"); })->name('group.invoice'); -route::get('/export/excel/{id}', 'Exports\ExportCustomersToExcelController@exportCurrencyVendorOrder'); -route:: get('/group/excel/{id}',function ($id) { - - echo '

Download Spreadsheet

'; - - $group = \App\Models\Group::where('id', $id)->first(); - - $supplier = $group->issuerCompany; - - $transferFeeTransactions = $group->transactions()->with([ - 'transactions' => function ($transaction) { - return $transaction->where('type', TransactionType::TRANSFER_FEE); - }])->get()->pluck('transactions')->flatten(); - - return view('pages.pdfs.currency_vendor_order', ['transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier]); - -})->name('group.excel'); - Route::get('/wallet/audit', function (Request $request) { $wallets = \App\Models\Wallet::all(); From e5cc4481fe96b872a86c80f2efaf04878f3020ab Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 20 May 2024 11:47:29 +0800 Subject: [PATCH 15/21] update RefundConfirmationComponent display text --- .../bookings/elements/RefundConfirmationComponent.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 3470891a..16930a76 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -46,8 +46,8 @@
Paid Amount: {{ paidAmount }}
-
Paid Amount: {{ (Math.round((this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2) }}
-
Refund Amount: {{ refundAmount }}
+
Refunded Amount: {{ (Math.round((this.data.refunded_amount + Number.EPSILON) * 100) / 100).toFixed(2) }}
+
Refund Amount Requested: {{ refundAmount }}
From 5425c37e52c838946d82d54c8dc63d00f09fde6e Mon Sep 17 00:00:00 2001 From: JiaSheng Date: Wed, 22 May 2024 19:28:42 +0800 Subject: [PATCH 16/21] -request multiple refund -show remark for refund in dashboard -show refund remark in export page --- .../bookings/elements/PaymentHistoryComponent.vue | 2 +- .../bookings/elements/RefundVerificationComponent.vue | 8 ++++++++ routes/web.php | 10 ++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index bd7d89ca..caba3fee 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -289,7 +289,7 @@
-
+
diff --git a/resources/assets/vue/components/bookings/elements/RefundVerificationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundVerificationComponent.vue index a1f6c7f4..9f817b7c 100644 --- a/resources/assets/vue/components/bookings/elements/RefundVerificationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundVerificationComponent.vue @@ -25,6 +25,14 @@ {{data.booking.company.reference}}
+
+ + + + + + +
Amount
diff --git a/routes/web.php b/routes/web.php index 6d92fce9..bc0235d7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -475,6 +475,7 @@ Route::get('/approve_refunds', function(Request $request){ echo '
'; echo ''; echo ''; + echo ''; echo ''; foreach ($payments->orderBy('updated_at', 'DESC')->get() as $index => $payment){ $booking = $payment->owner; @@ -499,6 +500,14 @@ Route::get('/approve_refunds', function(Request $request){ $remark = 'Pre ' . $remark; } + $refundTransactions = $payment->transactions()->refunds()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->get(); + + $noteRemark = ''; + + foreach ($refundTransactions as $refund) { + $noteRemark .= implode(', ', $refund->remarks->pluck('content')->toArray()) . ' '; + } + echo ''; echo ''; echo ''; @@ -516,6 +525,7 @@ Route::get('/approve_refunds', function(Request $request){ echo ''; echo ''; echo ''; + echo ''; echo ''; } echo '
- Delivery Order + Invoice PO#: {{$group->reference}}
@@ -66,7 +66,7 @@
{{ $key + 1 }} {{$transaction->owner->owner->marking}}Please refer to the appedix reference no: {{$transaction->owner->owner->company->reference}}Please refer to the appedix reference no: {{$transaction->owner->owner->marking}} {{$transaction->currency_rate}} {{$transaction->currency->short_code}} {{number_format((float)$transaction->amount, 2, '.', '')}}Last Updated AtBank TypeBank Holder NameNote Remark
'.($index + 1).'.'.$payment->updated_at->format('d-M-y').''.$payment->updated_at->diffForHumans().''.$bankType.''.$booking->bank->holder_name.''.$noteRemark.'
'; From 000c4183157ed49a08a44c93a7d4ca5435d53f6a Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 22 May 2024 21:17:11 +0800 Subject: [PATCH 17/21] make refund remarks required --- .../bookings/elements/RefundConfirmationComponent.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 16930a76..845c2b43 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -92,7 +92,9 @@ export default { refundAmount: { maxValue: maxValue(this.refundMaxValue) }, - refundRemark: {} + refundRemark: { + required + } } }, computed: { From 7feb05d784462654a67423ad77d9ead5bc0e09de Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 22 May 2024 22:23:59 +0800 Subject: [PATCH 18/21] make refund remarks required --- .../bookings/elements/RefundConfirmationComponent.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue index 845c2b43..5d27ca3f 100644 --- a/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/RefundConfirmationComponent.vue @@ -67,7 +67,7 @@