Compare commits

..

No commits in common. "0528506dfaa52988bb87a7488d52d6acd1a0547e" and "548e56335fd2c6c33f3e4281eb02b8d0fe71daee" have entirely different histories.

11 changed files with 114 additions and 170 deletions

View File

@ -2,19 +2,21 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Enums\InvoiceStatus;
use App\Filament\Resources\InvoiceReportResource\Pages; use App\Filament\Resources\InvoiceReportResource\Pages;
use App\Models\Order;
use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Support\Enums\FontFamily; use Filament\Tables;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Grouping\Group;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
class InvoiceReportResource extends Resource class InvoiceReportResource extends Resource
{ {
protected static ?string $model = Order::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Reports'; protected static ?string $navigationGroup = 'Reports';
@ -27,27 +29,7 @@ public static function form(Form $form): Form
{ {
return $form return $form
->schema([ ->schema([
Section::make([ //
Select::make('customer_id')
->relationship('customer', 'company_name')
->preload()
->required()
->searchable(),
ToggleButtons::make('filter_paid')
->boolean()
->required()
->default(false)
->colors([
'true' => 'info',
'false' => 'info',
])
->inline(),
DatePicker::make('date_start')
->required(),
DatePicker::make('date_end')
->required()
->default(today()),
])->columns(2),
]); ]);
} }
@ -55,37 +37,110 @@ public static function table(Table $table): Table
{ {
return $table return $table
->columns([ ->columns([
TextColumn::make('id') Tables\Columns\TextColumn::make('invoice.date')
->formatStateUsing(fn ($state) => 'TN-INR-'.$state) ->label('Date')
->fontFamily(FontFamily::Mono) ->date('Y-m-d'),
->color('primary'),
TextColumn::make('customer.company_name') Tables\Columns\TextColumn::make('invoice.internal_id')
->color('primary')
->fontFamily('mono'),
Tables\Columns\TextColumn::make('customer_po')
->color('code')
->weight('bold')
->extraHeaderAttributes(['class' => 'w-full']), ->extraHeaderAttributes(['class' => 'w-full']),
TextColumn::make('date_start')
->label('Start Date') Tables\Columns\TextColumn::make('total_service_price')
->date('Y-m-d'), ->label('Subtotal')
TextColumn::make('date_end') ->alignRight()
->label('End Date')
->date('Y-m-d'),
TextColumn::make('total')
->money(), ->money(),
Tables\Columns\TextColumn::make('pst')
->label('PST')
->alignRight()
->getStateUsing(fn (Order $record) => $record->invoice->pst ? $record->total_service_price * 0.07 : 0.00)
->formatStateUsing(function ($state) {
return $state == 0.00 ? '-' : '$'.$state;
}),
Tables\Columns\TextColumn::make('gst')
->label('GST')
->getStateUsing(fn (Order $record) => $record->total_service_price * 0.05)
->alignRight()
->money(),
Tables\Columns\TextColumn::make('invoice.total')
->label('Total')
->getStateUsing(function (Order $record) {
$total = $record->total_service_price * 1.05;
if ($record->invoice->pst) {
$total += $record->total_service_price * 0.07;
}
return $total;
})
->alignRight()
->money(),
Tables\Columns\TextColumn::make('invoice.status')
->badge(InvoiceStatus::class),
]) ])
->defaultSort('created_at', 'desc')
->filters([ ->filters([
]) Tables\Filters\SelectFilter::make('customer')
->actions([]); ->relationship('customer', 'company_name')
// ->defaultGroup( ->preload()
// Group::make('date') ->searchable()
// ->getKeyFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('Y-m-0')) ->placeholder('Select a customer...')
// ->getTitleFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('F Y')) ->selectablePlaceholder(false)
// ->orderQueryUsing(function (Builder $query) { ->query(function (array $data, Builder $query): Builder {
// return $query->where('orders.customer_id', $data['value'] ?? '-1');
// return $query->join('invoices', 'orders.invoice_id', '=', 'invoices.id') }),
// ->orderBy('invoices.date', 'desc');
// }) Tables\Filters\Filter::make('date_from')
// ->titlePrefixedWithLabel(false), ->form([DatePicker::make('date_from')])
// ); ->query(function (Builder $query, array $data): Builder {
return $query->when($data['date_from'], function (Builder $query, $date) {
return $query->whereHas('invoice', fn ($query) => $query->whereDate('date', '>=', $date));
});
}),
Tables\Filters\Filter::make('date_until')
->form([DatePicker::make('date_until')])
->query(function (Builder $query, array $data): Builder {
return $query->when($data['date_until'], function (Builder $query, $date) {
return $query->whereHas('invoice', fn ($query) => $query->whereDate('date', '<=', $date));
});
}),
Tables\Filters\SelectFilter::make('invoice_status')
->options(InvoiceStatus::class)
->query(function (Builder $query, array $data): Builder {
return $query->when($data['value'], fn (Builder $query, $value) => $query->whereHas('invoice', fn (Builder $query) => $query->where('status', $value)));
}),
], layout: Tables\Enums\FiltersLayout::AboveContent)
->hiddenFilterIndicators()
->actions([])
->defaultGroup(
Group::make('date')
->getKeyFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('Y-m-0'))
->getTitleFromRecordUsing(fn (Order $record): string => $record->invoice->date->format('F Y'))
->orderQueryUsing(function (Builder $query) {
return $query->join('invoices', 'orders.invoice_id', '=', 'invoices.id')
->orderBy('invoices.date', 'desc');
})
->titlePrefixedWithLabel(false),
);
}
public static function getEloquentQuery(): \Illuminate\Database\Eloquent\Builder
{
return Order::query()
->has('invoice');
} }
public static function getRelations(): array public static function getRelations(): array
@ -99,8 +154,6 @@ public static function getPages(): array
{ {
return [ return [
'index' => Pages\ListInvoiceReports::route('/'), 'index' => Pages\ListInvoiceReports::route('/'),
'edit' => Pages\EditInvoiceReport::route('/{record}/edit'),
'create' => Pages\CreateInvoiceReport::route('/create'),
]; ];
} }
} }

