diff --git a/app/Http/Controllers/BookingController.php b/app/Http/Controllers/BookingController.php index 45fa8eb..75edac0 100644 --- a/app/Http/Controllers/BookingController.php +++ b/app/Http/Controllers/BookingController.php @@ -17,12 +17,12 @@ public function index(Request $request) { $query = Booking::query(); - // Filter pencarian berdasarkan status_booking - if ($request->has('search') && !empty($request->search)) { - $query->where('status_booking', 'like', '%' . $request->search . '%'); - } + // Filter pencarian berdasarkan bulan dari tanggal_booking + if ($request->has('search') && !empty($request->search)) { + $query->whereMonth('tanggal_checkout', $request->search); + } - $bookings = $query->orderBy('tanggal_booking', 'desc')->paginate(10); + $bookings = $query->orderBy('tanggal_checkout', 'desc')->paginate(10); return view('admin.booking', compact('bookings')); } @@ -220,4 +220,25 @@ public function approvePerpanjangan($id) return redirect()->route('admin.booking')->with('success', 'Perpanjangan berhasil dikonfirmasi.'); } + +public function markAsCompleted($id_booking) +{ + $booking = Booking::findOrFail($id_booking); + + // Pastikan hanya booking yang dikonfirmasi bisa selesai + if ($booking->status_booking === 'Dikonfirmasi') { + $booking->update(['status_booking' => 'Selesai']); + + // Update status kamar menjadi tersedia + $room = $booking->room; + if ($room) { + $room->update(['status' => 'tersedia']); + } + + return redirect()->route('admin.booking')->with('success', 'Booking telah diselesaikan.'); + } + + return redirect()->route('admin.booking')->with('error', 'Booking belum dikonfirmasi.'); +} + } diff --git a/app/Http/Controllers/DashboardAdminController.php b/app/Http/Controllers/DashboardAdminController.php index 975f442..308ab2e 100644 --- a/app/Http/Controllers/DashboardAdminController.php +++ b/app/Http/Controllers/DashboardAdminController.php @@ -6,19 +6,43 @@ use App\Models\User; use App\Models\Room; use App\Models\Booking; +use Carbon\Carbon; class DashboardAdminController extends Controller { public function index() - { - // Mengambil data dari database - $totalUsers = User::count(); - $totalRooms = Room::count(); - $totalBookings = Booking::count(); - $pendingBookings = Booking::where('status_booking', 'pending')->with('user', 'room')->get(); +{ + $totalUsers = User::count(); + $totalRooms = Room::count(); + $totalBookings = Booking::count(); - // Mengirim data ke view - return view('admin.dashboard', compact('totalUsers', 'totalRooms', 'totalBookings', 'pendingBookings')); + // Ambil semua booking yang sudah dikonfirmasi + $confirmedBookings = Booking::with('user', 'room') + ->where('status_booking', 'Dikonfirmasi') + ->get(); + + // Buat array untuk simpan sisa hari per booking + $daysLeftPerBooking = []; + + foreach ($confirmedBookings as $booking) { + if ($booking->tanggal_checkout) { + $daysLeftPerBooking[$booking->id_booking] = now()->diffInDays(Carbon::parse($booking->tanggal_checkout), false); + } else { + $daysLeftPerBooking[$booking->id_booking] = null; + } } - + + // Ambil booking pending untuk ditampilkan di tabel + $pendingBookings = Booking::where('status_booking', 'pending')->with('user', 'room')->get(); + + return view('admin.dashboard', compact( + 'totalUsers', + 'totalRooms', + 'totalBookings', + 'pendingBookings', + 'confirmedBookings', + 'daysLeftPerBooking' + )); +} + } diff --git a/app/Http/Controllers/DashboardPemilikController.php b/app/Http/Controllers/DashboardPemilikController.php index b5aa80e..e075fa9 100644 --- a/app/Http/Controllers/DashboardPemilikController.php +++ b/app/Http/Controllers/DashboardPemilikController.php @@ -57,7 +57,14 @@ public function index(Request $request) return $p - $q; }, $pemasukan, $pengeluaran); - // Kirim data ke view + // Ambil data status kamar (tersedia, terisi, maintenance) + $data_kamar = [ + 'Terisi' => Room::where('status', 'terisi')->count(), + 'Kosong' => Room::where('status', 'tersedia')->count(), + 'Rusak' => Room::where('status', 'maintenance')->count(), + ]; + + // Kirim semua data ke view return view('pemilik.dashboard', compact( 'totalUsers', 'totalRooms', @@ -70,7 +77,8 @@ public function index(Request $request) 'pengeluaran', 'keuntungan', 'tahunList', - 'tahunTerpilih' + 'tahunTerpilih', + 'data_kamar' )); } } diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index d6c347b..d99e085 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -41,20 +41,26 @@ public function create() * Menyimpan data pengeluaran baru ke database. */ public function store(Request $request) - { - $request->validate([ - 'keterangan' => 'required|string|max:255', - 'jumlah_pengeluaran' => 'required|numeric|min:0', - 'tanggal_pengeluaran'=> 'required|date', - ]); +{ + $request->validate([ + 'keterangan' => 'required|string|max:255', + 'jumlah_pengeluaran' => 'required', + 'tanggal_pengeluaran'=> 'required|date', + ]); - Expense::create($request->only(['keterangan', 'jumlah_pengeluaran', 'tanggal_pengeluaran'])); + // Hilangkan titik/koma agar jumlah valid + $jumlah = str_replace(['.', ','], '', $request->jumlah_pengeluaran); - // Update data keuangan - $this->updateFinance(); + Expense::create([ + 'keterangan' => $request->keterangan, + 'jumlah_pengeluaran' => $jumlah, + 'tanggal_pengeluaran' => $request->tanggal_pengeluaran, + ]); - return redirect()->route('admin.expense')->with('success', 'Pengeluaran berhasil ditambahkan.'); - } + $this->updateFinance(); + + return redirect()->route('admin.expense')->with('success', 'Pengeluaran berhasil ditambahkan.'); +} /** * Menampilkan form untuk mengedit pengeluaran. @@ -69,21 +75,28 @@ public function edit($id_pengeluaran) * Memperbarui data pengeluaran di database. */ public function update(Request $request, $id_pengeluaran) - { - $request->validate([ - 'keterangan' => 'required|string|max:255', - 'jumlah_pengeluaran' => 'required|numeric|min:0', - 'tanggal_pengeluaran'=> 'required|date', - ]); +{ + $request->validate([ + 'keterangan' => 'required|string|max:255', + 'jumlah_pengeluaran' => 'required', + 'tanggal_pengeluaran'=> 'required|date', + ]); - $pengeluaran = Expense::findOrFail($id_pengeluaran); - $pengeluaran->update($request->only(['keterangan', 'jumlah_pengeluaran', 'tanggal_pengeluaran'])); + $pengeluaran = Expense::findOrFail($id_pengeluaran); - // Update data keuangan - $this->updateFinance(); + // Hilangkan titik/koma dari input user + $jumlah = str_replace(['.', ','], '', $request->jumlah_pengeluaran); - return redirect()->route('admin.expense')->with('success', 'Pengeluaran berhasil diperbarui.'); - } + $pengeluaran->update([ + 'keterangan' => $request->keterangan, + 'jumlah_pengeluaran' => $jumlah, + 'tanggal_pengeluaran' => $request->tanggal_pengeluaran, + ]); + + $this->updateFinance(); + + return redirect()->route('admin.expense')->with('success', 'Pengeluaran berhasil diperbarui.'); +} /** * Menghapus data pengeluaran dari database. @@ -104,16 +117,32 @@ public function destroy($id_pengeluaran) */ private function updateFinance() { + $tanggalHariIni = now()->format('Y-m-d'); + $totalPemasukan = Transaksi::sum('jumlah_pembayaran'); $totalPengeluaran = Expense::sum('jumlah_pengeluaran'); $totalKeuntungan = $totalPemasukan - $totalPengeluaran; - - Finance::create([ - 'tanggal' => now()->format('Y-m-d'), - 'pemasukan' => $totalPemasukan, - 'pengeluaran' => $totalPengeluaran, - 'keuntungan' => $totalKeuntungan, - 'keterangan' => 'Update otomatis dari data pengeluaran' - ]); + + // Cek apakah sudah ada data finance untuk hari ini + $finance = Finance::where('tanggal', $tanggalHariIni)->first(); + + if ($finance) { + // Update data yang sudah ada + $finance->update([ + 'pemasukan' => $totalPemasukan, + 'pengeluaran' => $totalPengeluaran, + 'keuntungan' => $totalKeuntungan, + 'keterangan' => 'Update otomatis dari data pengeluaran' + ]); + } else { + // Buat data baru + Finance::create([ + 'tanggal' => $tanggalHariIni, + 'pemasukan' => $totalPemasukan, + 'pengeluaran' => $totalPengeluaran, + 'keuntungan' => $totalKeuntungan, + 'keterangan' => 'Update otomatis dari data pengeluaran' + ]); + } } -} +} diff --git a/app/Http/Controllers/KamarController.php b/app/Http/Controllers/KamarController.php index 1e8122b..9ec36b6 100644 --- a/app/Http/Controllers/KamarController.php +++ b/app/Http/Controllers/KamarController.php @@ -1,18 +1,30 @@ -id())->orderBy('tanggal_booking', 'desc')->first(); + $booking = Booking::where('id_user', auth()->id()) + ->orderBy('tanggal_booking', 'desc') + ->first(); + $rooms = Room::all(); - return view('users.peta', compact('booking', 'rooms')); + + $daysLeft = null; + + if ($booking && $booking->status_booking === 'Dikonfirmasi' && $booking->tanggal_checkout) { + $today = Carbon::now(); + $checkoutDate = Carbon::parse($booking->tanggal_checkout); + $daysLeft = $today->diffInDays($checkoutDate, false); + } + + return view('users.peta', compact('booking', 'rooms', 'daysLeft')); } - } diff --git a/app/Http/Controllers/KeuanganController.php b/app/Http/Controllers/KeuanganController.php index 85461b9..4a78ee3 100644 --- a/app/Http/Controllers/KeuanganController.php +++ b/app/Http/Controllers/KeuanganController.php @@ -36,7 +36,15 @@ public function index(Request $request) $row->bulan = $months[$row->bulan] ?? $row->bulan; } - return view('admin.keuangan', compact('filteredLaporan', 'years', 'months')); + // Hitung total pemasukan, pengeluaran, dan keuntungan bersih + $totalPemasukan = $filteredLaporan->sum('total_pemasukan'); + $totalPengeluaran = $filteredLaporan->sum('total_pengeluaran'); + $totalKeuntungan = $filteredLaporan->sum('keuntungan_bersih'); + + // Kirim ke view + return view('admin.keuangan', compact( + 'filteredLaporan', 'years', 'months', + 'totalPemasukan', 'totalPengeluaran', 'totalKeuntungan' + )); } } - diff --git a/public/assets/users/1746684524_kamar.jpg b/public/assets/users/1746684524_kamar.jpg deleted file mode 100644 index 9b5854b..0000000 Binary files a/public/assets/users/1746684524_kamar.jpg and /dev/null differ diff --git a/public/assets/users/1746798080_pembayaran.jpg b/public/assets/users/1747925367_pembayaran.jpg similarity index 100% rename from public/assets/users/1746798080_pembayaran.jpg rename to public/assets/users/1747925367_pembayaran.jpg diff --git a/public/assets/users/1746901541_pembayaran.jpg b/public/assets/users/1747925679_pembayaran.jpg similarity index 100% rename from public/assets/users/1746901541_pembayaran.jpg rename to public/assets/users/1747925679_pembayaran.jpg diff --git a/resources/views/Admin/booking.blade.php b/resources/views/Admin/booking.blade.php index 7d69e76..eeffed4 100644 --- a/resources/views/Admin/booking.blade.php +++ b/resources/views/Admin/booking.blade.php @@ -49,22 +49,12 @@ onclick="return confirm('Apakah Anda yakin ingin menghapus booking ini?');"> - - {{-- - @if($booking->status_booking == 'Pending') -
- @csrf - -
+ + @if ($booking->status_booking === 'Dikonfirmasi') + + Tandai Selesai + @endif - - - @if($booking->status_booking == 'Dikonfirmasi') -
- @csrf - -
- @endif --}} @endforeach diff --git a/resources/views/Admin/createexpense.blade.php b/resources/views/Admin/createexpense.blade.php index 86b3204..2bc4142 100644 --- a/resources/views/Admin/createexpense.blade.php +++ b/resources/views/Admin/createexpense.blade.php @@ -19,8 +19,8 @@
- -
+ +
Kembali diff --git a/resources/views/Admin/dashboard.blade.php b/resources/views/Admin/dashboard.blade.php index 1c31322..e1cda85 100644 --- a/resources/views/Admin/dashboard.blade.php +++ b/resources/views/Admin/dashboard.blade.php @@ -2,7 +2,28 @@ @section('content')

