297 lines
12 KiB
PHP
Raw Normal View History

2024-10-10 15:15:30 -07:00
<?php
2024-12-10 15:28:14 -08:00
namespace App\Filament\Admin\Resources;
2024-10-10 15:15:30 -07:00
2025-01-16 17:37:32 -05:00
use App\Enums\IconEnum;
2024-11-13 23:34:53 -05:00
use App\Enums\InvoiceStatus;
2024-12-10 15:28:14 -08:00
use App\Filament\Admin\Resources\InvoiceResource\RelationManagers\OrdersRelationManager;
use App\Filament\Admin\Resources\InvoiceResource\RelationManagers\ProductServicesRelationManager;
2024-11-05 11:35:23 -05:00
use App\Models\Customer;
2024-10-10 15:15:30 -07:00
use App\Models\Invoice;
2024-11-05 11:35:23 -05:00
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Grid;
2024-12-10 15:28:14 -08:00
use Filament\Forms\Components\Group;
use Filament\Forms\Components\Placeholder;
2024-11-05 11:35:23 -05:00
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Split;
use Filament\Forms\Components\ToggleButtons;
2024-10-10 15:15:30 -07:00
use Filament\Forms\Form;
2024-11-13 23:34:53 -05:00
use Filament\Notifications\Notification;
2024-10-10 15:15:30 -07:00
use Filament\Resources\Resource;
use Filament\Tables;
2025-01-07 14:32:17 -05:00
use Filament\Tables\Columns\TextColumn;
2024-10-10 15:15:30 -07:00
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
2024-10-10 15:15:30 -07:00
class InvoiceResource extends Resource
{
protected static ?string $model = Invoice::class;
2025-01-16 17:37:32 -05:00
protected static ?string $navigationIcon = IconEnum::INVOICE->value;
2024-10-10 15:15:30 -07:00
protected static ?string $navigationGroup = 'Production';
2024-10-10 15:15:30 -07:00
protected static ?int $navigationSort = 2;
public static function form(Form $form): Form
{
return $form
->schema([
2024-12-10 15:28:14 -08:00
Group::make()
->schema([
Section::make([
Grid::make(2)
->schema([
Select::make('customer_id')
->required()
->label('Customer')
->options(Customer::all()->pluck('company_name', 'id'))
->reactive()
->searchable()
->disabledOn('edit')
->columnSpan(2),
Split::make([
DatePicker::make('date')
->required()
->default(today()),
DatePicker::make('due_date'),
])
->columnSpan(2),
ToggleButtons::make('status')
->options(InvoiceStatus::class)
->required()
->inline()
->default(InvoiceStatus::UNPAID)
->columnSpan(2),
])->columnSpan(2),
Grid::make(1)
->schema([
2025-01-14 17:17:04 -05:00
ToggleButtons::make('has_gst')
->label('GST')
->boolean('On', 'Off')
2024-12-10 15:28:14 -08:00
->default(true)
->inline()
->colors([
'true' => 'info',
'false' => 'info',
]),
2025-01-14 17:17:04 -05:00
ToggleButtons::make('has_pst')
->label('PST')
->boolean('On', 'Off')
2024-12-10 15:28:14 -08:00
->default(false)
->inline()
->colors([
'true' => 'info',
'false' => 'info',
]),
2025-01-21 21:28:41 -05:00
ToggleButtons::make('has_hst')
->label('HST')
->boolean('On', 'Off')
->default(false)
->inline()
->colors([
'true' => 'info',
'false' => 'info',
]),
2024-12-10 15:28:14 -08:00
])->columnSpan(1),
])
->columns(3)
->columnSpan(2),
Section::make()
->schema([
2025-01-14 17:17:04 -05:00
Placeholder::make('Id')
->label('ID')
->content(fn (Invoice $record): ?string => $record->internal_id),
2025-01-21 21:28:41 -05:00
Placeholder::make('Tax Rates '.'(if applicable)')
->content(fn (Invoice $record): ?string => $record->gst_rate.'% GST, '.$record->pst_rate.'% PST, '.$record->hst_rate.'% HST'),
2025-01-14 17:17:04 -05:00
2024-12-10 15:28:14 -08:00
Placeholder::make('created_at')
2025-01-14 17:17:04 -05:00
->label('Created')
2025-01-21 21:28:41 -05:00
->content(fn (Invoice $record): ?string => $record->created_at->format('Y-m-d')),
2024-12-10 15:28:14 -08:00
Placeholder::make('updated_at')
2025-01-14 17:17:04 -05:00
->label('Last modified')
2025-01-21 21:28:41 -05:00
->content(fn (Invoice $record): ?string => $record->updated_at->format('Y-m-d')),
2025-01-14 17:17:04 -05:00
2024-11-05 11:35:23 -05:00
])
2024-12-10 15:28:14 -08:00
->columnSpan(1)
->hidden(fn (?Invoice $record) => $record === null),
])
2024-11-05 11:35:23 -05:00
->columns(3)
2024-12-10 15:28:14 -08:00
->columnSpan(2),
])->columns(2);
2024-10-10 15:15:30 -07:00
}
public static function table(Table $table): Table
{
return $table
->columns([
2025-01-07 14:32:17 -05:00
TextColumn::make('internal_id')
2024-11-05 11:35:23 -05:00
->label('ID')
->fontFamily('mono')
->color('primary')
->sortable()
2024-12-10 15:28:14 -08:00
->searchable(query: function (Builder $query, $search) {
return $query->where('internal_id', 'like', "%{$search}%")
->orWhereHas('orders', function (Builder $query) use ($search) {
return $query->where('customer_po', 'like', "%{$search}%")
->orWhere('internal_po', 'like', "%{$search}%");
});
}),
2025-01-07 14:32:17 -05:00
TextColumn::make('customer.company_name')
->sortable()
2024-11-17 15:41:32 -05:00
->extraHeaderAttributes(['class' => 'w-full'])
->searchable(),
2024-12-10 15:28:14 -08:00
2025-01-07 14:32:17 -05:00
TextColumn::make('created_at')
2024-11-17 15:41:32 -05:00
->label('Created')
->date()
->sortable(),
2024-12-10 15:28:14 -08:00
2025-01-07 14:32:17 -05:00
TextColumn::make('subtotal')
2024-12-10 15:28:14 -08:00
->money()
2024-11-17 15:41:32 -05:00
->alignRight(),
2024-12-10 15:28:14 -08:00
2025-01-14 17:17:04 -05:00
TextColumn::make('has_gst')
->label('GST')
2025-01-21 21:28:41 -05:00
->money()
2025-01-14 17:17:04 -05:00
->formatStateUsing(function (Invoice $record) {
if ($record->has_gst) {
2025-01-21 21:28:41 -05:00
return '$'.number_format($record->gst_amount, 2);
2025-01-14 17:17:04 -05:00
}
return '-';
2025-01-07 14:32:17 -05:00
})
2024-11-17 15:41:32 -05:00
->alignRight(),
2024-12-10 15:28:14 -08:00
2025-01-14 17:17:04 -05:00
TextColumn::make('has_pst')
->label('PST')
2025-01-14 17:17:04 -05:00
->formatStateUsing(function (Invoice $record) {
if ($record->has_pst) {
2025-01-21 21:28:41 -05:00
return '$'.number_format($record->pst_amount, 2);
}
return '-';
})
->alignRight(),
TextColumn::make('has_hst')
->label('HST')
->money()
->formatStateUsing(function (Invoice $record) {
if ($record->has_hst) {
return '$'.number_format($record->hst_amount, 2);
2025-01-14 17:17:04 -05:00
}
return '-';
2024-11-17 19:39:40 -05:00
})
2024-11-17 15:41:32 -05:00
->alignRight(),
2025-01-07 14:32:17 -05:00
TextColumn::make('total')
->label('Total')
2024-12-10 15:28:14 -08:00
->money()
2024-11-17 15:41:32 -05:00
->weight('bold')
->alignRight(),
2025-01-07 14:32:17 -05:00
TextColumn::make('status')
2024-11-20 15:53:46 -05:00
->badge(InvoiceStatus::class)
->sortable(),
2024-10-10 15:15:30 -07:00
])
2024-11-13 23:34:53 -05:00
2024-10-10 15:15:30 -07:00
->filters([
Tables\Filters\Filter::make('created_at')
->form([
2024-11-20 15:53:46 -05:00
DatePicker::make('created_from')
->label('From date'),
DatePicker::make('created_until')
->label('Until date'),
])
->query(function (Builder $query, array $data): Builder {
return $query
->when(
$data['created_from'],
fn (Builder $query, $date): Builder => $query->whereDate('date', '>=', $date),
)
->when(
$data['created_until'],
fn (Builder $query, $date): Builder => $query->whereDate('date', '<=', $date),
);
}),
2024-11-13 23:34:53 -05:00
Tables\Filters\SelectFilter::make('status')
2024-11-20 15:53:46 -05:00
->options(InvoiceStatus::class),
2024-11-13 23:34:53 -05:00
2024-11-20 15:53:46 -05:00
], )
2024-11-13 23:34:53 -05:00
->groups([
'status',
])
2024-12-10 15:28:14 -08:00
->defaultSort('id', 'desc')
2024-11-13 23:34:53 -05:00
2024-10-10 15:15:30 -07:00
->actions([
Tables\Actions\EditAction::make(),
])
2024-11-13 23:34:53 -05:00
2024-10-10 15:15:30 -07:00
->bulkActions([
Tables\Actions\BulkAction::make('Mark as paid')
2024-11-13 23:34:53 -05:00
->action(function (Collection $records) {
$records->each->setStatus(InvoiceStatus::PAID);
Notification::make()
->title(count($records).' item(s) saved successfully')
->success()
->send();
})
->icon('lucide-circle-check')
->deselectRecordsAfterCompletion(),
2024-11-13 23:34:53 -05:00
2024-10-10 15:15:30 -07:00
Tables\Actions\BulkActionGroup::make([
Tables\Actions\BulkAction::make('Mark as unpaid')
2024-11-13 23:34:53 -05:00
->action(function (Collection $records) {
$records->each->setStatus(InvoiceStatus::UNPAID);
Notification::make()
->title(count($records).' item(s) saved successfully')
->success()
->send();
})
->icon('lucide-circle-x')
->deselectRecordsAfterCompletion(),
2024-10-10 15:15:30 -07:00
Tables\Actions\DeleteBulkAction::make(),
])
->label('Other actions'),
])
->selectCurrentPageOnly();
2024-10-10 15:15:30 -07:00
}
2025-01-04 16:41:24 -05:00
public static function canAccess(): bool
{
return auth()->user()->is_admin;
}
2024-10-10 15:15:30 -07:00
public static function getRelations(): array
{
return [
2024-11-07 12:22:20 -05:00
OrdersRelationManager::class,
ProductServicesRelationManager::class,
2024-10-10 15:15:30 -07:00
];
}
public static function getPages(): array
{
return [
2024-12-10 15:28:14 -08:00
'index' => \App\Filament\Admin\Resources\InvoiceResource\Pages\ListInvoices::route('/'),
'create' => \App\Filament\Admin\Resources\InvoiceResource\Pages\CreateInvoice::route('/create'),
'edit' => \App\Filament\Admin\Resources\InvoiceResource\Pages\EditInvoice::route('/{record}/edit'),
2024-10-10 15:15:30 -07:00
];
}
}