diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index f120d49..f7f013e 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Karbohidrat; use App\Models\Order; use App\Models\OrderDetail; use Carbon\Carbon; @@ -12,6 +13,7 @@ use Illuminate\Support\Str; class CustomerController extends Controller { public function index(){ + $payload = [ 'title' => 'Halaman Utama' ]; @@ -79,7 +81,7 @@ class CustomerController extends Controller ->select('dmph.master_menu_id', 'dmph.tgl_harian') ->get() ->groupBy('master_menu_id'); - + // Step 3: Gabungkan data menu + klasifikasi $result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph) { return [ @@ -190,8 +192,10 @@ class CustomerController extends Controller } public function checkout(){ + $karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat')->get(); $payload = [ - 'title' => 'Checkout ' + 'title' => 'Checkout ', + 'karbohidrat' => $karbohidrat ]; return view('guest.checkout.checkout_payment', $payload); } @@ -224,7 +228,8 @@ class CustomerController extends Controller 'bagian_instalasi' => $biodataResult['bagian_instalasi'], 'no_ekstensien' => $biodataResult['no_ekstensien'], 'total_harga' => $totalHarga, - 'status_order' => "Belum Bayar" + 'status_order' => "Belum Bayar", + 'email' => $biodataResult['email'], ]; $order = Order::create($payloadOrder); foreach ($dataCart as $cart) { @@ -237,6 +242,7 @@ class CustomerController extends Controller $payloadOrderDetail['jumlah'] = $value['jumlah']; $payloadOrderDetail['tgl_antar'] = $value['tgl']; $payloadOrderDetail['type'] = $value['kategoriPemesanan']; + $payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id']; if($cart['jenis_menu'] === "paket"){ $payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu']; }else{ @@ -267,17 +273,23 @@ class CustomerController extends Controller $noOrder = request('no_order_result'); $evidence = request()->file('bukti_pembayaran'); - + $caraPembayaran = request('cara_pembayaran'); $order = Order::where('no_order', $noOrder)->first(); // Simpan file ke storage - $path = $evidence->store('bukti_pembayaran', 'public'); + $payload = [ + 'tgl_pembayaran' => Carbon::now() + ]; + if($caraPembayaran === "transfer"){ + $path = $evidence->store('bukti_pembayaran', 'public'); + $payload['bukti_pembayaran'] = $path; + $payload['cara_pembayaran'] = 'Transfer'; + $payload['status_order'] = 'Menunggu Konfirmasi Pembayaran'; + }else{ + $payload['cara_pembayaran'] = 'Billing'; + $payload['status_order'] = 'Menunggu Konfirmasi Pembayaran Via Billing'; + } // Update data order - $order->update([ - 'bukti_pembayaran' => $path, - 'cara_pembayaran' => 'Transfer', - 'tgl_pembayaran' => Carbon::now(), - 'status_order' => "Menunggu Konfirmasi Pembayaran" - ]); + $order->update($payload); DB::commit(); session()->flash('payment_success', true); diff --git a/app/Http/Controllers/KarbohidratController.php b/app/Http/Controllers/KarbohidratController.php index cdd5b5f..26680dd 100644 --- a/app/Http/Controllers/KarbohidratController.php +++ b/app/Http/Controllers/KarbohidratController.php @@ -127,4 +127,9 @@ class KarbohidratController extends Controller $data = Karbohidrat::where('statusenabled', true)->get(); return $data; } + + public function option(){ + $data = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat')->get(); + return $data; + } } diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 4c7646e..342597b 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -28,6 +28,7 @@ class PesananController extends Controller ->where('o.statusenabled', true) ->select( 'o.order_id', + 'o.entry_at', 'o.no_order', 'o.nama_pemesan', 'o.jenis_customer', @@ -37,7 +38,7 @@ class PesananController extends Controller 'o.note_dibatalkan', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); - + $grouped = $orders->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); @@ -45,6 +46,7 @@ class PesananController extends Controller $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; return [ 'order_id' => $first->order_id, + 'entry_at' => $first->entry_at, 'no_order' => $first->no_order, 'nama_pemesan' => $first->nama_pemesan, 'jenis_customer' => $first->jenis_customer, @@ -56,6 +58,9 @@ class PesananController extends Controller 'selesai_detail' => $selesaiDetail, 'note_dibatalkan' => $first->note_dibatalkan, ]; + }) + ->filter(function($item){ + return $item['total_detail'] > 0 && $item['total_detail'] != $item['selesai_detail']; })->values(); return response()->json([ 'status' => true, @@ -138,8 +143,63 @@ class PesananController extends Controller ]); } + public function indexSelesai() + { + $payload = [ + 'title' => 'Pesanan Selesai' + ]; + return view('dashboard.pesanan.selesai.index', $payload); + } + public function getDataSelesai(){ + $orders = DB::connection('dbOrderGizi')->table('public.order as o') + ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') + ->where(['o.statusenabled' => true]) + ->select( + 'o.order_id', + 'o.entry_at', + 'o.no_order', + 'o.nama_pemesan', + 'o.jenis_customer', + 'o.total_harga', + 'o.status_order', + 'o.bukti_pembayaran', + 'o.note_dibatalkan', + 'od.status_order as detail_status_order' + )->get()->groupBy('order_id'); + + $grouped = $orders->map(function($items){ + $first = $items->first(); + $totalDetail = $items->count(); + $selesaiDetail = $items->where('detail_status_order', 'Selesai')->count(); + $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; + return [ + 'order_id' => $first->order_id, + 'entry_at' => $first->entry_at, + 'no_order' => $first->no_order, + 'nama_pemesan' => $first->nama_pemesan, + 'jenis_customer' => $first->jenis_customer, + 'total_harga' => $first->total_harga, + 'status_order' => $first->status_order, + 'bukti_pembayaran' => $first->bukti_pembayaran, + 'progress' => $progress, + 'total_detail' => $totalDetail, + 'selesai_detail' => $selesaiDetail, + 'note_dibatalkan' => $first->note_dibatalkan, + ]; + }) + ->filter(function($item){ + return $item['total_detail'] > 0 && $item['total_detail'] === $item['selesai_detail']; + }) + ->values(); + + return response()->json([ + 'status' => true, + 'rows' => $grouped->values(), + 'total' => $grouped->count() + ]); + } /** * Show the form for creating a new resource. */ diff --git a/app/Models/Order.php b/app/Models/Order.php index d825f2f..4a9360b 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -34,9 +34,13 @@ class Order extends Model 'berat_badan', 'ruang_perawatan', 'bagian_instalasi', - 'note_dibatalkan' + 'note_dibatalkan', + 'email' ]; + protected $cast = [ + 'tgl_pembayaran' => 'datetime' + ]; public function orderDetail(){ return $this->hasMany(OrderDetail::class, 'order_id')->with('paketMenu', 'menu'); diff --git a/app/Models/OrderDetail.php b/app/Models/OrderDetail.php index b2b2a68..ca83e0e 100644 --- a/app/Models/OrderDetail.php +++ b/app/Models/OrderDetail.php @@ -21,10 +21,12 @@ class OrderDetail extends Model 'tgl_antar', 'type', 'order_id', - 'status_order' + 'status_order', + 'karbohidrat_id' ]; + public function menu(){ return $this->belongsTo(Menu::class, 'master_menu_id', 'master_menu_id')->select('master_menu_id', 'nama_menu', 'foto'); } diff --git a/public/js/checkout/action.js b/public/js/checkout/action.js index f6d9124..eeacf67 100644 --- a/public/js/checkout/action.js +++ b/public/js/checkout/action.js @@ -1,3 +1,4 @@ + async function submitOrderToServer(){ const totalHarga = hitungTotalHarga(); @@ -91,10 +92,8 @@ async function submitOrderToServer(){ confirmButtonText: 'Berhasil!', confirmButtonColor: '#28a745' }).then(() => { - window.location.href = "/success-page"; // ganti dengan rute sukses milikmu + window.location.href = "/success-page"; // kehalaman success }); - - ; // redirect atau reset step } else { alert(result.message || "Terjadi kesalahan."); } diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 46bb7e5..bd9bb87 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -11,18 +11,16 @@ document.addEventListener('DOMContentLoaded', () => { $("#cartButton").addClass('d-none'); $("#no_order_result").val(order_id) let currentStep = 0; - let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - // Redirect jika cart kosong - if (cart.length === 0) { - window.location.href = "/"; - return; - } - - // Setup button step document.querySelectorAll('.next-step').forEach(btn => { btn.addEventListener('click', async () => { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + + if (cart.length === 0) { + window.location.href = "/"; + return; + } if (currentStep === 0){ if(!validateStepOne()) return isiKonfirmasi(); @@ -33,7 +31,26 @@ document.addEventListener('DOMContentLoaded', () => { alert(errorMessage); return } - if (!sessionStorage.getItem('order_id')) { + + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + for (const item of cart) { + for (const p of item.pesanan) { + const result = validateTanggalPemesanan(item, p.tgl); + + if (!result.valid) { + alert(result.message); + return; // hentikan di sini, tidak lanjut + } + } + } + + let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}'); + + if (!checkout_biodata.nama_pemesan) { + window.location.href = "/"; + return; + } + if (!sessionStorage.getItem('order_id')) { await submitOrderToServer(); // async function simpan ke server } currentStep++; @@ -46,6 +63,11 @@ document.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('.prev-step').forEach(btn => { btn.addEventListener('click', () => { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + if (cart.length === 0) { + window.location.href = "/"; + return; + } if (currentStep > 0) { currentStep--; showStep(currentStep); @@ -121,6 +143,7 @@ if (typeof checkout_biodata === 'object') { $('#kelas_perawatan').val(checkout_biodata.kelas_perawatan); $('#bagian_instalasi').val(checkout_biodata.bagian_instalasi); $('#no_ekstensien').val(checkout_biodata.no_ekstensien); + $('#email').val(checkout_biodata.email); } function isiKonfirmasi() { @@ -138,6 +161,7 @@ function isiKonfirmasi() { kelas_perawatan: $('#kelas_perawatan').val(), bagian_instalasi: $('#bagian_instalasi').val(), no_ekstensien: $('#no_ekstensien').val(), + email: $('#email').val(), }; sessionStorage.setItem('checkout_biodata', JSON.stringify(biodata)); @@ -150,9 +174,6 @@ function isiKonfirmasi() { // ======================= function renderCartSummary() { const container = document.getElementById('checkout_cart_summary'); - let now = new Date(); - let today = now.toISOString().split('T')[0]; - let isAfter12 = now.getHours() >= 12; container.innerHTML = ''; let totalKeseluruhan = 0; let carts = JSON.parse(sessionStorage.getItem('cart') || '[]'); @@ -162,36 +183,88 @@ function renderCartSummary() { let pesananHTML = ''; let countDate = pesananList.length; - pesananList.forEach((p, i) => { - let isTodayAndLate = p.tgl === today && isAfter12 + item?.pesanan.forEach((p, i) => { + let selectedDate = new Date(p.tgl); + let now = new Date(); + let jam = now.getHours(); + let isToday = selectedDate.toDateString() === now.toDateString(); + + let disableSiang = isToday && jam >= 10; + let disableSore = isToday && jam >= 13; pesananHTML += `
-
- +
+ +
-
- +
+
+
+ + +
+ +
-
+
`; - }); + + + + + }); + const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 : item.harga_kp || 0; @@ -213,10 +286,26 @@ function renderCartSummary() {
${item.nama_menu}
Rp ${parseInt(harga).toLocaleString('id-ID')}

${item.deskripsi || ''}

+ +
+ + ${ + item.apakah_someday + ? 'Tersedia setiap hari (Senin - Minggu) ' + : (item.tgl_tersedia + ? `Tersedia pada tanggal: ${item.tgl_tersedia}` + : 'Tidak ada info tanggal tersedia' + ) + } +
+
+ + Menu: ${item.apakah_someday ? 'Someday' : 'Menu Normal'} +
${pesananHTML}
+ onclick="addOrderDate(${item.id}, ${item?.apakah_menu_sore})">+ Tambah Tanggal
Total: Rp ${itemTotal.toLocaleString('id-ID')}
@@ -226,6 +315,9 @@ function renderCartSummary() {
`; container.insertAdjacentHTML('beforeend', itemHTML); + pesananList.forEach((p, i) => { + initFlatpickrTersedia(item, i); + }); }); container.insertAdjacentHTML('beforeend', `
@@ -257,22 +349,58 @@ function onTanggalChange(itemId, index) { renderCartSummary(); } -function onKategoriChange(itemId, index) { +function onKarbohidratChange(itemId, index){ let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - const kategori = $(`[data-item-id='${itemId}'][data-index='${index}'] .kategori-pemesanan-input`).val(); - cart.find(item => item.id === itemId).pesanan[index].kategoriPemesanan = kategori; + const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .karbohidrat-input`); + cart.find(item => item.id === itemId).pesanan[index].karbohidrat_id = parseInt(input.value); sessionStorage.setItem('cart', JSON.stringify(cart)); renderCartSummary(); } +function onKategoriChange(itemId, index, isToday) { + let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); + const selectEl = document.querySelector(`.kategori-pemesanan-input[data-item-id='${itemId}'][data-index='${index}']`); + const kategori = selectEl.value; + let now = new Date(); + let jam = now.getHours(); + console.log(isToday); + + if (kategori === "Makan Siang" && isToday && jam >= 10) { + batasLewat = true; + alert("Pemesanan Makan Siang hanya bisa dilakukan sebelum jam 10:00."); + } else if (kategori === "Makan Sore" && isToday && jam >= 15) { + batasLewat = true; + alert("Pemesanan Makan Sore hanya bisa dilakukan sebelum jam 13:00."); + } + + if (batasLewat) { + // Kembalikan ke value sebelumnya + const previous = selectEl.dataset.previousValue || ''; + selectEl.value = previous; + return; + } + + const item = cart.find(item => item.id === itemId); + if (item && item.pesanan && item.pesanan[index]) { + item.pesanan[index].kategoriPemesanan = kategori; + sessionStorage.setItem('cart', JSON.stringify(cart)); + renderCartSummary(); + } +} + + // ======================= // TAMBAH / HAPUS PESANAN // ======================= -function addOrderDate(itemId) { +function addOrderDate(itemId, sore) { let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); const item = cart.find(i => i.id === itemId); if (item && Array.isArray(item.pesanan)) { - item.pesanan.push({ tgl: '', jumlah: 1, kategoriPemesanan: '' }); + item.pesanan.push({ + tgl: '', + jumlah: 1, + kategoriPemesanan: sore ? 'Makan Sore' : 'Makan Siang' + }); sessionStorage.setItem('cart', JSON.stringify(cart)); renderCartSummary(); } @@ -293,7 +421,7 @@ function removeOrderDate(itemId, index, count) { } -function removeCartItem(itemId){ + function removeCartItem(itemId){ let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); cart = cart.filter(i => i.id !== itemId); sessionStorage.setItem('cart', JSON.stringify(cart)); @@ -331,7 +459,6 @@ function validateStepOne() { const selected = jenisCustomer.value; if (selected === 'Karyawan RSAB Harapan Kita') { const bagian = document.getElementById('bagian_instalasi').value.trim(); - const ekstension = document.getElementById('no_ekstensien').value.trim(); if (!bagian) { alert('Silakan lengkapi data karyawan.'); return false; @@ -368,6 +495,9 @@ function validateCartBeforeSubmit() { } else if (!pesanan.jumlah || pesanan.jumlah <= 0) { isValid = false; errorMessage = `Jumlah harus lebih dari 0 pada item "${item.nama_menu}" (baris ${i + 1})`; + }else if(!pesanan.karbohidrat_id){ + isValid = false; + errorMessage = `Karbohidrat belum diisi pada item "${item.nama_menu}" (baris ${i + 1})` } }); }); @@ -385,7 +515,6 @@ function hitungTotalHarga(){ const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_kp || 0 const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0); total += itemTotal - }) return total; @@ -413,3 +542,107 @@ function copyNoOrder() { } +function initFlatpickrTersedia(item, i) { + const now = new Date(); + const jamFlat = now.getHours(); + const menitFlat = now.getMinutes(); + const totalMenitFlatSekarang = jamFlat * 60 + menitFlat; + + const menitBatasFlat = 13 * 60; + const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat; + // Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap + const dayNumbers = (item.tgl_tersedia || "") + .split(',') + .map(s => s.trim()) + .filter(s => s !== '' && !isNaN(s)) + .map(s => parseInt(s)); + + // Generate tanggal dalam format YYYY-MM-DD untuk 3 bulan ke depan + let availableDates = []; + const bulanKeDepan = 3; + + for (let bulanOffset = 0; bulanOffset < bulanKeDepan; bulanOffset++) { + const baseDate = new Date(now.getFullYear(), now.getMonth() + bulanOffset, 1); + const year = baseDate.getFullYear(); + const month = String(baseDate.getMonth() + 1).padStart(2, '0'); + + dayNumbers.forEach(day => { + const dayStr = String(day).padStart(2, '0'); + const fullDateStr = `${year}-${month}-${dayStr}`; + const fullDate = new Date(`${fullDateStr}T00:00:00`); + + // Jika bukan menu someday, cek aturan H-1 dan jam batas + if (item.apakah_someday) { + availableDates.push(fullDateStr); + } else { + const selisihHari = Math.floor((fullDate - now) / (1000 * 60 * 60 * 24)); + if (selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal)) { + availableDates.push(fullDateStr); + } + } + }); + } + + + let minTanggal = 'today'; + + // Jika item adalah someday dan waktu sekarang sudah lewat 13:00 + if (item?.apakah_someday && totalMenitFlatSekarang >= 13 * 60) { + const besok = new Date(now); + besok.setDate(now.getDate() + 1); + minTanggal = besok.toISOString().split("T")[0]; // format YYYY-MM-DD + } + + + + if(!item.apakah_someday){ + availableDates = availableDates.filter(dateStr => { + const dateObj = new Date(dateStr); + const selisihHari = Math.floor((dateObj - now) / (1000 * 60 * 60 * 24)); + return selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal); + }); + } + + flatpickr(`#tanggal-${item.id}-${i}`, { + dateFormat: "Y-m-d", + ...(item?.apakah_someday ? { minDate: minTanggal,} : {enable : availableDates}), + defaultDate: item.pesanan[i]?.tgl || null, + onChange: function(selectedDates, dateStr) { + onTanggalChange(item.id, i, dateStr); + } + }); +} + + +function toggleBuktiPembayaran() { + const metode = document.getElementById("cara_pembayaran").value; + const buktiSection = document.getElementById("bukti_section"); + const buktiInput = document.getElementById("bukti_pembayaran"); + + if (metode === "billing") { + buktiSection.style.display = "none"; + buktiInput.required = false; + } else { + buktiSection.style.display = "block"; + buktiInput.required = true; + } +} + + +function validateTanggalPemesanan(item, tglDipilih) { + const now = new Date(); + const jam = now.getHours(); + const menit = now.getMinutes(); + const totalMenit = jam * 60 + menit; + const batasWaktu = 13 * 60; + const tglSekarang = now.toISOString().split("T")[0]; + + if (item.apakah_someday && totalMenit >= batasWaktu && tglDipilih === tglSekarang) { + return { + valid: false, + message: `Maaf, Anda tidak bisa memilih hari ini (${tglDipilih}) untuk menu sameday karena sudah lewat jam 13:00` + }; + } + + return { valid: true }; +} diff --git a/public/js/order_guest/index.js b/public/js/order_guest/index.js index 0d4d867..518505d 100644 --- a/public/js/order_guest/index.js +++ b/public/js/order_guest/index.js @@ -51,7 +51,7 @@ html += `
`; return containerGuest.html(html); - } + } let params = new URLSearchParams({ page: filter.page || 1, per_page: filter.per_page || 12, @@ -60,12 +60,12 @@ }).toString(); containerGuest.html('

Memuat data....

'); - + fetch(`/datamenu?${params}`) .then(res => res.json()) .then(res => { - + if (!res.status){ return containerGuest.html('

Gagal Memuat Data...

'); } @@ -114,14 +114,14 @@ : menu.apakah_menu_siang ? ` Tersedia untuk makan siang` : menu.apakah_menu_sore - ? ` Tersedia untuk makan sore` + ? ` Tersedia untuk makan sore` : ` Tidak tersedia untuk waktu makan apapun` }
${ - menu.apakah_someday + menu.apakah_someday ? `Menu Someday ` : `Menu Normal @@ -152,7 +152,7 @@ ? `+${(menu.klasifikasiMenu.length - 2)} lainnya` : ''}
- +
@@ -282,7 +292,7 @@ let idMenu = parseInt(idText.replace(/[^\d]/g, ''), 10); let foto = $('#cathering_order_photo').attr('src') let resultFoto = foto.replace('/gambar', ''); - + let namaMenu = $("#cathering_order_name").text(); let existingItem = cart.find(item => item.id_menu === idMenu && item.nama_menu === namaMenu); @@ -319,13 +329,12 @@ function saveItem(e){ let cart = JSON.parse(sessionStorage.getItem('cart') || '[]'); - const now = new Date(); - const todayFormatted = now.getFullYear() + '-' + (now.getMonth() + 1).toString().padStart(2, '0') + '-' + now.getDate().toString().padStart(2, '0') + const orders = [{ - tgl: todayFormatted, + tgl: '', jumlah: 1, - kategoriPemesanan: '' + kategoriPemesanan: $(e).data('apakah_menu_sore') ? 'Makan Sore' : 'Makan Siang' }]; let idMenu = $(e).data('id'); @@ -350,6 +359,10 @@ foto: $(e).data('foto'), jenis_menu: $(e).data('jenis_menu'), deskripsi: $(e).data('deskripsi'), + apakah_menu_siang: $(e).data('apakah_menu_siang'), + apakah_menu_sore: $(e).data('apakah_menu_sore'), + apakah_someday: $(e).data('apakah_someday'), + tgl_tersedia: $(e).data('tgl_tersedia'), pesanan : orders } cart.push(orderItem) diff --git a/public/js/pesanan_pending/action_progres_order.js b/public/js/pesanan_pending/action_progres_order.js index f4b3c27..53ec0a9 100644 --- a/public/js/pesanan_pending/action_progres_order.js +++ b/public/js/pesanan_pending/action_progres_order.js @@ -8,7 +8,7 @@ function fetchDetailOrder(order_id){ const detailHTML = (data?.order_detail || []).map(detail => { return `
-
+
Foto Menu @@ -43,31 +43,51 @@ function fetchDetailOrder(order_id){ const html = `
- -
- Bukti Pembayaran -
- - -
-
-
Nama Pemesan: ${data.nama_pemesan}
- Jenis Customer: ${data.jenis_customer} + +
+ Bukti Pembayaran
-
-

No Order: ${data.no_order}

-

Type Pembayaran: ${data.cara_pembayaran}

-

Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}

-

Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}

-
+ +
+
+
+
Nama Pemesan: ${data.nama_pemesan}
+ Jenis Customer: ${data.jenis_customer} -
- - ${data.status_order} + + + ${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? + `
+

Nama Pasien: ${data.nama_pasien}

+

Nomor Kamar Perawatan: ${data.no_kamar_perawatan}

+

Ruang Perawatan: ${data.kelas_perawatan}

+

Kelas Perawatan: ${data.ruang_perawatan}

+
`: ` +
+

Bagian /Instalasi: ${data.bagian_instalasi}

+

Ekstensien yang bisa di Hubungi: ${data.no_ekstensien}

+
+ + `} + + +
+

No Order: ${data.no_order}

+

Type Pembayaran: ${data.cara_pembayaran}

+

Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}

