From cda7716cfaea12e0b899dded07c82eb62569dd2a Mon Sep 17 00:00:00 2001 From: hildaaaevs <149044919+hildaaaevs@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:37:33 +0700 Subject: [PATCH] Upload bukti pembayaran --- app/Filament/Resources/ReservasiiResource.php | 62 ++++++++-- app/Filament/Widgets/ReservasiTerbaru.php | 3 - app/Livewire/BookingPage.php | 8 +- app/Livewire/PaketFotoPage.php | 18 ++- app/Livewire/SuccesPage.php | 5 + app/Livewire/UploadBuktiPembayaran.php | 62 ++++++++++ app/Models/Reservasii.php | 4 +- ..._02_20_043621_create_reservasiis_table.php | 2 + resources/views/layouts/app.blade.php | 21 ++++ .../views/livewire/auth/login-page.blade.php | 2 +- .../livewire/auth/register-page.blade.php | 8 +- .../views/livewire/booking-page.blade.php | 11 +- .../livewire/detail-paket-foto-page.blade.php | 2 +- resources/views/livewire/histori.blade.php | 27 +++-- resources/views/livewire/home-page.blade.php | 7 +- .../views/livewire/partials/footer.blade.php | 37 +----- .../views/livewire/succes-page.blade.php | 19 +++- .../upload-bukti-pembayaran.blade.php | 106 ++++++++++++++++++ routes/web.php | 4 +- 19 files changed, 318 insertions(+), 90 deletions(-) create mode 100644 app/Livewire/UploadBuktiPembayaran.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/livewire/upload-bukti-pembayaran.blade.php diff --git a/app/Filament/Resources/ReservasiiResource.php b/app/Filament/Resources/ReservasiiResource.php index a99b767..c320342 100644 --- a/app/Filament/Resources/ReservasiiResource.php +++ b/app/Filament/Resources/ReservasiiResource.php @@ -34,6 +34,7 @@ use Filament\Forms\Components\BelongsToSelect; use Barryvdh\DomPDF\Facade\Pdf; use Filament\Forms\Components\Modal; +use Filament\Forms\Components\FileUpload; class ReservasiiResource extends Resource { @@ -69,7 +70,6 @@ public static function form(Form $form): Form ->options([ 'tunai' => 'Tunai', 'transfer' => 'Transfer Bank', - 'wallet' => 'E-Wallet', ]) ->required(), Radio::make('tipe_pembayaran') @@ -79,6 +79,25 @@ public static function form(Form $form): Form 'dp' => 'DP', ]) ->required(), + Select::make('status_pembayaran') + ->label('Status Pembayaran') + ->options([ + 'pending' => 'Pending', + 'approved' => 'Approved', + 'rejected' => 'Rejected', + ]) + ->required() + ->default('pending'), + FileUpload::make('bukti_pembayaran') + ->label('Bukti Pembayaran') + ->image() + ->directory('bukti-pembayaran') + ->visibility('public') + ->imageResizeMode('cover') + ->imageCropAspectRatio('16:9') + ->imageResizeTargetWidth('1920') + ->imageResizeTargetHeight('1080') + ->columnSpanFull(), ]) ])->columnSpan(1), @@ -100,7 +119,7 @@ public static function form(Form $form): Form DatePicker::make('tanggal') ->label('Tanggal') ->required(), - Select::make('waktu') + Select::make('waktu') ->label('Pilih Jam') ->options( collect(range(8, 23))->mapWithKeys(function ($hour) { @@ -109,6 +128,9 @@ public static function form(Form $form): Form })->toArray() ) ->required() + ->disabled() + ->dehydrated() + ->default(fn ($record) => $record?->waktu), ]), ])->columnSpan(1), @@ -220,8 +242,19 @@ public static function table(Table $table): Table 'dp' => 'danger', }), - Tables\Columns\TextColumn::make('metode_pembayaran') - ->badge(), + Tables\Columns\TextColumn::make('status_pembayaran') + ->label('Status') + ->badge() + ->color(fn (string $state): string => match (strtolower($state)) { + 'pending' => 'warning', + 'approved' => 'success', + 'rejected' => 'danger', + }), + + Tables\Columns\ImageColumn::make('bukti_pembayaran') + ->label('Bukti Pembayaran') + ->size(100), + ]) ->filters([ Tables\Filters\Filter::make('tanggal') @@ -234,6 +267,13 @@ public static function table(Table $table): Table fn (Builder $query, $date): Builder => $query->whereDate('tanggal', $date), ); }), + Tables\Filters\SelectFilter::make('status_pembayaran') + ->options([ + 'pending' => 'Pending', + 'approved' => 'Approved', + 'rejected' => 'Rejected', + ]) + ->label('Status Pembayaran'), ]) ->actions([ ActionGroup::make([ @@ -281,20 +321,20 @@ public static function getRelations(): array public static function getNavigationBadge(): ?string { - // Hitung jumlah reservasi dengan tipe pembayaran 'dp' - $dpCount = static::getModel()::where('tipe_pembayaran', 'dp')->count(); + // Hitung jumlah reservasi dengan status pending + $pendingCount = static::getModel()::where('status_pembayaran', 'pending')->count(); // Kembalikan jumlah jika ada, null jika tidak ada - return $dpCount > 0 ? (string) $dpCount : null; + return $pendingCount > 0 ? (string) $pendingCount : null; } public static function getNavigationBadgeColor(): ?string { - // Hitung jumlah reservasi dengan tipe pembayaran 'dp' - $dpCount = static::getModel()::where('tipe_pembayaran', 'dp')->count(); + // Hitung jumlah reservasi dengan status pending + $pendingCount = static::getModel()::where('status_pembayaran', 'pending')->count(); - // Kembalikan warna merah jika ada reservasi DP - return $dpCount > 0 ? 'danger' : null; + // Kembalikan warna warning jika ada reservasi pending + return $pendingCount > 0 ? 'warning' : null; } public static function getPages(): array diff --git a/app/Filament/Widgets/ReservasiTerbaru.php b/app/Filament/Widgets/ReservasiTerbaru.php index 44e551c..8f20828 100644 --- a/app/Filament/Widgets/ReservasiTerbaru.php +++ b/app/Filament/Widgets/ReservasiTerbaru.php @@ -41,9 +41,6 @@ public function table(Table $table): Table 'full' => 'succes', 'DP' => 'danger' }), - TextColumn::make('metode_pembayaran') - ->label('Metode Pembayaran') - ->badge(), TextColumn::make('created_at') ->label('Waktu Reservasi') ]) diff --git a/app/Livewire/BookingPage.php b/app/Livewire/BookingPage.php index 7145c9b..c339673 100644 --- a/app/Livewire/BookingPage.php +++ b/app/Livewire/BookingPage.php @@ -159,6 +159,7 @@ public function placeOrder() 'total' => $this->totalPrice, 'tipe_pembayaran' => $this->tipe_pembayaran, 'metode_pembayaran' => 'transfer', // Default transfer, bisa diubah sesuai pilihan + 'status_pembayaran' => 'pending' ]); // Membuat detail reservasi @@ -170,10 +171,9 @@ public function placeOrder() 'total_harga' => $this->totalPrice, ]); - // Tampilkan pesan sukses dan redirect - session()->flash('message', 'Booking berhasil dibuat! Silahkan lakukan pembayaran sesuai metode yang dipilih.'); - session()->flash('booking_name', $this->nama); - return redirect()->route('booking.success'); + // Tampilkan pesan sukses dan redirect ke halaman upload bukti pembayaran + session()->flash('message', 'Booking berhasil dibuat! Silahkan upload bukti pembayaran.'); + return redirect()->route('upload.bukti.pembayaran', $reservasi->id); } public function render() diff --git a/app/Livewire/PaketFotoPage.php b/app/Livewire/PaketFotoPage.php index d06c285..31b5f5d 100644 --- a/app/Livewire/PaketFotoPage.php +++ b/app/Livewire/PaketFotoPage.php @@ -27,18 +27,16 @@ class PaketFotoPage extends Component public function render() { - $paketfotoQuery = PaketFoto::query()->where('status', 1); + $paketfoto = PaketFoto::when($this->sort === 'price', function($query) { + return $query->orderBy('harga_paket_foto', 'asc'); + }) + ->when($this->sort === 'latest', function($query) { + return $query->latest(); + }) + ->paginate(6); - if($this->sort == 'latest') { - $paketfotoQuery->latest(); - } - - if($this->sort == 'price') { - $paketfotoQuery->orderBy('harga_paket_foto'); - } - return view('livewire.paket-foto-page', [ - 'paketfoto' => $paketfotoQuery->paginate(6), + 'paketfoto' => $paketfoto ]); } } diff --git a/app/Livewire/SuccesPage.php b/app/Livewire/SuccesPage.php index a38e1b3..4835c24 100644 --- a/app/Livewire/SuccesPage.php +++ b/app/Livewire/SuccesPage.php @@ -29,6 +29,11 @@ public function mount($id = null) session()->flash('error', 'Tidak ada data booking yang ditemukan'); return redirect()->route('home'); } + + // Jika status pending dan belum ada bukti pembayaran, redirect ke halaman upload + if ($this->booking->status_pembayaran === 'pending' && !$this->booking->bukti_pembayaran) { + return redirect()->route('upload.bukti.pembayaran', $this->booking->id); + } // Ambil nama dari session $this->bookingName = session('booking_name'); diff --git a/app/Livewire/UploadBuktiPembayaran.php b/app/Livewire/UploadBuktiPembayaran.php new file mode 100644 index 0000000..89d7f55 --- /dev/null +++ b/app/Livewire/UploadBuktiPembayaran.php @@ -0,0 +1,62 @@ +bookingId = $id; + $this->booking = Reservasii::with(['user', 'detail.paketFoto', 'promo']) + ->where('user_id', auth()->id()) + ->where('id', $id) + ->first(); + + if (!$this->booking) { + session()->flash('error', 'Data booking tidak ditemukan'); + return redirect()->route('histori'); + } + + if ($this->booking->status_pembayaran === 'approved') { + return redirect()->route('booking.success', $this->booking->id); + } + } + + public function uploadBuktiPembayaran() + { + $this->validate([ + 'bukti_pembayaran' => 'required|image|max:2048', // max 2MB + ], [ + 'bukti_pembayaran.required' => 'Bukti pembayaran harus diupload', + 'bukti_pembayaran.image' => 'File harus berupa gambar', + 'bukti_pembayaran.max' => 'Ukuran file maksimal 2MB', + ]); + + $path = $this->bukti_pembayaran->store('bukti-pembayaran', 'public'); + + $this->booking->update([ + 'bukti_pembayaran' => $path, + 'status_pembayaran' => 'pending' + ]); + + session()->flash('message', 'Bukti pembayaran berhasil diupload. Silahkan tunggu konfirmasi dari admin.'); + return redirect()->route('histori'); + } + + public function render() + { + return view('livewire.upload-bukti-pembayaran'); + } +} \ No newline at end of file diff --git a/app/Models/Reservasii.php b/app/Models/Reservasii.php index 313e7db..2cd1cc2 100644 --- a/app/Models/Reservasii.php +++ b/app/Models/Reservasii.php @@ -17,7 +17,9 @@ class Reservasii extends Model 'promo_id', 'total', 'tipe_pembayaran', - 'metode_pembayaran' + 'metode_pembayaran', + 'bukti_pembayaran', + 'status_pembayaran' ]; protected $casts = [ diff --git a/database/migrations/2025_02_20_043621_create_reservasiis_table.php b/database/migrations/2025_02_20_043621_create_reservasiis_table.php index 5ec6433..1fb583e 100644 --- a/database/migrations/2025_02_20_043621_create_reservasiis_table.php +++ b/database/migrations/2025_02_20_043621_create_reservasiis_table.php @@ -21,6 +21,8 @@ public function up(): void $table->decimal('total',10 , 2); $table->enum('tipe_pembayaran',['full','DP']); $table->string('metode_pembayaran'); + $table->string('bukti_pembayaran')->nullable(); + $table->enum('status_pembayaran', ['pending', 'approved', 'rejected'])->default('pending'); $table->timestamps(); }); } diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..70d7fdd --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,21 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + @livewireStyles + @stack('scripts') + + + + + @livewireScripts + @stack('scripts') + + \ No newline at end of file diff --git a/resources/views/livewire/auth/login-page.blade.php b/resources/views/livewire/auth/login-page.blade.php index 097292b..8331724 100644 --- a/resources/views/livewire/auth/login-page.blade.php +++ b/resources/views/livewire/auth/login-page.blade.php @@ -21,7 +21,7 @@
- + @error('email')

{{ $message }}

diff --git a/resources/views/livewire/auth/register-page.blade.php b/resources/views/livewire/auth/register-page.blade.php index 99ded44..cbf65d5 100644 --- a/resources/views/livewire/auth/register-page.blade.php +++ b/resources/views/livewire/auth/register-page.blade.php @@ -12,11 +12,11 @@
-

Sign In

+

Daftar

Sudah punya akun? - Log in disini + Login

@@ -46,7 +46,7 @@
- +
@error('email') @@ -82,7 +82,7 @@
diff --git a/resources/views/livewire/booking-page.blade.php b/resources/views/livewire/booking-page.blade.php index ea75937..7345934 100644 --- a/resources/views/livewire/booking-page.blade.php +++ b/resources/views/livewire/booking-page.blade.php @@ -1,6 +1,6 @@

- Booking + Reservasi

@@ -14,7 +14,7 @@
@@ -120,7 +120,6 @@ class="{{ $isUnavailable ? 'text-gray-400 bg-gray-100' : '' }}"
-