Selamat Datang Di Kos Calista

+ + {{-- Notifikasi sisa masa booking customer (kalau ada booking terakhir) --}} + @isset($booking) + @if (!is_null($daysLeft)) + @if ($daysLeft > 0) +
+ Sisa booking customer: {{ $daysLeft }} hari +
+ @elseif ($daysLeft === 0) +
+ Hari ini adalah hari terakhir masa booking customer! +
+ @else +
+ Masa booking customer sudah berakhir. +
+ @endif + @endif + @endisset +
+ {{-- Statistik --}}
@@ -45,6 +66,8 @@
+ + {{-- Tabel Pending Booking --}}
@@ -64,6 +87,7 @@ Kamar Tanggal Pemesanan Status + Aksi @@ -102,7 +126,6 @@ @endforeach -
@endif @@ -110,5 +133,38 @@
+ + {{-- Tampilkan Booking yang sudah dikonfirmasi beserta sisa hari --}} +
+
+
Sisa Hari Booking
+ @foreach ($confirmedBookings as $booking) +
+

Customer: {{ $booking->user->name }}

+

Booking Kamar: {{ $booking->room->room_type }}

+ @php + $daysLeft = $daysLeftPerBooking[$booking->id_booking] ?? null; + @endphp + + @if(!is_null($daysLeft)) + @if($daysLeft > 0) +
+ Sisa booking: {{ $daysLeft }} hari +
+ @elseif($daysLeft === 0) +
+ Hari ini terakhir masa booking! +
+ @else +
+ Masa booking sudah berakhir +
+ @endif + @endif +
+ @endforeach +
+
-@endsection \ No newline at end of file +
+@endsection diff --git a/resources/views/Admin/rooms.blade.php b/resources/views/Admin/rooms.blade.php index 28cc992..140fd73 100644 --- a/resources/views/Admin/rooms.blade.php +++ b/resources/views/Admin/rooms.blade.php @@ -42,7 +42,7 @@ {{ ($rooms->currentPage() - 1) * $rooms->perPage() + $loop->iteration }} {{ $room->room_number }} {{ $room->room_type }} - Rp {{ number_format($room->harga, 0, ',', '.') }} + Rp {{ number_format((int) $room->harga, 0, ',', '.') }} {{ ucfirst($room->status) }} {{ $room->lantai }} {{ $room->fasilitas }} diff --git a/resources/views/Admin/transaksi.blade.php b/resources/views/Admin/transaksi.blade.php index 629b737..aa186b2 100644 --- a/resources/views/Admin/transaksi.blade.php +++ b/resources/views/Admin/transaksi.blade.php @@ -36,7 +36,7 @@ {{ $index + 1 }} {{ $item->booking->user->name }} - Kamar {{ $item->booking->room->room_number }} - Rp {{ number_format($item->jumlah_pembayaran, 2, ',', '.') }} + Rp {{ number_format((int) $item->jumlah_pembayaran, 0, ',', '.') }} {{ $item->metode_pembayaran ?? 'Belum dipilih' }} {{ ucfirst($item->status_transaksi) }} diff --git a/resources/views/Pemilik/dashboard.blade.php b/resources/views/Pemilik/dashboard.blade.php index a2dafdb..47b56f3 100644 --- a/resources/views/Pemilik/dashboard.blade.php +++ b/resources/views/Pemilik/dashboard.blade.php @@ -1,213 +1,219 @@ @extends('layouts.app1') @section('content') -
-

