Compare commits
No commits in common. "0528506dfaa52988bb87a7488d52d6acd1a0547e" and "548e56335fd2c6c33f3e4281eb02b8d0fe71daee" have entirely different histories.
0528506dfa
...
548e56335f
@ -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
|
||||||
@ -98,9 +153,7 @@ public static function getRelations(): array
|
|||||||
public static function getPages(): array
|
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'),
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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([
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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(),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
@ -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');
|
|
||||||
}
|
|
||||||
};
|
|
@ -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([
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1 +0,0 @@
|
|||||||
ERROR [mprocs::error] Error: channel closed
|
|
@ -1,5 +0,0 @@
|
|||||||
procs:
|
|
||||||
sail:
|
|
||||||
shell: "/home/nisse/Code/topnotch_website/vendor/bin/sail up"
|
|
||||||
npm:
|
|
||||||
shell: "npm run dev"
|
|
Loading…
x
Reference in New Issue
Block a user