progress di customer layout

This commit is contained in:
JokoPrasetio 2025-08-04 15:28:54 +07:00
parent 9070e548a5
commit d9b87b8672
30 changed files with 444 additions and 199 deletions

View File

@ -82,8 +82,15 @@ class CustomerController extends Controller
->get()
->groupBy('master_menu_id');
$kkal = DB::connection('dbOrderGizi')
->table('public.klasifikasi_menu_kalori as kmk')
->join('public.kalori as k', 'k.kalori_id', 'kmk.kalori_id')
->whereIn('kmk.master_menu_id', $menuIds)
->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori')
->get()
->groupBy('master_menu_id');
// Step 3: Gabungkan data menu + klasifikasi
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph) {
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
return [
'master_menu_id' => $menu->master_menu_id,
'nama' => $menu->nama_menu,
@ -108,6 +115,11 @@ class CustomerController extends Controller
'tgl_harian' => $item->tgl_harian,
];
})->values() : [],
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
return [
'nilai_kalori' => $item->nilai_kalori,
];
})->values() : [],
];
});
@ -192,7 +204,7 @@ class CustomerController extends Controller
}
public function checkout(){
$karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat')->get();
$karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat', 'nilai_kalori')->get();
$payload = [
'title' => 'Checkout ',
'karbohidrat' => $karbohidrat

View File

@ -43,7 +43,8 @@ class KarbohidratController extends Controller
$payload = [
'pegawai_id_entry' => auth()->user()->id,
'pegawai_nama_entry' => auth()->user()->full_name,
'nama_karbohidrat' => $data['nama_karbohidrat']
'nama_karbohidrat' => $data['nama_karbohidrat'],
'nilai_kalori' => $data['nilai_kalori'],
];
Karbohidrat::create($payload);
};
@ -87,6 +88,7 @@ class KarbohidratController extends Controller
$karbohidrat = Karbohidrat::where('karbohidrat_id', $id)->first();
$payload = [
'nama_karbohidrat' => $request->input('nama_karbohidrat'),
'nilai_kalori' => $request->input('nilai_kalori'),
'pegawai_id_modified' => auth()->user()->id,
'pegawai_nama_modified' => auth()->user()->full_name,
'modified_at' => Carbon::now()

View File

@ -16,7 +16,8 @@ class RequestKarbohidrat extends FormRequest
{
return [
'data' => 'required|array|min:1',
'data.*.nama_karbohidrat' => 'required|string'
'data.*.nama_karbohidrat' => 'required|string',
'data.*.nilai_kalori' => 'nullable'
];
}

View File

@ -15,7 +15,8 @@ class RequestUpdateKarbohidrat extends FormRequest
public function rules(): array
{
return [
'nama_karbohidrat' => 'required|string'
'nama_karbohidrat' => 'required|string',
'nilai_kalori' => 'nullable'
];
}

View File

@ -18,6 +18,7 @@ class Karbohidrat extends Model
'pegawai_id_modified',
'pegawai_nama_modified',
'statusenabled',
'nama_karbohidrat'
'nama_karbohidrat',
'nilai_kalori'
];
}

View File

