progress report
This commit is contained in:
parent
8152490596
commit
c1dfa20b0f
@ -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(),
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -36,7 +36,8 @@ class Order extends Model
|
||||
'bagian_instalasi',
|
||||
'note_dibatalkan',
|
||||
'email',
|
||||
'alamat'
|
||||
'alamat',
|
||||
'medical_record'
|
||||
];
|
||||
|
||||
protected $cast = [
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@ -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' => [
|
||||
|
||||
@ -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); }
|
||||
}
|
||||
|
||||
@ -92,7 +92,6 @@ async function submitOrderToServer(){
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
console.log(result);
|
||||
|
||||
if (result.status) {
|
||||
// ✅ Hapus sessionStorage di client
|
||||
|
||||
@ -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')
|
||||
}
|
||||
|
||||
@ -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;
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
4
public/js/laporan_pesanan/_init.js
Normal file
4
public/js/laporan_pesanan/_init.js
Normal file
@ -0,0 +1,4 @@
|
||||
const datatable =$("#datatableLaporanPesanan")
|
||||
const infoPesanan = document.getElementById('infoPesanan')
|
||||
const exportLp = document.getElementById('exportLp')
|
||||
const exportPendapatan = document.getElementById('exportPendapatan')
|
||||
125
public/js/laporan_pesanan/action.js
Normal file
125
public/js/laporan_pesanan/action.js
Normal 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();
|
||||
}
|
||||
192
public/js/laporan_pesanan/dt.js
Normal file
192
public/js/laporan_pesanan/dt.js
Normal 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();
|
||||
});
|
||||
@ -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">
|
||||
${
|
||||
|
||||
@ -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>`;
|
||||
}
|
||||
|
||||
@ -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({
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,
|
||||
}
|
||||
},
|
||||
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
288
public/js/pesanan_pending/of_dt.js
Normal file
288
public/js/pesanan_pending/of_dt.js
Normal 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,
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -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>
|
||||
|
||||
3
public/js/semua_pesanan/_init.js
Normal file
3
public/js/semua_pesanan/_init.js
Normal file
@ -0,0 +1,3 @@
|
||||
const datatableSemuaPesanan = $("#datatableSemuaPesanan")
|
||||
|
||||
const infoPesanan = document.getElementById('infoPesanan')
|
||||
115
public/js/semua_pesanan/action.js
Normal file
115
public/js/semua_pesanan/action.js
Normal 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)
|
||||
}
|
||||
|
||||
194
public/js/semua_pesanan/dt.js
Normal file
194
public/js/semua_pesanan/dt.js
Normal 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
BIN
public/logo/logo_rsabhk.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
@ -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
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
© {{ date('Y') }} RSAB Harapan Kita – Sistem Order Gizi
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
@ -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 }}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
76
resources/views/dashboard/pesanan/semua/index.blade.php
Normal file
76
resources/views/dashboard/pesanan/semua/index.blade.php
Normal 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
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -72,6 +72,9 @@
|
||||
<strong>Konsultasi Gizi!</strong>
|
||||
Butuh rekomendasi menu sesuai kondisi Anda?
|
||||
<a href="#" class="alert-link">Lihat jadwal konsultasi & daftar sekarang</a>.
|
||||
Butuh bantuan? Hubungi WhatsApp <strong>Instalasi Gizi</strong>
|
||||
<a href="https://wa.me/08815611382 " target="_blank">08815611382 </a>
|
||||
<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
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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']);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user