Selamat Datang Di Kos Calista

+
+

Selamat Datang Di Kos Calista

-
-
-
-
-
-
- +
+
+
+
+
+
+ +
+

{{ $totalUsers }}

+

Total Customer

+
+
+
+
+
+
+
+
+ +
+
+

{{ $totalRooms }}

+

Total Kamar

+
+
+
+
+
+
+
+
+ +
+
+

{{ $totalBookings }}

+

Total Booking

-

{{ $totalUsers }}

-

Total Customer

-
-
-
-
-
- -
+ +
+
+
+
+ + +
+
+ +
-

{{ $totalRooms }}

-

Total Kamar

-
-
-
-
-
-
- -
+ + +
+
+
+
Keuangan
+
-

{{ $totalBookings }}

-

Total Booking

-
-
- -
-
-
-
- - + +
+
+
+
Data Kamar
+ +
+
-
- - -
-
-
-
-
-
-
Bar Chart Keuangan
- -
-
-
- -
-
-
-
Pie Chart Keuangan
- -
-
-
-
@endsection -@push('scripts') - - + + -@endpush + }); + + @endpush \ No newline at end of file diff --git a/resources/views/Users/detail_kamar.blade.php b/resources/views/Users/detail_kamar.blade.php index 96359b8..7117506 100644 --- a/resources/views/Users/detail_kamar.blade.php +++ b/resources/views/Users/detail_kamar.blade.php @@ -51,11 +51,42 @@ class="{{ $room->status == 'tersedia' ? 'text-green-600' : ($room->status == 'te @endif @if (!empty($room->deskripsi)) -
-