View File

@ -3,7 +3,7 @@
namespace App\Filament\Resources\InvoiceReportResource\Pages; namespace App\Filament\Resources\InvoiceReportResource\Pages;
use App\Filament\Resources\InvoiceReportResource; use App\Filament\Resources\InvoiceReportResource;
use Filament\Actions; use Filament\Actions\Action;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
class ListInvoiceReports extends ListRecords class ListInvoiceReports extends ListRecords
@ -15,7 +15,9 @@ class ListInvoiceReports extends ListRecords
protected function getHeaderActions(): array protected function getHeaderActions(): array
{ {
return [ return [
Actions\CreateAction::make(), Action::make('generateReport')
->label('Make Report')
->icon('lucide-printer'),
]; ];
} }
} }

View File

@ -100,8 +100,7 @@ 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) ], layout: Tables\Enums\FiltersLayout::AboveContentCollapsible)
// ])
->actions([ ->actions([
]) ])

View File

@ -1,28 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class InvoiceReport extends Model
{
use HasFactory;
protected $fillable = [
'customer_id',
'date_start',
'date_end',
'filter_paid',
'subtotal',
'pst',
'gst',
'total',
];
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace Database\Factories;
use App\Models\Customer;
use App\Models\InvoiceReport;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\Factory;
class InvoiceReportFactory extends Factory
{
protected $model = InvoiceReport::class;
public function definition(): array
{
return [
'customer_id' => Customer::all()->shuffle()->first()->id,
'date_start' => Carbon::now()->subYear(),
'date_end' => Carbon::now(),
'filter_paid' => $this->faker->boolean(90),
/* 'subtotal' => $this->faker->randomFloat(),
'pst' => $this->faker->randomFloat(),
'gst' => $this->faker->randomFloat(),
'total' => $this->faker->randomFloat(),*/
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
];
}
}

View File

@ -1,32 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('invoice_reports', function (Blueprint $table) {
$table->id();
$table->foreignId('customer_id')->constrained();
$table->date('date_start');
$table->date('date_end');
$table->boolean('filter_paid');
$table->float('subtotal', 2)->default(0);
$table->float('pst', 2)->default(0);
$table->float('gst', 2)->default(0);
$table->float('total', 2)->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('invoice_reports');
}
};

View File

@ -26,7 +26,6 @@ public function run(): void
ServiceFileSeeder::class, ServiceFileSeeder::class,
QuoteSeeder::class, QuoteSeeder::class,
InvoiceSeeder::class, InvoiceSeeder::class,
InvoiceReportSeeder::class,
]); ]);
User::factory()->create([ User::factory()->create([

View File

@ -1,14 +0,0 @@
<?php
namespace Database\Seeders;
use App\Models\InvoiceReport;
use Illuminate\Database\Seeder;
class InvoiceReportSeeder extends Seeder
{
public function run(): void
{
InvoiceReport::factory()->count(5)->create();
}
}

View File

@ -14,7 +14,7 @@ class OrderSeeder extends Seeder
public function run(): void public function run(): void
{ {
foreach (Customer::all() as $customer) { foreach (Customer::all() as $customer) {
Order::factory(rand(10, 50), ['customer_id' => $customer])->create(); Order::factory(rand(50, 150), ['customer_id' => $customer])->create();
} }
} }
} }

View File

@ -1 +0,0 @@
ERROR [mprocs::error] Error: channel closed

View File

@ -1,5 +0,0 @@
procs:
sail:
shell: "/home/nisse/Code/topnotch_website/vendor/bin/sail up"
npm:
shell: "npm run dev"