@ -22,7 +22,8 @@ class OrderDetail extends Model
'type',
'order_id',
'status_order',
'karbohidrat_id'
'karbohidrat_id',
'catatan'
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@ -213,159 +213,170 @@ function renderCartSummary() {
const container = document.getElementById('checkout_cart_summary');
container.innerHTML = '';
let totalKeseluruhan = 0;
let carts = JSON.parse(sessionStorage.getItem('cart') || '[]');
const carts = JSON.parse(sessionStorage.getItem('cart') || '[]');
carts.forEach((item) => {
const pesananList = Array.isArray(item.pesanan) ? item.pesanan : [];
let pesananHTML = '';
let countDate = pesananList.length;
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 += `
<div class="row g-2 align-items-center mb-2" data-item-id="${item.id}" data-index="${i}">
<div class="col-6 col-md-3">
<input type="text"
class="form-control form-control-sm tanggal-input"
id="tanggal-${item.id}-${i}"
readonly>
</div>
<div class="col-6 col-md-3">
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
<option value="">Pilih Karbohidrat</option>
${(karhohidrats || []).map(item =>
`<option value="${item?.karbohidrat_id}" ${p.karbohidrat_id === item?.karbohidrat_id ? 'selected' : ''}>${item?.nama_karbohidrat}</option>`
).join(' ')}
</select>
</div>
<div class="col-12 col-md-3">
<select class="form-select form-select-sm kategori-pemesanan-input"
data-item-id="${item.id}"
data-index="${i}"
onchange="onKategoriChange(${item.id}, ${i}, ${isToday})"
onfocus="this.dataset.previousValue = this.value"
${item?.apakah_menu_siang || item?.apakah_menu_sore ? '' : 'disabled'}>
${item?.apakah_someday
? (
item?.apakah_menu_siang && item?.apakah_menu_sore
? `
<option value="Makan Siang" ${p?.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''} ${disableSiang ? 'disabled' : ''}>Makan Siang</option>
<option value="Makan Sore" ${p?.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''} ${disableSore ? 'disabled' : ''}>Makan Sore</option>
`
: item?.apakah_menu_siang
? `<option value="Makan Siang" selected ${disableSiang ? 'disabled' : ''}>Makan Siang</option>`
: item?.apakah_menu_sore
? `<option value="Makan Sore" selected ${disableSore ? 'disabled' : ''}>Makan Sore</option>`
: `<option value="" disabled selected>Tidak tersedia</option>`
)
: (
item?.apakah_menu_siang && item?.apakah_menu_sore
? `
<option value="Makan Siang" ${p?.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''}>Makan Siang</option>
<option value="Makan Sore" ${p?.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''}>Makan Sore</option>
`
: item?.apakah_menu_siang
? `<option value="Makan Siang" selected>Makan Siang</option>`
: item?.apakah_menu_sore
? `<option value="Makan Sore" selected>Makan Sore</option>`
: `<option value="" disabled selected>Tidak tersedia</option>`
)
}
</select>
</div>
<div class="col-6 col-md-2">
<input type="number" class="form-control form-control-sm jumlah-input" value="${p.jumlah}"
onchange="onJumlahChange(${item.id}, ${i})">
</div>
<div class="col-6 col-md-1 text-end">
<button type="button" class="btn btn-sm btn-danger w-100 w-md-auto"
onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
<i class="fa-solid fa-trash"></i>
</button>
</div>
</div>`;
});
const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita' ? item.harga_karyawan || 0 :
item.harga_kp || 0;
const harga = checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita'
? item.harga_karyawan || 0
: item.harga_public || 0;
const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0);
totalKeseluruhan += itemTotal
const itemHTML = `
<div class="card mb-3 shadow-sm position-relative">
<div class="row g-0">
<div class="col-md-4 d-flex align-items-center justify-content-center p-2">
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}" class="img-fluid rounded"
style="max-height: 180px; width:auto; object-fit: cover;">
</div>
<div class="col-md-8">
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2"
onclick="removeCartItem(${item.id})">
Hapus
</button>
<div class="card-body">
<h5 class="card-title">${item.nama_menu}</h5>
<div class="text-muted small">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
<p class="card-text text-muted small mb-3">${item.deskripsi || ''}</p>
totalKeseluruhan += itemTotal;
<div class="mb-2 small text-muted">
<i class="fa fa-calendar-check me-1"></i>
${
item.apakah_someday
? 'Tersedia setiap hari (Senin - Minggu) '
: (item.tgl_tersedia
? `Tersedia pada tanggal: ${item.tgl_tersedia}`
: 'Tidak ada info tanggal tersedia'
)
}
</div>
<div class="mb-2 small text-muted">
<i class="fa fa-utensils me-1"></i>
Menu: <strong>${item.apakah_someday ? 'Someday' : 'Menu Normal'}</strong>
</div>
<div class="mb-2 small text-muted">
<strong>Silakan isi tanggal pemesanan dan pilih karbohidrat yang diinginkan</strong>
</div>
${pesananHTML}
<div class="mt-3 d-flex justify-content-between align-items-center">
<button type="button" class="btn btn-sm btn-outline-success"
onclick="addOrderDate(${item.id}, ${item?.apakah_menu_sore})">+ Tambah Tanggal</button>
<div><strong>Total:</strong> <span class="text-success">Rp
${itemTotal.toLocaleString('id-ID')}</span></div>
</div>
</div>
</div>
</div>
</div>`;
container.insertAdjacentHTML('beforeend', itemHTML);
pesananList.forEach((p, i) => {
initFlatpickrTersedia(item, i);
const selectedDate = new Date(p.tgl);
const now = new Date();
const isToday = selectedDate.toDateString() === now.toDateString();
const jam = now.getHours();
const disableSiang = isToday && jam >= 10;
const disableSore = isToday && jam >= 13;
const countDate = pesananList.length;
console.log(item.apakah_someday);
pesananHTML += `
<div class=" rounded p-2 mb-2" data-item-id="${item.id}" data-index="${i}">
<div class="row g-2 align-items-center">
<!-- Tanggal -->
<div class="col-12 col-md-3">
<input type="text" class="form-control form-control-sm tanggal-input" id="tanggal-${item.id}-${i}" readonly>
</div>
<!-- Karbohidrat -->
${item.apakah_someday ? `` : `
<div class="col-12 col-md-3">
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
<option value="">Pilih Karbohidrat</option>
${(karhohidrats || []).map(k => `
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''}>
${k.nama_karbohidrat} (${k.nilai_kalori} kkal)
</option>`).join('')}
</select>
</div>`}
<!-- Waktu Makan -->
<div class="col-12 col-md-3">
<select class="form-select form-select-sm kategori-pemesanan-input"
data-item-id="${item.id}" data-index="${i}"
onchange="onKategoriChange(${item.id}, ${i}, ${isToday})"
onfocus="this.dataset.previousValue = this.value"
${item.apakah_menu_siang || item.apakah_menu_sore ? '' : 'disabled'}>
${
item.apakah_someday
? (
item.apakah_menu_siang && item.apakah_menu_sore
? `
<option value="Makan Siang" ${p.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''} ${disableSiang ? 'disabled' : ''}>Makan Siang</option>
<option value="Makan Sore" ${p.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''} ${disableSore ? 'disabled' : ''}>Makan Sore</option>
`
: item.apakah_menu_siang
? `<option value="Makan Siang" selected ${disableSiang ? 'disabled' : ''}>Makan Siang</option>`
: item.apakah_menu_sore
? `<option value="Makan Sore" selected ${disableSore ? 'disabled' : ''}>Makan Sore</option>`
: `<option value="" disabled selected>Tidak tersedia</option>`
)
: (
item.apakah_menu_siang && item.apakah_menu_sore
? `
<option value="Makan Siang" ${p.kategoriPemesanan === 'Makan Siang' ? 'selected' : ''}>Makan Siang</option>
<option value="Makan Sore" ${p.kategoriPemesanan === 'Makan Sore' ? 'selected' : ''}>Makan Sore</option>
`
: item.apakah_menu_siang
? `<option value="Makan Siang" selected>Makan Siang</option>`
: item.apakah_menu_sore
? `<option value="Makan Sore" selected>Makan Sore</option>`
: `<option value="" disabled selected>Tidak tersedia</option>`
)
}
</select>
</div>
<!-- Jumlah -->
<div class="col-6 col-md-2">
<div class="d-flex align-items-center justify-content-between">
<button class="btn btn-sm btn-outline-success" onclick="decrement(${item.id}, ${i})">
<i class="fa fa-minus"></i>
</button>
<input type="text" class="form-control form-control-sm text-center mx-2 jumlah-input"
value="${p.jumlah}" readonly style="width: 70px;" id="jumlah-${item.id}-${i}">
<button class="btn btn-sm btn-outline-success" onclick="increment(${item.id}, ${i})">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<!-- Hapus -->
<div class="col-6 col-md-1 text-end">
${countDate > 1
? `<button class="btn btn-sm btn-danger" onclick="removeOrderDate(${item.id}, ${i}, ${countDate})">
<i class="fa fa-trash"></i>
</button>`
: ''}
</div>
</div>
</div>
`;
});
const itemHTML = `
<div class="card mb-3 shadow-sm position-relative">
<div class="d-flex flex-column flex-md-row">
<div class="p-2 d-flex justify-content-center align-items-center" style="flex: 0 0 300px;">
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}"
class="img-fluid rounded" style="max-height: 180px; width: 100%; object-fit: cover;">
</div>
<div class="flex-grow-1 position-relative">
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2"
onclick="removeCartItem(${item.id})">
Hapus
</button>
<div class="card-body">
<h5 class="card-title">${item.nama_menu}</h5>
<div class="text-muted small mb-1">Rp ${parseInt(harga).toLocaleString('id-ID')}</div>
${item.deskripsi ? `<p class="card-text text-muted small mb-2">${item.deskripsi}</p>` : ''}
<div class="mb-2 small text-muted"><i class="fa fa-calendar-check me-1"></i>
${item.apakah_someday
? 'Tersedia setiap hari (Senin - Minggu)'
: (item.tgl_tersedia ? `Tersedia pada tanggal: ${item.tgl_tersedia}` : 'Tidak ada info tanggal tersedia')}
</div>
<div class="mb-2 small text-muted"><i class="fa fa-utensils me-1"></i>
Menu: <strong>${item.apakah_someday ? 'Someday' : 'Menu Normal'}</strong>
</div>
${item.kalori
? `<div class="mb-2 small text-muted"><i class="fa-solid fa-bolt me-1"></i> Kalori: <strong>${item.kalori} kkal</strong></div>`
: ''}
<div class="mb-2 small text-muted"><strong>Silakan isi tanggal pemesanan dan pilih karbohidrat yang diinginkan</strong></div>
${pesananHTML}
<div class="mt-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
<button class="btn btn-sm btn-outline-success"
onclick="addOrderDate(${item.id}, ${item.apakah_menu_sore})">
+ Tambah Tanggal
</button>
<div><strong>Total:</strong> <span class="text-success">Rp ${itemTotal.toLocaleString('id-ID')}</span></div>
</div>
</div>
</div>
</div>
</div>
`;
container.insertAdjacentHTML('beforeend', itemHTML);
pesananList.forEach((p, i) => initFlatpickrTersedia(item, i));
});
container.insertAdjacentHTML('beforeend', `
<div class="text-end mt-4">
<h5><strong>Total Keseluruhan:</strong> <span class="text-success">Rp ${totalKeseluruhan.toLocaleString('id-ID')}</span></h5>
<hr>
<h5><strong>Total Keseluruhan:</strong> <span class="text-success">Rp ${totalKeseluruhan.toLocaleString('id-ID')}</span></h5>
</div>
`);
document.getElementById('no_order_price').textContent = 'Rp ' + totalKeseluruhan.toLocaleString('id-ID')
document.getElementById('no_order_price').textContent = 'Rp ' + totalKeseluruhan.toLocaleString('id-ID');
}
// =======================
@ -563,7 +574,7 @@ function hitungTotalHarga(){
let total =0;
cart.forEach(item => {
const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_kp || 0
const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan || 0 : item.harga_public || 0
const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0);
total += itemTotal
})
@ -669,6 +680,25 @@ function initFlatpickrTersedia(item, i) {
});
}
function increment(itemId, index) {
const input = document.getElementById(`jumlah-${itemId}-${index}`);
input.value = parseInt(input.value || "0") + 1;
onJumlahChange(itemId, index); // Tetap panggil function milikmu
}
function decrement(itemId, index) {
const input = document.getElementById(`jumlah-${itemId}-${index}`);
let current = parseInt(input.value || "0");
console.log(current);
if (current > 1) {
input.value = current - 1;
onJumlahChange(itemId, index);
}else{
return
}
}
function toggleBuktiPembayaran() {
const metode = document.getElementById("cara_pembayaran").value;

View File

@ -44,7 +44,7 @@
width: 120
},
{
title:"Nilai Kalori",
title:"Nilai Kalori (Kkal)",
field:"nilai_kalori"
}
],

