topnotch_website/app/Filament/Admin/Resources/CustomerReportResource.php

147 lines
5.7 KiB
PHP
Raw Permalink Normal View History

2024-11-17 19:39:40 -05:00
<?php
2024-12-10 15:28:14 -08:00
namespace App\Filament\Admin\Resources;
2024-11-17 19:39:40 -05:00
2025-01-16 17:37:32 -05:00
use App\Enums\IconEnum;
2024-11-17 19:39:40 -05:00
use App\Models\Customer;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Form;
use Filament\Resources\Resource;
2025-01-16 10:39:50 -05:00
use Filament\Support\Enums\FontWeight;
2024-11-17 19:39:40 -05:00
use Filament\Tables;
use Filament\Tables\Columns\Summarizers\Sum;
2024-11-17 19:39:40 -05:00
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;
2024-11-17 19:39:40 -05:00
class CustomerReportResource extends Resource
{
protected static ?string $model = Customer::class;
2025-01-24 21:37:05 -05:00
protected static ?string $navigationIcon = IconEnum::CUSTOMER_SALES->value;
2024-11-17 19:39:40 -05:00
2025-01-24 21:37:05 -05:00
protected static ?string $navigationGroup = 'Reports';
2024-11-17 19:39:40 -05:00
2025-01-24 21:37:05 -05:00
protected static ?string $navigationLabel = 'Customer Reports';
2024-11-17 19:39:40 -05:00
2025-01-24 21:37:05 -05:00
protected static ?int $navigationSort = 4;
2024-11-17 19:39:40 -05:00
public static function form(Form $form): Form
{
return $form
->schema([
//
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('company_name')
->label('Customer')
->sortable()
// ->searchable()
->extraHeaderAttributes(['class' => 'w-full']),
2024-11-17 19:39:40 -05:00
Tables\Columns\TextColumn::make('invoices.subtotal')
->label('Subtotal')
2024-12-10 15:28:14 -08:00
->money()
2024-11-17 19:39:40 -05:00
->alignRight()
->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('subtotal'))
->summarize(Sum::make('subtotal')
->label('')
->money()
->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('subtotal'))
),
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')
2024-11-17 19:39:40 -05:00
->label('GST')
2024-12-10 15:28:14 -08:00
->money()
2024-11-17 19:39:40 -05:00
->alignRight()
->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('gst_amount'))
->summarize(Sum::make('gst_amount')
->label('')
->money()
->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('gst_amount'))
),
Tables\Columns\TextColumn::make('invoices.pst_amount')
2024-11-17 19:39:40 -05:00
->label('PST')
2024-12-10 15:28:14 -08:00
->money()
2024-11-17 19:39:40 -05:00
->alignRight()
->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('pst_amount'))
->summarize(Sum::make('pst_amount')
->label('')
->money()
->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('pst_amount'))
),
Tables\Columns\TextColumn::make('invoices.total')
->label('Total')
2024-12-10 15:28:14 -08:00
->money()
2025-01-16 10:39:50 -05:00
->weight(FontWeight::Bold)
2024-11-17 19:39:40 -05:00
->alignRight()
->getStateUsing(fn (Table $table, Model $record) => $record->invoices()->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('total'))
->summarize(Sum::make('total')
->label('')
->money()
->using(fn (Table $table, $query) => $query->tap(fn ($q) => self::applyDateFilters($q, $table))->sum('total'))
),
2024-11-17 19:39:40 -05:00
])
2024-11-17 19:39:40 -05:00
->filters([
Tables\Filters\Filter::make('created_at')
->form([
DatePicker::make('created_at')
->label('From date'),
]),
Tables\Filters\Filter::make('created_until')
->form([
DatePicker::make('created_until')
->label('Until date'),
]),
], layout: Tables\Enums\FiltersLayout::AboveContent);
}
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));
2024-11-17 19:39:40 -05:00
}
2025-01-04 16:41:24 -05:00
public static function canAccess(): bool
{
2025-02-01 09:57:57 -08:00
return auth()->user()->is_admin ?? false;
2025-01-04 16:41:24 -05:00
}
2024-11-17 19:39:40 -05:00
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
2024-12-10 15:28:14 -08:00
'index' => \App\Filament\Admin\Resources\CustomerReportResource\Pages\ListCustomerReports::route('/'),
2024-11-17 19:39:40 -05:00
];
}
}