schema([ Grid::make(2) ->schema([ Group::make()->schema([ Section::make('Informasi Reservasi')->schema([ Select::make('user_id') ->label('Nama') ->relationship('user', 'name') ->searchable() ->preload() ->required(), Select::make('metode_pembayaran') ->label('Metode pembayaran') ->options([ 'tunai' => 'Tunai', 'transfer' => 'Transfer Bank', 'wallet' => 'E-Wallet', ]) ->required(), Radio::make('tipe_pembayaran') ->label('Tipe pembayaran') ->options([ 'full' => 'Full', 'dp' => 'DP', ]) ->required(), ]) ])->columnSpan(1), Group::make()->schema([ Section::make('Promo')->schema([ Select::make('promo_id') ->label('Promo') ->relationship('promo', 'kode') ->searchable() ->preload() ->nullable() ->options(function() { return \App\Models\Promo::where('aktif', true) ->pluck('kode', 'id'); }), ]), Section::make('Jadwal Reservasi')->schema([ DatePicker::make('tanggal') ->label('Tanggal') ->required(), Select::make('waktu') ->label('Pilih Jam') ->options( collect(range(8, 23))->mapWithKeys(function ($hour) { $formatted = str_pad($hour, 2, '0', STR_PAD_LEFT) . ':00'; return [$formatted => $formatted]; })->toArray() ) ->required() ]), ])->columnSpan(1), Section::make('Detail Reservasi')->schema([ Repeater::make('detail') ->relationship() ->schema([ Grid::make(12) ->schema([ Select::make('paket_foto_id') ->relationship('paketFoto', 'nama_paket_foto') ->searchable() ->preload() ->required() ->distinct() ->disableOptionsWhenSelectedInSiblingRepeaterItems() ->columnSpan(3) ->reactive() ->afterStateUpdated(fn ($state, Set $set) => $set('harga', PaketFoto::find ($state)?->harga_paket_foto ?? 0)) ->afterStateUpdated(fn ($state, Set $set) => $set('total_harga', PaketFoto::find ($state)?->harga_paket_foto ?? 0)), Select::make('warna') ->label('Background') ->required() ->options([ 'putih' => 'White', 'abu' => 'Grey', 'cream' => 'Cream', 'spotlight' => 'Spotlight' ]) ->columnSpan(2), // Lebih kecil karena opsinya sedikit TextInput::make('jumlah') ->numeric() ->default(1) ->required() ->minValue(1) ->columnSpan(2) ->reactive() ->afterStateUpdated(fn ($state, Set $set, Get $get) => $set('total_harga', $state*$get('harga'))), TextInput::make('harga') ->numeric() ->required() ->disabled() ->dehydrated() ->columnSpan(2), TextInput::make('total_harga') ->numeric() ->required() ->dehydrated() ->columnSpan(3), ]), ]) ->columns(12), Placeholder::make('total_placeholder') ->label('Total') ->content(function (Get $get, Set $set){ $total = 0; if (!$repeaters = $get('detail')){ return $total; } foreach ($repeaters as $key => $repeater){ $total += $get("detail.{$key}.total_harga"); } $set('total', $total); return 'Rp ' . number_format($total, 0, ',', '.'); }), Hidden::make('total') ->default(0) ])->columnSpanFull(), ]) ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('user.name') ->label('Nama User') ->searchable(), Tables\Columns\TextColumn::make('tanggal') ->date('d F Y') ->sortable(), Tables\Columns\TextColumn::make('waktu') ->label('Jam'), Tables\Columns\TextColumn::make('promo.kode') ->label('Kode Promo') ->searchable(), Tables\Columns\TextColumn::make('total') ->money('IDR'), Tables\Columns\TextColumn::make('tipe_pembayaran') ->badge() ->color(fn (string $state): string => match (strtolower($state)) { 'full' => 'success', 'dp' => 'danger', default => 'secondary', }), Tables\Columns\TextColumn::make('metode_pembayaran') ->badge(), Tables\Columns\TextColumn::make('created_at') ->label('Tanggal Dibuat') ->dateTime('d F Y - H:i') ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ Tables\Filters\SelectFilter::make('tipe_pembayaran') ->options([ 'full' => 'Full Payment', 'dp' => 'Down Payment', ]) ->label('Status Pembayaran'), Tables\Filters\Filter::make('tanggal') ->form([ Forms\Components\DatePicker::make('tanggal_from')->label('Dari Tanggal'), Forms\Components\DatePicker::make('tanggal_until')->label('Sampai Tanggal'), ]) ->query(function (Builder $query, array $data): Builder { return $query ->when( $data['tanggal_from'], fn (Builder $query, $date): Builder => $query->whereDate('tanggal', '>=', $date), ) ->when( $data['tanggal_until'], fn (Builder $query, $date): Builder => $query->whereDate('tanggal', '<=', $date), ); }), ]) ->actions([ ActionGroup::make([ ViewAction::make(), EditAction::make(), DeleteAction::make() ]) ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]) ->defaultSort('created_at', 'desc'); } public static function getRelations(): array { return [ // ]; } public static function getNavigationBadge(): ?string { // Hitung jumlah reservasi dengan tipe pembayaran 'dp' $dpCount = static::getModel()::where('tipe_pembayaran', 'dp')->count(); // Kembalikan jumlah jika ada, null jika tidak ada return $dpCount > 0 ? (string) $dpCount : null; } public static function getNavigationBadgeColor(): ?string { // Hitung jumlah reservasi dengan tipe pembayaran 'dp' $dpCount = static::getModel()::where('tipe_pembayaran', 'dp')->count(); // Kembalikan warna merah jika ada reservasi DP return $dpCount > 0 ? 'danger' : null; } public static function getPages(): array { return [ 'index' => Pages\ListReservasiis::route('/'), 'create' => Pages\CreateReservasii::route('/create'), 'edit' => Pages\EditReservasii::route('/{record}/edit'), 'view' => Pages\ViewReservasii::route('/{record}'), ]; } }