View File

@ -8,7 +8,7 @@ function addForm(){
<div class="col mt-2 d-flex align-items-start gap-2" id="col-${colCount}">
<div class="form-floating flex-grow-1">
<input type="text" class="form-control" name="data[${colCount}][nilai_kalori]" placeholder="exp : 1000" required>
<label>Nilai Kalori</label>
<label>Nilai Kalori (Kkal)</label>
</div>
<div class="invalid-feedback"></div>

View File

@ -130,6 +130,7 @@ function editKarbohidrat(e){
new bootstrap.Modal(modalKarbohidratEdit).show();
formKarbohidratEdit.attr('action', `/dashboard/karbohidrat/${data?.karbohidrat_id}`)
$("#nama_karbohidrat").val(data.nama)
$("#nilai_kalori").val(data.nilai_kalori)
}
formKarbohidratEdit.on('submit', function(e){

View File

@ -26,7 +26,7 @@
formatter: function(value, row) {
let buttons = ''
buttons += `
<button class="btn btn-sm btn-primary me-2" onclick="editKarbohidrat(this)" data-karbohidrat_id="${row.karbohidrat_id}" data-nama="${row?.nama_karbohidrat}">
<button class="btn btn-sm btn-primary me-2" onclick="editKarbohidrat(this)" data-karbohidrat_id="${row.karbohidrat_id}" data-nama="${row?.nama_karbohidrat}" data-nilai_kalori="${row?.nilai_kalori}">
<i class="fa-solid fa-pencil"></i>
</button>
`
@ -46,6 +46,10 @@
{
title:"Nama Karbohidrat",
field:"nama_karbohidrat"
},
{
title:"Nilai Kalori (Kkal)",
field:"nilai_kalori"
}
],
});

View File

@ -1,27 +1,34 @@
let colCount = 1;
function addForm(){
let col = $("#col_add_karbohidrat")
let html = '';
function addForm() {
const col = $("#col_add_karbohidrat");
html += `
<div class="col mt-2 d-flex align-items-start gap-2" id="col-${colCount}">
<div class="form-floating flex-grow-1">
<input type="text" class="form-control" name="data[${colCount}][nama_karbohidrat]" placeholder="exp : Nasi" required>
<label>Nama Karbohidrat</label>
</div>
<div class="invalid-feedback"></div>
const html = `
<div class="row mt-2" id="col-${colCount}">
<div class="col-6">
<div class="form-floating">
<input type="text" class="form-control" name="data[${colCount}][nama_karbohidrat]" placeholder="exp : Nasi" required>
<label>Nama Karbohidrat</label>
</div>
</div>
<div class="col-md-5">
<div class="form-floating">
<input type="number" class="form-control" name="data[${colCount}][nilai_kalori]" placeholder="exp : 120">
<label>Nilai Kalori (Kkal)</label>
</div>
</div>
<div class="col-md-1 mt-2 d-flex align-items-start">
<button type="button" class="btn btn-danger" onclick="removeCol(${colCount})">
<i class="fa-solid fa-trash"></i>
</button>
</div>
</div>
`;
<button type="button" class="btn btn-danger mt-2 me-2" onclick="removeCol(${colCount})"><i class="fa-solid fa-trash"></i></button>
</div>
`
col.append(html)
col.append(html);
colCount++;
}
function removeCol(count){
$(`#col-${count}`).remove()
function removeCol(count) {
$(`#col-${count}`).remove();
}

View File

@ -5,4 +5,6 @@ const modalAddMenu = document.getElementById("modalMasterMenu")
const modalEditMenu = document.getElementById('modalMasterMenuEdit');
const formEditMenu = document.getElementById('formMasterMenuEdit')
const formEditMenu = document.getElementById('formMasterMenuEdit');
const modalDetailMenu = document.getElementById('detailMenuModal')

View File

@ -578,3 +578,71 @@ document.getElementById('formMasterMenuEdit').addEventListener('submit', functio
});
});
})
function detailMasterMenu(e){
const el = $(e);
const modal = new bootstrap.Modal(modalDetailMenu);
modal.show()
const someday = el.data('apakah_someday');
const siang = el.data('apakah_menu_siang');
const sore = el.data('apakah_menu_sore');
const kalori = JSON.parse(decodeURIComponent(el.data('kalori')))
const kaloriMenu = kalori.map(kal => `
<span class="badge bg-secondary me-1 mb-1">${kal.nilai_kalori} (kkal)</span>
`).join('');
const tags = JSON.parse(decodeURIComponent(el.data('klasifikasi_menu')));
const klasifikasiMenu = tags.map(tag => `
<span class="badge bg-secondary me-1 mb-1">${tag.nama_kategori_diet}</span>
`).join('');
const tgl = JSON.parse(decodeURIComponent(el.data('tgl') || '[]'))
const tglMenuTersedia = `
<div class="mb-1 small text-muted">
<i class="fa fa-calendar-check me-1"></i>
${someday ? 'Tersedia setiap hari (Senin - Minggu)' :
tgl.length ? `Tersedia pada tanggal: ${tgl.map(d => d.tgl_harian).join(', ')}` :
'Tidak ada info tanggal tersedia'}
</div>
<div class="mb-1 small text-muted">
<i class="fa fa-utensils me-1"></i> Menu: <strong>${someday ? 'Someday' : 'Menu Normal'}</strong>
</div>
<div class="mb-1 small text-muted">
${
siang && sore
? '<i class="fa fa-clock me-1 text-success"></i> Tersedia untuk makan siang dan sore'
: siang
? '<i class="fa fa-sun me-1 text-warning"></i> Tersedia untuk makan siang'
: sore
? '<i class="fa fa-moon me-1 text-info"></i> Tersedia untuk makan sore'
: '<i class="fa fa-ban me-1 text-danger"></i> Tidak tersedia untuk waktu makan apapun'
}
</div>
`;
$('#cathering_order_photo').attr('src', `/gambar/${el.data('foto') || 'default.jpg'}`);
$('#cathering_order_name').text(el.data('nama') || '-');
$('#cathering_order_deskripsi').text(el.data('deskripsi') || '');
$('#cathering_order_price_karyawan').text("Rp " + parseInt(el.data('harga_karyawan') || 0).toLocaleString('id-ID'));
$('#cathering_order_price_public').text("Rp " + parseInt(el.data('harga_public') || 0).toLocaleString('id-ID'));
$('#tag_klasifikasi_menu').html(`
<div class="mb-2">
<p class="mb-1 fw-semibold">Klasifikasi Menu:</p>
${klasifikasiMenu || '<span class="text-muted">Tidak ada klasifikasi</span>'}
</div>
`);
$('#kalori_menu').html(`
<div class="mb-2">
<p class="mb-1 fw-semibold">Kalori:</p>
${kaloriMenu || '<span class="text-muted">-</span>'}
</div>
`);
$('#tgl_menu_tersedia').html(tglMenuTersedia);
$('#apakah_someday').val(someday ? 1 : 0);
$('#apakah_menu_siang').val(siang ? 1 : 0);
$('#apakah_menu_sore').val(sore ? 1 : 0);
$('#tgl_tersedia').val(el.data('tgl_tersedia'));
}

