diff --git a/app/Filament/Resources/Master/EggPrices/EggPriceResource.php b/app/Filament/Resources/Master/EggPrices/EggPriceResource.php new file mode 100644 index 0000000..4daacf5 --- /dev/null +++ b/app/Filament/Resources/Master/EggPrices/EggPriceResource.php @@ -0,0 +1,134 @@ +components([ + TextInput::make('name') + ->label('Tipe Harga') + ->placeholder('Ecer, Distributor, Grosir') + ->required() + ->maxLength(50) + ->autofocus() + ->autocomplete(false), + + Select::make('unit_id') + ->label('Satuan') + ->relationship('unit', 'name') + ->required() + ->native(false) + ->searchable() + ->preload(), + + TextInput::make('price') + ->label('Harga') + ->placeholder('0') + ->required() + ->currencyMask(thousandSeparator: '.', decimalSeparator: ',', precision: 0) + ->prefix('Rp') + ->dehydrateStateUsing(fn ($state) => (int) str()->replace(',', '', (string) ($state ?? 0))), + ]) + ->columns(1); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('name') + ->label('Tipe Harga') + ->searchable() + ->sortable(), + + TextColumn::make('unit.name') + ->label('Satuan') + ->sortable(), + + TextColumn::make('price') + ->label('Harga') + ->money('IDR', decimalPlaces: 0) + ->sortable(), + + ...TimestampColumns::make(), + ]) + ->filters([ + TrashedFilter::make() + ->native(false), + ]) + ->recordActions([ + EditAction::make() + ->modalWidth(Width::Large), + + DeleteAction::make(), + + ForceDeleteAction::make(), + + RestoreAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + ...DefaultBulkActions::make('Harga Telur'), + ]), + ]) + ->emptyStateIcon(Heroicon::CurrencyDollar) + ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') + ->defaultSort('created_at', 'desc') + ->deferFilters(false); + } + + public static function getPages(): array + { + return [ + 'index' => ManageEggPrices::route('/'), + ]; + } + + public static function getRecordRouteBindingEloquentQuery(): Builder + { + return parent::getRecordRouteBindingEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/Master/EggPrices/Pages/ManageEggPrices.php b/app/Filament/Resources/Master/EggPrices/Pages/ManageEggPrices.php new file mode 100644 index 0000000..8931021 --- /dev/null +++ b/app/Filament/Resources/Master/EggPrices/Pages/ManageEggPrices.php @@ -0,0 +1,31 @@ +label('Tambah') + ->modalHeading('Tambah Harga Telur') + ->modalSubmitActionLabel('Simpan') + ->modalCancelActionLabel('Batal') + ->extraModalFooterActions(fn (CreateAction $action): array => [ + $action->makeModalSubmitAction('createAnother', arguments: ['another' => true]) + ->label('Simpan dan Tambah Lagi'), + ]) + ->modalWidth(Width::Large), + ]; + } +} diff --git a/app/Models/EggPrice.php b/app/Models/EggPrice.php new file mode 100644 index 0000000..31ea348 --- /dev/null +++ b/app/Models/EggPrice.php @@ -0,0 +1,24 @@ + 'integer', + ]; + + public function unit(): BelongsTo + { + return $this->belongsTo(Unit::class); + } +} diff --git a/database/factories/EggPriceFactory.php b/database/factories/EggPriceFactory.php new file mode 100644 index 0000000..34184df --- /dev/null +++ b/database/factories/EggPriceFactory.php @@ -0,0 +1,26 @@ + + */ +class EggPriceFactory extends Factory +{ + protected $model = EggPrice::class; + + public function definition(): array + { + $unit = Unit::inRandomOrder()->first() ?? Unit::factory()->create(); + + return [ + 'name' => $this->faker->randomElement(['Ecer', 'Grosir', 'Distributor']).' '.$this->faker->randomElement(['Pagi', 'Siang', 'Malam']), + 'unit_id' => $unit->id, + 'price' => $this->faker->numberBetween(1500, 3000), + ]; + } +} diff --git a/database/migrations/2026_02_18_000006_create_egg_prices_table.php b/database/migrations/2026_02_18_000006_create_egg_prices_table.php new file mode 100644 index 0000000..8a43a91 --- /dev/null +++ b/database/migrations/2026_02_18_000006_create_egg_prices_table.php @@ -0,0 +1,26 @@ +id(); + $table->string('name', 50); + $table->foreignId('unit_id')->constrained()->cascadeOnDelete(); + $table->unsignedInteger('price'); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); + $table->softDeletes(); + }); + } + + public function down(): void + { + Schema::dropIfExists('egg_prices'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 3199357..387c479 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -23,6 +23,7 @@ public function run(): void FeedPurchaseSeeder::class, EggCollectionSeeder::class, CustomerSeeder::class, + EggPriceSeeder::class, ]); } } diff --git a/database/seeders/EggPriceSeeder.php b/database/seeders/EggPriceSeeder.php new file mode 100644 index 0000000..00b26fb --- /dev/null +++ b/database/seeders/EggPriceSeeder.php @@ -0,0 +1,50 @@ +create([ + 'name' => 'Kilogram', + 'alias' => 'kg', + ]); + + $defaults = [ + [ + 'name' => 'Ecer', + 'price' => 2800, + ], + [ + 'name' => 'Grosir', + 'price' => 2600, + ], + [ + 'name' => 'Distributor', + 'price' => 2500, + ], + ]; + + foreach ($defaults as $data) { + EggPrice::firstOrCreate( + [ + 'name' => $data['name'], + 'unit_id' => $unit->id, + ], + [ + 'price' => $data['price'], + ] + ); + } + + EggPrice::factory()->count(5)->create(); + } +}