From b09ad3d4244d9c868897dc418dbc74cc8614f5a6 Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Fri, 8 Aug 2025 16:16:10 +0700 Subject: [PATCH] progress label --- app/Http/Controllers/CustomerController.php | 75 +++++++++++---- app/Http/Controllers/DashboardController.php | 3 - app/Http/Controllers/PesananController.php | 8 ++ public/js/checkout/index.js | 92 ++++++++++++++++--- public/js/count/konfirmasiPesanan.js | 20 ++++ public/js/order_guest/functions.js | 17 ++++ public/js/order_guest/index.js | 1 - public/js/pekerjaan/dt.js | 25 +++-- public/js/pesanan_pending/action.js | 3 +- .../views/dashboard/layouts/main.blade.php | 1 + .../dashboard/partials/sidenav.blade.php | 12 +-- .../views/guest/checkout/step/step2.blade.php | 31 ++++++- resources/views/guest/index.blade.php | 61 +++++++++--- routes/web.php | 1 + 14 files changed, 284 insertions(+), 66 deletions(-) create mode 100644 public/js/count/konfirmasiPesanan.js diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 0c9b23b..b747b34 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -44,7 +44,6 @@ class CustomerController extends Controller $payloadHari = range($tanggal_awal, $tanggal_akhir); } } - // Step 1: Ambil menu_id yang sesuai tanggal $menuIdTanggalValid = []; if (!empty($payloadHari)) { @@ -54,10 +53,6 @@ class CustomerController extends Controller ->pluck('master_menu_id') ->unique() ->toArray(); - // Jika tidak ada menu di tanggal tersebut, return kosong langsung - if (empty($menuIdTanggalValid)) { - return self::emptyMenuResponse($perPage); - } } // Step 2: Query menu $menuQuery = DB::connection('dbOrderGizi') @@ -71,11 +66,21 @@ class CustomerController extends Controller if (!empty($search)) { $menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%'); } + $menuQuery->where(function ($q) use ($menuIdTanggalValid, $payloadHari) { + if (!empty($menuIdTanggalValid)) { + // Jika ada filter tanggal: tampilkan menu sesuai tanggal atau yang someday + $q->whereIn('mn.master_menu_id', $menuIdTanggalValid) + ->orWhere('mn.apakah_someday', true); + }else if($payloadHari){ + $q->where('mn.apakah_someday', true); + } + // Jika TIDAK ada tanggal, tidak perlu where apapun — biarkan tampil semua menu + }); - if (!empty($menuIdTanggalValid)) { - $menuQuery->whereIn('mn.master_menu_id', $menuIdTanggalValid); - } - $paginated = $menuQuery->select( + // } + + + $menuItems = $menuQuery->select( 'mn.master_menu_id', 'mn.nama_menu', 'mn.foto', @@ -88,9 +93,9 @@ class CustomerController extends Controller 'mn.apakah_someday', 'mn.apakah_menu_siang', 'mn.apakah_menu_sore', - )->paginate($perPage); + )->get(); - $menuIds = collect($paginated->items())->pluck('master_menu_id')->toArray(); + $menuIds = $menuItems->pluck('master_menu_id')->toArray(); if (empty($menuIds)) { return self::emptyMenuResponse($perPage); @@ -104,11 +109,17 @@ class CustomerController extends Controller ->select('kmd.master_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet') ->get() ->groupBy('master_menu_id'); - $dmph = DB::connection('dbOrderGizi') ->table('public.detail_menu_paket_harian as dmph') ->whereIn('dmph.master_menu_id', $menuIds) ->select('dmph.master_menu_id', 'dmph.tgl_harian') + // ->orderByRaw(" + // CASE + // WHEN tgl_harian >= ? THEN 0 + // ELSE 1 + // END, + // tgl_harian ASC + // ", [$today]) ->get() ->groupBy('master_menu_id'); $kkal = DB::connection('dbOrderGizi') @@ -120,8 +131,7 @@ class CustomerController extends Controller ->groupBy('master_menu_id'); // Step 4: Transform response - $result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { - + $enriched = $menuItems->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { return [ 'master_menu_id' => $menu->master_menu_id, 'nama' => $menu->nama_menu, @@ -154,17 +164,43 @@ class CustomerController extends Controller ]; }); + // Urutkan: someday → tgl_harian terdekat + $sorted = $enriched->sortBy(function ($menu) { + $hariIni = now()->day; + $isSomeday = $menu['apakah_someday'] ? 0 : 1; + + if ($menu['apakah_someday']) { + return [0, 0]; + } + + $tglTerdekat = collect($menu['dmph'])->pluck('tgl_harian') + ->map(function ($tgl) use ($hariIni) { + return $tgl >= $hariIni ? $tgl : $tgl + 31; + }) + ->sort() + ->first() ?? 99; + + return [$isSomeday, $tglTerdekat]; + })->values(); + + // Paginate manual (setelah sort) + $total = $sorted->count(); + $currentPage = request()->get('page', 1); + $offset = ($currentPage - 1) * $perPage; + $pagedData = $sorted->slice($offset, $perPage)->values(); + return response()->json([ 'status' => true, 'message' => 'Berhasil mendapatkan data', 'data' => [ - 'data' => $result, - 'current_page' => $paginated->currentPage(), - 'last_page' => $paginated->lastPage(), - 'per_page' => $paginated->perPage(), - 'total' => $paginated->total(), + 'data' => $pagedData, + 'current_page' => (int) $currentPage, + 'last_page' => (int) ceil($total / $perPage), + 'per_page' => (int) $perPage, + 'total' => $total, ] ]); + } private static function emptyMenuResponse($perPage) @@ -381,6 +417,7 @@ class CustomerController extends Controller ], 200); return back()->with('success', 'Bukti pembayaran berhasil diunggah.'); } catch (\Throwable $th) { + dd($th); DB::rollBack(); return response([ 'status' => false, diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 407f9e1..322e881 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -40,9 +40,6 @@ class DashboardController extends Controller 'o.note_dibatalkan', 'od.status_order as detail_status_order') ->get()->groupBy('order_id'); - - - $grouped = $data->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 981c0d9..c88ba79 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -350,6 +350,14 @@ class PesananController extends Controller return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); } + public function countPesananPending(){ + $count = Order::where('statusenabled', true)->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing'])->count(); + return response()->json([ + 'status' => true, + 'count' => $count, + ]); + } + public function downloadLabel(Request $request){ $items = $request->input('items'); diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 8a43dad..56de014 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -44,7 +44,12 @@ document.addEventListener('DOMContentLoaded', () => { }else if(currentStep === 1){ const {isValid, errorMessage} =validateCartBeforeSubmit(); if (!isValid) { - alert(errorMessage); + Swal.fire({ + title: 'Perhatian!', + text: errorMessage, + icon: 'warning', + confirmButtonText: 'Oke' + }) return } let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); @@ -285,8 +290,21 @@ function renderCartSummary() { ? item.harga_karyawan || 0 : item.harga_public || 0; const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0); - totalKeseluruhan += itemTotal; + console.log(checkout_biodata); + if (checkout_biodata.jenis_customer === "Karyawan RSAB Harapan Kita") { + $('#karyawan').addClass('d-none'); + $('#pasien').removeClass('d-none'); + } else if (checkout_biodata.jenis_customer === "Keluarga Pasien / Penunggu Pasien") { + $('#karyawan').removeClass('d-none'); + $('#pasien').addClass('d-none'); + } else { + $('#karyawan').addClass('d-none'); + $('#pasien').addClass('d-none'); + } + + + totalKeseluruhan += itemTotal; pesananList.forEach((p, i) => { const selectedDate = new Date(p.tgl); const now = new Date(); @@ -296,6 +314,9 @@ function renderCartSummary() { const disableSore = isToday && jam >= 13; const countDate = pesananList.length; + if(checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita'){ + $("#karywan").re + } pesananHTML += `
@@ -559,26 +580,51 @@ function validateStepOne() { const email = document.getElementById('email').value.trim(); if (!jenisCustomer) { - alert('Silakan pilih jenis customer.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan pilih jenis customer.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } if (!namaPemesan) { - alert('Silakan isi nama pemesan.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan isi nama pemesan.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } if (!jenisKelamin) { - alert('Silakan pilih jenis kelamin.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan pilih jenis kelamin.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } if (!noWA) { - alert('Silakan isi nomor WhatsApp.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan isi nomor WhatsApp.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } if (!email) { - alert('Silakan isi email terlebih dahulu.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan isi email terlebih dahulu.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } @@ -587,7 +633,12 @@ function validateStepOne() { if (selected === 'Karyawan RSAB Harapan Kita') { const bagian = document.getElementById('bagian_instalasi').value.trim(); if (!bagian) { - alert('Silakan lengkapi data karyawan.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan lengkapi data karyawan.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } } else if (selected === 'Keluarga Pasien / Penunggu Pasien') { @@ -596,13 +647,23 @@ function validateStepOne() { const noKamar = document.getElementById('no_kamar').value.trim(); const kelas = document.getElementById('kelas_perawatan').value; if (!namaPasien || !ruang || !noKamar || !kelas) { - alert('Silakan lengkapi data pasien.'); + Swal.fire({ + title: 'Perhatian!', + text: 'Silakan lengkapi data pasien.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false; } }else if(selected === "Masyarakat Umum"){ const alamat = document.getElementById('alamat').value; if(!alamat){ - alert('Silahkan lengkapi alamat') + Swal.fire({ + title: 'Perhatian!', + text: 'Silahkan lengkapi alamat.', + icon: 'warning', + confirmButtonText: 'Oke' + }) return false } } @@ -617,10 +678,10 @@ function validateCartBeforeSubmit() { let errorMessage = ""; cart.forEach((item, index) => { - - const pesananList = item.pesanan || []; pesananList.forEach((pesanan, i) => { + console.log(!pesanan.karbohidrat_id, !item?.apakah_someday); + if (!pesanan.tgl) { isValid = false; errorMessage = `Tanggal belum diisi pada item "${item.nama_menu}" (baris ${i + 1})`; @@ -836,6 +897,11 @@ document.getElementById('submitNote').addEventListener('click', function(e){ sessionStorage.setItem('cart', JSON.stringify(cart)); $("#notedPOrder").modal('hide') }else{ - alert('gagal menyimpan catatan') + Swal.fire({ + title: 'Perhatian!', + text: 'gagal menyimpan catatan.', + icon: 'warning', + confirmButtonText: 'Oke' + }) } }); diff --git a/public/js/count/konfirmasiPesanan.js b/public/js/count/konfirmasiPesanan.js new file mode 100644 index 0000000..b97d290 --- /dev/null +++ b/public/js/count/konfirmasiPesanan.js @@ -0,0 +1,20 @@ +// $(document).ready(function () { +// getReminderOrder(); +// }); + +// const getReminderOrder = () => { +// $.ajax({ +// url: `/dashboard/count/pending`, +// success: function (response) { + +// const button = document.getElementById("konfirmasi_pesanan"); +// let count = response.count; + +// button.classList.remove('d-none'); +// if(count === 0){ +// button.classList.add('d-none'); +// } +// button.innerText = count; +// }, +// }); +// }; diff --git a/public/js/order_guest/functions.js b/public/js/order_guest/functions.js index 774e779..10580d9 100644 --- a/public/js/order_guest/functions.js +++ b/public/js/order_guest/functions.js @@ -23,6 +23,23 @@ $(document).ready(function(){ filterState.jenis_menu = jenis fetchMenu(filterState) }) + $(".alert-link").on('click', function(e){ + e.preventDefault(); + $('#tabJenisMenu .nav-link').removeClass('active text-success').addClass('text-black'); + $('#tabJenisMenu .nav-link[data-filter="konsultasi" ]').removeClass('text-black').addClass('active text-success'); + + if (typeof datePicker !== 'undefined') { + datePicker.clear(); + } + + filterState.jenis_menu = 'konsultasi'; + + document.getElementById('tanggalTerpilihLabel').classList.add('d-none'); // Sembunyikan label + document.getElementById('tanggalTerpilihLabel').textContent = ''; + document.getElementById('resetTanggal').classList.add('d-none'); + + fetchMenu(filterState); + }) let searchTimout; $('#searchMenu').on('input', function(){ diff --git a/public/js/order_guest/index.js b/public/js/order_guest/index.js index a0c6414..9839aea 100644 --- a/public/js/order_guest/index.js +++ b/public/js/order_guest/index.js @@ -8,7 +8,6 @@ function fetchMenu(filter = {}) { - const containerGuest = $("#order_guest_id"); $("#tanggal-filter").removeClass('d-none'); if(filter.jenis_menu === "konsultasi"){ diff --git a/public/js/pekerjaan/dt.js b/public/js/pekerjaan/dt.js index f81f692..f9b0171 100644 --- a/public/js/pekerjaan/dt.js +++ b/public/js/pekerjaan/dt.js @@ -34,7 +34,7 @@ align: 'center', valign: 'middle', formatter: function (value, row, index) { - return `` + return `` } }, { @@ -56,6 +56,11 @@ ` + buttons += ` + + ` return `
@@ -129,23 +134,25 @@ const isChecked = this.checked; $('.rowCheckbox').each(function () { this.checked = isChecked; - let order_id = $(this).data('order_id'); + let order_detail_id = $(this).data('order_detail_id'); + let jenis_customer = $(this).data('jenis_customer'); if (isChecked) { - selectedRows.push({ order_id }); + selectedRows.push({ order_detail_id, jenis_customer }); } }); $('#buttonLabel').prop("disabled", !isChecked); }); $(document).on('change', '.rowCheckbox', function () { - let order_id = $(this).data('order_id'); + let order_detail_id = $(this).data('order_id'); + let jenis_customer = $(this).data('jenis_customer'); let isChecked = this.checked; if (isChecked) { - if (!selectedRows.find(r => r.order_id === order_id)) { - selectedRows.push({ order_id }); + if (!selectedRows.find(r => r.order_detail_id === order_detail_id)) { + selectedRows.push({ order_detail_id, jenis_customer }); } } else { - selectedRows = selectedRows.filter(r => r.order_id !== order_id); + selectedRows = selectedRows.filter(r => r.order_detail_id !== order_detail_id); } $('#buttonLabel').prop("disabled", selectedRows.length === 0); }); @@ -187,3 +194,7 @@ } +function cetak(id, jenis_customer){ + console.log(id, jenis_customer); + +} diff --git a/public/js/pesanan_pending/action.js b/public/js/pesanan_pending/action.js index b9dea08..5e88050 100644 --- a/public/js/pesanan_pending/action.js +++ b/public/js/pesanan_pending/action.js @@ -47,7 +47,7 @@ document.getElementById('formActionOrder').addEventListener('submit', function ( showConfirmButton: false, backdrop: true, }); - + getReminderOrder(); datatablePending.bootstrapTable('refresh'); modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM }; @@ -119,6 +119,7 @@ document.getElementById('formActionApproveBillingOrder').addEventListener('submi showConfirmButton: false, backdrop: true, }); + getReminderOrder(); datatablePending.bootstrapTable('refresh'); modalActionApproveBillingnOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM }; diff --git a/resources/views/dashboard/layouts/main.blade.php b/resources/views/dashboard/layouts/main.blade.php index f5660b3..8a7ee3c 100644 --- a/resources/views/dashboard/layouts/main.blade.php +++ b/resources/views/dashboard/layouts/main.blade.php @@ -119,6 +119,7 @@ + diff --git a/resources/views/dashboard/partials/sidenav.blade.php b/resources/views/dashboard/partials/sidenav.blade.php index d0d6e58..bf9097e 100644 --- a/resources/views/dashboard/partials/sidenav.blade.php +++ b/resources/views/dashboard/partials/sidenav.blade.php @@ -61,11 +61,11 @@ - + @@ -78,10 +78,10 @@ diff --git a/resources/views/guest/checkout/step/step2.blade.php b/resources/views/guest/checkout/step/step2.blade.php index a34ee7f..1627779 100644 --- a/resources/views/guest/checkout/step/step2.blade.php +++ b/resources/views/guest/checkout/step/step2.blade.php @@ -15,7 +15,7 @@
- diff --git a/resources/views/guest/index.blade.php b/resources/views/guest/index.blade.php index 3e92ab7..11197cb 100644 --- a/resources/views/guest/index.blade.php +++ b/resources/views/guest/index.blade.php @@ -19,7 +19,7 @@
-
+
Pilih Tanggal Makanan @@ -57,30 +57,61 @@ Menampilkan menu...
+
+
-
-
-
- 0 item
- Isi keranjang anda -
-
-
- +
+
+
+ 0 item
+ Isi keranjang anda +
+
+
+ +
-
+ + +
diff --git a/routes/web.php b/routes/web.php index 884d7f6..bce287a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -44,6 +44,7 @@ Route::group(['middleware' => ['auth']], function(){ Route::get('/datatable/menu', [MenuController::class, 'datatable']); Route::get('/pending', [PesananController::class, 'index']); + Route::get('count/pending', [PesananController::class, 'countPesananPending']); Route::get('datatable/pending', [PesananController::class, 'getDataPending']); Route::post('pending/export', [PesananController::class, 'exportPending']); Route::put('/pending/action/{order_id}', [PesananController::class, 'actionOrder']);