From 04af87f6400823770ba9121e189ea8ab74125575 Mon Sep 17 00:00:00 2001 From: Steve Ng Date: Wed, 18 Oct 2023 08:48:30 +0800 Subject: [PATCH 1/2] csv download aging report --- .../Eloquent/Filters/WithAgingColumn.php | 30 +++++++ .../Exports/Services/ExportsAgingList.php | 82 +++++++++++++++++++ .../Exports/ExportArrivedParcelController.php | 8 ++ routes/web.php | 1 + 4 files changed, 121 insertions(+) create mode 100644 app/Classes/General/Eloquent/Filters/WithAgingColumn.php create mode 100644 app/Classes/Modules/Exports/Services/ExportsAgingList.php diff --git a/app/Classes/General/Eloquent/Filters/WithAgingColumn.php b/app/Classes/General/Eloquent/Filters/WithAgingColumn.php new file mode 100644 index 00000000..e3908ebc --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithAgingColumn.php @@ -0,0 +1,30 @@ +select('packing_lists.*') + ->addSelect(DB::raw("DATEDIFF('$today', transactions.updated_at) as days_over_duedate")) + ->addSelect(DB::raw("CASE + WHEN DATEDIFF('$today', transactions.updated_at) <= 0 THEN 0 + WHEN DATEDIFF('$today', transactions.updated_at) > 0 AND DATEDIFF('$today', transactions.updated_at) <= 30 THEN 1 + WHEN DATEDIFF('$today', transactions.updated_at) > 30 AND DATEDIFF('$today', transactions.updated_at) <= 60 THEN 2 + WHEN DATEDIFF('$today', transactions.updated_at) > 60 AND DATEDIFF('$today', transactions.updated_at) <= 90 THEN 3 + ELSE 4 + END AS due_date_number")); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Exports/Services/ExportsAgingList.php b/app/Classes/Modules/Exports/Services/ExportsAgingList.php new file mode 100644 index 00000000..d44d55e4 --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsAgingList.php @@ -0,0 +1,82 @@ +filters = [ + "has_invoice_status_in"=>[2],"packing_list_ordered_by_invoice_date"=>true, + "with_aging_column"=>true + ]; + } + + public function headings(): array + { + return [ + 'Company Name', + 'Customer Marking', + 'Invoice Date', + 'Current', + '1-30 DAYS', + '31-60 DAYS', + '61-90 DAYS', + '91++ DAYS', + ]; + } + + public function query() + { + return (new ApplyFiltersToQuery())->execute(PackingList::query(), $this->filters); + } + + public function map($list): array + { + $marking = null; + $name = null; + $invDate = 'n/a'; + if ($list->owner instanceof Order) { + $inviterPivotInviteeReference = $list->owner->companyModule->inviters()->withPivot('invitee_reference')->first(); + + if ($inviterPivotInviteeReference) $marking = $inviterPivotInviteeReference->pivot->invitee_reference .'/'.$list->owner->reference; + $name = $list->owner->companyModule->company->name; + } + + $transaction = $list->transactions()->whereIn('status', [ApprovalStatus::APPROVED])->first(); + if ($transaction) { + $invDate = date_format($transaction->updated_at,'d-m-Y'); + $amt = number_format($transaction->amount,2); + } + + return [ + $name, + $marking, + $invDate, + $this->dueDateColumn(0, $list->due_date_number, $amt), + $this->dueDateColumn(1, $list->due_date_number, $amt), + $this->dueDateColumn(2, $list->due_date_number, $amt), + $this->dueDateColumn(3, $list->due_date_number, $amt), + $this->dueDateColumn(4, $list->due_date_number, $amt), + ]; + } + + private function dueDateColumn($colNum, $dueDateNumber, $amt) { + if ($colNum == $dueDateNumber) return $amt; + return null; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Exports/ExportArrivedParcelController.php b/app/Http/Controllers/Exports/ExportArrivedParcelController.php index 8b396490..f62ea308 100644 --- a/app/Http/Controllers/Exports/ExportArrivedParcelController.php +++ b/app/Http/Controllers/Exports/ExportArrivedParcelController.php @@ -9,6 +9,7 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Excel; +use App\Classes\Modules\Exports\Services\ExportsAgingList; class ExportArrivedParcelController { @@ -46,4 +47,11 @@ class ExportArrivedParcelController ob_end_clean(); return $response; } + + public function aging(Request $request) { + $data = new ExportsAgingList(); + $response = $data->download('aging_report.xls', Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + return $response; + } } diff --git a/routes/web.php b/routes/web.php index 68b9a9fe..ae928d2d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -440,6 +440,7 @@ Route::get('/export/pending-arrangement-delivery-list', 'Exports\ExportPendingAr Route::get('/export/on-hold-packing-list', 'Exports\ExportPendingArrangementPackingListController@onHold')->name('packaging_list.on_hold.export'); Route::get('/export/arrived-parcel', 'Exports\ExportArrivedParcelController@export')->name('packing_list.arrived_parcel.export'); Route::get('/export/parcel-summary', 'Exports\ExportArrivedParcelController@summary'); +Route::get('/export/aging-list', 'Exports\ExportArrivedParcelController@aging')->name('aging-listing.export'); Route::get('/export/parcel-postcode', 'Exports\ExportParcelPostcodesController@export'); Route::get('/export/{year}/customer-total-order', 'Exports\ExportCustomersToExcelController@totalOrders'); Route::get('/export/packing-list-warehouse/guangzhou2-to-johor', 'Exports\ExportArrivedParcelController@guangZhou2ToJohor'); From 032171bb1804bc07b7c41b3937e9bd2e6fa32e33 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Mon, 23 Oct 2023 23:53:10 +0800 Subject: [PATCH 2/2] update aging listing --- .../Exports/Services/ExportsAgingList.php | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/app/Classes/Modules/Exports/Services/ExportsAgingList.php b/app/Classes/Modules/Exports/Services/ExportsAgingList.php index d44d55e4..111eb20a 100644 --- a/app/Classes/Modules/Exports/Services/ExportsAgingList.php +++ b/app/Classes/Modules/Exports/Services/ExportsAgingList.php @@ -12,6 +12,7 @@ use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\WithHeadingRow; use App\Classes\General\Eloquent\ApplyFiltersToQuery; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use DateTime; class ExportsAgingList implements WithHeadings, WithHeadingRow, WithMapping, ShouldAutoSize, FromQuery { @@ -19,10 +20,12 @@ class ExportsAgingList implements WithHeadings, WithHeadingRow, WithMapping, Sho private $filters; - public function __construct() { + public function __construct() + { $this->filters = [ - "has_invoice_status_in"=>[2],"packing_list_ordered_by_invoice_date"=>true, - "with_aging_column"=>true + "has_invoice_status_in" => [2], + "packing_list_ordered_by_invoice_date" => true, + "with_aging_column" => true ]; } @@ -31,12 +34,11 @@ class ExportsAgingList implements WithHeadings, WithHeadingRow, WithMapping, Sho return [ 'Company Name', 'Customer Marking', + 'Order Number', + 'Invoice No', 'Invoice Date', - 'Current', - '1-30 DAYS', - '31-60 DAYS', - '61-90 DAYS', - '91++ DAYS', + 'Days', + 'Amount', ]; } @@ -48,35 +50,49 @@ class ExportsAgingList implements WithHeadings, WithHeadingRow, WithMapping, Sho public function map($list): array { $marking = null; - $name = null; + $orderNo = null; + $name = null; $invDate = 'n/a'; + $invNo = 'n/a'; + $days = 'n/a'; + if ($list->owner instanceof Order) { - $inviterPivotInviteeReference = $list->owner->companyModule->inviters()->withPivot('invitee_reference')->first(); - - if ($inviterPivotInviteeReference) $marking = $inviterPivotInviteeReference->pivot->invitee_reference .'/'.$list->owner->reference; + $inviterPivotInviteeReference = $list->owner->companyModule->inviters()->withPivot('invitee_reference')->first(); + + if ($inviterPivotInviteeReference) { + $marking = $inviterPivotInviteeReference->pivot->invitee_reference; + $orderNo = $list->owner->reference; + } $name = $list->owner->companyModule->company->name; } $transaction = $list->transactions()->whereIn('status', [ApprovalStatus::APPROVED])->first(); if ($transaction) { - $invDate = date_format($transaction->updated_at,'d-m-Y'); - $amt = number_format($transaction->amount,2); + + $invoiceDate = $transaction->created_at; + $invDate = date_format($invoiceDate, 'd-m-Y'); + $invNo = $transaction->bill_no; + $amt = number_format($transaction->amount, 2); + + $currentDate = new DateTime(); + $interval = $currentDate->diff($invoiceDate); + $days = $interval->format('%a'); } return [ $name, $marking, + $orderNo, + $invNo, $invDate, - $this->dueDateColumn(0, $list->due_date_number, $amt), - $this->dueDateColumn(1, $list->due_date_number, $amt), - $this->dueDateColumn(2, $list->due_date_number, $amt), - $this->dueDateColumn(3, $list->due_date_number, $amt), - $this->dueDateColumn(4, $list->due_date_number, $amt), + $days, + $amt, ]; } - private function dueDateColumn($colNum, $dueDateNumber, $amt) { + private function dueDateColumn($colNum, $dueDateNumber, $amt) + { if ($colNum == $dueDateNumber) return $amt; return null; } -} \ No newline at end of file +}