#79 Add sums of columns for Customer Reports

This commit is contained in:
Nisse Lommerde 2025-02-13 15:53:01 -05:00
parent 6fc753fc19
commit 779d46d708
2 changed files with 57 additions and 52 deletions

View File

@ -4,15 +4,15 @@
use App\Enums\IconEnum; use App\Enums\IconEnum;
use App\Models\Customer; use App\Models\Customer;
use App\Models\Invoice;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Support\Enums\FontWeight; use Filament\Support\Enums\FontWeight;
use Filament\Tables; use Filament\Tables;
use Filament\Tables\Columns\Summarizers\Summarizer; use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;
class CustomerReportResource extends Resource class CustomerReportResource extends Resource
{ {
@ -41,68 +41,66 @@ public static function table(Table $table): Table
Tables\Columns\TextColumn::make('company_name') Tables\Columns\TextColumn::make('company_name')
->label('Customer') ->label('Customer')
->sortable() ->sortable()
->searchable() // ->searchable()
->extraHeaderAttributes(['class' => 'w-full']), ->extraHeaderAttributes(['class' => 'w-full']),
Tables\Columns\TextColumn::make('subtotal') Tables\Columns\TextColumn::make('invoices.subtotal')
->label('Subtotal')
->money() ->money()
// ->summarize(Summarizer::make()->using(function ($query, Table $table) {
// $createdAt = $table->getfilter('created_at')->getstate()['created_at'] ?? '1900-01-01';
// $createdUntil = $table->getfilter('created_until')->getstate()['created_until'] ?? '2100-01-01';
//
// $invoiceSum = invoice::wherebetween('date', [$createdAt, $createdUntil])->sum('subtotal');
//
// return '$'.number_format(round($invoiceSum, 2), 2, '.', ',');
// }))
->alignRight() ->alignRight()
->getStateUsing(function (Table $table, Model $record) { ->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('subtotal'))
return $record->getSubtotalAttribute( ->summarize(Sum::make('subtotal')
$table->getFilter('created_at')->getState()['created_at'], ->label('')
$table->getFilter('created_until')->getState()['created_until'] ->money()
); ->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('subtotal'))
}), ),
Tables\Columns\TextColumn::make('gst') Tables\Columns\TextColumn::make('invoices.hst_amount')
->label('HST')
->money()
->alignRight()
->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('hst_amount'))
->summarize(Sum::make('hst_amount')
->label('')
->money()
->using(fn (Table $table, Builder $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('hst_amount'))
),
Tables\Columns\TextColumn::make('invoices.gst_amount')
->label('GST') ->label('GST')
->money() ->money()
->alignRight() ->alignRight()
->getStateUsing(function (Table $table, Model $record) { ->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('gst_amount'))
return $record->getGstAttribute( ->summarize(Sum::make('gst_amount')
$table->getFilter('created_at')->getState()['created_at'], ->label('')
$table->getFilter('created_until')->getState()['created_until'] ->money()
); ->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('gst_amount'))
}), ),
Tables\Columns\TextColumn::make('pst') Tables\Columns\TextColumn::make('invoices.pst_amount')
->label('PST') ->label('PST')
->money() ->money()
->alignRight() ->alignRight()
->getStateUsing(function (Table $table, Customer $record) { ->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('pst_amount'))
return $record->getPstAttribute( ->summarize(Sum::make('pst_amount')
$table->getFilter('created_at')->getState()['created_at'], ->label('')
$table->getFilter('created_until')->getState()['created_until'] ->money()
); ->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('pst_amount'))
}), ),
Tables\Columns\TextColumn::make('total') Tables\Columns\TextColumn::make('invoices.total')
->label('Total')
->money() ->money()
// ->summarize(summarizer::make()->using(function ($query, table $table) {
// $createdAt = $table->getfilter('created_at')->getstate()['created_at'] ?? '1900-01-01';
// $createdUntil = $table->getfilter('created_until')->getstate()['created_until'] ?? '2100-01-01';
//
// $invoiceSum = invoice::wherebetween('date', [$createdAt, $createdUntil])->sum('total');
//
// return '$'.number_format(round($invoiceSum, 2), 2, '.', ',');
// }))
->weight(FontWeight::Bold) ->weight(FontWeight::Bold)
->alignRight() ->alignRight()
->getStateUsing(function (Table $table, Model $record) { ->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('total'))
return $record->getTotalAttribute( ->summarize(Sum::make('total')
$table->getFilter('created_at')->getState()['created_at'], ->label('')
$table->getFilter('created_until')->getState()['created_until'] ->money()
); ->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('total'))
}), ),
]) ])
->filters([ ->filters([
Tables\Filters\Filter::make('created_at') Tables\Filters\Filter::make('created_at')
->form([ ->form([
@ -115,11 +113,16 @@ public static function table(Table $table): Table
DatePicker::make('created_until') DatePicker::make('created_until')
->label('Until date'), ->label('Until date'),
]), ]),
]) ], layout: Tables\Enums\FiltersLayout::AboveContent);
->actions([ }
])
->bulkActions([ protected static function applyDateFilters($query, Table $table): void
]); {
$createdAt = $table->getFilter('created_at')?->getState()['created_at'] ?? null;
$createdUntil = $table->getFilter('created_until')?->getState()['created_until'] ?? null;
$query->when($createdAt, fn ($q, $date) => $q->whereDate('created_at', '>=', $date));
$query->when($createdUntil, fn ($q, $date) => $q->whereDate('created_at', '<=', $date));
} }
public static function canAccess(): bool public static function canAccess(): bool

View File

@ -52,6 +52,7 @@ public static function table(Table $table): Table
->extraHeaderAttributes(['class' => 'w-full']), ->extraHeaderAttributes(['class' => 'w-full']),
TextColumn::make('productServices.amount') TextColumn::make('productServices.amount')
->label('Quantity')
->alignRight() ->alignRight()
->getStateUsing(function (Table $table, Model $record) { ->getStateUsing(function (Table $table, Model $record) {
return $record->getQuantityAttribute( return $record->getQuantityAttribute(
@ -71,6 +72,7 @@ public static function table(Table $table): Table
), ),
TextColumn::make('productServices.amount_price') TextColumn::make('productServices.amount_price')
->label('Amount')
->alignRight() ->alignRight()
->money() ->money()
->getStateUsing(function (Table $table, Model $record) { ->getStateUsing(function (Table $table, Model $record) {