csv download aging report

This commit is contained in:
Steve Ng
2023-10-18 08:48:30 +08:00
parent 5b190d5334
commit 04af87f640
4 changed files with 121 additions and 0 deletions
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Builder;
class WithAgingColumn implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return mixed
*/
public static function apply(Builder $builder, $value)
{
$today = Carbon::now();
return $builder->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"));
}
}
@@ -0,0 +1,82 @@
<?php
namespace App\Classes\Modules\Exports\Services;
use App\Models\Order;
use App\Models\PackingList;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use App\Classes\General\Eloquent\ApplyFiltersToQuery;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
class ExportsAgingList implements WithHeadings, WithHeadingRow, WithMapping, ShouldAutoSize, FromQuery
{
use Exportable;
private $filters;
public function __construct() {
$this->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;
}
}
@@ -9,6 +9,7 @@ use App\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Excel; use Maatwebsite\Excel\Excel;
use App\Classes\Modules\Exports\Services\ExportsAgingList;
class ExportArrivedParcelController class ExportArrivedParcelController
{ {
@@ -46,4 +47,11 @@ class ExportArrivedParcelController
ob_end_clean(); ob_end_clean();
return $response; 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;
}
} }
+1
View File
@@ -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/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/arrived-parcel', 'Exports\ExportArrivedParcelController@export')->name('packing_list.arrived_parcel.export');
Route::get('/export/parcel-summary', 'Exports\ExportArrivedParcelController@summary'); 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/parcel-postcode', 'Exports\ExportParcelPostcodesController@export');
Route::get('/export/{year}/customer-total-order', 'Exports\ExportCustomersToExcelController@totalOrders'); Route::get('/export/{year}/customer-total-order', 'Exports\ExportCustomersToExcelController@totalOrders');
Route::get('/export/packing-list-warehouse/guangzhou2-to-johor', 'Exports\ExportArrivedParcelController@guangZhou2ToJohor'); Route::get('/export/packing-list-warehouse/guangzhou2-to-johor', 'Exports\ExportArrivedParcelController@guangZhou2ToJohor');