progress report

This commit is contained in:
JokoPrasetio 2025-08-12 17:24:34 +07:00
parent 8152490596
commit c1dfa20b0f
53 changed files with 2034 additions and 309 deletions

View File

@ -113,13 +113,6 @@ class CustomerController extends Controller
->table('public.detail_menu_paket_harian as dmph')
->whereIn('dmph.master_menu_id', $menuIds)
->select('dmph.master_menu_id', 'dmph.tgl_harian')
// ->orderByRaw("
// CASE
// WHEN tgl_harian >= ? THEN 0
// ELSE 1
// END,
// tgl_harian ASC
// ", [$today])
->get()
->groupBy('master_menu_id');
$kkal = DB::connection('dbOrderGizi')
@ -130,38 +123,63 @@ class CustomerController extends Controller
->get()
->groupBy('master_menu_id');
// Step 4: Transform response
$enriched = $menuItems->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
return [
'master_menu_id' => $menu->master_menu_id,
'nama' => $menu->nama_menu,
'foto' => $menu->foto,
'jenis_menu' => $menu->jenis_menu,
'harga_public' => $menu->harga_public,
'harga_karyawan' => $menu->harga_karyawan,
'harga_keluarga_pasien' => $menu->harga_keluarga_pasien,
'status' => $menu->status,
'deskripsi' => $menu->deskripsi,
'apakah_someday' => $menu->apakah_someday,
'apakah_menu_sore' => $menu->apakah_menu_sore,
'apakah_menu_siang' => $menu->apakah_menu_siang,
'klasifikasiMenu' => isset($klasifikasi[$menu->master_menu_id]) ? $klasifikasi[$menu->master_menu_id]->map(function ($item) {
return [
'kategori_diet_id' => $item->kategori_diet_id,
'nama_kategori_diet' => $item->nama_kategori_diet,
];
})->values() : [],
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
return [
'tgl_harian' => $item->tgl_harian
];
})->values() : [],
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
return [
'nilai_kalori' => $item->nilai_kalori,
];
})->values() : [],
];
function buildGroupLabel($tglList, $isSomeday){
if($isSomeday) return 'Menu Sameday';
if(empty($tglList)) return '-';
$days = collect($tglList)->map(fn($t) => substr($t, -2))
->unique()
->sort()
->values();
$groups = [];
foreach ($days as $d) {
$lastDigit = substr($d, -1);
$groups[$lastDigit][] = $d;
}
// buat label
$labels = [];
foreach ($groups as $list) {
$labels[] = 'Menu Normal Tersedia Tanggal ' . implode(',', $list);
}
return implode(' & ', $labels);
}
// Step 4: Transform response
$enriched = $menuItems->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
$tglList = isset($dmph[$menu->master_menu_id]) ? collect($dmph[$menu->master_menu_id])->pluck('tgl_harian')->toArray() : [];
$groupLabel = buildGroupLabel($tglList, $menu->apakah_someday);
return [
'master_menu_id' => $menu->master_menu_id,
'nama' => $menu->nama_menu,
'foto' => $menu->foto,
'jenis_menu' => $menu->jenis_menu,
'harga_public' => $menu->harga_public,
'harga_karyawan' => $menu->harga_karyawan,
'harga_keluarga_pasien' => $menu->harga_keluarga_pasien,
'status' => $menu->status,
'deskripsi' => $menu->deskripsi,
'apakah_someday' => $menu->apakah_someday,
'apakah_menu_sore' => $menu->apakah_menu_sore,
'apakah_menu_siang' => $menu->apakah_menu_siang,
'group_label' => $groupLabel,
'klasifikasiMenu' => isset($klasifikasi[$menu->master_menu_id]) ? $klasifikasi[$menu->master_menu_id]->map(function ($item) {
return [
'kategori_diet_id' => $item->kategori_diet_id,
'nama_kategori_diet' => $item->nama_kategori_diet,
];
})->values() : [],
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
return [
'tgl_harian' => $item->tgl_harian
];
})->values() : [],
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
return [
'nilai_kalori' => $item->nilai_kalori,
];
})->values() : [],
];
});
// Urutkan: someday → tgl_harian terdekat
@ -374,6 +392,7 @@ class CustomerController extends Controller
try {
$noOrder = request('no_order_result');
$medical_record = request('medical_record');
$evidence = request()->file('bukti_pembayaran');
$caraPembayaran = request('cara_pembayaran');
@ -402,6 +421,7 @@ class CustomerController extends Controller
}else{
$payload['cara_pembayaran'] = 'Billing';
$payload['status_order'] = 'Menunggu Konfirmasi Pembayaran Via Billing';
$payload['medical_record'] = $medical_record ?? null;
}
// Update data order
$order->update($payload);
@ -438,7 +458,7 @@ class CustomerController extends Controller
}
public function checkOrder(){
$payload = [
'title' => 'Check Order'
];
@ -460,6 +480,7 @@ class CustomerController extends Controller
'od.tgl_antar',
'od.harga_satuan',
'od.status_order as status_order_detail',
'od.catatan',
DB::raw("COALESCE(mm.nama_menu, mpm.nama_paket) as nama_item"),
DB::raw("COALESCE(mm.foto, mpm.foto) as foto"),
)
@ -504,6 +525,7 @@ class CustomerController extends Controller
'jumlah' => $item->jumlah,
'harga_satuan' => $item->harga_satuan,
'status_order' => $item->status_order_detail,
'catatan' => $item->catatan ?? '-'
// tambahkan field tambahan jika diperlukan
];
})->values(),

View File

@ -11,6 +11,8 @@ use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class PesananController extends Controller
{
@ -42,6 +44,7 @@ class PesananController extends Controller
"DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")",
$tanggalFormatted
)
->whereIn('o.status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing'])
->select(
'o.order_id',
'o.entry_at',
@ -53,6 +56,7 @@ class PesananController extends Controller
'o.total_harga',
'o.bukti_pembayaran',
'o.note_dibatalkan',
'o.medical_record',
'od.status_order as detail_status_order'
)->get()->groupBy('order_id');
$grouped = $orders->map(function($items){
@ -70,6 +74,7 @@ class PesananController extends Controller
'status_order' => $first->status_order,
'cara_pembayaran' => $first->cara_pembayaran,
'bukti_pembayaran' => $first->bukti_pembayaran,
'medical_record' => $first->medical_record,
'progress' => $progress,
'total_detail' => $totalDetail,
'selesai_detail' => $selesaiDetail,
@ -249,7 +254,7 @@ class PesananController extends Controller
}
public function getPekerjaan(){
$data = OrderDetail::with(['menu', 'paketMenu', 'order'])->whereHas('order', function($q){
$data = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q){
$q->where('status_order', 'Lunas');
});
$tanggal = request('tanggal');
@ -280,7 +285,7 @@ class PesananController extends Controller
$startDate = request('start_date');
$endDate = request('end_date');
$now = Carbon::now()->format('Y-m-d H-i');
$orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order'])->whereHas('order', function($q){
$orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q){
$q->where('status_order', 'Lunas');
})->whereBetween('tgl_antar', [$startDate, $endDate])->get();
$waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y');
@ -303,15 +308,14 @@ class PesananController extends Controller
$order = Order::where('statusenabled', true)
->whereBetween('entry_at', [$startDate, $endDate])
->with('orderDetail')
->whereHas('orderDetail', function($q) {
$q->where('status_order', '!=', 'Selesai');
})
->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing'])
->get();
$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 = [
'laporan' => 'LAPORAN KONFIRMASI PESANAN',
'waktu_cetak' => $waktu_cetak,
'orders' => $order,
'startDate' => $startDateFormatted,
@ -350,7 +354,7 @@ class PesananController extends Controller
return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf');
}
public function countPesananPending(){
public function countKonfirmasiPesanan(){
$count = Order::where('statusenabled', true)->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing'])->count();
return response()->json([
'status' => true,
@ -358,10 +362,255 @@ class PesananController extends Controller
]);
}
public function downloadLabel(Request $request){
$items = $request->input('items');
public function countVerifikasiPesanan(){
$count = OrderDetail::where('status_order', 'Pending')->with('order')->whereHas('order', function($q){
$q->where('status_order', 'Lunas');
})->count();
return response()->json([
'status' => true,
'count' => $count,
]);
}
dd(json_encode($items));
public function laporanPesanan(){
$data = [
'title' => 'Laporan Pesanan'
];
return view('dashboard.pesanan.laporan.pesanan.index', $data);
}
public function getLaporanPesanan(){
$tanggal = request('tanggal');
if(!empty($tanggal)){
$tanggalFormatted = collect($tanggal)->map(function ($tgl){
return Carbon::parse($tgl)->toDateString();
})->toArray();
}else{
$tanggalFormatted = [Carbon::now()->toDateString()];
}
$orders = self::helperLaporanPesanan($tanggalFormatted);
$grouped = $orders->map(function($items){
$first = $items->first();
$totalDetail = $items->count();
$selesaiDetail = $items->where('detail_status_order', 'Selesai')->count();
$progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0;
return [
'order_id' => $first->order_id,
'entry_at' => $first->entry_at,
'no_order' => $first->no_order,
'nama_pemesan' => $first->nama_pemesan,
'jenis_customer' => $first->jenis_customer,
'total_harga' => $first->total_harga,
'status_order' => $first->status_order,
'bukti_pembayaran' => $first->bukti_pembayaran,
'cara_pembayaran' => $first->cara_pembayaran,
'medical_record' => $first->medical_record,
'progress' => $progress,
'total_detail' => $totalDetail,
'selesai_detail' => $selesaiDetail,
'note_dibatalkan' => $first->note_dibatalkan,
];
})
->values();
return response()->json([
'status' => true,
'rows' => $grouped->values(),
'total' => $grouped->count()
]);
}
public function helperLaporanPesanan($tanggalFormatted){
$data = DB::connection('dbOrderGizi')->table('public.order as o')
->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id')
->where(['o.statusenabled' => true, 'o.status_order' => 'Lunas'])
->whereRaw(
"DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")",
$tanggalFormatted
)
->select(
'o.order_id',
'o.entry_at',
'o.no_order',
'o.nama_pemesan',
'o.jenis_customer',
'o.total_harga',
'o.cara_pembayaran',
'o.status_order',
'o.bukti_pembayaran',
'o.note_dibatalkan',
'o.medical_record',
'od.status_order as detail_status_order'
)->get()->groupBy('order_id');
return $data;
}
public function exportLaporanPesanan(){
$startDate = Carbon::parse(request('start_date'))->startOfDay();
$endDate = Carbon::parse(request('end_date'))->endOfDay();
$type = request('type');
$type_customer = request('type_customer');
$query = Order::where('statusenabled', true)->where('status_order', 'Lunas');
if($type_customer !== 'all'){
$query->where('jenis_customer', $type_customer);
}
$order = $query->whereBetween('entry_at', [$startDate, $endDate])->with('orderDetail')->get();
if($type === 'pdf'){
return $this->pdfPesanan($startDate, $endDate, $order);
}else{
return $this->excelPesanan($startDate, $endDate, $order);
}
}
public function pdfPesanan($startDate, $endDate, $order){
$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 = [
'laporan' => 'Laporan Pesanan',
'waktu_cetak' => $waktu_cetak,
'orders' => $order,
'startDate' => $startDateFormatted,
'endDate' => $endDateFormatted
];
$pdf = Pdf::loadView('dashboard.pesanan.pending.pdf', $data);
return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf');
}
public function excelPesanan($startDate, $endDate, $order){
$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');
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
$sheet->mergeCells('A1:G1');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
$sheet->mergeCells('A2:G2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
// Header tabel
$headers = ["No", "Nomor Order", "Nama Customer", "Jenis Customer", "Tanggal Pesanan", "Total", "Detail Pesanan"];
$sheet->fromArray($headers, null, 'A4');
$sheet->getStyle('A4:G4')->getFont()->setBold(true);
$sheet->getStyle('A4:G4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:G4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// Isi data
$row = 5;
foreach ($order as $index => $item) {
$sheet->setCellValue("A{$row}", $index + 1);
$sheet->setCellValue("B{$row}", $item->no_order);
$sheet->setCellValue("C{$row}", $item->nama_pemesan);
$sheet->setCellValue("D{$row}", $item->jenis_customer);
$sheet->setCellValue("E{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
$sheet->setCellValue("F{$row}", $item->total_harga);
$sheet->setCellValue("G{$row}", $item->orderDetail->map(function ($detail) {
return $detail->nama_menu . ' x' . $detail->jumlah;
})->implode(', '));
// Border tiap baris
$sheet->getStyle("A{$row}:G{$row}")->getBorders()->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$row++;
}
// Auto size kolom
foreach(range('A', 'G') as $col){
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$lastRow = $row - 1;
$sheet->setAutoFilter("A4:P{$lastRow}");
// Download file
$fileName = 'laporan-pesanan-' . now()->format('Ymd-His') . '.xlsx';
$writer = new Xlsx($spreadsheet);
// Output ke browser
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Content-Disposition: attachment; filename=\"{$fileName}\"");
header('Cache-Control: max-age=0');
$writer->save('php://output');
exit;
}
public function indexSemua(){
$payload = [
'title' => 'Semua Pesanan',
];
return view('dashboard.pesanan.semua.index', $payload);
}
public function getSemuaPekerjaan(){
$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',
'o.no_order',
'o.nama_pemesan',
'o.jenis_customer',
'o.total_harga',
'o.cara_pembayaran',
'o.status_order',
'o.bukti_pembayaran',
'o.note_dibatalkan',
'o.medical_record',
'od.status_order as detail_status_order'
)->get()->groupBy('order_id');
$grouped = $orders->map(function($items){
$first = $items->first();
$totalDetail = $items->count();
$selesaiDetail = $items->where('detail_status_order', 'Selesai')->count();
$progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0;
return [
'order_id' => $first->order_id,
'entry_at' => $first->entry_at,
'no_order' => $first->no_order,
'nama_pemesan' => $first->nama_pemesan,
'jenis_customer' => $first->jenis_customer,
'total_harga' => $first->total_harga,
'status_order' => $first->status_order,
'bukti_pembayaran' => $first->bukti_pembayaran,
'cara_pembayaran' => $first->cara_pembayaran,
'progress' => $progress,
'total_detail' => $totalDetail,
'selesai_detail' => $selesaiDetail,
'note_dibatalkan' => $first->note_dibatalkan,
];
})
->values();
return response()->json([
'status' => true,
'rows' => $grouped->values(),
'total' => $grouped->count()
]);
}
/**
* Show the form for creating a new resource.

View File

@ -36,7 +36,8 @@ class Order extends Model
'bagian_instalasi',
'note_dibatalkan',
'email',
'alamat'
'alamat',
'medical_record'
];
protected $cast = [

View File

@ -31,6 +31,9 @@ class OrderDetail extends Model
public function menu(){
return $this->belongsTo(Menu::class, 'master_menu_id', 'master_menu_id')->select('master_menu_id', 'nama_menu', 'foto');
}
public function karbohidrat(){
return $this->belongsTo(Karbohidrat::class, 'karbohidrat_id', 'karbohidrat_id')->select('karbohidrat_id', 'nama_karbohidrat', 'nilai_kalori');
}
public function paketMenu(){
return $this->belongsTo(PaketMenu::class, 'master_paket_menu_id', 'master_paket_menu_id')->select('master_paket_menu_id', 'nama_paket', 'foto');

View File

@ -2,6 +2,7 @@
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@ -19,6 +20,7 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
//
Blade::component('dashboard.pesanan.components.modalExport', 'modalExport');
Blade::component('dashboard.pesanan.components.infoPesanan', 'infoPesanan');
}
}

View File

@ -47,6 +47,10 @@ return [
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
'timeout' => null,
'auth_mode' => null,
'verify_peer'=> false,
'auto_tls' => false
],
'ses' => [

View File

@ -1897,15 +1897,15 @@ section,
/* TOMBOL */
.btn {
font-size: .60rem !important; /* ≈ 10 px */
padding: .31rem .41rem !important;
border-radius: .25rem !important;
font-size: .7rem !important;
padding: .5rem .25rem !important;
border-radius: .5rem;
}
.d-flex.justify-content-between small { font-size: .65rem; }
.d-flex.justify-content-between small { font-size: .65rem; }
.d-flex.justify-content-between strong { font-size: .65rem; }
}
/* fallback < 360 px menjadi 1 kolom */
@ -1925,4 +1925,38 @@ section,
#menuBtn:hover {
transform: translateX(-50%) translateY(-2px);
transition: transform .25s;
}
}
.btn-loading {
pointer-events: none;
opacity: 0.8;
display: flex;
align-items: center;
justify-content: center;
}
.btn-loading::after {
content: "";
border: 2px solid white;
border-top: 2px solid transparent;
border-radius: 50%;
width: 14px;
height: 14px;
animation: spin 0.6s linear infinite;
}
/* Khusus HP (max 576px) */
@media (max-width: 576px) {
.btn-loading::after {
width: 10px;
height: 10px;
border-width: 1.5px;
}
.btn-loading {
padding: 4px 8px; /* tombol lebih kecil di HP */
}
}
@keyframes spin {
to { transform: rotate(360deg); }
}

