progress label

This commit is contained in:
JokoPrasetio 2025-08-06 16:14:23 +07:00
parent 4d476bea75
commit 05ad717629
39 changed files with 647 additions and 328 deletions

View File

@ -28,9 +28,6 @@ class CustomerController extends Controller
$search = request('search');
$jenis_menu = request('jenis_menu');
$perPage = request()->get('per_page', 12);
if($jenis_menu === "paket"){
return self::dataPaketMenuOrder($search, $perPage);
}
return self::menuOrder($search, $jenis_menu, $perPage);
}
@ -42,7 +39,6 @@ class CustomerController extends Controller
$menuQuery = DB::connection('dbOrderGizi')
->table('public.master_menu as mn')
->where('mn.statusenabled', true);
if (!empty($jenis_menu)) {
$menuQuery->where('mn.jenis_menu', 'ILIKE', '%' . $jenis_menu . '%');
}
@ -140,71 +136,71 @@ class CustomerController extends Controller
}
// paket do komen dulu
// private static function dataPaketMenuOrder($search = null, $perPage){
// $query = DB::connection('dbOrderGizi')->table('public.master_paket_menu as mpn')
// ->where('mpn.statusenabled', true);
private static function dataPaketMenuOrder($search = null, $perPage){
$query = DB::connection('dbOrderGizi')->table('public.master_paket_menu as mpn')
->where('mpn.statusenabled', true);
// if(!empty($search)){
// $query->where('mpn.nama_paket', 'ILIKE', '%' . $search . '%');
// }
if(!empty($search)){
$query->where('mpn.nama_paket', 'ILIKE', '%' . $search . '%');
}
// $paginated = $query->select(
// 'mpn.master_paket_menu_id',
// 'mpn.nama_paket',
// 'mpn.foto',
// 'mpn.harga_public',
// 'mpn.harga_karyawan',
// 'mpn.harga_keluarga_pasien',
// 'mpn.deskripsi',
// 'mpn.status',
// 'dmph.detail_menu_paket_harian_id',
// 'dmph.tgl_harian'
// )->paginate($perPage);
$paginated = $query->select(
'mpn.master_paket_menu_id',
'mpn.nama_paket',
'mpn.foto',
'mpn.harga_public',
'mpn.harga_karyawan',
'mpn.harga_keluarga_pasien',
'mpn.deskripsi',
'mpn.status',
'dmph.detail_menu_paket_harian_id',
'dmph.tgl_harian'
)->paginate($perPage);
// $paketMenuIds = collect($paginated->items())->pluck('master_paket_menu_id')->toArray();
// dd($paketMenuIds);
// $klasifikasi = DB::connection('dbOrderGizi')
// ->table('public.klasifikasi_menu_diet as kmd')
// ->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id')
// ->whereIn('kmd.master_paket_menu_id', $paketMenuIds)
// ->select('kmd.master_paket_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet')
// ->get()
// ->groupBy('master_paket_menu_id');
$paketMenuIds = collect($paginated->items())->pluck('master_paket_menu_id')->toArray();
dd($paketMenuIds);
$klasifikasi = DB::connection('dbOrderGizi')
->table('public.klasifikasi_menu_diet as kmd')
->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id')
->whereIn('kmd.master_paket_menu_id', $paketMenuIds)
->select('kmd.master_paket_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet')
->get()
->groupBy('master_paket_menu_id');
$result = collect($paginated->items())->map(function ($paketMenu) use ($klasifikasi) {
return [
'master_paket_menu_id' => $paketMenu->master_paket_menu_id,
'nama' => $paketMenu->nama_paket,
'foto' => $paketMenu->foto,
'jenis_menu' => "paket",
'harga_public' => $paketMenu->harga_public,
'harga_karyawan' => $paketMenu->harga_karyawan,
'harga_keluarga_pasien' => $paketMenu->harga_keluarga_pasien,
'status' => $paketMenu->status,
'deskripsi' => $paketMenu->deskripsi,
'klasifikasiMenu' => isset($klasifikasi[$paketMenu->master_paket_menu_id]) ? $klasifikasi[$paketMenu->master_paket_menu_id]->map(function ($item) {
return [
'kategori_diet_id' => $item->kategori_diet_id,
'nama_kategori_diet' => $item->nama_kategori_diet,
];
})->values() : [],
];
});
// $result = collect($paginated->items())->map(function ($paketMenu) use ($klasifikasi) {
// return [
// 'master_paket_menu_id' => $paketMenu->master_paket_menu_id,
// 'nama' => $paketMenu->nama_paket,
// 'foto' => $paketMenu->foto,
// 'jenis_menu' => "paket",
// 'harga_public' => $paketMenu->harga_public,
// 'harga_karyawan' => $paketMenu->harga_karyawan,
// 'harga_keluarga_pasien' => $paketMenu->harga_keluarga_pasien,
// 'status' => $paketMenu->status,
// 'deskripsi' => $paketMenu->deskripsi,
// 'klasifikasiMenu' => isset($klasifikasi[$paketMenu->master_paket_menu_id]) ? $klasifikasi[$paketMenu->master_paket_menu_id]->map(function ($item) {
// return [
// 'kategori_diet_id' => $item->kategori_diet_id,
// 'nama_kategori_diet' => $item->nama_kategori_diet,
// ];
// })->values() : [],
// ];
// });
return response()->json([
'status' => true,
'message' => 'Berhasil mendapatkan data',
'data' => [
'data' => $result,
'current_page' => $paginated->currentPage(),
'last_page' => $paginated->lastPage(),
'per_page' => $paginated->perPage(),
'total' => $paginated->total(),
]
]);
}
// return response()->json([
// 'status' => true,
// 'message' => 'Berhasil mendapatkan data',
// 'data' => [
// 'data' => $result,
// 'current_page' => $paginated->currentPage(),
// 'last_page' => $paginated->lastPage(),
// 'per_page' => $paginated->perPage(),
// 'total' => $paginated->total(),
// ]
// ]);
// }
public function checkout(){
$karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat', 'nilai_kalori')->get();

View File

@ -43,7 +43,7 @@ class DashboardController extends Controller
$grouped = $data->map(function($items){
$grouped = $data->map(function($items){
$first = $items->first();
$totalDetail = $items->count();
$selesaiDetail = $items->where('detail_status_order', 'Selesai')->count();
@ -64,6 +64,10 @@ class DashboardController extends Controller
'note_dibatalkan' => $first->note_dibatalkan,
];
})->values();
$pemasukanKaryawan = $grouped->where('jenis_customer', 'Karyawan RSAB Harapan Kita')->sum('total_harga');
$pemasukanMasyarakat = $grouped->where('jenis_customer', 'Masyarakat Umum')->sum('total_harga');
$pemasukanKeluargaPasien = $grouped->where('jenis_customer', 'Keluarga Pasien / Penunggu Pasien')->sum('total_harga');
$totalPemasukan = $grouped->sum('total_harga');
$pesananPending = $grouped->whereNotIn('status_order', ['Lunas', 'Dibatalkan'])->count();
$pesananLunas = $grouped->where('status_order', 'Lunas')->count();
@ -91,6 +95,9 @@ class DashboardController extends Controller
'pesananBatal' => $pesananBatal,
'pesananLunas' => $pesananLunas,
'pesananSelesai' => $pesananSelesai,
'pemasukanKaryawan' => $pemasukanKaryawan,
'pemasukanMasyarakat' => $pemasukanMasyarakat,
'pemasukanKeluargaPasien' => $pemasukanKeluargaPasien,
],
'rows' => $grouped->values(),
'total' => $grouped->count(),

View File

@ -103,7 +103,7 @@ class KaloriController extends Controller
if(!empty($search)){
$query->where('nilai_kalori', 'ILIKE', '%' . $search . '%');
}else{
$query->take(30);
$query->limit(30);
}
$data = $query->select('kalori_id', 'nilai_kalori')->get();
return response()->json([

View File

@ -27,9 +27,21 @@ class PesananController extends Controller
public function getDataPending(){
$tanggal = request('tanggal');
if(!empty($tanggal)){
$tanggalFormatted = collect($tanggal)->map(function ($tgl){
return Carbon::parse($tgl)->toDateString();
})->toArray();
}else{
$tanggalFormatted = [Carbon::now()->toDateString()];
}
$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)
->whereRaw(
"DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")",
$tanggalFormatted
)
->select(
'o.order_id',
'o.entry_at',
@ -167,9 +179,21 @@ class PesananController extends Controller
public function getDataSelesai(){
$tanggal = request('tanggal');
if(!empty($tanggal)){
$tanggalFormatted = collect($tanggal)->map(function ($tgl){
return Carbon::parse($tgl)->toDateString();
})->toArray();
}else{
$tanggalFormatted = [Carbon::now()->toDateString()];
}
$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])
->whereRaw(
"DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")",
$tanggalFormatted
)
->select(
'o.order_id',
'o.entry_at',
@ -314,7 +338,7 @@ class PesananController extends Controller
$startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y');
$endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y');
$waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y');
$data = [
'waktu_cetak' => $waktu_cetak,
'orders' => $order,
@ -325,6 +349,12 @@ class PesananController extends Controller
return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf');
}
public function downloadLabel(Request $request){
$items = $request->input('items');
dd(json_encode($items));
}
/**
* Show the form for creating a new resource.
*/

View File

@ -1786,3 +1786,53 @@ section,
.border-dashed:hover {
border-color: #198754;
}
@media (max-width: 576px) {
.card h5 {
font-size: 14px;
}
.card .badge {
font-size: 10px;
}
.card .btn {
font-size: 13px;
padding: 6px 10px;
}
}
.nav-tabs-clean {
border-bottom: 2px solid #dee2e6;
}
.nav-tabs-clean .nav-link {
font-weight: 500;
color: #555;
padding: 0.6rem 1rem;
border: none;
border-bottom: 3px solid transparent;
transition: all 0.2s ease-in-out;
background-color: transparent;
}
.nav-tabs-clean .nav-link:hover {
color: #198754;
border-bottom: 3px solid #d1e7dd;
}
.nav-tabs-clean .nav-link.active {
color: #198754;
border-bottom: 3px solid #198754;
background-color: transparent;
}
@media (max-width: 576px) {
.nav-tabs-clean .nav-item {
flex: 1 0 50%;
text-align: center;
}
.nav-tabs-clean {
flex-wrap: wrap;
}
}

BIN
public/assets/img/404.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

View File

@ -8,6 +8,8 @@ let order_id = sessionStorage.getItem('order_id') || '[]';
// =======================
document.addEventListener('DOMContentLoaded', () => {
const checkCart = JSON.parse(sessionStorage.getItem('cart') || '[]');
const validChart = checkCart.length > 0 && checkCart.every(item =>
Array.isArray(item.pesanan) &&
item.pesanan.length > 0
@ -17,6 +19,9 @@ document.addEventListener('DOMContentLoaded', () => {
return
}
$("#cartButton").addClass('d-none');
$("#no_order_result").val(order_id)
let currentStep = 0;
@ -109,6 +114,45 @@ document.addEventListener('DOMContentLoaded', () => {
const countDownPayment = document.getElementById('countdownPayment')
function orderTimeCheck(){
const checkTimeOrder = sessionStorage.getItem('time_order');
if (checkTimeOrder) {
const orderTime = new Date(checkTimeOrder);
const now = new Date();
// Jika time_order tidak valid (misalnya null, NaN, atau invalid date)
if (isNaN(orderTime.getTime())) {
console.warn('Waktu order tidak valid di session.');
sessionStorage.clear(); // bisa juga removeItem satu per satu
window.location.href = "/";
return;
}
const selisihMs = now.getTime() - orderTime.getTime();
const selisihMenit = selisihMs / 1000 / 60;
if (selisihMenit > 10) {
// Bersihkan session
sessionStorage.removeItem('cart');
sessionStorage.removeItem('checkout_biodata');
sessionStorage.removeItem('order_id');
sessionStorage.removeItem('time_order');
Swal.fire({
title: 'Waktu pembayaran sudah lewat!',
text: 'Silakan lakukan pemesanan ulang.',
icon: 'warning',
confirmButtonText: 'Oke'
}).then(() => {
window.location.href = "/";
});
return;
}
}
}
function updateCountdown(){
const now = new Date();
@ -128,8 +172,10 @@ document.addEventListener('DOMContentLoaded', () => {
}
updateCountdown();
orderTimeCheck();
const interval = setInterval(() => {
updateCountdown()
orderTimeCheck()
if(new Date() >= deadline) clearInterval(interval)
}, 1000)
@ -572,7 +618,7 @@ function validateCartBeforeSubmit() {
let errorMessage = "";
cart.forEach((item, index) => {
console.log(item.apakah_someday);
const pesananList = item.pesanan || [];
pesananList.forEach((pesanan, i) => {
@ -603,7 +649,6 @@ function hitungTotalHarga(){
cart.forEach(item => {
const harga = biodata.jenis_customer === "Karyawan RSAB Harapan Kita" ? item.harga_karyawan : item.harga_public || 0
console.log(harga);
const itemTotal = item.pesanan?.reduce((sum, p) => sum + (p.jumlah * harga), 0);
total += itemTotal
@ -672,8 +717,6 @@ function initFlatpickrTersedia(item, i) {
availableDates.push(fullDateStr);
} else {
const selisihHari = Math.floor((fullDate - now) / (1000 * 60 * 60 * 24));
console.log(selisihHari);
if (selisihHari >= 1 || (selisihHari === 1 && !lewatBatasNormal)) {
availableDates.push(fullDateStr);
}

View File

@ -144,6 +144,9 @@ function fetchData(startDate = null, endDate = null){
$("#pesanan_belum_diambil").text(res?.data?.pesananLunas - res?.data?.pesananSelesai)
$("#pesanan_diambil").text(res?.data?.pesananSelesai)
$("#nilai_transaksi_total").text(parseInt(res?.data?.totalPemasukan).toLocaleString('id-ID'))
$("#nilai_transaksi_karyawan").text(parseInt(res?.data?.pemasukanKaryawan).toLocaleString('id-ID'))
$("#nilai_transaksi_masyarakat").text(parseInt(res?.data?.pemasukanMasyarakat).toLocaleString('id-ID'))
$("#nilai_transaksi_pasien").text(parseInt(res?.data?.pemasukanKeluargaPasien).toLocaleString('id-ID'))
datatable.bootstrapTable('load', res.rows)
})
.catch(error => {

View File

@ -12,9 +12,8 @@ function initSelectize(formElement) {
create: false,
placeholder: "Kualifikasi Menu...",
maxItems: null,
preload: true,
preload: true,
load: function (query, callback) {
if (!query.length) return callback();
$.ajax({
url: '/dashboard/option/klasifikasi-menu',
data: { search: query },
@ -50,10 +49,9 @@ function initSelectize(formElement) {
searchField: ['nilai_kalori', 'kalori_id'],
create: false,
placeholder: "Kualifikasi kalori...",
maxItems: null,
maxItems: 1,
preload: true,
load: function (query, callback) {
if (!query.length) return callback();
$.ajax({
url: '/dashboard/option/kalori',
data: { search: query },
@ -72,11 +70,11 @@ function initSelectize(formElement) {
render: {
option: function (item, escape) {
return `<div class="p-1">
<div class="fw-semibold" style="font-size: 0.85rem;">${escape(item.nilai_kalori)}</div>
<div class="fw-semibold" style="font-size: 0.85rem;">${escape(item.nilai_kalori)} kkal</div>
</div>`;
},
item: function (item, escape) {
return `<div>${escape(item.nilai_kalori)}</div>`;
return `<div>${escape(item.nilai_kalori)} kkal</div>`;
}
}
});
@ -444,7 +442,6 @@ function editMasterMenu(e) {
maxItems: null,
preload: true,
load: function (query, callback) {
if (!query.length) return callback();
$.ajax({
url: '/dashboard/option/klasifikasi-menu',
data: { search: query },
@ -492,10 +489,9 @@ function editMasterMenu(e) {
searchField: ['nilai_kalori'],
create: false,
placeholder: "Kalori...",
maxItems: null,
maxItems: 1,
preload: true,
load: function (query, callback) {
if (!query.length) return callback();
$.ajax({
url: '/dashboard/option/kalori',
data: { search: query },
@ -623,7 +619,7 @@ function detailMasterMenu(e){
`;
$('#cathering_order_photo').attr('src', `/gambar/${el.data('foto') || 'default.jpg'}`);
$('#cathering_order_name').text(el.data('nama') || '-');
$('#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'));

View File

@ -78,22 +78,30 @@
if(session.nama_customer){
$("#welcomeMessage").html(`Selamat Datang, <strong>${session.nama_customer}</strong> !`)
}
const menus = res.data.data || [];
if (menus.length === 0){
return containerGuest.html('<p class="text-muted">.</p>');
return containerGuest.html(`
<div class="d-flex flex-column align-items-center justify-content-center text-center py-4">
<img src="/assets/img/404.png" alt="Tidak ada menu" style="max-width: 180px;" class="mb-3 mt-3">
<h6 class="text-muted mb-1">Belum ada menu yang tersedia untuk saat ini.</h6>
</div>
`);
}
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">';
let html = '<div class="container"><div class="row row-cols-2 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="col-12 col-sm-6 col-md-4 col-lg-3 mb-2">
<div class="card h-100 shadow-sm p-2 rounded-4">
<!-- Gambar Makanan -->
<img src="gambar/${menu.foto || '3.jpeg'}"
class="rounded shadow-sm object-fit-cover" height="150px"
class="rounded shadow-sm object-fit-cover w-100" height="150px"
alt="${menu.nama_menu}">
<!-- Info Tersedia Tanggal -->
<div class="text-muted small mt-2 px-1">
@ -131,7 +139,16 @@
}
</div>
<!-- Nama & Harga -->
<h5 class="fw-bold mb-1 mt-2">${menu.nama}</h5>
<h5 class="fw-bold mb-1 mt-2">${menu.nama} <small class="fs-6">${(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>`
: ''}</small> </h5>
<div class="row text-muted small">
<div class="col-12 fw-semibold">Harga</div>
<div class="col-6">Karyawan:</div>
@ -155,20 +172,6 @@
: ''}
</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"
@ -271,8 +274,8 @@
`).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>';
? kalori.map(kkal => `<small class="badge bg-success me-1 mb-1 fs-6">${kkal ? kkal + ' Kkal' : ''}</small>`).join('')
: '';
const tglMenuTersedia = `
<div class="mb-1 small text-muted">
@ -299,7 +302,11 @@
$('#checkoutModal').modal('show');
$('#cathering_order_photo').attr('src', `/gambar/${el.data('foto') || 'default.jpg'}`);
$('#cathering_order_name').text(el.data('nama_menu') || '-');
$('#cathering_order_name').html(`
<div>${el.data('nama_menu')}
${resultKkal}
</div>`);
$('#cathering_order_menu_id').val(el.data('id'));
$('#cathering_order_jenis_menu').val(el.data('jenis_menu'));
$('#cathering_order_deskripsi').text(el.data('deskripsi') || '');
@ -307,7 +314,6 @@
$('#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);
@ -348,7 +354,14 @@
let order_id = sessionStorage.getItem('order_id') || null;
if(order_id){
window.location.href = '/checkout'
Swal.fire({
icon: 'warning',
title: 'Pesanan Belum Selesai',
text: 'Silakan selesaikan pesanan Anda terlebih dahulu sebelum melanjutkan.',
timer: 2500,
}).then(() => {
window.location.href = '/checkout';
});
}
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
@ -368,7 +381,8 @@
let namaMenu = $("#cathering_order_name").text();
let existingItem = cart.find(item => item.id_menu === idMenu && item.nama_menu === namaMenu);
console.log(cart);
let existingItem = cart.find(item => item.id_menu === idMenu);
if(!existingItem){
const orderItem ={
@ -405,7 +419,7 @@
let idMenu = $(e).data('id');
let namaMenu = $(e).data('nama_menu');
let existingItem = cart.find(item => item.id_menu === idMenu && item.nama_menu === namaMenu);
let existingItem = cart.find(item => item.id_menu === idMenu);
if(existingItem){
orders.forEach(newOrder => {
const existingOrder =existingItem.pesanan.find(p => p.tgl === newOrder.tgl)
@ -451,7 +465,14 @@
function handleClick(e){
const order_id = sessionStorage.getItem('order_id') || null;
if(order_id){
window.location.href = '/checkout'
Swal.fire({
icon: 'warning',
title: 'Pesanan Belum Selesai',
text: 'Silakan selesaikan pesanan Anda terlebih dahulu sebelum melanjutkan.',
timer: 2500,
}).then(() => {
window.location.href = '/checkout';
});
}else{
saveItem(e)
}

View File

@ -1,5 +1,6 @@
function initDt(selectDate = []){
let selectedRows = [];
datatablePekerjaan.bootstrapTable('destroy');
datatablePekerjaan.bootstrapTable({
url: "/dashboard/datatable/pekerjaan",
@ -20,13 +21,22 @@
pageSize: 10,
pageList: [10, 20, 30, 40, 50, 100, 200],
cookie: true,
cookieIdTable: "table_rma_ssc_id",
cookieIdTable: "datatablePekerjaan",
icons: {
refresh: "fas fa-sync-alt", // atau ganti ke icon lain
columns: "fas fa-th-large"
},
columns: [
{
title: '<input type="checkbox" id="selectAll" />',
field: 'order_id',
align: 'center',
valign: 'middle',
formatter: function (value, row, index) {
return `<input type="checkbox" class="rowCheckbox" data-order_id="${row.order_id}" />`
}
},
{
title: "Action",
field:'order_id',
@ -114,6 +124,66 @@
],
});
$(document).on('click', '#selectAll', function () {
selectedRows = [];
const isChecked = this.checked;
$('.rowCheckbox').each(function () {
this.checked = isChecked;
let order_id = $(this).data('order_id');
if (isChecked) {
selectedRows.push({ order_id });
}
});
$('#buttonLabel').prop("disabled", !isChecked);
});
$(document).on('change', '.rowCheckbox', function () {
let order_id = $(this).data('order_id');
let isChecked = this.checked;
if (isChecked) {
if (!selectedRows.find(r => r.order_id === order_id)) {
selectedRows.push({ order_id });
}
} else {
selectedRows = selectedRows.filter(r => r.order_id !== order_id);
}
$('#buttonLabel').prop("disabled", selectedRows.length === 0);
});
window.getSelectedRowsForLabel = () => selectedRows;
}
function labelDownload(){
const selected = (typeof getSelectedRowsForLabel === 'function') ? getSelectedRowsForLabel() : [];
if (selected.length === 0) {
alert("Silakan pilih setidaknya satu item terlebih dahulu.");
return;
}
fetch('/dashboard/pekerjaan/label', {
method:'POST',
headers:{
'Content-Type' : 'application/json',
'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value,
},
body: JSON.stringify({ items : selected})
})
.then(response => {
if (!response.ok) throw new Error('Gagal download label');
return response.blob();
})
.then(res => {
console.log(res);
})
.catch(error => {
alert('gagal mengunduh');
console.error(error);
})
}

View File

@ -1,6 +1,13 @@
datatablePending.bootstrapTable({
function initDt(selectDate = []){
datatablePending.bootstrapTable('destroy')
datatablePending.bootstrapTable({
url: "/dashboard/datatable/pending",
method:'get',
queryParams:function(params){
params.tanggal = selectDate;
return params;
},
showColumns: true,
showColumnsToggleAll: true,
showRefresh: true,
@ -158,3 +165,38 @@
}
],
});
}
document.addEventListener('DOMContentLoaded', function () {
flatpickr('#tanggal', {
dateFormat: "Y-m-d",
mode: "multiple",
locale: "id", // opsional: agar hari/bulan dalam Bahasa Indonesia
onValueUpdate: function(selectedDates, dateStr, instance) {
const selectedFormattedDates = selectedDates.map(d => {
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
})
initDt(selectedFormattedDates)
if(selectedFormattedDates.length > 0){
const tanggalList = selectedFormattedDates;
let tanggalRapi = '';
if (tanggalList.length === 1) {
tanggalRapi = tanggalList[0];
} else if (tanggalList.length === 2) {
tanggalRapi = tanggalList.join(' dan ');
} else if (tanggalList.length > 2) {
tanggalRapi = tanggalList.slice(0, -1).join(', ') + ', dan ' + tanggalList.slice(-1);
}
$("#confirm_date_pesanan_pending").text(': ' + tanggalRapi)
}else{
$("#confirm_date_pesanan_pending").text('');
}
}
});
$("#confirm_date_pesanan_pending").text('Hari Ini');
initDt();
});

View File

@ -1,139 +1,147 @@
function initDt(selectDate = []){
datatableSelesai.bootstrapTable('destroy')
datatableSelesai.bootstrapTable({
url: "/dashboard/datatable/selesai",
method:'get',
queryParams:function(params){
params.tanggal = selectDate;
return params;
},
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"
},
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 += `
<button class="btn btn-sm btn-warning text-dark" onclick="orderSelesai('${row.order_id}')">
<i class="fa fa-utensils me-1"></i>
</button>
`
}
columns: [
{
title: "Action",
field:'order_id',
formatter: function(value, row) {
let buttons = ''
if(row?.status_order === "Lunas"){
buttons += `
<button class="btn btn-sm btn-warning text-dark" onclick="orderSelesai('${row.order_id}')">
<i class="fa fa-utensils me-1"></i>
</button>
`
return `
<div class="d-flex space-x">
${buttons}
</div>
`;
}
},
{
title: "No.Order",
field: 'no_order',
sortable: true,
},
{
title: "Cara Pembayaran",
field: 'cara_pembayaran',
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 `
<span class="badge ${badgeClass} px-3 py-1">${status}</span>
${status === 'Dibatalkan' && row.note_dibatalkan ? `
<div class="text-danger small mt-1">
<i class="fa fa-info-circle"></i> ${row.note_dibatalkan}
</div>
` : ''}
`;
}
},
{
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 `
<div class="d-flex space-x">
${buttons}
<div class="text-center">
<div class="progress" style="height: 18px;">
<div class="progress-bar bg-success" role="progressbar"
style="width: ${progress}%;"
aria-valuenow="${progress}" aria-valuemin="0" aria-valuemax="100">
${progress}%
</div>
</div>
<small class="text-muted">${selesai} / ${total} selesai</small>
</div>
`;
}
},
},
sortable: true,
},
{
title: "Pemesan",
field:'nama_pemesan',
sortable: true,
},
{
title: "Tgl Pemesanan",
field: 'entry_at',
formatter: function(value, row) {
if (!row?.entry_at) return '-';
{
title: "No.Order",
field: 'no_order',
sortable: true,
},
{
title: "Cara Pembayaran",
field: 'cara_pembayaran',
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';
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')
}
return `
<span class="badge ${badgeClass} px-3 py-1">${status}</span>
${status === 'Dibatalkan' && row.note_dibatalkan ? `
<div class="text-danger small mt-1">
<i class="fa fa-info-circle"></i> ${row.note_dibatalkan}
</div>
` : ''}
`;
}
},
{
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 `
<div class="text-center">
<div class="progress" style="height: 18px;">
<div class="progress-bar bg-success" role="progressbar"
style="width: ${progress}%;"
aria-valuenow="${progress}" aria-valuemin="0" aria-valuemax="100">
${progress}%
</div>
</div>
<small class="text-muted">${selesai} / ${total} selesai</small>
</div>
`;
},
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')
}
}
],
],
});
}

View File

@ -91,6 +91,38 @@
</div>
</div>
<div class="row g-4 mt-2">
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-info text-secondary">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-money me-1"></i> Karyawan RSAB Harapan Kita</h5>
<h2 class="fw-bold mb-1" id="nilai_transaksi_karyawan">Rp 1.240.000</h2>
<small>Total Nilai Transaksi Karyawan RSAB Harapan Kita</small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-secondary text-secondary">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-money me-1"></i> Keluarga Pasien / Penunggu Pasien</h5>
<h2 class="fw-bold mb-1" id="nilai_transaksi_pasien">Rp 1.240.000</h2>
<small>Total Nilai Transaksi Keluarga Pasien / Penunggu Pasien</small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-success text-secondary">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-money me-1"></i> Masyarakat Umum</h5>
<h2 class="fw-bold mb-1" id="nilai_transaksi_masyarakat">Rp 1.240.000</h2>
<small>Total Nilai Transaksi Masyarakat Umum</small>
</div>
</div>
</div>
</div>
<div class="card mt-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Data Pesanan </h5>

View File

@ -58,6 +58,7 @@
<option value="Snack">Snack</option>
<option value="Makanan">Makanan</option>
<option value="Minuman">Minuman</option>
<option value="Paket">Paket</option>
</select>
<label>Kategori</label>
</div>
@ -83,7 +84,7 @@
</div>
<div class="col-md-12">
<label for="tags" class="form-label">Kalori</label>
<select class="kalori-menu" multiple name="data[0][kalori_id][]"></select>
<select class="kalori-menu" name="data[0][kalori_id][]"></select>
</div>
<div class="col-md-6">

View File

@ -51,6 +51,7 @@
<option value="Snack">Snack</option>
<option value="Makanan">Makanan</option>
<option value="Minuman">Minuman</option>
<option value="Paket">Paket</option>
</select>
<label>Kategori</label>
</div>
@ -76,7 +77,7 @@
</div>
<div class="col-md-12">
<label for="kalori_id_edit" class="form-label">Kalori</label>
<select class="kalori-menu" multiple name="kalori_id[]" id="kalori_id_edit"></select>
<select class="kalori-menu" name="kalori_id[]" id="kalori_id_edit"></select>
</div>
<div class="col-md-6">

View File

@ -52,12 +52,12 @@
<div data-i18n="Account Settings">Master Menu</div>
</a>
</li>
<li class="menu-item {{ Request::is('dashboard/paket-menu') ? 'active' : '' }}">
{{-- <li class="menu-item {{ Request::is('dashboard/paket-menu') ? 'active' : '' }}">
<a href="/dashboard/paket-menu" class="menu-link">
<i class="menu-icon tf-icons bx bx-dock-top"></i>
<div data-i18n="Authentications">Master Paket Menu</div>
</a>
</li>
</li> --}}
<!-- Components -->
<li class="menu-header small text-uppercase"><span class="menu-header-text">Order</span></li>
<!-- Cards -->

View File

@ -18,6 +18,9 @@
<!-- Kanan: Tombol Export + Input Tanggal -->
<div class="d-flex align-items-center gap-2">
<!-- Tombol Export -->
<button type="button" class="btn btn-sm btn-primary" id="buttonLabel" onclick="labelDownload()" disabled>
<i class="fa-solid fa-qrcode"></i> Download Label
</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPekerjaan()">
<i class="fa fa-download me-1"></i> Export
</button>
@ -66,7 +69,17 @@
})
initDt(selectedFormattedDates);
if(selectedFormattedDates.length > 0){
$("#confirm_pekerjaan_time").text('Pada Tanggal : ' + selectedFormattedDates)
const tanggalList = selectedFormattedDates;
let tanggalRapi = '';
if (tanggalList.length === 1) {
tanggalRapi = tanggalList[0];
} else if (tanggalList.length === 2) {
tanggalRapi = tanggalList.join(' dan ');
} else if (tanggalList.length > 2) {
tanggalRapi = tanggalList.slice(0, -1).join(', ') + ', dan ' + tanggalList.slice(-1);
}
$("#confirm_pekerjaan_time").text(': '+ tanggalRapi)
}else{
$("#confirm_pekerjaan_time").text('Hari Ini');
}

View File

@ -109,7 +109,7 @@
<th>Nama Pemesan</th>
<th>Status Order</th>
<th>Tanggal Antar</th>
<th>Waktu Pemesanan</th>
<th>Waktu Makan</th>
<th>Menu</th>
<th>Keterangan</th>
<th>Jumlah</th>

View File

@ -44,26 +44,4 @@
<script src="{{ ver('/js/pesanan_pending/dt.js') }}"></script>
<script src="{{ ver('/js/pesanan_pending/action.js') }}"></script>
<script src="{{ ver('/js/pesanan_pending/action_progres_order.js') }}"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
flatpickr('#tanggal', {
dateFormat: "Y-m-d",
mode: "multiple",
locale: "id", // opsional: agar hari/bulan dalam Bahasa Indonesia
onValueUpdate: function(selectedDates, dateStr, instance) {
const selectedFormattedDates = selectedDates.map(d => {
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
})
if(selectedFormattedDates.length > 0){
$("#confirm_date_pesanan_pending").text('Pada Tanggal : ' + selectedFormattedDates)
}else{
$("#confirm_date_pesanan_pending").text('');
}
}
});
});
</script>
@endsection

View File

@ -2,11 +2,11 @@
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Laporan Pesanan</title>
<title>Laporan Pesanan Pending</title>
<style>
body {
font-family: Arial, sans-serif;
font-size: 11px;
font-size: 10px;
line-height: 1.5;
margin: 40px;
color: #333;
@ -56,11 +56,11 @@
th {
background-color: #f0f0f0;
text-align: center;
font-size: 11px;
font-size: 10px;
}
td {
font-size: 11px;
font-size: 10px;
vertical-align: top;
}
@ -68,14 +68,7 @@
background-color: #f9f9f9;
}
th:nth-child(1), td:nth-child(1) { width: 30px; text-align: center; }
th:nth-child(2), td:nth-child(2) { width: 90px; }
th:nth-child(3), td:nth-child(3) { width: 140px; }
th:nth-child(4), td:nth-child(4) { width: 150px; }
th:nth-child(5), td:nth-child(5) { width: 50px; text-align: center; }
th:nth-child(6), td:nth-child(6) { width: 80px; text-align: right; }
th:nth-child(7), td:nth-child(7) { width: 90px; text-align: center; }
th:nth-child(8), td:nth-child(8) { width: 60px; text-align: center; }
.footer {
position: absolute;
@ -91,10 +84,10 @@
<div class="header">
<h2>Laporan Pesanan Pending</h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }} </div>
@if ($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
</div>
@ -106,51 +99,51 @@
<table>
<thead>
<tr>
<th>No</th>
<th style="width:5%;">No</th>
<th>No Order</th>
<th>Status Bayar</th>
<th>Nama Pemesan</th>
<th>Menu</th>
<th>Status Order</th>
<th>Jumlah</th>
<th>Harga Satuan (Rp)</th>
<th style="width:9%;">Jumlah</th>
<th style="width:9%; text-align:center;">Harga Satuan (Rp)</th>
<th>Tanggal Antar</th>
<th>Waktu</th>
<th>Waktu Makan</th>
</tr>
</thead>
<tbody>
@php $no = 1; @endphp
@forelse ($orders as $order)
@foreach ($order->orderDetail as $i => $detail)
<tr>
<td style="text-align: center;">{{ $i === 0 ? $no++ : '' }}</td>
<td>{{ $i === 0 ? $order->no_order : '' }}</td>
<td>
@if ($i === 0)
{{ $order->nama_pemesan }}
@if ($order->jenis_customer)
<br><small>({{ $order->jenis_customer }})</small>
@endif
@endif
</td>
<td>{{ $detail->menu->nama_menu ?? '-' }}</td>
<td>{{ $detail->status_order ?? '-' }}</td>
<td style="text-align: center;">{{ $detail->jumlah }}</td>
<td style="text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td style="text-align: center;">
{{ $detail->tgl_antar
? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y')
: '-' }}
</td>
<td style="text-align: center;">{{ $detail->type }}</td>
</tr>
@endforeach
@empty
@forelse ($orders as $order)
@foreach ($order->orderDetail as $i => $detail)
<tr>
<td colspan="9" style="text-align: center; color: #888;">Tidak ada data pesanan</td>
<td>{{ $i === 0 ? $no++ : '' }}</td>
<td>{{ $i === 0 ? $order->no_order : '' }}</td>
<td>{{ $i === 0 ? ($order->status_order === "Belum Bayar" ? $order->status_order : $order->status_order . ' ('. $order->cara_pembayaran .')' ) : '' }}</td>
<td>
@if ($i === 0)
{{ $order->nama_pemesan }}
@if ($order->jenis_customer)
<br><small>({{ $order->jenis_customer }})</small>
@endif
@endif
</td>
<td>{{ $detail->menu->nama_menu ?? '-' }}</td>
<td>{{ $detail->status_order ?? '-' }}</td>
<td style="text-align: center;">{{ $detail->jumlah }}</td>
<td style="text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td style="text-align: center;">
{{ $detail->tgl_antar
? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y')
: '-' }}
</td>
<td style="text-align: center;">{{ $detail->type }}</td>
</tr>
@endforelse
@endforeach
@empty
<tr>
<td colspan="9" style="text-align: center; color: #888;">Tidak ada data pesanan</td>
</tr>
@endforelse
</tbody>
</table>

View File

@ -10,7 +10,7 @@
<!-- Card Master Menu -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Pesanan Selesai</h5>
<h5 class="mb-0">Pesanan Selesai <strong id="confirm_selesai_time"></strong></h5>
<div class="d-flex align-items-center gap-2">
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportSelesai()">
<i class="fa fa-download me-1"></i> Export
@ -54,13 +54,27 @@
const day = String(d.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
})
initDt(selectedFormattedDates)
if(selectedFormattedDates.length > 0){
$("#confirm_date_pesanan_pending").text('Pada Tanggal : ' + selectedFormattedDates)
const tanggalList = selectedFormattedDates;
let tanggalRapi = '';
if (tanggalList.length === 1) {
tanggalRapi = tanggalList[0];
} else if (tanggalList.length === 2) {
tanggalRapi = tanggalList.join(' dan ');
} else if (tanggalList.length > 2) {
tanggalRapi = tanggalList.slice(0, -1).join(', ') + ', dan ' + tanggalList.slice(-1);
}
$("#confirm_selesai_time").text(': ' + tanggalRapi)
}else{
$("#confirm_date_pesanan_pending").text('');
$("#confirm_selesai_time").text('');
}
}
});
$("#confirm_selesai_time").text('Hari ini');
initDt()
});
</script>
@endsection

View File

@ -68,7 +68,6 @@
background-color: #f9f9f9;
}
th:nth-child(1), td:nth-child(1) { width: 30px; text-align: center; }
th:nth-child(2), td:nth-child(2) { width: 90px; }
th:nth-child(3), td:nth-child(3) { width: 140px; }
th:nth-child(4), td:nth-child(4) { width: 150px; }
@ -114,7 +113,7 @@
<th>Jumlah</th>
<th>Harga Satuan (Rp)</th>
<th>Tanggal Antar</th>
<th>Waktu</th>
<th>Waktu Makan</th>
</tr>
</thead>
<tbody>
@ -122,7 +121,7 @@
@forelse ($orders as $order)
@foreach ($order->orderDetail as $i => $detail)
<tr>
<td style="text-align: center;">{{ $i === 0 ? $no++ : '' }}</td>
<td style="width: 6%;">{{ $i === 0 ? $no++ : '' }}</td>
<td>{{ $i === 0 ? $order->no_order : '' }}</td>
<td>
@if ($i === 0)
@ -134,8 +133,8 @@
</td>
<td>{{ $detail->menu->nama_menu ?? '-' }}</td>
<td>{{ $detail->status_order ?? '-' }}</td>
<td style="text-align: center;">{{ $detail->jumlah }}</td>
<td style="text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td style="width: 10%; text-align: center;">{{ $detail->jumlah }}</td>
<td style="width: 10%; text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td style="text-align: center;">
{{ $detail->tgl_antar
? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y')

View File

@ -4,11 +4,8 @@
<section class="section py-5 bg-light">
<div class="container">
<div class="row">
<div class="col-md-12 mb-2">
<div id="welcomeMessage"></div>
</div>
<div class="col-md-6">
<ul class="nav nav-tabs mb-4 " id="tabJenisMenu">
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12">
<ul class="nav nav-tabs mb-3" id="tabJenisMenu">
<li class="nav-item"><a class="nav-link active text-success" href="#" data-filter="makanan">Makanan</a></li>
<li class="nav-item "><a class="nav-link text-black" href="#" data-filter="minuman">Minuman</a></li>
<li class="nav-item"><a class="nav-link text-black" href="#" data-filter="snack">Snack</a></li>
@ -16,12 +13,36 @@
<li class="nav-item"><a class="nav-link text-black" href="#" data-filter="konsultasi">Jadwal Konsultasi Gizi</a></li>
</ul>
</div>
<div class="col-md-6">
<div class="mb-4">
<div class="col-lg-6 col-md-12 col-sm-12 col-xs-12">
<div class="mb-3">
<input type="text" class="form-control" id="searchMenu" placeholder="Pencarian...">
</div>
</div>
</div>
<div class="row g-2 m-2">
<!-- Filter Kategori Ketersediaan -->
<div class="col-12 mb-2">
<h6 class="fw-bold text-muted">Ketersediaan Menu</h6>
<div class="d-flex flex-wrap gap-2">
<button type="button" class="btn btn-outline-success btn-sm" data-filter="someday">Tersedia Setiap Hari</button>
<button type="button" class="btn btn-outline-primary btn-sm" data-filter="normal">Tersedia di Tanggal Tertentu</button>
</div>
</div>
<!-- Filter Kategori Menu -->
<div class="col-12 mt-3">
<h6 class="fw-bold text-muted">Kategori Menu</h6>
<div class="d-flex flex-wrap gap-2">
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu1">Menu 1</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu2">Menu 2</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu3">Menu 3</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu4">Menu 4</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu5">Menu 5</button>
<!-- dan seterusnya -->
</div>
</div>
</div>
<div id="order_guest_id"></div>
<div id="floatingCartButton"
class="cart-floating bg-success text-white rounded d-none shadow-lg"

View File

@ -59,6 +59,7 @@ Route::group(['middleware' => ['auth']], function(){
Route::get('datatable/pekerjaan', [PesananController::class, 'getPekerjaan']);
Route::post('pekerjaan/export', [PesananController::class, 'exportPekerjaan']);
Route::get('/pekerjaan/detail/{id}', [PesananController::class, 'getPekerjaanDetail']);
Route::post('/pekerjaan/label', [PesananController::class, 'downloadLabel']);
});
Route::post('/logout', [AuthController::class, 'logout']);