MIF_E31222582/app/Filament/Resources/ReservasiiResource.php

310 lines
13 KiB
PHP

<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ReservasiiResource\Pages;
use App\Filament\Resources\ReservasiiResource\RelationManagers;
use Filament\Tables\Actions\ActionGroup;
use App\Models\PaketFoto;
use App\Models\Reservasii;
use Filament\Tables\Actions\ViewAction;
use Filament\Tables\Actions\EditAction;
use Filament\Tables\Actions\DeleteAction;
use Filament\Forms;
use Filament\Forms\Components\Group;
use Filament\Forms\Components\Hidden;
use Filament\Forms\Components\Placeholder;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Section;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\NumericInput;
use Filament\Forms\Set;
use Filament\Forms\Components\TimePicker;
use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\BelongsToSelect;
use Barryvdh\DomPDF\Facade\Pdf;
use Filament\Forms\Components\Modal;
class ReservasiiResource extends Resource
{
protected static ?string $model = Reservasii::class;
protected static ?string $navigationIcon = 'heroicon-o-squares-plus';
protected static ?string $navigationLabel = 'Reservasi';
public static function getPluralLabel(): string{
return 'Reservasi';}
public static function getModelLabel(): string
{
return 'Reservasi';
}
public static function form(Form $form): Form
{
return $form
->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(),
TextInput::make('nama')
->label('Nama')
->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('nama')
->label('Nama')
->searchable(),
Tables\Columns\TextColumn::make('tanggal')
->date('d F Y')
->sortable(),
Tables\Columns\TextColumn::make('waktu')
->label('Jam')
->time('H:i'),
Tables\Columns\TextColumn::make('detail.paketFoto.nama_paket_foto')
->label('Paket Foto')
->listWithLineBreaks()
->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',
}),
Tables\Columns\TextColumn::make('metode_pembayaran')
->badge(),
])
->filters([
Tables\Filters\Filter::make('tanggal')
->form([
DatePicker::make('tanggal')->label('Tanggal'),
])
->query(function (Builder $query, array $data): Builder {
return $query->when(
$data['tanggal'],
fn (Builder $query, $date): Builder => $query->whereDate('tanggal', $date),
);
}),
])
->actions([
ActionGroup::make([
ViewAction::make(),
EditAction::make(),
DeleteAction::make()
])
])
->headerActions([
Tables\Actions\Action::make('downloadPdf')
->label('Download PDF')
->icon('heroicon-o-document-arrow-down')
->form([
DatePicker::make('start_date')
->label('Tanggal Mulai')
->required(),
DatePicker::make('end_date')
->label('Tanggal Selesai')
->required(),
])
->action(function (array $data) {
$reservasis = Reservasii::with(['user', 'detail.paketFoto'])
->whereBetween('tanggal', [$data['start_date'], $data['end_date']])
->get();
$pdf = Pdf::loadView('pdf.reservasi', [
'reservasis' => $reservasis,
'start_date' => $data['start_date'],
'end_date' => $data['end_date']
]);
return response()->streamDownload(function () use ($pdf) {
echo $pdf->output();
}, 'reservasi.pdf');
})
]);
}
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}'),
];
}
}