View File

@ -92,7 +92,6 @@ async function submitOrderToServer(){
});
const result = await response.json();
console.log(result);
if (result.status) {
// ✅ Hapus sessionStorage di client

View File

@ -290,7 +290,6 @@ function renderCartSummary() {
? item.harga_karyawan || 0
: item.harga_public || 0;
const itemTotal = pesananList.reduce((sum, p) => sum + (p.jumlah * harga), 0);
console.log(checkout_biodata);
if (checkout_biodata.jenis_customer === "Karyawan RSAB Harapan Kita") {
$('#karyawan').addClass('d-none');
@ -436,7 +435,7 @@ function renderCartSummary() {
: (item.tgl_tersedia ? `Tersedia pada tanggal: ${item.tgl_tersedia}` : 'Tidak ada info tanggal tersedia')}
</div>
<div class="mb-2 small text-muted"><i class="fa fa-utensils me-1"></i>
Menu: <strong>${item.apakah_someday ? 'Someday' : 'Menu Normal'}</strong>
Menu: <strong>${item.apakah_someday ? 'Sameday' : 'Menu Normal'}</strong>
</div>
${item.kalori
? `<div class="mb-2 small text-muted"><i class="fa-solid fa-bolt me-1"></i> Kalori: <strong>${item.kalori} kkal</strong></div>`
@ -771,7 +770,7 @@ function initFlatpickrTersedia(item, i) {
dayNumbers.forEach(day => {
const dayStr = String(day).padStart(2, '0');
const fullDateStr = `${year}-${month}-${dayStr}`;
const fullDate = new Date(`${fullDateStr}T23:00:00`);
const fullDate = new Date(`${fullDateStr}T00:00:00`);
// Jika bukan menu someday, cek aturan H-1 dan jam batas
if (item.apakah_someday) {
@ -833,14 +832,17 @@ function toggleBuktiPembayaran() {
const metode = document.getElementById("cara_pembayaran").value;
const buktiSection = document.getElementById("bukti_section");
const buktiInput = document.getElementById("bukti_pembayaran");
const billing_section = document.getElementById("billing_section");
buktiInput.required = true;
if (metode === "billing") {
buktiSection.style.display = "none";
billing_section.style.display = "block";
buktiInput.required = false;
$("#modalActionMethodBillingOrder").modal('show')
} else {
buktiSection.style.display = "block";
billing_section.style.display = "none";
buktiInput.required = true;
$("#modalActionMethodBillingOrder").modal('hide')
}

View File

@ -1,20 +1,43 @@
// $(document).ready(function () {
// getReminderOrder();
// });
$(document).ready(function () {
getReminderKonfirmasiPesanan();
getReminderVerifikasiMakanan()
});
// const getReminderOrder = () => {
// $.ajax({
// url: `/dashboard/count/pending`,
// success: function (response) {
const getReminderKonfirmasiPesanan = () => {
$.ajax({
url: `/dashboard/count/konfirmasi-pesanan`,
success: function (response) {
console.log(response);
// const button = document.getElementById("konfirmasi_pesanan");
// let count = response.count;
const button = document.getElementById("konfirmasi_pesanan");
let count = response.count;
// button.classList.remove('d-none');
// if(count === 0){
// button.classList.add('d-none');
// }
// button.innerText = count;
// },
// });
// };
button.classList.remove('d-none');
if(count === 0){
button.classList.add('d-none');
}
button.innerText = count;
},
});
};
const getReminderVerifikasiMakanan = () => {
$.ajax({
url: `/dashboard/count/verifikasi-pesanan`,
success: function (response) {
console.log(response);
const button = document.getElementById("verifikasi_makanan");
const konfirmasiPesanan = document.getElementById("konfirmasi_pesanan_offcanvas");
let count = response.count;
button.classList.remove('d-none');
if(count === 0){
button.classList.add('d-none');
konfirmasiPesanan.classList.add('d-none');
}
button.innerText = count;
konfirmasiPesanan.innerText = count;
},
});
};

View File

@ -0,0 +1,4 @@
const datatable =$("#datatableLaporanPesanan")
const infoPesanan = document.getElementById('infoPesanan')
const exportLp = document.getElementById('exportLp')
const exportPendapatan = document.getElementById('exportPendapatan')

View File

@ -0,0 +1,125 @@
function fetchDetailOrder(order_id){
fetch(`/dashboard/pending/action-progress-order/${order_id}`)
.then(res => res.json())
.then(res => {
const data = res;
document.getElementById('pesanan_container').innerHTML =''
// Generate HTML untuk order_detail
const detailHTML = (data?.order_detail || []).map(detail => {
return `
<div class="col-md-12 mb-3">
<div class="card shadow-sm border-0">
<div class="row g-0">
<div class="col-md-5 d-flex align-items-center p-2">
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 120px; width: auto;">
</div>
<div class="col-md-5 p-2">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
<p class="mb-1">Jumlah: <span>${detail?.jumlah || 0}</span></p>
<p class="mb-1">Tanggal Pesan: <span>${detail?.tgl_antar || 0}</span></p>
<p class="mb-1">Harga: <strong>Rp ${parseInt(detail?.harga_satuan || 0).toLocaleString('id-ID')}</strong></p>
<p class="mb-1">Status Pesanan:
<span class="badge text-dark ${detail?.status_order === 'Selesai' ? 'bg-success' : 'bg-warning'}"
id="status_badge_${detail.order_detail_id}">
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
</div>
</div>
</div>
</div>
`;
}).join('');
const html = `
<div class="row mt-4">
<!-- Gambar Bukti Pembayaran -->
${data.bukti_pembayaran ? `
<div class="col-md-4 text-center mb-3 mb-md-0">
<div class="border rounded shadow-sm p-2 bg-light">
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}"
alt="Bukti Pembayaran"
class="img-fluid rounded"
style="max-height: 170px; width: auto;">
<div class="text-muted small mt-2">Bukti Pembayaran</div>
</div>
</div>` : ''}
<!-- Informasi Pemesan -->
<div class="${data.bukti_pembayaran ? `col-md-8` : `col-md-12`}">
<div class="card shadow-sm border-0">
<div class="card-body">
<h5 class="card-title text-primary mb-1">${data.nama_pemesan}</h5>
<p class="text-muted mb-2">Jenis Customer: <strong>${data.jenis_customer}</strong></p>
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? `
<div class="mb-2">
<p class="mb-1">Nama Pasien: <strong>${data.nama_pasien}</strong></p>
<p class="mb-1">Nomor Kamar: <strong>${data.no_kamar_perawatan}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong>${data.ruang_perawatan}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong>${data.kelas_perawatan}</strong></p>
</div>` : data?.jenis_customer === 'Masyarakat Umum' ? `
<div class="mb-2">
<p class="mb-1">Alamat: <strong>${data.alamat || '-'}</strong></p>
</div>
` : `
<div class="mb-2">
<p class="mb-1">Bagian / Instalasi: <strong>${data.bagian_instalasi}</strong></p>
<p class="mb-1">Ekstensien: <strong>${data.no_ekstensien || '-'}</strong></p>
</div>
`
}
<hr>
<div class="mb-2">
<p class="mb-1">No Order: <strong>${data.no_order}</strong></p>
<p class="mb-1">Metode Pembayaran: <strong>${data.cara_pembayaran}</strong></p>
${data?.cara_pembayaran === 'Billing' ? `
<p class="mb-1">No.Medical Record: <strong>${data.medical_record}</strong></p>
`: ''}
<p class="mb-1">Tanggal Pembayaran: <strong>${data.tgl_pembayaran || '-'}</strong></p>
<p class="mb-1">Total Harga: <strong>Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
</div>
<div class="mt-3">
<label class="form-label fw-semibold">Status Saat Ini:</label><br>
<span class="badge ${data?.status_order === 'Lunas' ? 'bg-success' : 'bg-warning'} text-dark">
${data.status_order}
</span>
</div>
</div>
</div>
</div>
</div>
<hr class="my-4">
<div class="row">
${detailHTML}
</div>
`;
document.getElementById('pesanan_container').innerHTML = html;
})
.catch(err => {
document.getElementById('pesanan_container').innerHTML = '<p class="text-danger">Terjadi kesalahan saat memuat data.</p>';
console.error(err);
});
}
function pesananLunas(order_id){
new bootstrap.Modal(infoPesanan).show();
fetchDetailOrder(order_id)
}
function exportLaporanPesanan(){
new bootstrap.Modal(exportLp).show();
}
function exportLaporanPendapatan(){
new bootstrap.Modal(exportPendapatan).show();
}

View File

@ -0,0 +1,192 @@
function initDt(selectDate = []){
datatable.bootstrapTable('destroy')
datatable.bootstrapTable({
url: "/dashboard/datatable/laporan-pesanan",
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"
},
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="pesananLunas('${row.order_id}')">
<i class="fa fa-utensils me-1"></i>
</button>
`
}
return `
<div class="d-flex space-x">
${buttons}
</div>
`;
}
},
{
title: "Pemesan",
field:'nama_pemesan',
sortable: true,
},
{
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="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:'Bukti Pembayaran',
formatter: function(value, row){
if(row?.cara_pembayaran === 'Transfer' && row?.bukti_pembayaran){
return `
<a href="/storage/${row.bukti_pembayaran}" target="_blank" class="btn btn-sm btn-primary">
<i class="fa fa-eye"></i> Lihat Bukti
</a>
`;
}else if(row?.cara_pembayaran === 'Billing'){
return `No.MR: ${row?.medical_record || '-'}`;
}
}
},
{
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')
}
}
],
});
}
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_laporan_pesanan").text(': '+ tanggalRapi)
}else{
$("#confirm_laporan_pesanan").text('Hari Ini');
}
}
});
$("#confirm_laporan_pesanan").text('Hari Ini');
initDt();
});

View File

@ -104,7 +104,7 @@ function initSelectize(formElement) {
});
});
const radioSomeday = formElement.querySelector(`input[value="Someday"]`);
const radioSomeday = formElement.querySelector(`input[value="Sameday"]`);
const radioMenuNormal = formElement.querySelector(`input[value="Menu Normal"]`);
const tanggalWrapper = formElement.querySelector('.date-input')?.closest('.col-md-12');
@ -388,7 +388,7 @@ function editMasterMenu(e) {
$("#jenis_makanan_edit").val(dataOld.jenis_menu);
$("#deskripsi_edit").val(dataOld.deskripsi);
$(`input[name="kategori_menu"][value="${dataOld.apakah_someday ? 'Someday' : 'Menu Normal'}"]`).prop('checked', true);
$(`input[name="kategori_menu"][value="${dataOld.apakah_someday ? 'Sameday' : 'Menu Normal'}"]`).prop('checked', true);
$(`input[name="apakah_menu_siang"][value="${dataOld.apakah_menu_siang ? 'iya' : ''}"]`).prop('checked', true);
$(`input[name="apakah_menu_sore"][value="${dataOld.apakah_menu_sore ? 'iya' : ''}"]`).prop('checked', true);
@ -425,7 +425,7 @@ function editMasterMenu(e) {
$('input[name="kategori_menu"]').on('change', function(){
const selected = $(this).val();
const isSomeday = selected === 'Someday';
const isSomeday = selected === 'Sameday';
if(isSomeday){
tanggalWrapper.classList.add('d-none');
if (tanggalSelectizeInstance) {
@ -619,7 +619,7 @@ function detailMasterMenu(e){
'Tidak ada info tanggal tersedia'}
</div>
<div class="mb-1 small text-muted">
<i class="fa fa-utensils me-1"></i> Menu: <strong>${someday ? 'Someday' : 'Menu Normal'}</strong>
<i class="fa fa-utensils me-1"></i> Menu: <strong>${someday ? 'Sameday' : 'Menu Normal'}</strong>
</div>
<div class="mb-1 small text-muted">
${

View File

@ -105,7 +105,7 @@
field: "master_menu_id",
formatter: function (value, row) {
if (row?.apakah_someday) {
return `<span class="badge bg-warning text-dark">Someday</span>`;
return `<span class="badge bg-warning text-dark">Sameday</span>`;
}
return `<span class="badge bg-success text-dark">Menu Normal</span>`;
}

View File

@ -88,6 +88,13 @@
const menus = res.data.data || [];
const groups = {};
menus.forEach(menu => {
const key = menu.group_label || 'Tanpa Tanggal'
if (!groups[key]) groups[key] = [];
groups[key].push(menu);
});
if (menus.length === 0){
return containerGuest.html(`
<div class="d-flex flex-column align-items-center justify-content-center text-center py-4">
@ -98,11 +105,35 @@
}
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 => {
for (const [label, list] of Object.entries(groups)) {
let scheduleInfo = '';
if (label === "Menu Sameday") {
scheduleInfo = `
<ul class="mb-0" style="font-size:.80rem; list-style: none; padding-left: 0;">
<li><strong>Makan Siang:</strong> Pesan Maks <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> Pesan Maks <strong>13.00 WIB</strong></li>
</ul>
`;
} else {
scheduleInfo = `<div style="font-size:.80rem">Dipesan maksimal <strong>H-1</strong> sebelum pukul <strong>13.00 WIB</strong></div>`;
}
html += `
<div class="col-12 mb-2 col-12 col-xs-12 col-sm-12 col-md-12 col-lg-12 mb-2 mb-2">
<div class="text-white text-center rounded-pill py-1 px-2" style="font-size:.95rem; background-color: #2d996cff;">
<strong>${label}</strong>
<div class="mt-1 text-center" style="font-size:.80rem;">
${scheduleInfo}
</div>
</div>
</div>
`;
list?.forEach(menu => {
html += `
<div class="col-6 col-xs-12 col-sm-6 col-md-4 col-lg-3 mb-2">
<div class="card h-80 shadow-sm p-2 rounded-4 mb-3">
<div class="card h-80 shadow-sm p-2 rounded-4 mb-2">
<!-- GAMBAR + NAMA DI DALAM GAMBAR -->
<div class="position-relative">
<img src="gambar/${menu.foto || '3.jpeg'}"
@ -111,84 +142,68 @@
<!-- Overlay gelap bawah -->
<div class="position-absolute bottom-0 start-0 w-100"
style="height:50%; background:linear-gradient(transparent, rgba(0,0,0,.6)); border-radius:0 0 .5rem .5rem;"></div>
style="height:100%; background:linear-gradient(transparent, rgba(0,0,0,.6)); border-radius:0 0 .5rem .5rem;"></div>
<!-- di dalam .position-relative (gambar) -->
<!-- Nama + kalori di dalam gambar (bawah) -->
<div class="position-absolute bottom-0 start-0 p-2 w-100">
<h6 class="fw-bold text-white mb-0 lh-1" style="font-size:.9rem">${menu.nama}</h6>
<h6 class="fw-bold text-white mb-0" style="font-size:.75rem; max-width: 85%;">${menu.nama.substring(0, 39) + '...' }</h6>
${menu?.kalori.length > 0 ? `
<small class="text-white badge bg-success">${(menu.kalori || []).slice(0,1).map(k=>k.nilai_kalori||0).join('')} kkal</small>`: ''}
</div>
<!-- Kategori Diet -->
<div class="position-absolute bottom-0 start-0">
<small class="text-white badge bg-success">${(menu.kalori || []).slice(0,1).map(k=>k.nilai_kalori||0).join('')} kkal</small>`: ''}
${(menu.klasifikasiMenu || [])
.slice(0, 2)
.slice(0, 1)
.map(tag => {
const name = tag.nama_kategori_diet || '';
const truncated = name.length > 12 ? name.substring(0, 12) + '...' : name;
return `<span class="badge bg-info me-1 mb-1" title="${name}">${truncated}</span>`;
}).join('')}
${(menu.klasifikasiMenu || []).length > 2
? `<span class="badge bg-secondary">+${menu.klasifikasiMenu.length - 2} lainnya</span>`
? `<span class="badge bg-secondary text-truncate">+${menu.klasifikasiMenu.length - 2} lainnya</span>`
: ''}
</div>
<!-- badge someday/normal (kiri-atas) -->
<div class="position-absolute top-0 start-0 m-2">
${menu.apakah_someday
? '<span class="badge bg-success">Someday</span>'
: '<span class="badge bg-warning text-dark">Normal</span>'}
? '<span class="badge bg-success" >Menu Sameday</span>'
: '<span class="badge text-dark" style="background-color:#FFD166;">Menu Normal</span>'}
</div>
<!-- Label siang / sore (kanan-bawah gambar) -->
<div class="position-absolute bottom-0 end-0 m-1 d-flex gap-1">
${menu.apakah_menu_siang
? '<div class="badge bg-warning text-dark d-flex align-items-center px-1" style="font-size:.55rem"><i class="fa fa-sun me-1" style="font-size:.5rem"></i>Siang</div>'
: ''}
${menu.apakah_menu_sore
? '<div class="badge bg-info text-dark d-flex align-items-center px-1" style="font-size:.55rem"><i class="fa fa-moon me-1" style="font-size:.5rem"></i>Sore</div>'
: ''}
${!menu.apakah_menu_siang && !menu.apakah_menu_sore
? '<div class="badge bg-danger d-flex align-items-center px-1" style="font-size:.55rem"><i class="fa fa-times-circle me-1" style="font-size:.5rem"></i>Tutup</div>'
: ''}
<div class="position-absolute top-0 end-0 m-1 d-flex gap-1">
</div>
</div>
<!-- Tanggal tersedia (chip scroll) -->
<div class="d-flex align-items-center gap-1 mt-2 px-1">
<small class="text-muted fw-semibold">Tersedia:</small>
<div class="flex-fill" style="min-width:0; max-width:100%;">
<div class="d-flex gap-1 overflow-auto"
style="font-size:.75rem; scrollbar-width:none; -ms-overflow-style:none;">
${menu.apakah_someday
? '<span class="badge bg-success" style="font-size:.75rem">Setiap hari</span>'
: (Array.isArray(menu.dmph) && menu.dmph.length > 0
? menu.dmph.slice(0, 6).map(d =>
`<span class="badge text-success border" style="font-size:.75rem">${d.tgl_harian}</span>`
).join('')
: '<span class="badge bg-danger" style="font-size:.75rem">Tutup</span>')}
<div class="d-flex align-items-center gap-1 mt-2 px-1">
<small class="text-muted fw-semibold">Tersedia:</small>
<div class="d-flex gap-1 overflow-auto" style="font-size:.65rem; scrollbar-width:none;">
${menu.apakah_menu_siang && menu.apakah_menu_sore
? '<div class="badge bg-success text-dark d-flex align-items-center px-1 text-white" style="font-size:.65rem;">Makan Siang<br/> & Sore</div>'
: menu.apakah_menu_siang
? '<div class="badge bg-warning text-dark d-flex align-items-center px-1" style="font-size:.65rem;">Makan Siang</div>'
: menu.apakah_menu_sore
? '<div class="badge text-white d-flex align-items-center px-1" style="font-size:.65rem; background-color:#3A86FF;" >Makan Sore</div>'
: '<div class="badge bg-danger d-flex align-items-center px-1" style="font-size:.5rem;"><i class="fa fa-times-circle" style="font-size:.5rem"></i>Tutup</div>'}
</div>
</div>
<!-- Harga 1 baris -->
<div class="d-flex justify-content-between align-items-center text-muted small mt-1 px-1">
<small>Karyawan</small>
<strong class="text-success">Rp ${parseInt(menu.harga_karyawan).toLocaleString('id-ID')}</strong>
</div>
<div class="d-flex justify-content-between align-items-center text-muted small px-1">
<small>Public</small>
<strong class="text-success">Rp ${parseInt(menu.harga_public).toLocaleString('id-ID')}</strong>
</div>
<!-- Harga -->
<!-- Harga 1 baris -->
<div class="d-flex justify-content-between align-items-center text-muted small mt-1 px-1">
<small>Karyawan</small>
<strong class="text-success">Rp ${parseInt(menu.harga_karyawan).toLocaleString('id-ID')}</strong>
</div>
<div class="d-flex justify-content-between align-items-center text-muted small px-1">
<small>Public</small>
<strong class="text-success">Rp ${parseInt(menu.harga_public).toLocaleString('id-ID')}</strong>
</div>
<!-- Tombol -->
<div class="d-flex p-2 mt-auto ">
<button class="btn btn-outline-success w-50 me-2"
<button class="btn btn-outline-success w-50 me-1 d-flex justify-content-center align-items-center p-2"
onclick="orderMenu(this)"
data-id="${menu.master_menu_id || menu.master_paket_menu_id}"
data-nama_menu="${menu.nama}"
@ -203,9 +218,9 @@
data-apakah_menu_sore="${menu.apakah_menu_sore}"
data-apakah_menu_siang="${menu.apakah_menu_siang}"
data-apakah_someday="${menu.apakah_someday}">
<i class="fa-solid fa-circle-info"></i> Detail
<i class="fa-solid fa-circle-info me-1"></i> Detail
</button>
<button class="btn btn-success w-50 "
<button class="btn btn-success w-50 d-flex justify-content-center align-items-center p-2 btn-clicked"
onclick="handleClick(this)"
data-id="${menu.master_menu_id ?? menu.master_paket_menu_id}"
data-nama_menu="${menu.nama}"
@ -225,9 +240,11 @@
</div>
</div>
</div>
`;
});
}
html += '</div></div>';
@ -297,7 +314,7 @@
'Tidak ada info tanggal tersedia'}
</div>
<div class="mb-1 small text-muted">
<i class="fa fa-utensils me-1"></i> Menu: <strong>${someday ? 'Someday' : 'Menu Normal'}</strong>
<i class="fa fa-utensils me-1"></i> Menu: <strong>${someday ? 'Sameday' : 'Menu Normal'}</strong>
</div>
<div class="mb-1 small text-muted">
${
@ -477,6 +494,17 @@
}
function handleClick(e){
const originalHTML = e.innerHTML;
// Efek klik
e.classList.add('btn-clicked');
setTimeout(() => e.classList.remove('btn-clicked'), 80);
// Ganti isi tombol jadi checklist
e.innerHTML = '<i class="fas fa-check"></i>';
// Simulasi proses
setTimeout(() => {
e.innerHTML = originalHTML;
}, 1000);
const order_id = sessionStorage.getItem('order_id') || null;
if(order_id){
Swal.fire({

View File

@ -90,6 +90,7 @@ document.getElementById('formActionApproveOrder').addEventListener('submit', fun
});
datatablePekerjaan.bootstrapTable('refresh');
modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM
getReminderVerifikasiMakanan()
};
modalActionOrder.addEventListener('hidden.bs.modal', handler); // ✅ pakai DOM

View File

@ -34,7 +34,7 @@
align: 'center',
valign: 'middle',
formatter: function (value, row, index) {
return `<input type="checkbox" class="rowCheckbox" data-order_detail_id="${row.order_id}" data-jenis_customer="${row?.order?.jenis_customer}" />`
return `<input type="checkbox" class="rowCheckbox" data-order_detail_id="${row.order_detail_id}" />`
}
},
{
@ -56,11 +56,7 @@
<i class="fa-solid fa-circle-info"></i>
</button>
`
buttons += `
<button class="btn btn-sm btn-primary me-2" onclick="cetak('${row?.order_detail_id}', '${row?.order?.jenis_customer}')">
<i class="fa-solid fa-qrcode"></i>
</button>
`
return `
<div class="d-flex space-x">
@ -100,6 +96,18 @@
},
sortable: true,
},
{
title: "Karbohidrat",
field: 'karbohidrat_id',
formatter: function (value, row) {
if (!row?.karbohidrat) return '';
const nama = row.karbohidrat.nama_karbohidrat || '';
const kalori = row.karbohidrat.nilai_kalori ? ` (${row.karbohidrat.nilai_kalori} kkal)` : '';
return nama + kalori;
},
sortable: true,
},
{
title: "Pemesan",
field:'order.nama_pemesan',
@ -135,21 +143,19 @@
$('.rowCheckbox').each(function () {
this.checked = isChecked;
let order_detail_id = $(this).data('order_detail_id');
let jenis_customer = $(this).data('jenis_customer');
if (isChecked) {
selectedRows.push({ order_detail_id, jenis_customer });
selectedRows.push({ order_detail_id });
}
});
$('#buttonLabel').prop("disabled", !isChecked);
});
$(document).on('change', '.rowCheckbox', function () {
let order_detail_id = $(this).data('order_id');
let jenis_customer = $(this).data('jenis_customer');
let order_detail_id = $(this).data('order_detail_id');
let isChecked = this.checked;
if (isChecked) {
if (!selectedRows.find(r => r.order_detail_id === order_detail_id)) {
selectedRows.push({ order_detail_id, jenis_customer });
selectedRows.push({ order_detail_id });
}
} else {
selectedRows = selectedRows.filter(r => r.order_detail_id !== order_detail_id);
@ -163,38 +169,6 @@
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);
})
const order_detail_ids = selected.map(item => item.order_detail_id);
window.open(`https://smart.rsabhk.co.id:2222/service-reporting/label-cetering/${order_detail_ids}`, '_blank');
}
function cetak(id, jenis_customer){
console.log(id, jenis_customer);
}

View File

@ -13,3 +13,7 @@ const formActionProgressOrder = $("#formActionProgressOrder")
const modalExport = document.getElementById('modalExportPending');
const datatableOfPekerjaan = $("#datatableVerifikasiMakananOffcanvas")
const modalDetailOrder = document.getElementById('modalDetailOrderOf');
const modalActionOrderPekerjaan = document.getElementById('modalActionApproveOrder');

View File

@ -47,7 +47,8 @@ document.getElementById('formActionOrder').addEventListener('submit', function (
showConfirmButton: false,
backdrop: true,
});
getReminderOrder();
getReminderKonfirmasiPesanan()
getReminderVerifikasiMakanan()
datatablePending.bootstrapTable('refresh');
modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM
};
@ -119,7 +120,8 @@ document.getElementById('formActionApproveBillingOrder').addEventListener('submi
showConfirmButton: false,
backdrop: true,
});
getReminderOrder();
getReminderKonfirmasiPesanan()
getReminderVerifikasiMakanan()
datatablePending.bootstrapTable('refresh');
modalActionApproveBillingnOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM
};

View File

@ -11,7 +11,7 @@ function fetchDetailOrder(order_id){
<div class="card shadow-sm border-0">
<div class="row g-0">
<div class="col-md-5 d-flex align-items-center p-2">
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 120px; width: auto;">
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 250px; width: auto;">
</div>
<div class="col-md-5 p-2">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
@ -24,7 +24,7 @@ function fetchDetailOrder(order_id){
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
</div>
<div class="form-check form-switch mt-2">
<input class="form-check-input status-switch" type="checkbox"
@ -44,12 +44,14 @@ function fetchDetailOrder(order_id){
const html = `
<div class="row mt-3">
<!-- Bagian Kiri: Gambar Bukti Pembayaran -->
${data.bukti_pembayaran ? `
<div class="col-md-4 text-center mb-3 mb-md-0">
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}" alt="Bukti Pembayaran" class="img-fluid rounded shadow" style="max-height: 170px; width: auto;">
</div>
<a href="/storage/${data.bukti_pembayaran}" target="_blank">
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}" alt="Bukti Pembayaran" class="img-fluid rounded shadow" style="max-height: 370px; width: auto;"></a>
</div>` : ''}
<!-- Bagian Kanan: Informasi Pemesan -->
<div class="col-md-8">
<div class="${data?.bukti_pembayaran ? `col-md-8` : `col-md-12`}">
<div class="card shadow-sm border-0">
<div class="card-body">
<h5 class="mb-0">Nama Pemesan: <span class="text-primary" id="nama_pemesan">${data.nama_pemesan}</span></h5>
@ -59,14 +61,14 @@ function fetchDetailOrder(order_id){
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ?
`<div class="mb-2">
<p class="mb-1">Nama Pasien: <strong id="no_order">${data.nama_pasien}</strong></p>
<p class="mb-1">Nomor Kamar Perawatan: <strong id="no_order">${data.no_kamar_perawatan}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong id="no_order">${data.kelas_perawatan}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong id="no_order">${data.ruang_perawatan}</strong></p>
<p class="mb-1">Nama Pasien: <strong id="no_order">${data.nama_pasien || '-'}</strong></p>
<p class="mb-1">Nomor Kamar Perawatan: <strong id="no_order">${data.no_kamar_perawatan || '-'}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong id="no_order">${data.kelas_perawatan || '-'}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong id="no_order">${data.ruang_perawatan || '-'}</strong></p>
</div>`: `
<div class="mb-2">
<p class="mb-1">Bagian /Instalasi: <strong id="no_order">${data.bagian_instalasi}</strong></p>
<p class="mb-1">Ekstensien yang bisa di Hubungi: <strong id="no_order">${data.no_ekstensien}</strong></p>
<p class="mb-1">Bagian /Instalasi: <strong id="no_order">${data.bagian_instalasi || '-'}</strong></p>
<p class="mb-1">Ekstensien yang bisa di Hubungi: <strong id="no_order">${data.no_ekstensien || '-'}</strong></p>
</div>
`}
@ -126,6 +128,7 @@ function fetchDetailOrder(order_id){
el.disabled = true;
datatablePending.bootstrapTable('refresh')
showToast('Status berhasil diperbarui!');
getReminderVerifikasiMakanan()
})
.catch(err => {
console.error('Gagal update status:', err);

View File

@ -20,7 +20,7 @@
pageSize: 10,
pageList: [10, 20, 30, 40, 50, 100, 200],
cookie: true,
cookieIdTable: "table_rma_ssc_id",
cookieIdTable: "datatablePesananPending",
icons: {
refresh: "fas fa-sync-alt", // atau ganti ke icon lain
columns: "fas fa-th-large"
@ -115,7 +115,6 @@
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;">
@ -135,6 +134,20 @@
title: "Pemesan",
field:'nama_pemesan',
sortable: true,
},
{
title:'Bukti Pembayaran',
formatter: function(value, row){
if(row?.cara_pembayaran === 'Transfer' && row?.bukti_pembayaran){
return `
<a href="/storage/${row.bukti_pembayaran}" target="_blank" class="btn btn-sm btn-primary">
<i class="fa fa-eye"></i> Lihat Bukti
</a>
`;
}else if(row?.cara_pembayaran === 'Billing'){
return `No.MR: ${row?.medical_record || '-'}`;
}
}
},
{
title: "Total Harga Pesanan",
@ -162,7 +175,8 @@
title: "Kategori Customer",
field: 'jenis_customer',
sortable: true,
}
},
],
});
}

View File

@ -0,0 +1,288 @@
document.addEventListener('DOMContentLoaded', function () {
const $timeLabel = $("#confirm_pekerjaan_time");
$timeLabel.text("Hari Ini");
// Init Date Picker
flatpickr("#tanggal_offcanvas", {
dateFormat: "Y-m-d",
mode: "multiple",
locale: "id",
onValueUpdate: function (selectedDates) {
const selectedFormatted = selectedDates.map(d =>
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
);
initPekerjaanDt(selectedFormatted);
updateTimeLabel(selectedFormatted);
}
});
initPekerjaanDt();
});
// Update Label Tanggal
function updateTimeLabel(dates) {
const $timeLabel = $("#confirm_pekerjaan_time");
if (dates.length === 0) {
$timeLabel.text("Hari Ini");
return;
}
let label = dates.length === 1
? dates[0]
: dates.length === 2
? dates.join(" dan ")
: `${dates.slice(0, -1).join(", ")}, dan ${dates.slice(-1)}`;
$timeLabel.text(`: ${label}`);
}
// Init Table
function initPekerjaanDt(selectDate = []) {
let selectedRows = [];
datatableOfPekerjaan.bootstrapTable('destroy').bootstrapTable({
url: "/dashboard/datatable/pekerjaan",
method: 'get',
queryParams: params => ({ ...params, tanggal: selectDate }),
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: "datatableVerifikasiMakananOffcanvas",
icons: { refresh: "fas fa-sync-alt", columns: "fas fa-th-large" },
columns: getTableColumns(),
});
// Checkbox Handling
$(document).off('click', '#selectAll').on('click', '#selectAll', function () {
const isChecked = this.checked;
selectedRows = isChecked
? $(".rowCheckbox").map(function () { return { order_detail_id: $(this).data("order_detail_id") }; }).get()
: [];
$(".rowCheckbox").prop("checked", isChecked);
toggleLabelButton(selectedRows.length > 0);
});
$(document).off('change', '.rowCheckbox').on('change', '.rowCheckbox', function () {
const id = $(this).data("order_detail_id");
if (this.checked) {
if (!selectedRows.find(r => r.order_detail_id === id)) selectedRows.push({ order_detail_id: id });
} else {
selectedRows = selectedRows.filter(r => r.order_detail_id !== id);
}
toggleLabelButton(selectedRows.length > 0);
});
window.getSelectedRowsForLabel = () => selectedRows;
}
// Toggle Cetak Label Button
function toggleLabelButton(enable) {
$('#buttonLabel').prop("disabled", !enable);
}
// Download Label
function labelDownload() {
const ids = getSelectedRowsForLabel().map(item => item.order_detail_id);
window.open(`https://smart.rsabhk.co.id:2222/service-reporting/label-cetering/${ids}`, '_blank');
}
// Table Columns
function getTableColumns() {
return [
{
title: '<input type="checkbox" id="selectAll" />',
field: 'order_id',
align: 'center',
formatter: (v, r) => `<input type="checkbox" class="rowCheckbox" data-order_detail_id="${r.order_detail_id}" />`
},
{
title: "Action",
formatter: (v, r) => {
let btns = '';
if (r?.status_order !== "Selesai") {
btns += `
<button class="btn btn-sm btn-success me-2"
onclick="approve(this)"
data-id="${r.order_detail_id}"
data-nama_pemesan="${r?.order?.nama_pemesan}"
data-no_order="${r?.order?.no_order}"
data-menu="${r?.menu?.nama_menu || r?.paket_menu?.nama_paket}"
data-jenis_customer="${r?.order?.jenis_customer}"
data-type="${r?.type}">
<i class="fa fa-check me-1"></i>
</button>`;
}
btns += `
<button class="btn btn-sm btn-primary me-2" onclick="detailOrder(${r?.order_detail_id})">
<i class="fa-solid fa-circle-info"></i>
</button>`;
return `<div class="d-flex">${btns}</div>`;
}
},
{ title: "No.Order", field: 'order.no_order', sortable: true },
{
title: "Status",
formatter: (v, r) => {
const status = r?.status_order;
const badgeClass = status === "Selesai" ? 'bg-success text-dark' : 'bg-primary';
return `<span class="badge ${badgeClass} px-3 py-1">${status}</span>`;
}
},
{ title: "Menu", formatter: (v, r) => r?.menu?.nama_menu || r?.paket_menu?.nama_paket, sortable: true },
{
title: "Karbohidrat",
formatter: (v, r) => {
if (!r?.karbohidrat) return '';
const nama = r.karbohidrat.nama_karbohidrat || '';
const kalori = r.karbohidrat.nilai_kalori ? ` (${r.karbohidrat.nilai_kalori} kkal)` : '';
return nama + kalori;
},
sortable: true,
},
{
title: "Pemesan",
formatter: (v, r) => `
<ul class="list-unstyled mb-0 text-nowrap">
<li><i class="fa fa-user me-1 text-muted"></i><strong>${r?.order?.nama_pemesan ?? '-'}</strong></li>
<li><i class="fa fa-tag me-1 text-muted"></i>${r?.order?.jenis_customer ?? '-'}</li>
</ul>`
},
{ title: "Tgl Antar", field: 'tgl_antar' },
{ title: "Waktu Pemesanan", field: 'type', sortable: true },
{ title: "Catatan", field: 'catatan', sortable: true },
];
}
function detailOrder(id){
const offcanvas = bootstrap.Offcanvas.getInstance(document.getElementById('offcanvasKonfirmasiPesanan')) || new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan'));
offcanvas.hide();
new bootstrap.Modal(modalDetailOrder).show();
fetch(`/dashboard/pekerjaan/detail/${id}`)
.then(res => res.json())
.then(res => {
const data = res.data;
document.getElementById('pesanan_container').innerHTML = '';
document.getElementById('confirm_nama_pesanan').textContent = data?.order?.nama_pemesan;
let html = '';
html += `
<div class="col-md-12 mb-3">
<div class="card shadow-sm border-0">
<div class="row g-0">
<div class="col-md-5 d-flex align-items-center p-2">
<img src="/gambar/${data?.menu?.foto || data?.paket_menu?.foto}" alt="Foto Menu" class="img-fluid rounded shadow m-auto" style="max-height: 220px; width: auto;">
</div>
<div class="col-md-7 p-1">
<p class="mb-1">Nama Menu: <strong>${data?.menu?.nama_menu || data?.paket_menu?.nama_menu}</strong></p>
<p class="mb-1">Tanggal Antar: <span>${data?.tgl_antar || 0}</span></p>
<p class="mb-1">Jumlah: <span>${data?.jumlah || 0}</span></p>
<p class="mb-1">Harga Satuan: <strong>Rp ${parseInt(data?.harga_satuan || 0).toLocaleString('id-ID')}</strong></p>
<p class="mb-1">Status Pesanan:
<span class="badge text-dark ${data?.status_order === 'Selesai' ? 'bg-success' : 'bg-warning'}">
${data?.status_order}
</span>
</p>
<hr class="my-2">
<p class="mb-1">Pemesan: <strong>${data?.order?.nama_pemesan || '-'}</strong></p>
<p class="mb-1">Jenis Kelamin: <strong>${data?.order?.jenis_kelamin || '-'}</strong></p>
<p class="mb-1">Jenis Customer: <strong>${data?.order?.jenis_customer || '-'}</strong></p>
${data?.order?.jenis_customer === "Masyarakat Umum" ?
`<p class="mb-1">Alamat: <strong>${data?.order?.alamat || '-'}</strong></p>
` : data?.order?.jenis_customer === "Karyawan RSAB Harapan Kita" ? `
<p class="mb-1">Bagian /Instalasi: <strong>${data?.order?.bagian_instalasi || '-'}</strong></p>
<p class="mb-1">No Ekstensien: <strong>${data?.order?.no_ekstensien || '-'}</strong></p>
` :`
<p class="mb-1">Nama Pasien: <strong>${data?.order?.nama_pasien || '-'}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong>${data?.order?.ruang_perawatan || '-'}</strong></p>
<p class="mb-1">Nomor Kamar Perawatan: <strong>${data?.order?.no_kamar_perawatan || '-'}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong>${data?.order?.kelas_perawatan || '-'}</strong></p>
`
}
</div>
</div>
</div>
</div>
</div>
`
document.getElementById('pesanan_container').innerHTML = html;
document.getElementById('modalDetailOrderOf').addEventListener('hidden.bs.modal', () => {
new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan')).show()
}, { once:true});
})
.catch(error => {
console.error(error);
})
}
function exportPekerjaan(){
const offcanvas = bootstrap.Offcanvas.getInstance(document.getElementById('offcanvasKonfirmasiPesanan')) || new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan'));
offcanvas.hide();
new bootstrap.Modal(modalExport).show();
document.getElementById('formExport').setAttribute('action', '/dashboard/pekerjaan/export')
}
function approve(e){
const offcanvas = bootstrap.Offcanvas.getInstance(document.getElementById('offcanvasKonfirmasiPesanan')) || new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan'));
offcanvas.hide();
const data = $(e).data();
new bootstrap.Modal(modalActionOrderPekerjaan).show();
$("#confirmActionApproveOrder").text(data?.menu + ' (' + data?.type +')')
$("#confirmNoOrder").text(data?.no_order + ' (' + data?.nama_pemesan +')')
document.getElementById('formActionApproveOrder').setAttribute(`action`, `/dashboard/pending/update-detail-status/${data.id}`)
document.getElementById('modalActionApproveOrder').addEventListener('hidden.bs.modal', () => {
new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan')).show()
}, { once:true});
}
document.getElementById('formActionApproveOrder').addEventListener('submit', function (e) {
e.preventDefault();
const form = this;
const actionUrl = form.getAttribute('action');
fetch(actionUrl, {
method: 'POST',
headers: {
'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value,
}
}).then(async (res) => {
const data = await res.json();
if (res.status) {
Swal.fire({
icon: 'success',
title: 'Berhasil',
text: 'Pesanan berhasil diselesaikan!',
timer: 2000,
showConfirmButton: false,
backdrop: true,
});
datatableOfPekerjaan.bootstrapTable('refresh');
getReminderVerifikasiMakanan()
bootstrap.Modal.getInstance(modalActionOrderPekerjaan).hide();
} else {
throw new Error(data.message || 'Terjadi kesalahan saat mengubah status.');
}
}).catch(err => {
console.error(err);
Swal.fire({
icon: 'error',
title: 'Gagal',
text: err,
});
});
});

View File

@ -24,7 +24,7 @@ function fetchDetailOrder(order_id){
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
</div>
</div>
</div>
@ -35,6 +35,7 @@ function fetchDetailOrder(order_id){
const html = `
<div class="row mt-4">
<!-- Gambar Bukti Pembayaran -->
${data.bukti_pembayaran ? `
<div class="col-md-4 text-center mb-3 mb-md-0">
<div class="border rounded shadow-sm p-2 bg-light">
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}"
@ -43,10 +44,10 @@ function fetchDetailOrder(order_id){
style="max-height: 170px; width: auto;">
<div class="text-muted small mt-2">Bukti Pembayaran</div>
</div>
</div>
</div>` : ''}
<!-- Informasi Pemesan -->
<div class="col-md-8">
<div class="${data.bukti_pembayaran ? `col-md-8` : `col-md-12`}">
<div class="card shadow-sm border-0">
<div class="card-body">
<h5 class="card-title text-primary mb-1">${data.nama_pemesan}</h5>
@ -68,7 +69,10 @@ function fetchDetailOrder(order_id){
<div class="mb-2">
<p class="mb-1">No Order: <strong>${data.no_order}</strong></p>
<p class="mb-1">Tipe Pembayaran: <strong>${data.cara_pembayaran}</strong></p>
<p class="mb-1">Metode Pembayaran: <strong>${data.cara_pembayaran}</strong></p>
${data?.cara_pembayaran === 'Billing' ? `
<p class="mb-1">No.Medical Record: <strong>${data.medical_record}</strong></p>
`: ''}
<p class="mb-1">Tanggal Pembayaran: <strong>${data.tgl_pembayaran || '-'}</strong></p>
<p class="mb-1">Total Harga: <strong>Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
</div>

View File

@ -0,0 +1,3 @@
const datatableSemuaPesanan = $("#datatableSemuaPesanan")
const infoPesanan = document.getElementById('infoPesanan')

View File

@ -0,0 +1,115 @@
function fetchDetailOrder(order_id){
fetch(`/dashboard/pending/action-progress-order/${order_id}`)
.then(res => res.json())
.then(res => {
const data = res;
document.getElementById('pesanan_container').innerHTML =''
// Generate HTML untuk order_detail
const detailHTML = (data?.order_detail || []).map(detail => {
return `
<div class="col-md-12 mb-3">
<div class="card shadow-sm border-0">
<div class="row g-0">
<div class="col-md-5 d-flex align-items-center p-2">
<img src="/gambar/${detail?.menu?.foto || 'default.jpg'}" alt="Foto Menu" class="img-fluid rounded shadow" style="max-height: 250px; width: auto;">
</div>
<div class="col-md-5 p-2">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
<p class="mb-1">Jumlah: <span>${detail?.jumlah || 0}</span></p>
<p class="mb-1">Tanggal Pesan: <span>${detail?.tgl_antar || 0}</span></p>
<p class="mb-1">Harga: <strong>Rp ${parseInt(detail?.harga_satuan || 0).toLocaleString('id-ID')}</strong></p>
<p class="mb-1">Status Pesanan:
<span class="badge text-dark ${detail?.status_order === 'Selesai' ? 'bg-success' : 'bg-warning'}"
id="status_badge_${detail.order_detail_id}">
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
</div>
</div>
</div>
</div>
`;
}).join('');
const html = `
<div class="row mt-4">
<!-- Gambar Bukti Pembayaran -->
${data.bukti_pembayaran ? `
<div class="col-md-4 text-center mb-3 mb-md-0">
<div class="border rounded shadow-sm p-2 bg-light">
<a href="/storage/${data.bukti_pembayaran}" target="_blank">
<img src="/storage/${data.bukti_pembayaran || 'gambar/default.jpg'}"
alt="Bukti Pembayaran"
class="img-fluid rounded"
style="max-height: 170px; width: auto;">
</a>
<div class="text-muted small mt-2">Bukti Pembayaran</div>
</div>
</div>` : ''}
<!-- Informasi Pemesan -->
<div class="${data.bukti_pembayaran ? `col-md-8` : `col-md-12`}">
<div class="card shadow-sm border-0">
<div class="card-body">
<h5 class="card-title text-primary mb-1">${data.nama_pemesan}</h5>
<p class="text-muted mb-2">Jenis Customer: <strong>${data.jenis_customer}</strong></p>
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? `
<div class="mb-2">
<p class="mb-1">Nama Pasien: <strong>${data.nama_pasien}</strong></p>
<p class="mb-1">Nomor Kamar: <strong>${data.no_kamar_perawatan}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong>${data.ruang_perawatan}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong>${data.kelas_perawatan}</strong></p>
</div>` : `
<div class="mb-2">
<p class="mb-1">Bagian / Instalasi: <strong>${data.bagian_instalasi}</strong></p>
<p class="mb-1">Ekstensien: <strong>${data.no_ekstensien || '-'}</strong></p>
</div>`}
<hr>
<div class="mb-2">
<p class="mb-1">No Order: <strong>${data.no_order}</strong></p>
<p class="mb-1">Metode Pembayaran: <strong>${data.cara_pembayaran}</strong></p>
${data?.cara_pembayaran === 'Billing' ? `
<p class="mb-1">No.Medical Record: <strong>${data.medical_record}</strong></p>
`: ''}
<p class="mb-1">Tanggal Pembayaran: <strong>${data.tgl_pembayaran || '-'}</strong></p>
<p class="mb-1">Total Harga: <strong>Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}</strong></p>
</div>
<div class="mt-3">
<label class="form-label fw-semibold">Status Saat Ini:</label><br>
<span class="badge ${data?.status_order === 'Lunas' ? 'bg-success' : 'bg-warning'} text-dark">
${data.status_order}
</span>
</div>
</div>
</div>
</div>
</div>
<hr class="my-4">
<div class="row">
${detailHTML}
</div>
`;
document.getElementById('pesanan_container').innerHTML = html;
})
.catch(err => {
document.getElementById('pesanan_container').innerHTML = '<p class="text-danger">Terjadi kesalahan saat memuat data.</p>';
console.error(err);
});
}
function orderLunas(order_id){
new bootstrap.Modal(infoPesanan).show();
fetchDetailOrder(order_id)
}

View File

@ -0,0 +1,194 @@
function initDt(selectDate = []){
datatableSemuaPesanan.bootstrapTable('destroy')
datatableSemuaPesanan.bootstrapTable({
url: "/dashboard/datatable/semua-pesanan",
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: "datatableSemuaPesanan",
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 === "Dibatalkan") return ''
if(row?.status_order === "Lunas"){
buttons += `
<button class="btn btn-sm btn-warning text-dark" onclick="orderLunas('${row.order_id}')">
<i class="fa fa-utensils me-1"></i>
</button>
`
}
return `
<div class="d-flex space-x">
${buttons}
</div>
`;
}
},
{
title: "Pemesan",
field:'nama_pemesan',
sortable: true,
},
{
title: "No.Order",
field: 'no_order',
sortable: true,
},
{
title: "Kategori Customer",
field: 'jenis_customer',
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="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:'Bukti Pembayaran',
formatter: function(value, row){
if(row?.cara_pembayaran === 'Transfer' && row?.bukti_pembayaran){
return `
<a href="/storage/${row.bukti_pembayaran}" target="_blank" class="btn btn-sm btn-primary">
<i class="fa fa-eye"></i> Lihat Bukti
</a>
`;
}else if(row?.cara_pembayaran === 'Billing'){
return `No.MR: ${row?.medical_record || '-'}`;
}
}
},
{
title: "Total Harga Pesanan",
field:'total_harga',
formatter: function(value, row){
return 'Rp ' + parseInt(row.total_harga).toLocaleString('id-ID')
}
},
{
title: "Tgl Pemesanan",
formatter: function(value, row) {
if (!row?.entry_at) return '-';
const date = new Date(row.entry_at);
return date.toLocaleString('id-ID', {
day: '2-digit',
month: 'short', // Bisa diganti 'long' kalau mau 'Juli' bukan 'Jul'
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
hour12: false // pakai format 24 jam
});
},
},
],
});
}
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();
});

BIN
public/logo/logo_rsabhk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -30,9 +30,11 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-primary text-primary">
<div class="card-body">
<h5 class="card-title mb-1" id="confirm_filter_name"><i class="bx bx-calendar me-1"></i> Pesanan Hari Ini</h5>
<h2 class="fw-bold mb-1" id="pesanan_data">23</h2>
<small id="confirm_filter_time">Data tanggal {{ \Carbon\Carbon::now()->format('d M Y') }}</small>
<a href="dashboard/semua-pesanan">
<h5 class="card-title mb-1" id="confirm_filter_name"><i class="bx bx-calendar me-1"></i> Pesanan Hari Ini</h5>
<h2 class="fw-bold mb-1" id="pesanan_data">23</h2>
<small id="confirm_filter_time">Data tanggal {{ \Carbon\Carbon::now()->format('d M Y') }}</small>
</a>
</div>
</div>
</div>
@ -50,9 +52,11 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-warning text-warning">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Konfirmasi Pesanan</h5>
<h2 class="fw-bold mb-1" id="pesanan_waiting">8</h2>
<small>Menunggu Konfirmasi / Pembayaran</small>
<a href="dashboard/pending">
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Konfirmasi Pesanan</h5>
<h2 class="fw-bold mb-1" id="pesanan_waiting">8</h2>
<small>Menunggu Konfirmasi / Pembayaran</small>
</a>
</div>
</div>
</div>
@ -63,9 +67,11 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-info text-info">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-money me-1"></i> Total Nilai Transaksi</h5>
<h2 class="fw-bold mb-1" id="nilai_transaksi_total">Rp 1.240.000</h2>
<small>Akumulasi dari pesanan</small>
<a href="dashboard/laporan-pesanan">
<h5 class="card-title mb-1"><i class="bx bx-money me-1"></i> Total Nilai Transaksi</h5>
<h2 class="fw-bold mb-1" id="nilai_transaksi_total">Rp 1.240.000</h2>
<small>Akumulasi dari pesanan</small>
</a>
</div>
</div>
</div>
@ -73,9 +79,11 @@
<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-box me-1"></i>Pesanan Lunas, Menunggu Pengambilan</h5>
<h2 class="fw-bold mb-1" id="pesanan_belum_diambil">5</h2>
<small>Pembayaran sudah lunas, namun pesanan belum diambil karena tanggal pengambilan belum sesuai. </small>
<a href="dashboard/pekerjaan">
<h5 class="card-title mb-1"><i class="bx bx-box me-1"></i>Pesanan Lunas, Menunggu Pengambilan</h5>
<h2 class="fw-bold mb-1" id="pesanan_belum_diambil">5</h2>
<small>Pembayaran sudah lunas, namun pesanan belum diambil karena tanggal pengambilan belum sesuai. </small>
</a>
</div>
</div>
</div>
@ -95,9 +103,11 @@
<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>
<a href="dashboard/laporan-pesanan">
<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>
</a>
</div>
</div>
</div>
@ -105,9 +115,11 @@
<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>
<a href="dashboard/laporan-pesanan">
<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>
</a>
</div>
</div>
</div>
@ -115,9 +127,11 @@
<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>
<a href="dashboard/laporan-pesanan">
<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>
</a>
</div>
</div>
</div>

View File

@ -90,9 +90,9 @@
<div class="col-md-6">
<label for="exampleInputEmail1" class="form-label">Kategori Menu</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="data[0][kategori_menu]" id="radio_karyawan" value="Someday" required>
<input class="form-check-input" type="radio" name="data[0][kategori_menu]" id="radio_karyawan" value="Sameday" required>
<label class="form-check-label" for="radio_karyawan" >
Someday
Sameday
</label>
</div>
<div class="form-check">
@ -119,7 +119,8 @@
</div>
<div class="col-md-12 d-none">
<label for="tags" class="form-label">Tanggal Menu Tersedia</label>
<select class="date-input" multiple name="data[0][tanggal][]"></select>
<select class="date-input" multiple name="data[0][tanggal][]"></select>
<div class="form-text">Gunakan Key <kbd>Tab</kbd> untuk menambahkan tanggal.</div>
</div>
</div>
</div>

View File

@ -85,9 +85,9 @@
<div class="col-md-6">
<label for="exampleInputEmail1" class="form-label">Kategori Menu</label>
<div class="form-check">
<input class="form-check-input" type="radio" name="kategori_menu" id="kategori_menu_someday" value="Someday" required>
<input class="form-check-input" type="radio" name="kategori_menu" id="kategori_menu_someday" value="Sameday" required>
<label class="form-check-label" for="kategori_menu_someday" >
Someday
Sameday
</label>
</div>
<div class="form-check">
@ -114,7 +114,8 @@
</div>
<div class="col-md-12 tgl-part">
<label for="tags" class="form-label">Tanggal Menu Tersedia</label>
<select class="" multiple name="tanggal[]" id="tanggal_edit"></select>
<select class="" multiple name="tanggal[]" id="tanggal_edit"></select>
<div class="form-text">Gunakan Key <kbd>Tab</kbd> untuk menambahkan tanggal.</div>
</div>
</div>
</div>

View File

@ -1,10 +1,10 @@
<aside id="layout-menu" class="layout-menu menu-vertical menu bg-menu-theme">
<div class="app-brand demo">
<a href="index.html" class="app-brand-link">
<a href="/dashboard" class="app-brand-link">
<span class="app-brand-logo demo">
</span>
<span class="app-brand-text demo menu-text fw-bolder ms-2">Order Gizi</span>
<span class="app-brand-text demo menu-text fw-bolder ms-2"><img src="/logo/logo_rsabhk.png" width="180"></span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto d-block d-xl-none">
@ -31,7 +31,7 @@
<li class="menu-item {{ Request::is('dashboard/klasifikasi-menu') ? 'active' : '' }}">
<a href="/dashboard/klasifikasi-menu" class="menu-link">
<i class="menu-icon tf-icons bx bx-dock-top"></i>
<div data-i18n="Account Settings">Klasifikasi Menu</div>
<div data-i18n="Account Settings">Klasifikasi Menu </div>
</a>
</li>
<li class="menu-item {{ Request::is('dashboard/kalori') ? 'active' : '' }}">
@ -65,23 +65,52 @@
<li class="menu-item {{ Request::is('dashboard/pending') ? 'active' : '' }}">
<a href="/dashboard/pending" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Konfirmasi Pesanan</div>
<div data-i18n="Basic">Konfirmasi Pesanan (Beta)
<span class="badge badge-canter rounded-circle bg-danger ms-2 mb-1" id="konfirmasi_pesanan"></span>
</div>
</a>
</li>
<!-- User interface -->
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
<a href="/dashboard/pekerjaan" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Verifikasi Makanan (Beta) <span class="badge badge-canter rounded-circle bg-danger ms-2 mb-1" id="verifikasi_makanan"></span></div>
</a>
</li>
<li class="menu-item {{ Request::is('dashboard/selesai') ? 'active' : '' }}">
<a href="/dashboard/selesai" class="menu-link">
<i class="menu-icon tf-icons bx bx-box"></i>
<div data-i18n="User interface">Pesanan Selesai</div>
<div data-i18n="User interface">Pesanan Selesai (Beta)</div>
</a>
</li>
<li class="menu-item {{ Request::is('dashboard/semua-pesanan') ? 'active' : '' }}">
<a href="/dashboard/semua-pesanan" class="menu-link">
<i class="menu-icon tf-icons bx bx-box"></i>
<div data-i18n="User interface">Semua Pesanan (Beta)</div>
</a>
</li>
<li class="menu-header small text-uppercase"><span class="menu-header-text">Verifikasi Makanan</span></li>
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
<a href="/dashboard/pekerjaan" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Verifikasi Makanan</div>
</a>
</li>
<li class="menu-header small text-uppercase"><span class="menu-header-text">Laporan</span></li>
<li class="menu-item {{ Request::is('dashboard/laporan-pesanan') ? 'active' : '' }}">
<a href="/dashboard/laporan-pesanan" class="menu-link">
<i class="menu-icon tf-icons bx bx-box"></i>
<div data-i18n="User interface">Laporan Pesanan (Beta)</div>
</a>
</li>
{{-- <li class="menu-item {{ Request::is('dashboard/laporan-pesanan') ? 'active' : '' }}">
<a href="/dashboard/laporan-pesanan" class="menu-link">
<i class="menu-icon tf-icons bx bx-box"></i>
<div data-i18n="User interface">Laporan Pesanan</div>
</a>
</li> --}}
{{-- <li class="menu-header small text-uppercase"><span class="menu-header-text">Verifikasi Makanan</span></li> --}}
</ul>
</aside>

View File

@ -0,0 +1,24 @@
<!-- Modal -->
<div class="modal fade" id="{{ $modalId }}" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h5 class="modal-title fs-5">{{ $judulModal }}</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="container" id="pesanan_container"></div>
<!-- Tempatkan ini di layout HTML -->
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,70 @@
<!-- Modal -->
<div class="modal fade" id="{{ $modalId }}" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h5 class="modal-title fs-5">Export Data {{ $confirm }}</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Modal Form -->
<form action="{{ $form }}" method="POST">
@csrf
<div class="modal-body">
<div class="container">
<div class="row">
<div class="col-md-12 mb-2">
<div class="form-group">
<label for="exampleFormControlInput1">Pilih type dokumen</label>
<select class="form-control" name="type" required>
<option value="pdf">PDF</option>
<option value="excel">Excel</option>
</select>
</div>
</div>
<div class="col-md-12 mb-2">
<div class="form-group">
<label for="exampleFormControlInput1">Pilih Pelanggan</label>
<select class="form-control" name="type_customer" required>
<option value="all">Semua</option>
<option value="Masyarakat Umum">Masyarakat Umum</option>
<option value="Karyawan RSAB Harapan Kita">Karyawan RSAB Harapan Kita</option>
<option value="Keluarga Pasien / Penunggu Pasien">Keluarga Pasien / Penunggu Pasien</option>
</select>
</div>
</div>
<div class="col-md-6 mb-2">
<div class="form-group">
<label for="exampleFormControlInput1">Start Date</label>
<input type="date" class="form-control" name="start_date" id="start_date" required>
</div>
</div>
<div class="col-md-6 mb-2">
<div class="form-group">
<label for="exampleFormControlInput1">End Date</label>
<input type="date" class="form-control" name="end_date" id="end_date" required>
</div>
</div>
</div>
</div>
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-primary">Export</button>
</div>
</form>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const today = new Date().toISOString().split('T')[0]; // Mendapatkan tanggal hari ini dalam format YYYY-MM-DD
$('#start_date').val(today);
$('#end_date').val(today);
});
</script>

View File

@ -0,0 +1,56 @@
@extends('dashboard.layouts.main')
@section('body_main')
<div class="container-xxl flex-grow-1 container-p-y">
<!-- Breadcrumb -->
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">Dashboard /</span> Laporan Pesanan
</h4>
<!-- Card Master Menu -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center flex-wrap gap-2">
<!-- Judul Kiri -->
<h5 class="mb-0">
Laporan Pesanan <strong id="confirm_laporan_pesanan"></strong>
</h5>
<!-- Kanan: Tombol Export + Input Tanggal -->
<div class="d-flex align-items-center gap-2">
<!-- Tombol Export -->
<button type="button" class="btn btn-sm btn-success text-dark" onclick="exportLaporanPendapatan()">
<i class="fa fa-download me-1"></i> Export Laporan Pendapatan
</button>
<button type="button" class="btn btn-sm btn-info" onclick="exportLaporanPesanan()">
<i class="fa fa-download me-1"></i> Export Laporan Pesanan
</button>
<!-- Input Tanggal -->
<div class="input-group input-group-sm" style="width: 240px;">
<span class="input-group-text bg-white">
<i class="fa fa-calendar-alt"></i>
</span>
<input
type="text"
class="form-control tanggal-input"
id="tanggal"
placeholder="Pilih tanggal"
readonly>
</div>
</div>
</div>
<div class="card-body">
<table class="table" id="datatableLaporanPesanan"></table>
</div>
</div>
</div>
<x-modalExport modalId="exportLp" form="/dashboard/export/laporan-pesanan" confirm="Pesanan"/>
<x-modalExport modalId="exportPendapatan" form="/dashboard/export/laporan-pendapatan" confirm="Pendapatan"/>
<x-infoPesanan modalId="infoPesanan" judulModal="Info Pesanan" />
<script src="{{ ver('/js/laporan_pesanan/_init.js') }}"></script>
<script src="{{ ver('/js/laporan_pesanan/dt.js') }}"></script>
<script src="{{ ver('/js/laporan_pesanan/action.js') }}"></script>
@endsection

View File

@ -18,13 +18,13 @@
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">Start Date</label>
<input type="date" class="form-control" name="start_date" required>
<input type="date" class="form-control" name="start_date" id="start_date" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">End Date</label>
<input type="date" class="form-control" name="end_date" required>
<input type="date" class="form-control" name="end_date" id="end_date" required>
</div>
</div>
</div>
@ -41,3 +41,10 @@
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const today = new Date().toISOString().split('T')[0]; // Mendapatkan tanggal hari ini dalam format YYYY-MM-DD
$('#start_date').val(today);
$('#end_date').val(today);
});
</script>

View File

@ -8,15 +8,13 @@
font-family: Arial, sans-serif;
font-size: 10.5px;
line-height: 1.5;
margin: 40px;
margin: 20px;
color: #333;
}
.header {
text-align: center;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
}
.header .sub-title {
@ -69,8 +67,17 @@
th:nth-child(7), td:nth-child(7) {
width: 15%; /* buat lebih panjang dari kolom lain */
}
th:nth-child(4), td:nth-child(4) { width: 60px; text-align: center; }
th:nth-child(6), td:nth-child(6) { width: 110px; text-align: center; }
th:nth-child(4), td:nth-child(4) {
width: 60px;
text-align: center;
}
th:nth-child(6), td:nth-child(6) {
width: 110px;
text-align: center;
}
.keterangan {
font-size: 10px;
line-height: 1.4;
@ -87,15 +94,21 @@
</style>
</head>
<body>
<div class="header">
<h2>Daftar Pesanan</h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }} </div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
<div style=" align-items: center;">
<div>
<img src="{{ public_path('logo/logo_rsabhk.png') }}" alt="Logo RSAB" style="height: 45px;">
</div>
<div style="margin-left: 37px; margin-top: -45px; text-align: center;">
<h2>Daftar Pesanan</h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
</div>
</div>
</div>
<div class="meta">
@ -111,6 +124,7 @@
<th>Tanggal Antar</th>
<th>Waktu Makan</th>
<th>Menu</th>
<th>Karbohidrat</th>
<th>Keterangan</th>
<th>Jumlah</th>
<th>Harga Satuan (Rp)</th>
@ -134,6 +148,13 @@
</td>
<td>{{ $row['type'] ?? '-' }}</td>
<td>{{ $row['menu']['nama_menu'] ?? '-' }}</td>
<td>
@if($row['karbohidrat'])
{{ $row['karbohidrat']['nama_karbohidrat'] }} ({{ $row['karbohidrat']['nilai_kalori'] ? $row['karbohidrat']['nilai_kalori'] . ' kkal' : '-' }})
@else
-
@endif
</td>
<td class="keterangan">
@php
$jenis = strtolower($row['order']['jenis_customer'] ?? '');
@ -156,7 +177,7 @@
</tr>
@empty
<tr>
<td colspan="9" style="text-align: center; color: #888;">Tidak ada data</td>
<td colspan="10" style="text-align: center; color: #888;">Tidak ada data</td>
</tr>
@endforelse
</tbody>
@ -165,6 +186,5 @@
<div class="footer">
&copy; {{ date('Y') }} RSAB Harapan Kita Sistem Order Gizi
</div>
</body>
</html>

View File

@ -12,6 +12,9 @@
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Konfirmasi Pesanan <strong id="confirm_date_pesanan_pending"></strong></h5>
<div class="d-flex align-items-center gap-2">
<button class="btn btn-sm btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasKonfirmasiPesanan" aria-controls="offcanvasKonfirmasiPesanan">
Verifikasi Makanan <span class="badge badge-canter rounded-circle bg-danger ms-2 mb-1" id="konfirmasi_pesanan_offcanvas"></span>
</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPending()">
<i class="fa fa-download me-1"></i> Export
</button>
@ -35,13 +38,20 @@
</div>
</div>
@include('dashboard.pesanan.pending.modal.detail')
@include('dashboard.pesanan.pending.modal.action')
@include('dashboard.pesanan.pending.modal.confirmBilling')
@include('dashboard.pesanan.pending.modal.actionProgressPesanan')
@include('dashboard.pesanan.pending.modal.export')
@include('dashboard.pesanan.pending.offcanvas.konfirmasiPesanan')
@include('dashboard.pesanan.pending.modal.actionPekerjaan')
<script src="{{ ver('/js/pesanan_pending/_init.js') }}"></script>
<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 src="{{ ver('/js/pesanan_pending/of_dt.js') }}"></script>
@endsection

View File

@ -0,0 +1,29 @@
<!-- Modal -->
<div class="modal fade" id="modalActionApproveOrder" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h5 class="modal-title fs-5">Aksi <strong id="confirmNoOrder"></strong></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Modal Form -->
<form method="POST" id="formActionApproveOrder">
@csrf
@method('put')
<div class="modal-body ">
Apakah kamu yakin melakukan persetujuan pada order ini ? <strong id="confirmActionApproveOrder"></strong>
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-primary">Setujui</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -16,11 +16,8 @@
<div class="modal-body">
<div class="container" id="pesanan_container"></div>
<!-- Tempatkan ini di layout HTML -->
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>

View File

@ -0,0 +1,26 @@
<!-- Modal -->
<div class="modal fade" id="modalDetailOrderOf" tabindex="-1" aria-hidden="true" >
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h5 class="modal-title fs-5">Data Pesanan <strong id="confirm_nama_pesanan"></strong></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Modal Form -->
@csrf
@method('put')
<div class="modal-body">
<div class="container" id="pesanan_container"></div>
<!-- Tempatkan ini di layout HTML -->
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>

View File

@ -10,7 +10,7 @@
</div>
<!-- Modal Form -->
<form action="/dashboard/pending/export" method="POST">
<form action="/dashboard/pending/export" method="POST" id="formExport">
@csrf
<div class="modal-body">
<div class="container">
@ -18,13 +18,13 @@
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">Start Date</label>
<input type="date" class="form-control" name="start_date" required>
<input type="date" class="form-control" name="start_date" id="start_date" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">End Date</label>
<input type="date" class="form-control" name="end_date" required>
<input type="date" class="form-control" name="end_date" id="end_date" required>
</div>
</div>
</div>
@ -41,3 +41,10 @@
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const today = new Date().toISOString().split('T')[0]; // Mendapatkan tanggal hari ini dalam format YYYY-MM-DD
$('#start_date').val(today);
$('#end_date').val(today);
});
</script>

View File

@ -0,0 +1,41 @@
<div class="offcanvas offcanvas-end"
id="offcanvasKonfirmasiPesanan"
tabindex="-1"
aria-labelledby="offcanvasKonfirmasiPesananLabel"
style="width: 1400px;">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasKonfirmasiPesananLabel">
Verifikasi Makanan <strong id="confirm_pekerjaan_time"></strong>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Tutup"></button>
</div>
<div class="offcanvas-body">
<!-- Toolbar -->
<div class="d-flex align-items-center gap-2 mb-3">
<!-- Tombol Cetak Label -->
<button type="button" class="btn btn-sm btn-primary" id="buttonLabel" onclick="labelDownload()" disabled>
<i class="fa-solid fa-qrcode"></i> Cetak Label
</button>
<!-- Tombol Export -->
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPekerjaan()">
<i class="fa fa-download me-1"></i> Export
</button>
<!-- Input Tanggal -->
<div class="input-group input-group-sm" style="width: 240px;">
<span class="input-group-text bg-white">
<i class="fa fa-calendar-alt"></i>
</span>
<input type="text" class="form-control tanggal-input" id="tanggal_offcanvas" placeholder="Pilih tanggal" readonly>
</div>
</div>
<!-- Table -->
<div class="table-responsive">
<table class="table table-hover" id="datatableVerifikasiMakananOffcanvas"></table>
</div>
</div>
</div>

View File

@ -8,17 +8,16 @@
font-family: Arial, sans-serif;
font-size: 10px;
line-height: 1.5;
margin: 40px;
margin: 20px;
color: #333;
}
.header {
text-align: center;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
}
.header h2 {
margin: 0;
font-size: 20px;
@ -83,13 +82,20 @@
<body>
<div class="header">
<h2>Laporan Konfirmasi Pesanan</h2>
@if ($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
<div style=" align-items: center;">
<div>
<img src="{{ public_path('logo/logo_rsabhk.png') }}" alt="Logo RSAB" style="height: 45px;">
</div>
<div style="margin-left: 37px; margin-top: -45px; text-align: center;">
<h2>{{ $laporan ?? 'Laporan Konfirmasi Pesanan' }} </h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
</div>
</div>
</div>
<div class="meta">
@ -118,7 +124,7 @@
<tr>
<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>{{ $i === 0 ? (($order->status_order === "Belum Bayar" || $order->status_order === "Dibatalkan" ) ? $order->status_order : $order->status_order . ' ('. $order->cara_pembayaran .')' ) : '' }}</td>
<td>
@if ($i === 0)
{{ $order->nama_pemesan }}

View File

@ -18,13 +18,13 @@
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">Start Date</label>
<input type="date" class="form-control" name="start_date" required>
<input type="date" class="form-control" name="start_date" id="start_date" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="exampleFormControlInput1">End Date</label>
<input type="date" class="form-control" name="end_date" required>
<input type="date" class="form-control" name="end_date" id="end_date" required>
</div>
</div>
</div>
@ -41,3 +41,10 @@
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const today = new Date().toISOString().split('T')[0]; // Mendapatkan tanggal hari ini dalam format YYYY-MM-DD
$('#start_date').val(today);
$('#end_date').val(today);
});
</script>

View File

@ -8,17 +8,16 @@
font-family: Arial, sans-serif;
font-size: 11px;
line-height: 1.5;
margin: 40px;
margin: 20px;
color: #333;
}
.header {
text-align: center;
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
}
.header h2 {
margin: 0;
font-size: 20px;
@ -89,13 +88,20 @@
<body>
<div class="header">
<h2>Laporan Pesanan Selesai</h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }} </div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
<div style=" align-items: center;">
<div>
<img src="{{ public_path('logo/logo_rsabhk.png') }}" alt="Logo RSAB" style="height: 45px;">
</div>
<div style="margin-left: 37px; margin-top: -45px; text-align: center;">
<h2>Laporan Pesanan Selesai</h2>
@if($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else
<div class="sub-title">Periode: {{ $startDate }} - {{ $endDate }}</div>
@endif
<div class="sub-title">RSAB Harapan Kita</div>
</div>
</div>
</div>
<div class="meta">

View File

@ -0,0 +1,76 @@
@extends('dashboard.layouts.main')
@section('body_main')
<div class="container-xxl flex-grow-1 container-p-y">
<!-- Breadcrumb -->
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">Dashboard /</span> Semua Pesanan
</h4>
<!-- Card Master Menu -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Semua Pesanan <strong id="confirm_semua_pesanan_time"></strong></h5>
<div class="d-flex align-items-center gap-2">
<div class="input-group input-group-sm" style="width: 240px;">
<span class="input-group-text bg-white">
<i class="fa fa-calendar-alt"></i>
</span>
<input
type="text"
class="form-control tanggal-input"
id="tanggal"
placeholder="Pilih tanggal"
readonly>
</div>
</div>
</div>
<div class="card-body">
<table class="table" id="datatableSemuaPesanan"></table>
</div>
</div>
</div>
<x-infoPesanan modalId="infoPesanan" judulModal="Info Pesanan" />
<script src="{{ ver('/js/semua_pesanan/_init.js') }}"></script>
<script src="{{ ver('/js/semua_pesanan/dt.js') }}"></script>
<script src="{{ ver('/js/semua_pesanan/action.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}`;
})
// 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_semua_pesanan_time").text(': ' + tanggalRapi)
}else{
$("#confirm_semua_pesanan_time").text('');
}
}
});
$("#confirm_semua_pesanan_time").text('Hari ini');
// initDt()
});
</script>
@endsection