+

Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}

+ +
+ +
+ + ${data.status_order} +
+
+
-

@@ -84,7 +104,7 @@ function fetchDetailOrder(order_id){ const id = this.dataset.id; const isChecked = this.checked; const newStatus = isChecked ? 'Selesai' : 'Pending'; - + // Update badge UI const badge = document.getElementById(`status_badge_${id}`); if (badge) { diff --git a/public/js/pesanan_pending/dt.js b/public/js/pesanan_pending/dt.js index 4b78432..45b64ed 100644 --- a/public/js/pesanan_pending/dt.js +++ b/public/js/pesanan_pending/dt.js @@ -124,18 +124,32 @@ field:'nama_pemesan', sortable: true, }, - { - title: "Kategori Customer", - field: 'jenis_customer', - sortable: true, - }, - { + { title: "Total Harga Pesanan", field:'total_harga', formatter: function(value, row){ return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID') } + }, + { + title: "Tgl Pemesanan", + formatter: function(value, row) { + if (!row?.entry_at) return '-'; + const date = new Date(row.entry_at); + return date.toLocaleString('id-ID', { + day: '2-digit', + month: 'short', // Bisa diganti 'long' kalau mau 'Juli' bukan 'Jul' + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + hour12: false // pakai format 24 jam + }); + }, + }, + { + title: "Kategori Customer", + field: 'jenis_customer', + sortable: true, } - ], }); diff --git a/public/js/pesanan_selesai/_init.js b/public/js/pesanan_selesai/_init.js new file mode 100644 index 0000000..362e0b4 --- /dev/null +++ b/public/js/pesanan_selesai/_init.js @@ -0,0 +1,4 @@ +const datatableSelesai = $("#datatablePesananSelesai") + +const modalActionSelesaiOrder = document.getElementById('modalActionSelesaiOrder') +const formActionSelesaiOrder = $("#formActionSelesaiOrder") diff --git a/public/js/pesanan_selesai/detail_order.js b/public/js/pesanan_selesai/detail_order.js new file mode 100644 index 0000000..f870816 --- /dev/null +++ b/public/js/pesanan_selesai/detail_order.js @@ -0,0 +1,108 @@ +function fetchDetailOrder(order_id){ + fetch(`/dashboard/pending/action-progress-order/${order_id}`) + .then(res => res.json()) + .then(res => { + const data = res; + document.getElementById('pesanan_container').innerHTML ='' + // Generate HTML untuk order_detail + const detailHTML = (data?.order_detail || []).map(detail => { + return ` +
+
+
+
+ Foto Menu +
+
+

Nama Menu: ${detail?.menu?.nama_menu || '-'}

+

Jumlah: ${detail?.jumlah || 0}

+

Tanggal Pesan: ${detail?.tgl_antar || 0}

+

Harga: Rp ${parseInt(detail?.harga_satuan || 0).toLocaleString('id-ID')}

+

Status Pesanan: + + ${detail?.status_order} + +

+ +
+
+
+
+ `; + }).join(''); + + const html = ` +
+ +
+
+ Bukti Pembayaran +
Bukti Pembayaran
+
+
+ + +
+
+
+
${data.nama_pemesan}
+

Jenis Customer: ${data.jenis_customer}

+ + ${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? ` +
+

Nama Pasien: ${data.nama_pasien}

+

Nomor Kamar: ${data.no_kamar_perawatan}

+

Ruang Perawatan: ${data.ruang_perawatan}

+

Kelas Perawatan: ${data.kelas_perawatan}

+
` : ` +
+

Bagian / Instalasi: ${data.bagian_instalasi}

+

Ekstensien: ${data.no_ekstensien || '-'}

+
`} + +
+ +
+

No Order: ${data.no_order}

+

Tipe Pembayaran: ${data.cara_pembayaran}

+

Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}

