progress label
@ -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();
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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([
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
|
||||
@ -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
|
After Width: | Height: | Size: 41 KiB |
BIN
public/gambar/1PiDSRRaH56koiV.png
Normal file
|
After Width: | Height: | Size: 458 KiB |
BIN
public/gambar/2LLlfVZAwhyugfI.jpg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
public/gambar/BaaeDhuwxvnZizJ.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
public/gambar/EKUC5BMuEwyu6fr.jpg
Normal file
|
After Width: | Height: | Size: 134 KiB |
BIN
public/gambar/Kc8m48SGRwfqCKp.jpg
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/gambar/P9aGUsEmbhzi2lQ.png
Normal file
|
After Width: | Height: | Size: 458 KiB |
BIN
public/gambar/R4RwHfMdvPd9OQg.jpg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
public/gambar/aGdDPjqGDQvBdu9.jpg
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/gambar/adjsGhdxjp9ed56.jpg
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
public/gambar/bWYX7qOQIEpRB23.jpg
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
public/gambar/fOoiTswsOkCGb2x.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
public/gambar/k5P14WguOQVW4af.jpg
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
public/gambar/uhsxLiDIpIgtTw9.jpg
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
public/gambar/ypeScN7ShpO3wcd.jpg
Normal file
|
After Width: | Height: | Size: 163 KiB |
@ -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);
|
||||
}
|
||||
|
||||
@ -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 => {
|
||||
|
||||
@ -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'));
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
});
|
||||
|
||||
@ -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')
|
||||
}
|
||||
}
|
||||
|
||||
],
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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 -->
|
||||
|
||||
@ -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');
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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']);
|
||||
|
||||