View File

@ -52,6 +52,25 @@
<i class="fa-solid fa-trash"></i>
</button>
`
buttons += `
<button class="btn btn-sm btn-info me-2" onclick="detailMasterMenu(this)"
data-master_menu_id="${row.master_menu_id}"
data-nama="${row?.nama_menu}"
data-foto="${row?.foto}"
data-harga_public="${row?.harga_public}"
data-harga_karyawan="${row?.harga_karyawan}"
data-jenis_menu="${row?.jenis_menu}"
data-apakah_someday="${row?.apakah_someday ? 1 : 0}"
data-apakah_menu_siang="${row?.apakah_menu_siang ? 1 : 0}"
data-apakah_menu_sore="${row?.apakah_menu_sore ? 1 : 0}"
data-deskripsi="${row?.deskripsi}"
data-tgl="${encodeURIComponent(JSON.stringify(row?.tgl || []))}"
data-kalori="${encodeURIComponent(JSON.stringify(row?.kalori || []))}"
data-klasifikasi_menu="${encodeURIComponent(JSON.stringify(row?.kategoriDiet || []))}"
>
<i class="fa-solid fa-circle-info"></i>
</button>
`
return `
<div class="d-flex space-x">
${buttons}

View File

@ -85,8 +85,9 @@
}
let html = '<div class="container"><div class="row row-cols-1 row-cols-md-2 g-4">';
let html = '<div class="container"><div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-3">';
menus.forEach(menu => {
html += `
<div class="col-md-3 mb-4">
<div class="card h-100 shadow-sm p-2 rounded-4">
@ -135,25 +136,39 @@
<div class="col-12 fw-semibold">Harga</div>
<div class="col-6">Karyawan:</div>
<div class="col-6 text-end fw-semibold">Rp ${parseInt(menu.harga_karyawan).toLocaleString('id-ID')}</div>
<div class="col-6">Keluarga Pasien:</div>
<div class="col-6 text-end fw-semibold">Rp ${parseInt(menu.harga_keluarga_pasien).toLocaleString('id-ID')}</div>
<div class="col-6">Public:</div>
<div class="col-6 text-end fw-semibold">Rp ${parseInt(menu.harga_public).toLocaleString('id-ID')}</div>
</div>
<!-- Kategori Diet (Badge) -->
<div class="mb-3">
<div class="mb-1">
${(menu.klasifikasiMenu || [])
.slice(0, 2)
.map(tag => {
const name = tag.nama_kategori_diet || '';
const truncated = name.length > 12 ? name.substring(0, 12) + '...' : name;
return `<span class="badge bg-secondary me-1 mb-1" title="${name}">${truncated}</span>`;
return `<span class="badge bg-secondary me-1 mb-1" title="${name}">${truncated} </span>`;
}).join('')}
${(menu.klasifikasiMenu || []).length > 2
? `<span class="badge bg-secondary">+${(menu.klasifikasiMenu.length - 2)} lainnya</span>`
: ''}
</div>
<!-- Kalori (Badge) -->
<div class="mb-2">
${(menu.kalori || [])
.slice(0, 2)
.map(kkal => {
const name = kkal.nilai_kalori || '';
const truncated = name.length > 12 ? name.substring(0, 12) + '...' : name;
return `<span class="badge bg-success me-1 mb-1" title="${name}">${truncated} kkal</span>`;
}).join('')}
${(menu.kalori || []).length > 2
? `<span class="badge bg-secondary">+${(menu.klasifikasiMenu.length - 2)} lainnya</span>`
: ''}
</div>
<!-- Tombol Order -->
<div class="d-flex p-2 mt-auto">
<button class="btn btn-outline-success w-50 me-2"
@ -161,11 +176,12 @@
data-id="${menu.master_menu_id || menu.master_paket_menu_id}"
data-nama_menu="${menu.nama}"
data-harga_karyawan="${menu.harga_karyawan}"
data-harga_keluarga_pasien="${menu.harga_keluarga_pasien}"
data-harga_public="${menu.harga_public}"
data-jenis_menu="${menu.jenis_menu}"
data-deskripsi="${menu.deskripsi}"
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
data-kalori="${(menu.kalori || []).map(kkal => kkal.nilai_kalori).join(', ')}"
data-foto="${menu.foto}"
data-apakah_menu_sore="${menu.apakah_menu_sore}"
data-apakah_menu_siang="${menu.apakah_menu_siang}"
@ -178,11 +194,12 @@
data-id="${menu.master_menu_id ?? menu.master_paket_menu_id}"
data-nama_menu="${menu.nama}"
data-harga_karyawan="${menu.harga_karyawan}"
data-harga_keluarga_pasien="${menu.harga_keluarga_pasien}"
data-harga_public="${menu.harga_public}"
data-jenis_menu="${menu.jenis_menu}"
data-deskripsi="${menu.deskripsi}"
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
data-kalori="${(menu.kalori || []).map(kkal => kkal.nilai_kalori).join(', ')}"
data-foto="${menu.foto}"
data-apakah_menu_sore="${menu.apakah_menu_sore}"
data-apakah_menu_siang="${menu.apakah_menu_siang}"
@ -233,7 +250,18 @@
const modalCheckout = $("#checkoutModal")
function orderMenu(e) {
const el = $(e);
$("#scroll-top").addClass('d-none');
const tags = (el.data('klasifikasi_menu') || '').split(',').filter(Boolean).map(tag => tag.trim());
const kaloriRaw = el.data('kalori');
let kalori = [];
if(Array.isArray(kaloriRaw)){
kalori = kaloriRaw.map(k => String(k))
}else if(typeof kaloriRaw === 'string'){
kalori = kaloriRaw.split(',').map(k => k.trim())
}else if(kaloriRaw !== undefined && kaloriRaw !== null){
kalori = [String(kaloriRaw)]
}
const someday = el.data('apakah_someday');
const siang = el.data('apakah_menu_siang');
const sore = el.data('apakah_menu_sore');
@ -242,6 +270,10 @@
<span class="badge bg-secondary me-1 mb-1">${tag}</span>
`).join('');
const resultKkal = kalori.length > 0
? kalori.map(kkal => `<span class="badge bg-success me-1 mb-1">${kkal} Kkal</span>`).join('')
: '<small class="text-muted">Tidak ada data kalori</small>';
const tglMenuTersedia = `
<div class="mb-1 small text-muted">
<i class="fa fa-calendar-check me-1"></i>
@ -272,9 +304,10 @@
$('#cathering_order_jenis_menu').val(el.data('jenis_menu'));
$('#cathering_order_deskripsi').text(el.data('deskripsi') || '');
$('#cathering_order_price_karyawan').text("Rp " + parseInt(el.data('harga_karyawan') || 0).toLocaleString('id-ID'));
$('#cathering_order_price_keluarga_pasien').text("Rp " + parseInt(el.data('harga_keluarga_pasien') || 0).toLocaleString('id-ID'));
$('#cathering_order_price_public').text("Rp " + parseInt(el.data('harga_public') || 0).toLocaleString('id-ID'));
$('#tag_klasifikasi_menu').html(klasifikasiMenu);
$('#tgl_menu_tersedia').html(tglMenuTersedia);
$('#kalori_menu').html(resultKkal);
$('#apakah_someday').val(someday ? 1 : 0);
$('#apakah_menu_siang').val(siang ? 1 : 0);
$('#apakah_menu_sore').val(sore ? 1 : 0);
@ -351,6 +384,7 @@
apakah_menu_sore: $('#apakah_menu_sore').val() === "1" ? true: false,
apakah_someday: $('#apakah_someday').val() === "1" ? true: false,
tgl_tersedia: $('#tgl_tersedia').val(),
kalori: $('#kalori').text(),
pesanan : orders
}
cart.push(orderItem)
@ -387,7 +421,7 @@
id_menu : idMenu,
nama_menu : namaMenu,
harga_karyawan : $(e).data('harga_karyawan'),
harga_kp : $(e).data('harga_keluarga_pasien'),
harga_public : $(e).data('harga_public'),
foto: $(e).data('foto'),
jenis_menu: $(e).data('jenis_menu'),
deskripsi: $(e).data('deskripsi'),
@ -395,6 +429,7 @@
apakah_menu_sore: $(e).data('apakah_menu_sore'),
apakah_someday: $(e).data('apakah_someday'),
tgl_tersedia: $(e).data('tgl_tersedia'),
kalori: $(e).data('kalori'),
pesanan : orders
}
cart.push(orderItem)

View File

@ -99,12 +99,18 @@
{
title: "Tgl Antar",
field: 'tgl_antar',
},
{
title: "Waktu Pemesanan",
field: 'type',
sortable: true,
},
{
title: "Catatan",
field: 'catatan',
sortable: true,
},
],
});

View File

@ -18,7 +18,7 @@
<div class="col">
<div class="form-floating">
<input type="text" class="form-control" name="data[0][nilai_kalori]" placeholder="exp : 1000" required>
<label>Niali Kalori</label>
<label>Nilai Kalori (Kkal)</label>
</div>
</div>
<div id="col_add_kalori"></div>

View File

@ -20,7 +20,7 @@
<div class="col">
<div class="form-floating">
<input type="text" class="form-control" name="nilai_kalori" id="nilai_kalori_edit" placeholder="Nasi" required>
<label>Nilai Kalori</label>
<label>Nilai Kalori (Kkal)</label>
</div>
</div>
</div>

View File

@ -15,14 +15,20 @@
<div class="modal-body">
<div class="container" id="container_create">
<div class="row">
<div class="col">
<div class="col-6">
<div class="form-floating">
<input type="text" class="form-control" name="data[0][nama_karbohidrat]" placeholder="exp : Nasi" required>
<label>Nama Karbohidrat</label>
</div>
</div>
<div id="col_add_karbohidrat"></div>
<div class="col-6">
<div class="form-floating">
<input type="number" class="form-control" name="data[0][nilai_kalori]" placeholder="exp : 3000" >
<label>Nilai Kalori (Kkal)</label>
</div>
</div>
</div>
<div id="col_add_karbohidrat"></div>
<button type="button" class="btn btn-outline-primary btn-sm mt-2" onclick="addForm()">
+ Tambah Karbohidrat
</button>

View File

@ -17,12 +17,18 @@
<div class="container">
<div class="row">
<div class="col">
<div class="col-6">
<div class="form-floating">
<input type="text" class="form-control" name="nama_karbohidrat" id="nama_karbohidrat" placeholder="Nasi" required>
<label>Nama Karbohidrat</label>
</div>
</div>
<div class="col-6">
<div class="form-floating">
<input type="text" class="form-control" name="nilai_kalori" id="nilai_kalori" placeholder="exp : 300" required>
<label>Nilai Kalori (Kkal)</label>
</div>
</div>
</div>
</div>

View File

@ -23,6 +23,7 @@
</div>
@include('dashboard.master.menu.modal.add')
@include('dashboard.master.menu.modal.edit')
@include('dashboard.master.menu.modal.detail')
<!-- JS scripts -->
<script src="{{ ver('/js/menu/_init.js') }}"></script>
<script src="{{ ver('/js/menu/dt.js') }}"></script>

View File

@ -0,0 +1,41 @@
<div class="modal fade" id="detailMenuModal" tabindex="-1" aria-labelledby="detailMenuModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title fw-bold" id="detailMenuModalLabel">Detail Catering RSAB Harapan Kita</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row g-3">
<div class="col-md-4 text-center">
<input type="hidden" id="apakah_someday">
<input type="hidden" id="apakah_menu_siang">
<input type="hidden" id="apakah_menu_sore">
<input type="hidden" id="tgl_tersedia">
<img id="cathering_order_photo" class="img-fluid rounded shadow" style="max-height: 370px; width:270px;" alt="Foto Menu">
</div>
<div class="col-md-8">
<h5 id="cathering_order_name" class="mb-2 fw-bold"></h5>
<div id="tgl_menu_tersedia" class="mb-2"></div>
<div class="row text-muted small mb-2">
<div class="col-6">Harga Karyawan:</div>
<div class="col-6 text-end"><span class="fw-semibold" id="cathering_order_price_karyawan"></span></div>
<div class="col-6">Harga Public:</div>
<div class="col-6 text-end"><span class="fw-semibold" id="cathering_order_price_public"></span></div>
</div>
<p id="cathering_order_deskripsi" class="text-muted small mb-2"></p>
<div id="tag_klasifikasi_menu" class="mb-2"></div>
<div id="kalori_menu" class="mb-2"></div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>

View File

@ -2,7 +2,7 @@
<div class="row g-3 mb-4">
<input type="hidden" name="cart_data" id="cart_data">
<div class="col-md-6">
<label for="exampleInputEmail1" class="form-label">Apakah Anda Seorang ?</label>
<label for="exampleInputEmail1" class="form-label">Apakah Anda Seorang ? <span class="text-danger">*</span></label>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita" required>
<label class="form-check-label" for="radio_karyawan" >
@ -23,7 +23,7 @@
</div>
</div>
<div class="col-md-6">
<label for="exampleInputEmail1" class="form-label">Jenis Kelamin</label>
<label for="exampleInputEmail1" class="form-label">Jenis Kelamin <span class="text-danger">*</span></label>
<div class="form-check">
<input class="form-check-input" type="radio" name="jenis_kelamin" value="Laki-laki" required>
<label class="form-check-label">
@ -38,15 +38,15 @@
</div>
</div>
<div class="col-md-6">
<label class="form-label">Nama Pemesan</label>
<label class="form-label">Nama Pemesan <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="nama_pemesan" id="nama_pemesan" required>
</div>
<div class="col-md-6">
<label class="form-label">No. Whatsapp</label>
<label class="form-label">No. Whatsapp <span class="text-danger">*</span></label>
<input type="number" class="form-control" name="no_whatsapp" id="no_whatsapp" required>
</div>
<div class="col-md-12">
<label class="form-label">Email</label>
<label class="form-label">Email <span class="text-danger">*</span></label>
<input type="email" class="form-control" name="email" id="email" required>
</div>
{{-- <div class="col-md-6">
@ -65,11 +65,11 @@
{{-- Pasien --}}
<div class="col-md-6 pasien">
<label class="form-label">Nama Pasien</label>
<label class="form-label">Nama Pasien <span class="text-danger">*</span></label>
<input type="text" class="form-control pasien-field" name="nama_pasien" id="nama_pasien">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Ruang Perawatan</label>
<label class="form-label">Ruang Perawatan <span class="text-danger">*</span></label>
<select class="form-select pasien-field" name="ruang_perawatan" id="ruang_perawatan">
<option value="">Pilih...</option>
<option value="Ruang Kenanga">Ruang Kenanga</option>
@ -85,12 +85,12 @@
</div>
<div class="col-md-6 pasien">
<label class="form-label">Nomor Kamar Perawatan</label>
<label class="form-label">Nomor Kamar Perawatan <span class="text-danger">*</span></label>
<input type="text" class="form-control pasien-field" name="no_kamar" id="no_kamar">
</div>
<div class="col-md-6 pasien">
<label class="form-label">Kelas Perawatan </label>
<label class="form-label">Kelas Perawatan <span class="text-danger">*</span></label>
<select class="form-select pasien-field" name="kelas_perawatan" id="kelas_perawatan">
<option value="">Pilih...</option>
<option value="VIP A">VIP A</option>
@ -103,7 +103,7 @@
{{-- Karyawan --}}
<div class="col-md-6 karyawan">
<label class="form-label">Bagian /Instalasi</label>
<label class="form-label">Bagian /Instalasi <span class="text-danger">*</span></label>
<input type="text" class="form-control karyawan-field" name="bagian_instalasi" id="bagian_instalasi">
</div>
<div class="col-md-6 karyawan">
@ -116,7 +116,7 @@
{{-- Umum --}}
<div class="col-md-12 umum">
<label class="form-label">Alamat</label>
<label class="form-label">Alamat <span class="text-danger">*</span></label>
<textarea class="form-control umum-field" name="alamat" id="alamat"></textarea>
</div>
{{-- End Umum --}}

View File

@ -14,7 +14,7 @@
<input type="hidden" id="apakah_menu_siang">
<input type="hidden" id="apakah_menu_sore">
<input type="hidden" id="tgl_tersedia">
<img id="cathering_order_photo" class="img-fluid rounded shadow" style="max-height: 170px;" alt="Foto Menu">
<img id="cathering_order_photo" class="img-fluid rounded shadow" style="max-height: 370px; width:270px;" alt="Foto Menu">
</div>
<div class="col-md-8">
<h5 id="cathering_order_name" class="mb-2 fw-bold"></h5>
@ -23,13 +23,14 @@
<div class="row text-muted small mb-2">
<div class="col-6">Harga Karyawan:</div>
<div class="col-6 text-end"><span class="fw-semibold" id="cathering_order_price_karyawan"></span></div>
<div class="col-6">Harga Keluarga Pasien:</div>
<div class="col-6 text-end"><span class="fw-semibold" id="cathering_order_price_keluarga_pasien"></span></div>
<div class="col-6">Harga Public:</div>
<div class="col-6 text-end"><span class="fw-semibold" id="cathering_order_price_public"></span></div>
</div>
<p id="cathering_order_deskripsi" class="text-muted small mb-2"></p>
<div id="tag_klasifikasi_menu" class="mb-2"></div>
<div id="kalori_menu" class="mb-2"></div>
<input type="hidden" id="cathering_order_menu_id">
<input type="hidden" id="cathering_order_jenis_menu">
</div>