diff --git a/app/Filament/Admin/Resources/CustomerReportResource.php b/app/Filament/Admin/Resources/CustomerReportResource.php index 76e340c..bc18d83 100644 --- a/app/Filament/Admin/Resources/CustomerReportResource.php +++ b/app/Filament/Admin/Resources/CustomerReportResource.php @@ -11,7 +11,6 @@ use Filament\Tables\Columns\Summarizers\Summarizer; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Query\Builder; class CustomerReportResource extends Resource { @@ -45,14 +44,13 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('subtotal') ->money() - ->summarize(Summarizer::make()->using(function (Builder $query, Table $table) { - return '$'. - number_format( - round(Invoice::whereBetween('date', [ - $table->getFilter('created_at')->getState()['created_at'] ?? '1900-01-01', - $table->getFilter('created_until')->getState()['created_until'] ?? '2100-01-01', - ])->sum('subtotal'), 2), 2, '.', ','); + ->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() ->getStateUsing(function (Table $table, Model $record) { @@ -86,14 +84,13 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('total') ->money() - ->summarize(Summarizer::make()->using(function (Builder $query, Table $table) { - return '$'. - number_format( - round(Invoice::whereBetween('date', [ - $table->getFilter('created_at')->getState()['created_at'] ?? '1900-01-01', - $table->getFilter('created_until')->getState()['created_until'] ?? '2100-01-01', - ])->sum('total'), 2), 2, '.', ','); + ->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('bold') ->alignRight() diff --git a/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php b/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php index 3f892a0..569e5e0 100644 --- a/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php +++ b/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php @@ -3,6 +3,7 @@ namespace App\Filament\Admin\Resources\OrderResource\Pages; use App\Enums\OrderAttributes; +use App\Enums\OrderStatus; use App\Filament\Admin\Resources\OrderResource; use App\Models\Order; use App\Models\OrderProduct; @@ -148,7 +149,9 @@ protected function getHeaderActions(): array ->label('Save changes') ->action('save') ->icon('lucide-save'), + Actions\ReplicateAction::make() + ->label('Duplicate') ->icon('lucide-copy') ->color('info') ->mutateRecordDataUsing(function (array $data): array { @@ -157,12 +160,27 @@ protected function getHeaderActions(): array return $data; }) - ->beforeReplicaSaved(function (Model $replica): void {}) + ->beforeReplicaSaved(function (Order $replica): void { + $replica->customer_po = 'Repeat of '.$replica->customer_po; + $replica->status = OrderStatus::DRAFT; + $replica->printed = false; + $replica->pre_production = false; + $replica->order_date = today(); + $replica->due_date = today()->addDays(10); + $replica->save(); + }) ->successRedirectUrl(fn (Model $replica): string => OrderResource::getUrl('edit', [$replica])), + + // Action::make('invoice') + // ->visible(fn () => auth()->user()->is_admin) + // ->label('To Invoice') + // ->icon('lucide-receipt-text'), + // Action::make('print') ->icon('lucide-printer') ->url(fn (Order $record) => route('orders.pdf', $record)) ->openUrlInNewTab(), + Actions\DeleteAction::make() ->icon('lucide-trash-2'), ]; diff --git a/app/Filament/Admin/Resources/TaxResource.php b/app/Filament/Admin/Resources/TaxRateResource.php similarity index 75% rename from app/Filament/Admin/Resources/TaxResource.php rename to app/Filament/Admin/Resources/TaxRateResource.php index 7f6eed7..a92151c 100644 --- a/app/Filament/Admin/Resources/TaxResource.php +++ b/app/Filament/Admin/Resources/TaxRateResource.php @@ -2,18 +2,16 @@ namespace App\Filament\Admin\Resources; -use App\Filament\Admin\Resources\TaxResource\Pages; -use App\Models\Tax; +use App\Filament\Admin\Resources\TaxRateResource\Pages; +use App\Models\TaxRate; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; -class TaxResource extends Resource +class TaxRateResource extends Resource { - // protected static ?string $model = Tax::class; - - protected static ?string $navigationLabel = 'Service Tax'; + protected static ?string $model = TaxRate::class; protected static ?string $navigationIcon = 'lucide-circle-dollar-sign'; @@ -48,11 +46,6 @@ public static function table(Table $table): Table ]); } - public static function canAccess(): bool - { - return auth()->user()->is_admin; - } - public static function getRelations(): array { return [ @@ -60,12 +53,17 @@ public static function getRelations(): array ]; } + public static function canAccess(): bool + { + return auth()->user()->is_admin; + } + public static function getPages(): array { return [ - 'index' => Pages\ListTaxes::route('/'), - 'create' => Pages\CreateTax::route('/create'), - 'edit' => Pages\EditTax::route('/{record}/edit'), + 'index' => Pages\ListTaxRates::route('/'), + 'create' => Pages\CreateTaxRate::route('/create'), + 'edit' => Pages\EditTaxRate::route('/{record}/edit'), ]; } } diff --git a/app/Filament/Admin/Resources/TaxRateResource/Pages/CreateTaxRate.php b/app/Filament/Admin/Resources/TaxRateResource/Pages/CreateTaxRate.php new file mode 100644 index 0000000..ac778a6 --- /dev/null +++ b/app/Filament/Admin/Resources/TaxRateResource/Pages/CreateTaxRate.php @@ -0,0 +1,11 @@ + */ + use HasFactory; + + protected $fillable = ['name', 'value']; +} diff --git a/database/factories/TaxRateFactory.php b/database/factories/TaxRateFactory.php new file mode 100644 index 0000000..1a697b0 --- /dev/null +++ b/database/factories/TaxRateFactory.php @@ -0,0 +1,23 @@ + + */ +class TaxRateFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2025_01_14_221133_create_tax_rates_table.php b/database/migrations/2025_01_14_221133_create_tax_rates_table.php new file mode 100644 index 0000000..1d422d8 --- /dev/null +++ b/database/migrations/2025_01_14_221133_create_tax_rates_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('name'); + $table->decimal('value', 8, 2); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tax_rates'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 1462362..978bfab 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -27,6 +27,7 @@ public function run(): void QuoteSeeder::class, InvoiceSeeder::class, InvoiceReportSeeder::class, + TaxRateSeeder::class, ]); User::factory()->create([ diff --git a/database/seeders/TaxRateSeeder.php b/database/seeders/TaxRateSeeder.php new file mode 100644 index 0000000..639cd03 --- /dev/null +++ b/database/seeders/TaxRateSeeder.php @@ -0,0 +1,18 @@ + 'GST', 'value' => 5.00]); + TaxRate::create(['name' => 'PST', 'value' => 7.00]); + } +}