diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 8afb953..30d0939 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -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(); diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 329f80f..407f9e1 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -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(), diff --git a/app/Http/Controllers/KaloriController.php b/app/Http/Controllers/KaloriController.php index 9950a05..81fe7f8 100644 --- a/app/Http/Controllers/KaloriController.php +++ b/app/Http/Controllers/KaloriController.php @@ -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([ diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index b290dd9..981c0d9 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -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. */ diff --git a/public/asset_guests/css/main.css b/public/asset_guests/css/main.css index 587edb7..29b569d 100644 --- a/public/asset_guests/css/main.css +++ b/public/asset_guests/css/main.css @@ -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; + } + } diff --git a/public/assets/img/404.png b/public/assets/img/404.png new file mode 100644 index 0000000..dfa25a6 Binary files /dev/null and b/public/assets/img/404.png differ diff --git a/public/gambar/1PiDSRRaH56koiV.png b/public/gambar/1PiDSRRaH56koiV.png new file mode 100644 index 0000000..b2c8f08 Binary files /dev/null and b/public/gambar/1PiDSRRaH56koiV.png differ diff --git a/public/gambar/2LLlfVZAwhyugfI.jpg b/public/gambar/2LLlfVZAwhyugfI.jpg new file mode 100644 index 0000000..d55b065 Binary files /dev/null and b/public/gambar/2LLlfVZAwhyugfI.jpg differ diff --git a/public/gambar/BaaeDhuwxvnZizJ.jpg b/public/gambar/BaaeDhuwxvnZizJ.jpg new file mode 100644 index 0000000..884f54d Binary files /dev/null and b/public/gambar/BaaeDhuwxvnZizJ.jpg differ diff --git a/public/gambar/EKUC5BMuEwyu6fr.jpg b/public/gambar/EKUC5BMuEwyu6fr.jpg new file mode 100644 index 0000000..6862e0c Binary files /dev/null and b/public/gambar/EKUC5BMuEwyu6fr.jpg differ diff --git a/public/gambar/Kc8m48SGRwfqCKp.jpg b/public/gambar/Kc8m48SGRwfqCKp.jpg new file mode 100644 index 0000000..322ca31 Binary files /dev/null and b/public/gambar/Kc8m48SGRwfqCKp.jpg differ diff --git a/public/gambar/P9aGUsEmbhzi2lQ.png b/public/gambar/P9aGUsEmbhzi2lQ.png new file mode 100644 index 0000000..b2c8f08 Binary files /dev/null and b/public/gambar/P9aGUsEmbhzi2lQ.png differ diff --git a/public/gambar/R4RwHfMdvPd9OQg.jpg b/public/gambar/R4RwHfMdvPd9OQg.jpg new file mode 100644 index 0000000..d55b065 Binary files /dev/null and b/public/gambar/R4RwHfMdvPd9OQg.jpg differ diff --git a/public/gambar/aGdDPjqGDQvBdu9.jpg b/public/gambar/aGdDPjqGDQvBdu9.jpg new file mode 100644 index 0000000..d7fdf6b Binary files /dev/null and b/public/gambar/aGdDPjqGDQvBdu9.jpg differ diff --git a/public/gambar/adjsGhdxjp9ed56.jpg b/public/gambar/adjsGhdxjp9ed56.jpg new file mode 100644 index 0000000..66452f7 Binary files /dev/null and b/public/gambar/adjsGhdxjp9ed56.jpg differ diff --git a/public/gambar/bWYX7qOQIEpRB23.jpg b/public/gambar/bWYX7qOQIEpRB23.jpg new file mode 100644 index 0000000..ce2830e Binary files /dev/null and b/public/gambar/bWYX7qOQIEpRB23.jpg differ diff --git a/public/gambar/fOoiTswsOkCGb2x.jpg b/public/gambar/fOoiTswsOkCGb2x.jpg new file mode 100644 index 0000000..884f54d Binary files /dev/null and b/public/gambar/fOoiTswsOkCGb2x.jpg differ diff --git a/public/gambar/k5P14WguOQVW4af.jpg b/public/gambar/k5P14WguOQVW4af.jpg new file mode 100644 index 0000000..8c199ec Binary files /dev/null and b/public/gambar/k5P14WguOQVW4af.jpg differ diff --git a/public/gambar/uhsxLiDIpIgtTw9.jpg b/public/gambar/uhsxLiDIpIgtTw9.jpg new file mode 100644 index 0000000..deacad0 Binary files /dev/null and b/public/gambar/uhsxLiDIpIgtTw9.jpg differ diff --git a/public/gambar/ypeScN7ShpO3wcd.jpg b/public/gambar/ypeScN7ShpO3wcd.jpg new file mode 100644 index 0000000..6c8cd04 Binary files /dev/null and b/public/gambar/ypeScN7ShpO3wcd.jpg differ diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index 200ae39..ce8efc3 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -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); } diff --git a/public/js/dashboard/index.js b/public/js/dashboard/index.js index 61d0860..2e2c415 100644 --- a/public/js/dashboard/index.js +++ b/public/js/dashboard/index.js @@ -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 => { diff --git a/public/js/menu/action.js b/public/js/menu/action.js index 8ac0350..cd2f862 100644 --- a/public/js/menu/action.js +++ b/public/js/menu/action.js @@ -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 `
.
'); + return containerGuest.html(` +
+