View File

@ -92,6 +92,7 @@
: data.status_order === 'Belum Bayar' ? '' : 'bg-success'}">
${item?.status_order}
</p>
<p class="mb-1 small">Catatan: <strong>${item?.catatan || '-'}</strong></p>
</div>
</div>
</div>

View File

@ -24,10 +24,10 @@
<strong>Menu Normal:</strong> Dipesan maksimal H-1 sebelum pukul <strong>13.00 WIB</strong>.
</li>
<li>
<strong>Menu Same Day:</strong> Dipesan pada hari yang sama setelah pukul <strong>13.00 WIB</strong>.
<strong>Menu Sameday:</strong>.
<ul class="ps-3 mt-1">
<li><strong>Makan Siang:</strong> maksimal pukul <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> maksimal pukul <strong>13.00 WIB</strong></li>
<li><strong>Makan Siang:</strong> Dipesan maksimal pukul <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> Dipesan maksimal pukul <strong>13.00 WIB</strong></li>
</ul>
</li>
<li>
@ -60,10 +60,10 @@
<strong>Menu Normal:</strong> Dipesan maksimal H-1 sebelum pukul <strong>13.00 WIB</strong>.
</li>
<li>
<strong>Menu Same Day:</strong> Dipesan pada hari yang sama setelah pukul <strong>13.00 WIB</strong>.
<strong>Menu Sameday:</strong>.
<ul class="ps-3 mt-1">
<li><strong>Makan Siang:</strong> maksimal pukul <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> maksimal pukul <strong>13.00 WIB</strong></li>
<li><strong>Makan Siang:</strong> Dipesan maksimal pukul <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> Dipesan maksimal pukul <strong>13.00 WIB</strong></li>
</ul>
</li>
<li>