+

Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}

+
+ +
+
+ + ${data.status_order} + +
+
+
+
+
+ + +
+ +
+ ${detailHTML} +
+ `; + + document.getElementById('pesanan_container').innerHTML = html; + + }) + .catch(err => { + document.getElementById('pesanan_container').innerHTML = '

Terjadi kesalahan saat memuat data.

'; + console.error(err); + }); + +} + +function orderSelesai(order_id){ + new bootstrap.Modal(modalActionSelesaiOrder).show(); + fetchDetailOrder(order_id) +} diff --git a/public/js/pesanan_selesai/dt.js b/public/js/pesanan_selesai/dt.js new file mode 100644 index 0000000..8dd1bf0 --- /dev/null +++ b/public/js/pesanan_selesai/dt.js @@ -0,0 +1,134 @@ + + datatableSelesai.bootstrapTable({ + url: "/dashboard/datatable/selesai", + showColumns: true, + showColumnsToggleAll: true, + showRefresh: true, + sortable: true, + search: true, + searchOnEnterKey: false, + searchHighlight: true, + pagination: true, + serverSide:true, + pageSize: 10, + pageList: [10, 20, 30, 40, 50, 100, 200], + cookie: true, + cookieIdTable: "table_rma_ssc_id", + icons: { + refresh: "fas fa-sync-alt", // atau ganti ke icon lain + columns: "fas fa-th-large" + }, + + columns: [ + { + title: "Action", + field:'order_id', + formatter: function(value, row) { + let buttons = '' + if(row?.status_order === "Lunas"){ + buttons += ` + + ` + } + + return ` +
+ ${buttons} +
+ `; + } + }, + + { + title: "No.Order", + field: 'no_order', + sortable: true, + }, + { + title: "Status Pembayaran", + field: 'status_order', + sortable: true, + formatter: function(value, row) { + const status = value; + let badgeClass = 'bg-secondary'; + if (status === "Belum Bayar") { + badgeClass = 'bg-warning text-dark'; + } else if (status === "Menunggu Konfirmasi Pembayaran") { + badgeClass = 'bg-primary'; + } else if (status === "Lunas" || status === "Sudah Bayar") { + badgeClass = 'bg-success text-dark'; + } else if(status === "Dibatalkan"){ + badgeClass = 'bg-danger'; + } + return ` + ${status} + ${status === 'Dibatalkan' && row.note_dibatalkan ? ` +
+ ${row.note_dibatalkan} +
+ ` : ''} + `; + } + }, + { + title: "Status Pesanan", + formatter: function(value, row) { + const progress = parseInt(row.progress) || 0; + const total = row.total_detail || 0; + const selesai = row.selesai_detail || 0; + + return ` +
+
+
+ ${progress}% +
+
+ ${selesai} / ${total} selesai +
+ `; + }, + sortable: true, + }, + { + title: "Pemesan", + field:'nama_pemesan', + sortable: true, + }, + { + title: "Tgl Pemesanan", + field: 'entry_at', + formatter: function(value, row) { + if (!row?.entry_at) return '-'; + + const date = new Date(row.entry_at); + return date.toLocaleString('id-ID', { + day: '2-digit', + month: 'short', // Bisa diganti 'long' kalau mau 'Juli' bukan 'Jul' + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + hour12: false // pakai format 24 jam + }); + }, + sortable: true, + }, + { + title: "Kategori Customer", + field: 'jenis_customer', + sortable: true, + }, + { + title: "Total Harga Pesanan", + field:'total_harga', + formatter: function(value, row){ + return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID') + } + } + + ], + }); diff --git a/resources/views/dashboard/partials/sidenav.blade.php b/resources/views/dashboard/partials/sidenav.blade.php index 9df6379..066eb4b 100644 --- a/resources/views/dashboard/partials/sidenav.blade.php +++ b/resources/views/dashboard/partials/sidenav.blade.php @@ -62,8 +62,8 @@ -
` : + data?.bukti_bayar ? ` +
+
Bukti Pembayaran
+ Bukti Pembayaran +
+ ` :` +
+ +
+ `}
- - - - ` container.html(html); }) diff --git a/resources/views/guest/checkout/checkout_payment.blade.php b/resources/views/guest/checkout/checkout_payment.blade.php index ae1019f..0b9b672 100644 --- a/resources/views/guest/checkout/checkout_payment.blade.php +++ b/resources/views/guest/checkout/checkout_payment.blade.php @@ -46,6 +46,9 @@
+ diff --git a/resources/views/guest/checkout/step/step1.blade.php b/resources/views/guest/checkout/step/step1.blade.php index 9da699b..4208b41 100644 --- a/resources/views/guest/checkout/step/step1.blade.php +++ b/resources/views/guest/checkout/step/step1.blade.php @@ -45,6 +45,10 @@
+
+ + +
{{--
@@ -57,7 +61,7 @@
- + {{-- Pasien --}}
diff --git a/resources/views/guest/checkout/step/step2.blade.php b/resources/views/guest/checkout/step/step2.blade.php index 85eeedf..a34ee7f 100644 --- a/resources/views/guest/checkout/step/step2.blade.php +++ b/resources/views/guest/checkout/step/step2.blade.php @@ -3,11 +3,8 @@ {{-- Ringkasan Pesanan --}}
Pesanan Gizi
- + +
{{-- Akan diisi oleh JavaScript --}}
@@ -17,4 +14,40 @@
+ +
diff --git a/resources/views/guest/checkout/step/step3.blade.php b/resources/views/guest/checkout/step/step3.blade.php index 1718938..b59408c 100644 --- a/resources/views/guest/checkout/step/step3.blade.php +++ b/resources/views/guest/checkout/step/step3.blade.php @@ -75,21 +75,27 @@
-
+
+ + - +
+
+
-
+ id="bukti_pembayaran" name="bukti_pembayaran" accept="image/*" onchange="previewBuktiPembayaran()"> +
Klik atau drag file ke sini untuk upload
Format: JPG, PNG | Max: 2MB
-
diff --git a/routes/web.php b/routes/web.php index 0350685..acb729c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,6 +29,7 @@ Route::group(['middleware' => ['auth']], function(){ Route::resource('/karbohidrat', KarbohidratController::class); Route::get('/datatable/karbohidrat', [KarbohidratController::class, 'datatable']); + Route::get('/option/karbohidrat', [KarbohidratController::class, 'option']); Route::resource('/menu', MenuController::class); Route::get('/datatable/menu', [MenuController::class, 'datatable']); @@ -40,7 +41,8 @@ Route::group(['middleware' => ['auth']], function(){ Route::get('/pending/action-progress-order/{order_id}', [PesananController::class, 'getDataOrderDetail']); Route::post('/pending/update-detail-status/{order_id}', [PesananController::class, 'updateDetailStatusOrder']); - + Route::get('/selesai', [PesananController::class, 'indexSelesai']); + Route::get('datatable/selesai', [PesananController::class, 'getDataSelesai']); }); Route::post('/logout', [AuthController::class, 'logout']);