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 `
-
+

@@ -43,31 +43,51 @@ function fetchDetailOrder(order_id){
const html = `
-
-
-

-
-
-
-
-
-
Nama Pemesan: ${data.nama_pemesan}
-
Jenis Customer: ${data.jenis_customer}
+
+
+
-
-
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 `
+
+
+
+
+

+
+
+
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
+
+
+
+
+
+
+
+
${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 `
+
+
+
${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
+

+
+ ` :`
+
+
+
+ `}
-
-
-
-
`
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
-
-
Kategori Pemesanan
-
Menu Same Day: Dipesan pada hari yang sama setelah pukul 10.00 WIB
-
Menu Normal: Dipesan minimal H-1 sebelum hari penyajian
-
+
+
{{-- Akan diisi oleh JavaScript --}}
@@ -17,4 +14,40 @@
+
+
+
+ Informasi Penting
+
+
+ -
+ Menu Normal: Dipesan maksimal H-1 sebelum pukul 13.00 WIB.
+
+ -
+ Menu Same Day: Dipesan pada hari yang sama setelah pukul 13.00 WIB.
+
+ - Makan Siang: maksimal pukul 10.00 WIB
+ - Makan Sore: maksimal pukul 13.00 WIB
+
+
+ -
+ Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.
+
+ -
+ Pengambilan makanan dilakukan sendiri di Instalasi Gizi (Ruang Distribusi Makan):
+
+ - Siang: 12.00 – 13.00 WIB
+ - Sore: 16.00 – 17.00 WIB
+
+
+ -
+ Jenis karbohidrat dapat dipilih sesuai pilihan yang tersedia.
+
+ -
+ Butuh bantuan? Hubungi WhatsApp Instalasi Gizi:
+ 08815611382
+ Jam kerja: 08.00 – 15.00 WIB
+
+
+
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']);