View File

@ -101,6 +101,10 @@
<img id="bukti_preview" class="img-fluid rounded mt-3 d-none" style="max-height: 300px; object-fit: contain;" />
</div>
</div>
<div class="mb-3" id="billing_section" style="display:none;">
<label for="exampleInputEmail1" class="form-label">No. Medical Record</label>
<input type="text" class="form-control" name="medical_record" id="medical_record" placeholder="Masukkan No. Medical Record">
</div>
</div>
</div>

View File

@ -72,6 +72,9 @@
<strong>Konsultasi Gizi!</strong>&nbsp;
Butuh rekomendasi menu sesuai kondisi Anda?
&nbsp;<a href="#" class="alert-link">Lihat jadwal konsultasi & daftar sekarang</a>.
Butuh bantuan? Hubungi WhatsApp <strong>Instalasi Gizi</strong>&nbsp;
<a href="https://wa.me/08815611382 " target="_blank">08815611382 </a>&nbsp;
<small class="text-muted">Jam kerja: 08.00 15.00 WIB</small>
</marquee>
</div>
</div>
@ -85,10 +88,10 @@
<button type="button" id="menuBtn"
class="btn btn-danger position-fixed start-50 translate-middle-x
rounded-pill shadow-lg d-flex align-items-center gap-2
px-3 py-2 d-none"
px-2 py-1 d-none"
style="bottom: 75px; z-index: 1051; font-size: .8rem;" onclick="toggleCartList()">
<i class="fa-solid fa-bell-concierge"></i>
<span>Menu</span>
<span>Menu Dipilih</span>
</button>
<div id="cartList"
class="position-fixed start-50 translate-middle-x bg-white rounded shadow-lg d-none"
@ -119,23 +122,13 @@
<div class="alert alert-info py-3 px-4 small border-start border-4 border-primary mt-3" role="alert">
<div class="fw-bold mb-2">
<i class="fa fa-info-circle me-1"></i>Informasi Penting
<i class="fa fa-info-circle me-1"></i>Informasi
</div>
<ul class="mb-0 ps-3">
<li>
<strong>Menu Normal:</strong> Dipesan maksimal H-1 sebelum pukul <strong>13.00 WIB</strong>.
</li>
<li>
<strong>Menu Same Day:</strong> Dipesan pada hari yang sama setelah pukul <strong>13.00 WIB</strong>.
<ul class="ps-3 mt-1">
<li><strong>Makan Siang:</strong> maksimal pukul <strong>10.00 WIB</strong></li>
<li><strong>Makan Sore:</strong> maksimal pukul <strong>13.00 WIB</strong></li>
</ul>
</li>
<li>
Butuh bantuan? Hubungi WhatsApp <strong>Instalasi Gizi</strong>:
<a href="https://wa.me/08815611382 " target="_blank">08815611382 </a> <br>
<small class="text-muted">Jam kerja: 08.00 15.00 WIB</small>
<span class="text-muted">Jam kerja: 08.00 - 15.00 WIB</small>
</li>
</ul>
</div>
@ -200,6 +193,6 @@
});
</script>
@endsection