Deskripsi:

-

{!! nl2br(e($room->deskripsi)) !!}

-
- @endif + @php + // Pisahkan berdasarkan dua bagian utama: 'Fasilitas umum :' dan 'Aturan di Kos Calista' + $fasilitas = ''; + $aturan = ''; + + if (preg_match('/Fasilitas umum\s*:\s*(.+?)\s*Aturan di Kos Calista\s*/s', $room->deskripsi, $match)) { + $fasilitas = trim($match[1]); + } + + if (preg_match('/Aturan di Kos Calista\s*(.+)/s', $room->deskripsi, $match)) { + $aturan = trim($match[1]); + } + + // Ambil item berdasarkan pola angka di depan (1. xxx 2. xxx ...) + preg_match_all('/\d+\.\s*([^0-9]+)/', $fasilitas, $fasilitasList); + preg_match_all('/\d+\.\s*([^0-9]+)/', $aturan, $aturanList); + @endphp + +
+

Fasilitas Umum:

+
    + @foreach ($fasilitasList[1] as $item) +
  • {{ trim($item) }}
  • + @endforeach +
+
+ +
+

Aturan di Kos Calista:

+
    + @foreach ($aturanList[1] as $item) +
  • {{ trim($item) }}
  • + @endforeach +
+
+ @endif +
diff --git a/routes/web.php b/routes/web.php index 8b5b388..14c8c23 100644 --- a/routes/web.php +++ b/routes/web.php @@ -98,9 +98,9 @@ Route::get('/', [CustomerController::class, 'index'])->name('admin.customer'); Route::get('/create', [CustomerController::class, 'create'])->name('admin.createcustomer'); Route::post('/store', [CustomerController::class, 'store'])->name('admin.storecustomer'); - Route::get('/edit/{id}', [CustomerController::class, 'edit'])->name('admin.editcustomer'); - Route::put('/update/{id}', [CustomerController::class, 'update'])->name('admin.updatecustomer'); - Route::get('/delete/{id}', [CustomerController::class, 'destroy'])->name('admin.deletecustomer'); + Route::get('/edit/{id_user}', [CustomerController::class, 'edit'])->name('admin.editcustomer'); + Route::put('/update/{id_user}', [CustomerController::class, 'update'])->name('admin.updatecustomer'); + Route::get('/delete/{id_user}', [CustomerController::class, 'destroy'])->name('admin.deletecustomer'); }); // Rooms @@ -134,6 +134,7 @@ Route::put('/confirm/{id_booking}', [BookingController::class, 'confirm'])->name('admin.bookingconfirm'); Route::put('/cancel/{id_booking}', [BookingController::class, 'cancel'])->name('admin.bookingcancel'); Route::put('/admin/booking/perpanjangan/{id}/approve', [BookingController::class, 'approvePerpanjangan'])->name('admin.approvePerpanjangan'); + Route::get('/admin/booking/selesai/{id_booking}', [BookingController::class, 'markAsCompleted'])->name('admin.bookingselesai'); }); // Expense