From dbd235fcbe1a1fe52a5e01a721e08c8fcc77e87f Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Mon, 9 Feb 2026 09:43:39 +0700 Subject: [PATCH] feat: Add Chicken entity with model, migration, Filament resource, and status enum. --- app/Enums/ChickenStatus.php | 45 +++++ .../Master/Chickens/ChickenResource.php | 164 ++++++++++++++++++ .../Master/Chickens/Pages/ManageChickens.php | 31 ++++ app/Models/Chicken.php | 24 +++ ...026_02_09_021857_create_chickens_table.php | 35 ++++ 5 files changed, 299 insertions(+) create mode 100644 app/Enums/ChickenStatus.php create mode 100644 app/Filament/Resources/Master/Chickens/ChickenResource.php create mode 100644 app/Filament/Resources/Master/Chickens/Pages/ManageChickens.php create mode 100644 app/Models/Chicken.php create mode 100644 database/migrations/2026_02_09_021857_create_chickens_table.php diff --git a/app/Enums/ChickenStatus.php b/app/Enums/ChickenStatus.php new file mode 100644 index 0000000..bba4b58 --- /dev/null +++ b/app/Enums/ChickenStatus.php @@ -0,0 +1,45 @@ + 'Aktif', + self::DEAD => 'Mati', + self::CULLED => 'Dimusnahkan', + self::SOLD => 'Dijual', + }; + } + + public function getColor(): string|array|null + { + return match ($this) { + self::ACTIVE => 'success', + self::DEAD => 'danger', + self::CULLED => 'warning', + self::SOLD => 'primary', + }; + } + + public static function options(): array + { + return collect(self::cases()) + ->mapWithKeys(fn ($case) => [$case->value => $case->getLabel()]) + ->toArray(); + } +} diff --git a/app/Filament/Resources/Master/Chickens/ChickenResource.php b/app/Filament/Resources/Master/Chickens/ChickenResource.php new file mode 100644 index 0000000..c1176fa --- /dev/null +++ b/app/Filament/Resources/Master/Chickens/ChickenResource.php @@ -0,0 +1,164 @@ +components([ + TextInput::make('tag_code') + ->label('Kode Tag') + ->placeholder('...') + ->autocomplete(false) + ->autofocus() + ->required() + ->maxLength(20) + ->unique(ignoreRecord: true), + + DatePicker::make('hatch_date') + ->label('Tanggal Menetas') + ->placeholder('Pilih Tanggal') + ->native(false) + ->displayFormat('l, d F Y'), + + DatePicker::make('arrival_date') + ->label('Tanggal Tiba') + ->placeholder('Pilih Tanggal') + ->required() + ->native(false) + ->displayFormat('l, d F Y'), + + DatePicker::make('exit_date') + ->label('Tanggal Keluar/Afkir') + ->placeholder('Pilih Tanggal') + ->native(false) + ->displayFormat('l, d F Y'), + + Select::make('status') + ->label('Status') + ->options(ChickenStatus::class) + ->required() + ->native(false) + ->default(ChickenStatus::ACTIVE), + ]) + ->columns(1); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + TextColumn::make('tag_code') + ->label('Kode Tag') + ->searchable() + ->sortable(), + + TextColumn::make('hatch_date') + ->label('Tanggal Menetas') + ->date('l, d F Y') + ->sortable(), + + TextColumn::make('arrival_date') + ->label('Tanggal Tiba') + ->date('l, d F Y') + ->sortable(), + + TextColumn::make('exit_date') + ->label('Tanggal Keluar') + ->date('l, d F Y') + ->sortable(), + + TextColumn::make('status') + ->label('Status') + ->badge() + ->sortable(), + + ...TimestampColumns::make(), + ]) + ->filters([ + SelectFilter::make('status') + ->label('Status') + ->options(ChickenStatus::class) + ->native(false), + + TrashedFilter::make() + ->native(false), + ]) + ->recordActions([ + EditAction::make() + ->modalWidth(Width::Large), + + DeleteAction::make(), + + ForceDeleteAction::make(), + + RestoreAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + ...DefaultBulkActions::make('Ayam'), + ]), + ]) + ->emptyStateIcon(Heroicon::RectangleGroup) + ->emptyStateDescription('Setelah Anda membuat data pertama, maka akan muncul disini.') + ->defaultSort('created_at', 'desc') + ->deferFilters(false); + } + + public static function getPages(): array + { + return [ + 'index' => ManageChickens::route('/'), + ]; + } + + public static function getRecordRouteBindingEloquentQuery(): Builder + { + return parent::getRecordRouteBindingEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/Master/Chickens/Pages/ManageChickens.php b/app/Filament/Resources/Master/Chickens/Pages/ManageChickens.php new file mode 100644 index 0000000..7b12835 --- /dev/null +++ b/app/Filament/Resources/Master/Chickens/Pages/ManageChickens.php @@ -0,0 +1,31 @@ +label('Tambah') + ->modalHeading('Tambah Ayam') + ->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/Chicken.php b/app/Models/Chicken.php new file mode 100644 index 0000000..d8f7c28 --- /dev/null +++ b/app/Models/Chicken.php @@ -0,0 +1,24 @@ + 'date', + 'arrival_date' => 'date', + 'exit_date' => 'date', + 'status' => ChickenStatus::class, + ]; + } +} diff --git a/database/migrations/2026_02_09_021857_create_chickens_table.php b/database/migrations/2026_02_09_021857_create_chickens_table.php new file mode 100644 index 0000000..3155a0e --- /dev/null +++ b/database/migrations/2026_02_09_021857_create_chickens_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('tag_code', 20); + $table->date('hatch_date')->nullable(); + $table->date('arrival_date'); + $table->date('exit_date')->nullable(); + $table->enum('status', ChickenStatus::cases())->default(ChickenStatus::ACTIVE->value)->comment(ChickenStatus::comment()); + $table->timestamp('created_at')->useCurrent(); + $table->timestamp('updated_at')->nullable()->useCurrentOnUpdate(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('chickens'); + } +};