View File

@ -6,8 +6,8 @@
<div class="container position-relative d-flex align-items-center justify-content-between">
<a href="/" class="logo d-flex align-items-center me-auto">
<!-- Uncomment the line below if you also wish to use an image logo -->
<!-- <img src="asset_guests/img/logo.png" alt=""> -->
<h1 class="sitename">Order Gizi</h1>
<img src="/logo/logo_rsabhk.png" width="170" alt="Logo RSAB HARAPAN KITA" class="logo-img">
<h1 class="sitename"></h1>
</a>
<nav id="navmenu" class="navmenu">

View File

@ -44,7 +44,9 @@ Route::group(['middleware' => ['auth']], function(){
Route::get('/datatable/menu', [MenuController::class, 'datatable']);
Route::get('/pending', [PesananController::class, 'index']);
Route::get('count/pending', [PesananController::class, 'countPesananPending']);
Route::get('count/konfirmasi-pesanan', [PesananController::class, 'countKonfirmasiPesanan']);
Route::get('count/verifikasi-pesanan', [PesananController::class, 'countVerifikasiPesanan']);
Route::get('datatable/pending', [PesananController::class, 'getDataPending']);
Route::post('pending/export', [PesananController::class, 'exportPending']);
Route::put('/pending/action/{order_id}', [PesananController::class, 'actionOrder']);
@ -56,6 +58,14 @@ Route::group(['middleware' => ['auth']], function(){
Route::post('/selesai/export', [PesananController::class, 'exportSelesai']);
Route::get('datatable/selesai', [PesananController::class, 'getDataSelesai']);
Route::get('/semua-pesanan', [PesananController::class, 'indexSemua']);
Route::get('datatable/semua-pesanan', [PesananController::class, 'getSemuaPekerjaan']);
Route::get('/laporan-pesanan', [PesananController::class, 'laporanPesanan']);
Route::get('datatable/laporan-pesanan', [PesananController::class, 'getLaporanPesanan']);
Route::post('export/laporan-pesanan', [PesananController::class, 'exportLaporanPesanan']);
Route::get('/pekerjaan', [PesananController::class, 'pekerjaan']);
Route::get('datatable/pekerjaan', [PesananController::class, 'getPekerjaan']);
Route::post('pekerjaan/export', [PesananController::class, 'exportPekerjaan']);