Merge pull request 'development' (#1) from development into production

Reviewed-on: #1
This commit is contained in:
Joko 2025-08-19 04:40:01 +00:00
commit d9ebc738c0
63 changed files with 692 additions and 251 deletions

View File

@ -300,6 +300,7 @@ class CustomerController extends Controller
$payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id'] ?? null;
$payloadOrderDetail['catatan'] = $value['catatan'] ?? null;
$payloadOrderDetail['master_menu_id'] = $cart['id_menu'];
$payloadOrderDetail['total_kalori'] = $value['resultKalori'] ?? ($cart['kalori'] ?? null);
OrderDetail::create($payloadOrderDetail);
}
}
@ -407,6 +408,7 @@ class CustomerController extends Controller
->table('public.order as o')
->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id')
->leftJoin('public.master_menu as mm', 'mm.master_menu_id', '=', 'od.master_menu_id')
->leftJoin('public.menu_mcu as mcu', 'mcu.menu_mcu_id', '=', 'od.menu_mcu_id')
->where('o.no_order', 'ILIKE', '%' . $noOrder . '%')
->select(
'o.*',
@ -416,7 +418,8 @@ class CustomerController extends Controller
'od.harga_satuan',
'od.status_order as status_order_detail',
'od.catatan',
'mm.nama_menu as nama_item',
'od.total_kalori',
DB::raw('COALESCE(mm.nama_menu, mcu.nama_mcu) as nama_item'),
'mm.foto as foto'
)
->get();
@ -460,7 +463,8 @@ class CustomerController extends Controller
'jumlah' => $item->jumlah,
'harga_satuan' => $item->harga_satuan,
'status_order' => $item->status_order_detail,
'catatan' => $item->catatan ?? '-'
'catatan' => $item->catatan ?? '-',
'total_kalori' => $item->total_kalori
// tambahkan field tambahan jika diperlukan
];
})->values(),
@ -487,6 +491,7 @@ class CustomerController extends Controller
DB::connection('dbOrderGizi')->beginTransaction();
$today = now()->toDateString();
$jumlahHariIni = Order::whereDate('entry_at', $today)->count();
$priceMcu = MasterMcu::where('menu_mcu_id', request('paket_mcu'))->first();
$urutan = $jumlahHariIni + 1;
$noOrder = 'TX/CT/GIZI/' . now()->year .'/'. now()->month .'/' . now()->day .'/MCU/' . Str::random(6) .'/' . str_pad($urutan, 4, '0', STR_PAD_LEFT);
$payload = [
@ -499,17 +504,20 @@ class CustomerController extends Controller
'no_wa' => request('no_hp') ?? null,
'tinggi_badan' => request('tinggi_badan') ?? null,
'berat_badan' => request('berat_badan') ?? null,
'status_order' =>'Menunggu Konfirmasi Pesanan MCU'
'status_order' =>'Menunggu Konfirmasi Pesanan MCU',
'total_harga' => $priceMcu ? $priceMcu->harga : null,
'cara_pembayaran' =>'MCU',
];
$order = Order::create($payload);
$payloadDetail = [
'order_id' => $order->order_id,
'jumlah' => 1,
'tgl_antar' => request('tgl_mcu'),
'menu_mcu_id' => request('paket_mcu'),
'jam_layanan' => request('jam_layanan'),
'cara_pembayaran' => 'MCU',
'status_order' =>'Menunggu Konfirmasi'
'status_order' =>'Pending',
'harga_satuan' => $priceMcu ? $priceMcu->harga : null,
];
OrderDetail::create($payloadDetail);

View File

@ -136,7 +136,6 @@ class PesananController extends Controller
'pegawai_name_confirm_order' => auth()->user()->full_name,
'pegawai_at_confirm_order' => Carbon::now(),
'status_order' => 'Lunas',
'cara_pembayaran' => 'Billing'
];
if($request->hasFile('evidence_medical_record')){
$file = $request->file('evidence_medical_record');
@ -264,7 +263,7 @@ class PesananController extends Controller
}
public function getPekerjaan(){
$data = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q){
$data = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q){
$q->where('status_order', 'Lunas');
});
$tanggal = request('tanggal');
@ -288,7 +287,7 @@ class PesananController extends Controller
}
public function getPekerjaanDetail($order_detail_id){
$data = OrderDetail::where('order_detail_id', $order_detail_id)->with(['order', 'menu', 'paketMenu'])->first();
$data = OrderDetail::where('order_detail_id', $order_detail_id)->with(['order', 'menu', 'masterMcu'])->first();
return response()->json([
'status' => true,
'data' => $data
@ -301,7 +300,7 @@ class PesananController extends Controller
$type_customer = request('type_customer');
$type = request('type');
$orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){
$orderDetail = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){
$q->where('status_order', 'Lunas');
if($type_customer !== 'all'){
$q->where('jenis_customer', $type_customer);
@ -338,18 +337,18 @@ class PesananController extends Controller
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', "Menu Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
$sheet->mergeCells('A1:K1');
$sheet->mergeCells('A1:L1');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
$sheet->mergeCells('A2:K2');
$sheet->mergeCells('A2:L2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
// Header tabel
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pesanan", "Menu Pesanan", "Karbohidrat", "Jumlah", "Tanggal Antar", "Waktu Makan", "Catatan"];
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pesanan", "Menu Pesanan", "Karbohidrat", "Total Kalori (kal)", "Jumlah", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"];
$sheet->fromArray($headers, null, 'A4');
$sheet->getStyle('A4:K4')->applyFromArray([
$sheet->getStyle('A4:L4')->applyFromArray([
'font' => ['bold' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
'borders' => [
@ -358,9 +357,9 @@ class PesananController extends Controller
]
]
]);
$sheet->getStyle('A4:K4')->getFont()->setBold(true);
$sheet->getStyle('A4:K4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:K4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$sheet->getStyle('A4:L4')->getFont()->setBold(true);
$sheet->getStyle('A4:L4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:L4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// Isi data
$row = 5;
foreach ($orderDetail as $index => $item) {
@ -369,25 +368,26 @@ class PesananController extends Controller
$sheet->setCellValue("C{$row}", $item?->order?->nama_pemesan);
$sheet->setCellValue("D{$row}", $item?->order?->jenis_customer);
$sheet->setCellValue("E{$row}", $item?->status_order ?? "-");
$sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? '-');
$sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? $item?->masterMcu?->nama_mcu);
$karbohidratNama = $item?->karbohidrat?->nama_karbohidrat ?? '-';
$karbohidratNilai = $item?->karbohidrat?->nilai_kalori ?? '-';
$sheet->setCellValue("G{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} kal)" : ''));
$sheet->setCellValue("H{$row}", $item?->jumlah ?? '-');
$sheet->setCellValue("I{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("J{$row}", $item?->type ?? "-");
$sheet->setCellValue("K{$row}", $item?->catatan ?? "-");
$sheet->setCellValue("H{$row}", $item?->total_kalori ?? '-');
$sheet->setCellValue("I{$row}", $item?->jumlah ?? '-');
$sheet->setCellValue("J{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("K{$row}", $item?->type ?? $item->jam_layanan);
$sheet->setCellValue("L{$row}", $item?->catatan ?? "-");
// Border tiap baris
$sheet->getStyle("A{$row}:K{$row}")->getBorders()->getAllBorders()
$sheet->getStyle("A{$row}:L{$row}")->getBorders()->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$row++;
}
// Auto size kolom
foreach(range('A', 'K') as $col){
foreach(range('A', 'L') as $col){
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$lastRow = $row - 1;
$sheet->setAutoFilter("A4:K{$lastRow}");
$sheet->setAutoFilter("A4:L{$lastRow}");
// Download file
$fileName = 'menu-pesanan' . now()->format('Ymd-His') . '.xlsx';
$writer = new Xlsx($spreadsheet);
@ -409,7 +409,7 @@ class PesananController extends Controller
$type_customer = request('type_customer');
$query = Order::where('statusenabled', true)
->whereBetween('entry_at', [$startDate, $endDate])
->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing']);
->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU']);
if($type_customer !== 'all'){
$query->where('jenis_customer', $type_customer);
}
@ -449,18 +449,18 @@ class PesananController extends Controller
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
$sheet->mergeCells('A1:P1');
$sheet->mergeCells('A1:R1');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
$sheet->mergeCells('A2:P2');
$sheet->mergeCells('A2:R2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
// Header tabel
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"];
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Total Kalori", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"];
$sheet->fromArray($headers, null, 'A4');
$sheet->getStyle('A4:Q4')->applyFromArray([
$sheet->getStyle('A4:R4')->applyFromArray([
'font' => ['bold' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
'borders' => [
@ -469,9 +469,9 @@ class PesananController extends Controller
]
]
]);
$sheet->getStyle('A4:Q4')->getFont()->setBold(true);
$sheet->getStyle('A4:Q4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:Q4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$sheet->getStyle('A4:R4')->getFont()->setBold(true);
$sheet->getStyle('A4:R4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:R4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// Isi data
$row = 5;
@ -489,14 +489,15 @@ class PesananController extends Controller
$sheet->setCellValue("J{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
$sheet->setCellValue("K{$row}", $item->total_harga);
$sheet->setCellValue("L{$row}", $detail?->menu?->nama_menu ?? '-');
$sheet->setCellValue("M{$row}", $detail?->jumlah ?? '-');
$sheet->setCellValue("N{$row}", $detail?->status_order ?? "-");
$sheet->setCellValue("O{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("P{$row}", $detail?->type ?? "-");
$sheet->setCellValue("Q{$row}", $detail?->catatan ?? "-");
$sheet->setCellValue("L{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu);
$sheet->setCellValue("M{$row}", $detail?->total_kalori ?? '-');
$sheet->setCellValue("N{$row}", $detail?->jumlah ?? '-');
$sheet->setCellValue("O{$row}", $detail?->status_order ?? "-");
$sheet->setCellValue("P{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("Q{$row}", $detail?->type ?? $detail->jam_layanan);
$sheet->setCellValue("R{$row}", $detail?->catatan ?? "-");
// Border tiap baris
$sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders()
$sheet->getStyle("A{$row}:R{$row}")->getBorders()->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$row++;
@ -504,11 +505,11 @@ class PesananController extends Controller
}
// Auto size kolom
foreach(range('A', 'Q') as $col){
foreach(range('A', 'R') as $col){
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$lastRow = $row - 1;
$sheet->setAutoFilter("A4:Q{$lastRow}");
$sheet->setAutoFilter("A4:R{$lastRow}");
// Download file
$fileName = $title . now()->format('Ymd-His') . '.xlsx';
$writer = new Xlsx($spreadsheet);
@ -682,18 +683,18 @@ class PesananController extends Controller
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
$sheet->mergeCells('A1:P1');
$sheet->mergeCells('A1:Q1');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
$sheet->mergeCells('A2:P2');
$sheet->mergeCells('A2:Q2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
// Header tabel
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"];
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Total Kalori (kal)", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Catatan"];
$sheet->fromArray($headers, null, 'A4');
$sheet->getStyle('A4:P4')->applyFromArray([
$sheet->getStyle('A4:Q4')->applyFromArray([
'font' => ['bold' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
'borders' => [
@ -702,9 +703,9 @@ class PesananController extends Controller
]
]
]);
$sheet->getStyle('A4:P4')->getFont()->setBold(true);
$sheet->getStyle('A4:P4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:P4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$sheet->getStyle('A4:Q4')->getFont()->setBold(true);
$sheet->getStyle('A4:Q4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:Q4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// Isi data
$row = 5;
@ -721,14 +722,15 @@ class PesananController extends Controller
$sheet->setCellValue("I{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
$sheet->setCellValue("J{$row}", $item->total_harga);
$sheet->setCellValue("K{$row}", $detail?->menu?->nama_menu ?? '-');
$sheet->setCellValue("L{$row}", $detail?->jumlah ?? '-');
$sheet->setCellValue("M{$row}", $detail?->status_order ?? "-");
$sheet->setCellValue("N{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("O{$row}", $detail?->type ?? "-");
$sheet->setCellValue("P{$row}", $detail?->catatan ?? "-");
$sheet->setCellValue("K{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu);
$sheet->setCellValue("L{$row}", $detail?->total_kalori ?? '-');
$sheet->setCellValue("M{$row}", $detail?->jumlah ?? '-');
$sheet->setCellValue("N{$row}", $detail?->status_order ?? "-");
$sheet->setCellValue("O{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "-");
$sheet->setCellValue("P{$row}", $detail?->type ?? $detail->jam_layanan);
$sheet->setCellValue("Q{$row}", $detail?->catatan ?? "-");
// Border tiap baris
$sheet->getStyle("A{$row}:P{$row}")->getBorders()->getAllBorders()
$sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$row++;
@ -736,11 +738,11 @@ class PesananController extends Controller
}
// Auto size kolom
foreach(range('A', 'P') as $col){
foreach(range('A', 'Q') as $col){
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$lastRow = $row - 1;
$sheet->setAutoFilter("A4:P{$lastRow}");
$sheet->setAutoFilter("A4:Q{$lastRow}");
// Download file
$fileName = 'laporan-pesanan-' . now()->format('Ymd-His') . '.xlsx';
$writer = new Xlsx($spreadsheet);
@ -958,6 +960,15 @@ class PesananController extends Controller
'total' => $grouped->count()
]);
}
public function downloadLabel(){
$data = request('data');
$dataArray = explode(',', $data);
$orderDetail = OrderDetail::whereIn('order_detail_id', $dataArray)->with(['masterMcu', 'menu', 'order'])->get();
$pdf = Pdf::loadView('dashboard.label.multi', compact('orderDetail'));
return $pdf->stream('label_.pdf');
}
/**
* Show the form for creating a new resource.
*/

View File

@ -38,7 +38,7 @@ class Order extends Model
'email',
'alamat',
'medical_record',
'evidence_medical_record'
'evidence_medical_record',
];
protected $cast = [
@ -47,6 +47,6 @@ class Order extends Model
];
public function orderDetail(){
return $this->hasMany(OrderDetail::class, 'order_id')->with('paketMenu', 'menu');
return $this->hasMany(OrderDetail::class, 'order_id')->with('masterMcu', 'menu');
}
}

View File

@ -15,7 +15,7 @@ class OrderDetail extends Model
'modified_at',
'statusenabled',
'master_menu_id',
'paket_mcu_id',
'menu_mcu_id',
'harga_satuan',
'jumlah',
'tgl_antar',
@ -24,7 +24,8 @@ class OrderDetail extends Model
'status_order',
'karbohidrat_id',
'catatan',
'jam_layanan'
'jam_layanan',
'total_kalori'
];
@ -38,4 +39,7 @@ class OrderDetail extends Model
public function order(){
return $this->belongsTo(Order::class, 'order_id', 'order_id');
}
public function masterMcu(){
return $this->belongsTo(MasterMcu::class, 'menu_mcu_id', 'menu_mcu_id');
}
}

View File

@ -8,6 +8,7 @@
"require": {
"php": "^8.2",
"barryvdh/laravel-dompdf": "^3.1",
"barryvdh/laravel-snappy": "^1.0",
"laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1",
"phpoffice/phpspreadsheet": "^4.5"

147
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "696ae0d1187bc1634529f1760a11ffd0",
"content-hash": "9d83b6a45b530b893999cf984c08fde5",
"packages": [
{
"name": "barryvdh/laravel-dompdf",
@ -83,6 +83,84 @@
],
"time": "2025-02-13T15:07:54+00:00"
},
{
"name": "barryvdh/laravel-snappy",
"version": "v1.0.4",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-snappy.git",
"reference": "5b8668e4a54be630973fd309b4cb1abe75a8afbb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/5b8668e4a54be630973fd309b4cb1abe75a8afbb",
"reference": "5b8668e4a54be630973fd309b4cb1abe75a8afbb",
"shasum": ""
},
"require": {
"illuminate/filesystem": "^9|^10|^11|^12",
"illuminate/support": "^9|^10|^11|^12",
"knplabs/knp-snappy": "^1.4.4",
"php": "^8.1"
},
"require-dev": {
"orchestra/testbench": "^7|^8|^9|^10"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"PDF": "Barryvdh\\Snappy\\Facades\\SnappyPdf",
"SnappyImage": "Barryvdh\\Snappy\\Facades\\SnappyImage"
},
"providers": [
"Barryvdh\\Snappy\\ServiceProvider"
]
},
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Barryvdh\\Snappy\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "Snappy PDF/Image for Laravel",
"keywords": [
"image",
"laravel",
"pdf",
"snappy",
"wkhtmltoimage",
"wkhtmltopdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-snappy/issues",
"source": "https://github.com/barryvdh/laravel-snappy/tree/v1.0.4"
},
"funding": [
{
"url": "https://fruitcake.nl",
"type": "custom"
},
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2025-02-24T15:20:06+00:00"
},
{
"name": "brick/math",
"version": "0.13.1",
@ -1365,6 +1443,73 @@
],
"time": "2025-02-03T10:55:03+00:00"
},
{
"name": "knplabs/knp-snappy",
"version": "v1.5.1",
"source": {
"type": "git",
"url": "https://github.com/KnpLabs/snappy.git",
"reference": "3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/KnpLabs/snappy/zipball/3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7",
"reference": "3dd138e9e47de91cd2e056c5e6e1a0dd72547ee7",
"shasum": ""
},
"require": {
"php": ">=8.1",
"psr/log": "^2.0||^3.0",
"symfony/process": "^5.0||^6.0||^7.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.0",
"pedrotroller/php-cs-custom-fixer": "^2.19",
"phpstan/phpstan": "^1.0.0",
"phpstan/phpstan-phpunit": "^1.0.0",
"phpunit/phpunit": "^8.5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Knp\\Snappy\\": "src/Knp/Snappy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "KNP Labs Team",
"homepage": "http://knplabs.com"
},
{
"name": "Symfony Community",
"homepage": "http://github.com/KnpLabs/snappy/contributors"
}
],
"description": "PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.",
"homepage": "http://github.com/KnpLabs/snappy",
"keywords": [
"knp",
"knplabs",
"pdf",
"snapshot",
"thumbnail",
"wkhtmltopdf"
],
"support": {
"issues": "https://github.com/KnpLabs/snappy/issues",
"source": "https://github.com/KnpLabs/snappy/tree/v1.5.1"
},
"time": "2025-01-06T16:53:26+00:00"
},
{
"name": "laravel/framework",
"version": "v12.20.0",

52
config/snappy.php Normal file
View File

@ -0,0 +1,52 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Snappy PDF / Image Configuration
|--------------------------------------------------------------------------
|
| This option contains settings for PDF generation.
|
| Enabled:
|
| Whether to load PDF / Image generation.
|
| Binary:
|
| The file path of the wkhtmltopdf / wkhtmltoimage executable.
|
| Timeout:
|
| The amount of time to wait (in seconds) before PDF / Image generation is stopped.
| Setting this to false disables the timeout (unlimited processing time).
|
| Options:
|
| The wkhtmltopdf command options. These are passed directly to wkhtmltopdf.
| See https://wkhtmltopdf.org/usage/wkhtmltopdf.txt for all options.
|
| Env:
|
| The environment variables to set while running the wkhtmltopdf process.
|
*/
'pdf' => [
'enabled' => true,
'binary' => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'),
'timeout' => false,
'options' => [],
'env' => [],
],
'image' => [
'enabled' => true,
'binary' => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage'),
'timeout' => false,
'options' => [],
'env' => [],
],
];

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

@ -65,6 +65,11 @@ async function submitOrderToServer(){
$("#checkoutFormFinal").on('submit', async function(e){
e.preventDefault()
const buttonSubmit = $(this).find('button[type="submit"]')
if(buttonSubmit.prop('disabled')) return;
buttonSubmit.prop('disabled', true)
.html('<i class="fas fa-spinner fa-spin me-2"></i>Memproses...')
const cara_pembayaran = document.getElementById('cara_pembayaran').value;
const bukti_pembayaran = document.querySelector('input[name="bukti_pembayaran"]').value;
@ -74,6 +79,7 @@ async function submitOrderToServer(){
text: 'Silahkan upload bukti pembayaran jika metode yang dipakai transfer.',
icon: 'warning',
})
buttonSubmit.prop('disabled', false).html('Selesaikan Pesanan');
return;
}
@ -81,6 +87,12 @@ async function submitOrderToServer(){
const form = this;
const formData = new FormData(form);
const clearSession = () => {
sessionStorage.removeItem('cart');
sessionStorage.removeItem('checkout_biodata');
sessionStorage.removeItem('order_id');
sessionStorage.removeItem('time_order');
};
try {
const response = await fetch('/finish-checkout', {
@ -95,11 +107,7 @@ async function submitOrderToServer(){
if (result.status) {
// ✅ Hapus sessionStorage di client
sessionStorage.removeItem('cart');
sessionStorage.removeItem('checkout_biodata');
sessionStorage.removeItem('order_id');
sessionStorage.removeItem('time_order');
clearSession()
Swal.fire({
title: 'Pesanan Berhasil!',
text: 'Terima kasih, pesanan Anda sedang kami siapkan.',
@ -110,10 +118,7 @@ async function submitOrderToServer(){
window.location.href = "/success-page"; // kehalaman success
});
} else {
sessionStorage.removeItem('cart');
sessionStorage.removeItem('checkout_biodata');
sessionStorage.removeItem('order_id');
sessionStorage.removeItem('time_order');
clearSession()
Swal.fire({
title: 'Gagal!',
text: result.message,
@ -124,11 +129,10 @@ async function submitOrderToServer(){
});
}
} catch (err) {
sessionStorage.removeItem('cart');
sessionStorage.removeItem('checkout_biodata');
sessionStorage.removeItem('order_id');
sessionStorage.removeItem('time_order');
clearSession()
console.error(err);
alert("Terjadi kesalahan saat mengirim data.");
}finally{
buttonSubmit.prop('disabled', false).html('Selesaikan Pesanan');
}
})

View File

@ -31,67 +31,78 @@ document.addEventListener('DOMContentLoaded', () => {
// Setup button step
document.querySelectorAll('.next-step').forEach(btn => {
btn.addEventListener('click', async () => {
const btnLoad = btn;
btnLoad.disabled = true;
btnLoad.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i>Memproses...';
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
if (cart.length === 0) {
try {
if (cart.length === 0) {
window.location.href = "/";
return;
}
if (currentStep === 0){
if(!validateStepOne()) return
isiKonfirmasi();
currentStep++; showStep(currentStep);
}else if(currentStep === 1){
const {isValid, errorMessage} =validateCartBeforeSubmit();
if (!isValid) {
Swal.fire({
title: 'Perhatian!',
text: errorMessage,
if(!validateStepOne()) return
isiKonfirmasi();
currentStep++; showStep(currentStep);
}else if(currentStep === 1){
const {isValid, errorMessage} =validateCartBeforeSubmit();
if (!isValid) {
Swal.fire({
title: 'Perhatian!',
text: errorMessage,
icon: 'warning',
confirmButtonText: 'Oke'
})
return
}
let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}');
if (!checkout_biodata.nama_pemesan) {
Swal.fire({
title: 'Biodata Belum Terisi!',
text: 'Lakukan Pengisian biodata terlebih dahulu.',
icon: 'warning',
confirmButtonText: 'Oke'
})
return
}
let checkout_biodata = JSON.parse(sessionStorage.getItem('checkout_biodata') || '{}');
confirmButtonText: 'oke!',
}).then(() => {
window.location.href = "/checkout";
});
return
}
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
for (const item of cart) {
for (const p of item.pesanan) {
const result = validateTanggalPemesanan(item, p.tgl);
if (!checkout_biodata.nama_pemesan) {
Swal.fire({
title: 'Biodata Belum Terisi!',
text: 'Lakukan Pengisian biodata terlebih dahulu.',
icon: 'warning',
confirmButtonText: 'oke!',
}).then(() => {
window.location.href = "/checkout";
});
return
}
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
for (const item of cart) {
for (const p of item.pesanan) {
const result = validateTanggalPemesanan(item, p.tgl);
if (!result.valid) {
alert(result.message);
return; // hentikan di sini, tidak lanjut
if (!result.valid) {
alert(result.message);
return; // hentikan di sini, tidak lanjut
}
}
}
}
if (!sessionStorage.getItem('order_id')) {
await submitOrderToServer(); // async function simpan ke server
if (!sessionStorage.getItem('order_id')) {
await submitOrderToServer(); // async function simpan ke server
}
}
time_order = sessionStorage.getItem('time_order')
orderDate = new Date(time_order);
deadline = new Date(orderDate.getTime() + 10 * 60 * 1000)
updateCountdown()
currentStep++;
showStep(currentStep)
}else if(currentStep === 2){
renderCartSummary()
time_order = sessionStorage.getItem('time_order')
orderDate = new Date(time_order);
deadline = new Date(orderDate.getTime() + 10 * 60 * 1000)
updateCountdown()
currentStep++;
showStep(currentStep)
}else if(currentStep === 2){
renderCartSummary()
}
} catch (error) {
console.error(error);
Swal.fire('Error', 'Terjadi kesalahan, silakan coba lagi.', 'error');
}finally{
btnLoad.disabled = false;
btnLoad.innerHTML = 'Selanjutnya';
}
});
});
@ -313,9 +324,7 @@ function renderCartSummary() {
const disableSore = isToday && jam >= 13;
const countDate = pesananList.length;
if(checkout_biodata.jenis_customer === 'Karyawan RSAB Harapan Kita'){
$("#karywan").re
}
pesananHTML += `
<div class="rounded border p-3 mb-3 shadow-sm" data-item-id="${item.id}" data-index="${i}">
<div class="row g-3 align-items-center">
@ -335,11 +344,11 @@ function renderCartSummary() {
<!-- Karbohidrat -->
${item.apakah_someday ? `` : `
<div class="col-12 col-md-3">
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
<select class="form-select form-select-sm karbohidrat-input" onChange="onKarbohidratChange(${item.id}, ${i}, this, ${item.kalori})">
<option disabled selected>Pilih Karbohidrat</option>
${(karhohidrats || []).map(k => `
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''}>
${k.nama_karbohidrat} ${k.nilai_kalori ? `(${k.nilai_kalori} kkal)` : ''}
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''} data-kalori=${k.nilai_kalori}>
${k.nama_karbohidrat} ${k.nilai_kalori ? `(${k.nilai_kalori} kal)` : ''}
</option>
`).join('')}
</select>
@ -384,16 +393,16 @@ function renderCartSummary() {
<!-- Jumlah -->
<div class="col-6 col-md-2">
<div class="d-flex align-items-center justify-content-between">
<button class="btn btn-sm btn-outline-success" onclick="decrement(${item.id}, ${i})">
<i class="fa fa-minus"></i>
</button>
<input type="text" class="form-control form-control-sm text-center mx-2 jumlah-input"
value="${p.jumlah}" readonly style="width: 60px;" id="jumlah-${item.id}-${i}">
<button class="btn btn-sm btn-outline-success" onclick="increment(${item.id}, ${i})">
<i class="fa fa-plus"></i>
</button>
</div>
<div class="d-flex align-items-center justify-content-between">
<button class="btn btn-sm btn-outline-success" onclick="decrement(${item.id}, ${i})">
<i class="fa fa-minus"></i>
</button>
<input type="text" class="form-control form-control-sm text-center mx-2 jumlah-input"
value="${p.jumlah}" readonly style="width: 60px;" id="jumlah-${item.id}-${i}">
<button class="btn btn-sm btn-outline-success" onclick="increment(${item.id}, ${i})">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<!-- Tombol Hapus -->
@ -405,22 +414,25 @@ function renderCartSummary() {
: ''
}
</div>
</div>
${item.kalori
? `<div class="mb-2 small text-muted">Total Kalori: <strong id="kalori_${item.id}_${i}">${p?.resultKalori ? p?.resultKalori : item?.kalori}</strong> kal</div>`
: ''}
</div>
</div>
`;
});
const itemHTML = `
<div class="card mb-3 shadow-sm position-relative">
<div class="d-flex flex-column flex-md-row">
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2" onClick="removeCartItem(${item.id})" style="z-index:1;">
<button type="button" class="btn btn-sm btn-danger position-absolute top-0 end-0 m-2" onClick="removeCartItem(${item.id})" style="z-index:1;">
Hapus
</button>
<div class="d-flex flex-column flex-md-row">
<div class="p-2 d-flex justify-content-center align-items-center" style="flex: 0 0 300px;">
<img src="gambar/${item.foto || 'default.jpg'}" alt="${item.nama_menu}"
class="img-fluid rounded" style="max-height: 180px; width: 100%; object-fit: cover;">
class="img-fluid rounded" style="max-height: 280px; width: 100%; object-fit: cover;">
</div>
<div class="flex-grow-1 position-relative">
@ -437,12 +449,10 @@ function renderCartSummary() {
<div class="mb-2 small text-muted"><i class="fa fa-utensils me-1"></i>
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>`
: ''}
<div class="mb-2 small text-muted"><strong>Silahkan isi tanggal pemesanan, pilih karbohidrat dan catatan pemesanan (opsional) yang diinginkan</strong></div>
${pesananHTML}
ilahkan isi tanggal pemesanan, pilih karbohidrat dan catatan pemesanan (opsional) yang diinginkan
<div class="mt-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
<button class="btn btn-sm btn-outline-success"
onclick="addOrderDate(${item.id}, ${item.apakah_menu_sore})">
@ -489,15 +499,26 @@ function onTanggalChange(itemId, index) {
const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .tanggal-input`);
cart.find(item => item.id === itemId).pesanan[index].tgl = input.value;
sessionStorage.setItem('cart', JSON.stringify(cart));
renderCartSummary();
// renderCartSummary();
}
function onKarbohidratChange(itemId, index){
function onKarbohidratChange(itemId, index, el, kalori){
const selectedOption = el.options[el.selectedIndex];
const kaloriOption = parseInt(selectedOption.getAttribute('data-kalori')) || 0;
const kaloriMenuInt = kalori || 0;
const totalKalori = kaloriOption + kaloriMenuInt;
const kaloriEl = document.getElementById(`kalori_${itemId}_${index}`);
if (kaloriEl) {
kaloriEl.textContent = totalKalori ;
}
let cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
const input = document.querySelector(`div[data-item-id='${itemId}'][data-index='${index}'] .karbohidrat-input`);
cart.find(item => item.id === itemId).pesanan[index].karbohidrat_id = parseInt(input.value);
cart.find(item => item.id === itemId).pesanan[index].resultKalori = totalKalori;
sessionStorage.setItem('cart', JSON.stringify(cart));
renderCartSummary();
}
function onKategoriChange(itemId, index, isToday) {
@ -526,7 +547,7 @@ function onKategoriChange(itemId, index, isToday) {
if (item && item.pesanan && item.pesanan[index]) {
item.pesanan[index].kategoriPemesanan = kategori;
sessionStorage.setItem('cart', JSON.stringify(cart));
renderCartSummary();
// renderCartSummary();
}
}

View File

@ -10,12 +10,14 @@ function fetchDetailOrder(order_id){
<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">
<div class="${data?.jenis_customer === "MCU" ? 'd-none' : '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>
<div class="${data?.jenis_customer === "MCU" ?"col-md-12 p-2" : 'col-md-5 p-2'}">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || detail?.master_mcu?.nama_mcu}</strong></p>
<p class="mb-1">Jumlah: <span>${detail?.jumlah || 0}</span></p>
${detail?.total_kalori ? `<p class="mb-1">Total Kalori: <span>${detail?.total_kalori } kal</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:
@ -24,7 +26,7 @@ function fetchDetailOrder(order_id){
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
${detail?.catatan ? `<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>` : ''}
</div>
</div>
</div>
@ -69,12 +71,12 @@ function fetchDetailOrder(order_id){
<div class="mb-2">
<p class="mb-1">Alamat: <strong>${data.alamat || '-'}</strong></p>
</div>
` : `
` : data?.jenis_customer === 'Karyawan RSAB Harapan Kita' ?`
<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>
`
</div>
` : ''
}
<hr>

View File

@ -222,8 +222,9 @@ document.getElementById('formMasterMenu').addEventListener('submit', function(e)
const allFormSetsBeforSubmit = document.querySelectorAll('.form-set');
for (let i = 0; i < allFormSetsBeforSubmit.length; i++) {
const checkSiang = allFormSetsBeforSubmit[i].querySelector(`input[name="data[${i}][apakah_menu_siang]"]`);
const checkSore = allFormSetsBeforSubmit[i].querySelector(`input[name="data[${i}][apakah_menu_sore]"]`);
const checkSiang = allFormSetsBeforSubmit[i].querySelector(`input[name*="[apakah_menu_siang]"]`);
const checkSore = allFormSetsBeforSubmit[i].querySelector(`input[name*="[apakah_menu_sore]"]`);
if (!checkSiang?.checked && !checkSore?.checked) {
e.preventDefault();

View File

@ -91,7 +91,9 @@
},
{
title:"Nama Menu",
field:"nama_menu",
formatter:function(value, row){
return row?.kalori[0]?.nilai_kalori ? row?.nama_menu + ' ' + '(' + row?.kalori[0]?.nilai_kalori + ' kal)' : row?.nama_menu
},
width: 300
},
{

View File

@ -94,18 +94,6 @@ let orderIndex = 0;
$('#cartTotal').text('Rp ' + total.toLocaleString('id-ID'));
}
function renderCartTotalOnly() {
const cart = JSON.parse(sessionStorage.getItem('cart') || '[]');
let total = 0;

View File

@ -527,7 +527,6 @@
let namaMenu = $("#cathering_order_name").text();
console.log(cart);
let existingItem = cart.find(item => item.id_menu === idMenu);
if(!existingItem){

View File

@ -7,16 +7,21 @@ function detailOrder(id){
document.getElementById('pesanan_container').innerHTML = '';
document.getElementById('confirm_nama_pesanan').textContent = data?.order?.nama_pemesan;
let html = '';
console.log(data);
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: 320px; width: auto;">
<div class="${data?.order?.jenis_customer === "MCU" ? 'd-none' : 'col-md-5 d-flex align-items-center p-2'} ">
<img src="/gambar/${data?.menu?.foto || data?.master_mcu?.foto}" alt="Foto Menu" class="img-fluid rounded shadow m-auto" style="max-height: 320px; 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>
<div class="${data?.order?.jenis_customer === "MCU" ? 'col-md-12' : 'col-md-7 p-1'}">
<p class="mb-1">Nama Menu: <strong>${data?.menu?.nama_menu || data?.master_mcu?.nama_mcu}</strong></p>
<p class="mb-1">Tanggal Antar: <span>${data?.tgl_antar || 0}</span></p>
${data?.total_kalori ? `
<p class="mb-1">Total Kalori: <span>${data?.total_kalori} kal</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:
@ -24,7 +29,8 @@ function detailOrder(id){
${data?.status_order}
</span>
</p>
<p class="mb-1">Catatan: <strong>${data?.catatan || '-'}</strong></p>
${data?.order?.jenis_customer !== "MCU" ? `
<p class="mb-1">Catatan: <strong>${data?.catatan || '-'}</strong></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>
@ -36,12 +42,12 @@ function detailOrder(id){
` : 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>
` :`
` : data?.order?.jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? `
<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>
@ -63,8 +69,11 @@ function detailOrder(id){
function approve(e){
const data = $(e).data();
new bootstrap.Modal(modalActionOrder).show();
$("#confirmActionApproveOrder").text(data?.menu + ' (' + data?.type +')')
$("#confirmActionApproveOrder").text(
data?.menu + (!data?.type ? '' : ` (${data.type})`)
);
$("#confirmNoOrder").text(data?.no_order + ' (' + data?.nama_pemesan +')')
document.getElementById('formActionApproveOrder').setAttribute(`action`, `/dashboard/pending/update-detail-status/${data.id}`)
}

View File

@ -45,7 +45,7 @@
if(row?.status_order !== "Selesai"){
buttons += `
<button class="btn btn-sm btn-success me-2" onclick="approve(this)" data-id="${row.order_detail_id}" data-nama_pemesan="${row?.order?.nama_pemesan}" data-no_order="${row?.order?.no_order}" data-menu="${row?.menu?.nama_menu || row?.paket_menu?.nama_paket}" data-jenis_customer="${row?.order?.jenis_customer}" data-type="${row?.type}">
<button class="btn btn-sm btn-success me-2" onclick="approve(this)" data-id="${row.order_detail_id}" data-nama_pemesan="${row?.order?.nama_pemesan}" data-no_order="${row?.order?.no_order}" data-menu="${row?.menu?.nama_menu || row?.master_mcu?.nama_mcu}" data-jenis_customer="${row?.order?.jenis_customer}" data-type="${row?.type}">
<i class="fa fa-check me-1"></i>
</button>
`
@ -92,7 +92,7 @@
title: "Menu",
field: 'order_detail_id',
formatter:function(value, row){
return row?.menu?.nama_menu || row?.paket_menu?.nama_paket
return row?.menu?.nama_menu || row?.master_mcu?.nama_mcu
},
sortable: true,
},
@ -108,6 +108,12 @@
},
sortable: true,
},
{
title:"Total Kalori",
formatter: function(value, row){
return row?.total_kalori ? row?.total_kalori + ' kal' : '-';
}
},
{
title: "Pemesan",
field:'order.nama_pemesan',
@ -125,8 +131,12 @@
},
{
title: "Waktu Pemesanan",
field: 'type',
title: "Waktu Pengantaran",
formatter: function(value, row){
if(row?.order?.jenis_customer === 'MCU')return row.jam_layanan.slice(0, 5);
return row?.type
},
sortable: true,
},
{
@ -170,5 +180,6 @@
function labelDownload(){
const selected = (typeof getSelectedRowsForLabel === 'function') ? getSelectedRowsForLabel() : [];
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');
window.open(`/dashboard/pekerjaan/label?data=${order_detail_ids}`, '_blank');
// window.open(`https://smart.rsabhk.co.id:2222/service-reporting/label-cetering/${order_detail_ids}`, '_blank');
}

View File

@ -49,6 +49,7 @@ document.getElementById('formActionOrder').addEventListener('submit', function (
});
getReminderKonfirmasiPesanan()
getReminderVerifikasiMakanan()
getReminderVerifikasiMakananOffCanvas()
datatablePending.bootstrapTable('refresh');
modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM
};
@ -95,7 +96,7 @@ function AdminApproved(e){
$("#billingOrder").addClass('d-none')
}
$("#confirmActionApproveBillingOrder").text('Pembayaran Via Billing '+ data.nama_pemesan + ' / ' + data.no_order)
$("#confirmActionApproveBillingOrder").text('Pembayaran Via' + data.billing === "true" ? ' Billing ' : ' MCU '+ data.nama_pemesan + ' / ' + data.no_order)
formActionApproveBillingOrder.attr(`action`, `/dashboard/pending/action-billing/${data.order_id}`)
}

View File

@ -88,7 +88,9 @@
},
{
title: "Cara Pembayaran",
field: 'cara_pembayaran',
formatter: function(value, row){
return row?.cara_pembayaran || 'MCU'
},
sortable: true,
},
{
@ -167,6 +169,7 @@
{
title: "Tgl Pemesanan",
formatter: function(value, row) {
if (!row?.entry_at) return '-';
const date = new Date(row.entry_at);
return date.toLocaleString('id-ID', {

View File

@ -119,7 +119,8 @@ function toggleLabelButton(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');
window.open(`/dashboard/pekerjaan/label?data=${ids}`, '_blank');
// window.open(`https://smart.rsabhk.co.id:2222/service-reporting/label-cetering/${ids}`, '_blank');
}
// Table Columns
@ -142,7 +143,7 @@ function getTableColumns() {
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-menu="${r?.menu?.nama_menu || r?.master_mcu?.nama_mcu}"
data-jenis_customer="${r?.order?.jenis_customer}"
data-type="${r?.type}">
<i class="fa fa-check me-1"></i>
@ -164,7 +165,7 @@ function getTableColumns() {
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: "Menu", formatter: (v, r) => r?.menu?.nama_menu || r?.master_mcu?.nama_mcu, sortable: true },
{
title: "Karbohidrat",
formatter: (v, r) => {
@ -175,6 +176,14 @@ function getTableColumns() {
},
sortable: true,
},
{
title:"Total Kalori",
formatter: function(value, row){
return row?.total_kalori ? row?.total_kalori + ' kal' : '-'
}
},
{
title: "Pemesan",
formatter: (v, r) => `
@ -184,7 +193,12 @@ function getTableColumns() {
</ul>`
},
{ title: "Tgl Antar", field: 'tgl_antar' },
{ title: "Waktu Pemesanan", field: 'type', sortable: true },
{ title: "Waktu Pengantaran",
formatter: function(value, row){
if(row?.order?.jenis_customer === 'MCU')return row.jam_layanan.slice(0, 5);
return row?.type
},
sortable: true },
{ title: "Catatan", field: 'catatan', sortable: true },
];
}
@ -205,20 +219,22 @@ function detailOrder(id){
<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 class="${data?.order?.jenis_customer === "MCU" ? 'd-none' : 'col-md-5 d-flex align-items-center p-2'} ">
<img src="/gambar/${data?.menu?.foto}" alt="Foto Menu" class="img-fluid rounded shadow m-auto" style="max-height: 240px; width: 220px;">
</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>
<div class="${data?.order?.jenis_customer === "MCU" ? 'col-md-12' : 'col-md-7 p-1'}">
<p class="mb-1">Nama Menu: <strong>${data?.menu?.nama_menu || data?.master_mcu?.nama_mcu}</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>
${data?.total_kalori ? `<p class="mb-1">Total Kalori: <span>${data?.total_kalori || 0} kal</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>
<p class="mb-1">Catatan: <strong>${data?.catatan || '-'}</strong></p>
${data?.order?.jenis_customer === 'MCU' ? '' : `
<p class="mb-1">Catatan: <strong>${data?.catatan || '-'}</strong></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>
@ -228,12 +244,12 @@ function detailOrder(id){
` : 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>
` :`
` : data?.order?.jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? `
<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>
@ -267,7 +283,7 @@ function approve(e){
offcanvas.hide();
const data = $(e).data();
new bootstrap.Modal(modalActionOrderPekerjaan).show();
$("#confirmActionApproveOrder").text(data?.menu + ' (' + data?.type +')')
$("#confirmActionApproveOrder").text(data?.menu + (!data?.type ? '' : `(${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', () => {

View File

@ -10,11 +10,11 @@ function fetchDetailOrder(order_id){
<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 class="${data?.jenis_customer === "MCU" ? 'd-none' : '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: 240px;">
</div>
<div class="col-md-5 p-2">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
<div class="${data?.jenis_customer === "MCU" ? 'col-md-12' : 'col-md-5 p-2'}">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || detail?.master_mcu?.nama_mcu}</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>
@ -24,7 +24,8 @@ function fetchDetailOrder(order_id){
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
${detail?.catatan ? ` <p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>` : ''}
</div>
</div>
</div>
@ -69,12 +70,12 @@ function fetchDetailOrder(order_id){
<p class="mb-1">Bagian / Instalasi: <strong>${data?.bagian_instalasi || '-'}</strong></p>
<p class="mb-1">No Ekstensien: <strong>${data?.no_ekstensien || '-'}</strong></p>
`
: `
: data?.jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? `
<p class="mb-1">Nama Pasien: <strong>${data?.nama_pasien || '-'}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong>${data?.ruang_perawatan || '-'}</strong></p>
<p class="mb-1">Nomor Kamar Perawatan: <strong>${data?.no_kamar_perawatan || '-'}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong>${data?.kelas_perawatan || '-'}</strong></p>
`
` :''
}
<hr>

View File

@ -6,17 +6,21 @@ function fetchDetailOrder(order_id){
document.getElementById('pesanan_container').innerHTML =''
// Generate HTML untuk order_detail
const detailHTML = (data?.order_detail || []).map(detail => {
const kalori = detail?.total_kalori ? `
<p class="mb-1">Total Kalori: <span>${detail?.total_kalori || 0} kal</span></p>`
: '';
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 class="${data?.jenis_customer === "MCU" ? 'd-none' : '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: 240px;">
</div>
<div class="col-md-5 p-2">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || '-'}</strong></p>
<div class="${data?.jenis_customer === "MCU" ? 'col-md-12' : 'col-md-5 p-2'} ">
<p class="mb-1">Nama Menu: <strong>${detail?.menu?.nama_menu || detail?.master_mcu?.nama_mcu}</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>
${kalori}
<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'}"
@ -24,14 +28,15 @@ function fetchDetailOrder(order_id){
${detail?.status_order}
</span>
</p>
<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>
${detail?.catatan ? `<p class="mb-1">Catatan : <span>${detail?.catatan || '-'}</span></p>` : ''}
</div>
</div>
</div>
</div>
`;
}).join('');
const html = `
<div class="row mt-4">
@ -70,16 +75,16 @@ function fetchDetailOrder(order_id){
<p class="mb-1">Bagian / Instalasi: <strong>${data?.bagian_instalasi || '-'}</strong></p>
<p class="mb-1">No Ekstensien: <strong>${data?.no_ekstensien || '-'}</strong></p>
`
: `
: data?.jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? `
<p class="mb-1">Nama Pasien: <strong>${data?.nama_pasien || '-'}</strong></p>
<p class="mb-1">Ruang Perawatan: <strong>${data?.ruang_perawatan || '-'}</strong></p>
<p class="mb-1">Nomor Kamar Perawatan: <strong>${data?.no_kamar_perawatan || '-'}</strong></p>
<p class="mb-1">Kelas Perawatan: <strong>${data?.kelas_perawatan || '-'}</strong></p>
`
` : ''
}
<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>

View File

@ -68,7 +68,9 @@
},
{
title: "Cara Pembayaran",
field: 'cara_pembayaran',
formatter: function(value, row){
return row?.cara_pembayaran || 'MCU'
},
sortable: true,
},
{

View File

@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Label {{ $label?->order?->no_order ?? '-' }}</title>
<style>
@page {
size: 80mm 130mm landscape;
margin: 2mm 1.5mm 2mm 1.5mm;
}
body {
font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
font-size: 7.5px;
line-height: 1.1;
margin: 0;
color: #000;
margin-left: 22px;
}
.logo {
display: block;
width: 115px;
height: 35px;
margin-top: 15px;
margin-left: 13px;
}
.title {
text-align: center;
font-weight: bold;
font-size: 14px;
margin-top: -32px;
margin-left:21px;
}
.order {
position: absolute;
font-size: 9.5px;
margin-left: 140px;
margin-top: -12px !important;
margin-bottom: 5px;
}
.info {
margin-top:10px;
margin-left: 30px !important;
justify-content: center;
width: 100%;
border-collapse: collapse;
}
.info td {
padding: 2px 5px;
vertical-align: top;
font-size: 10px;
}
.info td:first-child {
width: 30%;
font-weight: bold;
}
.footer {
margin-top: 10px;
text-align: center;
}
.footer-content {
display: flex;
align-items: center;
justify-content: center;
gap: 8px; /* jarak antar elemen */
}
.footer-logo {
height: 45px; /* samakan tinggi logo */
}
.footer-text {
font-size: 12px;
font-weight: bold;
}
</style>
</head>
<body>
<img src="{{ public_path('logo/logo_rsabhk.png') }}" class="logo">
<div class="title">CATERING RSAB HARAPAN KITA</div>
<div class="order">No Order : {{ $label?->order?->no_order ?? 'xxxxxx' }}</div>
<table class="info">
<tr><td>Nama Pemesan {{ $label?->order?->jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? '/ Pasien' : ''}}</td><td>: {{ $label?->order?->nama_pemesan }} {{ $label?->order?->jenis_customer === "Keluarga Pasien / Penunggu Pasien" ? '/ ' . $label?->order?->nama_pasien : ''}}</td></tr>
@if($label?->order?->jenis_customer === "Keluarga Pasien / Penunggu Pasien")
<tr><td>Ruang Perawatan/No Kamar</td><td>: {{ $label?->order?->kelas_perawatan ?? '-'}} / {{ $label?->order?->no_kamar_perawatan ?? '-'}} </td></tr>
@elseif($label?->order?->jenis_customer === "Karyawan RSAB Harapan Kita")
<tr><td>Bagian/No Ekstensien </td><td>: {{ $label?->order?->bagian_instalasi ?? '-'}} / {{ $label?->order?->no_ekstensien ?? '-'}} </td></tr>
@endif
<tr><td>Pesanan</td>
<td>
<span style="vertical-align: top;">:</span>
<span style="max-width: 54mm; word-wrap: break-word; white-space: normal; display: inline-block; vertical-align: top;">
{{ $label?->masterMcu?->nama_mcu ?? $label?->menu?->nama_menu }}
</span>
</td></tr>
<tr><td>Total Kalori</td><td>: {{ isset($label->total_kalori) ? $label->total_kalori . ' kal' : '-' }}</td></tr>
<tr><td>Harga Satuan</td><td>: Rp {{ number_format($label?->harga_satuan, 0, ',', '.') }}</td></tr>
<tr><td>Tanggal Produksi</td><td>: {{ $label?->tgl_antar ? \Carbon\Carbon::parse($label->tgl_antar)->translatedFormat('d F Y') : '-' }} </td></tr>
<tr><td>No. Telp</td><td>: {{ $label?->order?->no_wa ?? '-' }}</td></tr>
@if ($label?->order?->alamat)
<tr>
<td style="vertical-align: top;">Alamat</td>
<td><span style="vertical-align: top;">:</span>
<span style="max-width: 54mm; word-wrap: break-word; white-space: normal; display: inline-block; vertical-align: top;">
{{ $label?->order?->alamat }}
</span>
</td>
</tr>
@endif
</table>
<div class="footer">
<div class="footer-content">
<img src="{{ public_path('logo/halal_gizi.png') }}" alt="Halal" style="height: 52px; margin-top:12px;">
<span class="footer-text">SELAMAT MENIKMATI</span>
<img src="{{ public_path('logo/iso_gizi.png') }}" alt="ISO 22000" class="footer-logo">
</div>
</div>
<style>
</style>
</body>
</html>

View File

@ -0,0 +1,5 @@
@foreach ($orderDetail as $label)
<div @if (!$loop->last) style="page-break-after: always;" @endif>
@include('dashboard.label.index', ['label' => $label])
</div>
@endforeach

View File

@ -41,7 +41,7 @@
<!-- fontawosome CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" integrity="sha512-Evv84Mr4kqVGRNSgIGL/F/aIDqQb7xQ2vcrdIwxfjThSH8CSR7PBEakCr51Ck+w+/U6swU2Im1vVX0SVk9ABhg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="{{ ver('/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css') }}../" />
{{-- flatcpicker css --}}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>

View File

@ -33,6 +33,7 @@
<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>
<option value="MCU">MCU</option>
</select>
</div>
</div>

View File

@ -114,7 +114,7 @@
<th style="width:9%;">Jumlah</th>
<th style="width:9%; text-align:center;">Harga Satuan (Rp)</th>
<th>Tanggal Antar</th>
<th>Waktu Makan</th>
<th>Waktu Makan <br/> /Jam Layanan</th>
</tr>
</thead>
<tbody>
@ -133,7 +133,7 @@
@endif
@endif
</td>
<td>{{ $detail->menu->nama_menu ?? '-' }}</td>
<td>{{ $detail->menu->nama_menu ?? $detail?->masterMcu?->nama_mcu }}</td>
<td>{{ $detail->status_order ?? '-' }}</td>
<td style="text-align: center;">{{ $detail->jumlah }}</td>
<td style="text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
@ -142,7 +142,7 @@
? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y')
: '-' }}
</td>
<td style="text-align: center;">{{ $detail->type }}</td>
<td style="text-align: center;">{{ $detail->type ?? substr($detail->jam_layanan, 0, 5) }}</td>
</tr>
@endforeach
@empty

View File

@ -4,11 +4,12 @@
<meta charset="UTF-8">
<title>Daftar Pesanan</title>
<style>
body {
font-family: Arial, sans-serif;
font-size: 10.5px;
line-height: 1.5;
margin: 20px;
margin: 25px;
color: #333;
}
@ -51,7 +52,7 @@
th, td {
border: 1px solid #bbb;
padding: 6px 8px;
padding: 3px 5px;
}
th {
@ -65,11 +66,11 @@
}
th:nth-child(7), td:nth-child(7) {
width: 15%; /* buat lebih panjang dari kolom lain */
width: 10%; /* buat lebih panjang dari kolom lain */
}
th:nth-child(4), td:nth-child(4) {
width: 60px;
width: 10px;
text-align: center;
}
@ -118,13 +119,14 @@
<table>
<thead>
<tr>
<th>No</th>
<th style="width: 5%;">No</th>
<th>Nama Pemesan</th>
<th>Status Order</th>
<th>Tanggal Antar</th>
<th>Waktu Makan</th>
<th>Waktu Makan <br/> /Jam Layanan</th>
<th>Menu</th>
<th>Karbohidrat</th>
<th>Total Kalori</th>
<th>Keterangan</th>
<th>Jumlah</th>
<th>Harga Satuan (Rp)</th>
@ -133,7 +135,7 @@
<tbody>
@forelse ($pekerjaan as $i => $row)
<tr>
<td>{{ $i + 1 }}</td>
<td style="width: 5%;">{{ $i + 1 }}</td>
<td>
{{ $row['order']['nama_pemesan'] ?? '-' }}
@if (!empty($row['order']['jenis_customer']))
@ -146,15 +148,16 @@
? \Carbon\Carbon::parse($row['tgl_antar'])->locale('id')->translatedFormat('d F Y')
: '-' }}
</td>
<td>{{ $row['type'] ?? '-' }}</td>
<td>{{ $row['menu']['nama_menu'] ?? '-' }}</td>
<td>{{ $row['type'] ?? substr($row['jam_layanan'], 0, 5) }}</td>
<td>{{ $row['masterMcu']['nama_mcu'] ?? $row['menu']['nama_menu'] ?? '-' }}</td>
<td>
@if($row['karbohidrat'])
{{ $row['karbohidrat']['nama_karbohidrat'] }} ({{ $row['karbohidrat']['nilai_kalori'] ? $row['karbohidrat']['nilai_kalori'] . ' kkal' : '-' }})
{{ $row['karbohidrat']['nama_karbohidrat'] }} ({{ $row['karbohidrat']['nilai_kalori'] ? $row['karbohidrat']['nilai_kalori'] . ' kkal' : '-' }})
@else
-
-
@endif
</td>
<td>{{ $row['total_kalori'] ? $row['total_kalori'] . ' kal' : '' }}</td>
<td class="keterangan">
@php
$jenis = strtolower($row['order']['jenis_customer'] ?? '');

View File

@ -112,9 +112,10 @@
<th>Menu</th>
<th>Status Order</th>
<th style="width:9%;">Jumlah</th>
<th style="width:9%;">Total Kalori</th>
<th style="width:9%; text-align:center;">Harga Satuan (Rp)</th>
<th>Tanggal Antar</th>
<th>Waktu Makan</th>
<th>Waktu Makan <br/> /Jam Layanan</th>
</tr>
</thead>
<tbody>
@ -133,16 +134,19 @@
@endif
@endif
</td>
<td>{{ $detail->menu->nama_menu ?? '-' }}</td>
<td>{{ $detail->menu->nama_menu ?? $detail?->masterMcu?->nama_mcu }}</td>
<td>{{ $detail->status_order ?? '-' }}</td>
<td style="text-align: center;">{{ $detail->jumlah }}</td>
<td style="text-align: center;">{{ $detail->total_kalori ? $detail->total_kalori . ' kal' : '-' }}</td>
<td style="text-align: right;">{{ number_format($detail->harga_satuan, 0, ',', '.') }}</td>
<td style="text-align: center;">
{{ $detail->tgl_antar
? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y')
: '-' }}
: '-'}}
</td>
<td style="text-align: center;">
{{ $detail->type ?? (isset($detail->jam_layanan) ? substr($detail->jam_layanan, 0, 5) : '-') }}
</td>
<td style="text-align: center;">{{ $detail->type }}</td>
</tr>
@endforeach
@empty

View File

@ -73,17 +73,19 @@
const harga = parseInt(item.harga_satuan);
const jumlah = parseInt(item.jumlah);
const total = harga * jumlah;
console.log(item);
itemHTML += `
<div class="card mb-2 shadow-sm">
<div class="row g-0">
<div class="col-md-4 p-2">
<div class="${data?.cara_pembayaran === "MCU" ? 'd-none' : 'col-md-4 p-2'}">
<img src="/gambar/${item.foto || 'default.jpg'}" class="img-fluid rounded-start" alt="${item.nama_item}" style="max-height: 150px; width:100%; object-fit: cover;">
</div>
<div class="col-md-8">
<div class="${data?.cara_pembayaran === "MCU" ? 'col-md-12' : 'col-md-8'}">
<div class="card-body py-2 px-3 mt-2">
<h6 class="card-title mb-1">${item.nama_item}</h6>
<p class="mb-1 small text-muted">Tgl Antar: <strong>${item.tgl_antar}</strong></p>
${item?.total_kalori ? `
<p class="mb-1 small text-muted">Total Kalori: <strong>${item?.total_kalori || '-'} kal</strong></p>
` : ''}
<p class="mb-1 small">Harga: <strong>${harga.toLocaleString('id-ID')}</strong></p>
<p class="mb-1 small">Jumlah: <strong>${jumlah}</strong></p>
<p class="mb-0 small">Total: <strong class="text-success">Rp ${total.toLocaleString('id-ID')}</strong></p>
@ -92,7 +94,8 @@
: data.status_order === 'Belum Bayar' ? '' : 'bg-success'}">
${item?.status_order}
</p>
<p class="mb-1 small">Catatan: <strong>${item?.catatan || '-'}</strong></p>
${data?.cara_pembayaran === "MCU" ? '' : `
<p class="mb-1 small">Catatan: <strong>${item?.catatan || '-'}</strong></p>`}
</div>
</div>
</div>
@ -202,7 +205,7 @@
</div>
` :`
<div class="text-center mb-4">
<button class="btn btn-success fw-bold">Pembayaran VIA Billing</button>
<button class="btn btn-success fw-bold">Pembayaran VIA ${data?.cara_pembayaran === "MCU" ? 'MCU' : 'Billing'}</button>
</div>
`}
<div class="text-center">

View File

@ -23,15 +23,15 @@
<div class="col-12 mb-2">
<h6 class="fw-bold text-muted mb-1">
Pilih Tanggal Makanan
<a tabindex="0" class="ms-1 text-decoration-none" role="button" data-bs-toggle="popover" data-bs-trigger="focus"
<a tabindex="0" class="text-decoration-none" role="button" data-bs-toggle="popover" data-bs-trigger="focus"
title="Panduan"
data-bs-content="Pilih rentang tanggal untuk melihat daftar menu yang tersedia pada tanggal tersebut.">
<i class="fa fa-info-circle text-secondary"></i>
</a>
</h6>
<div class="input-group input-group-sm mb-2" style="max-width: 350px;">
<span class="input-group-text bg-white px-2">
<div class="input-group input-group-sm mb-2" style="max-width: 450px;">
<span class="input-group-text bg-white px-1">
<i class="fa fa-calendar-alt text-primary"></i>
</span>
@ -124,7 +124,7 @@
<div class="fw-bold mb-2">
<i class="fa fa-info-circle me-1"></i>Informasi
</div>
<ul class="mb-0 ps-3">
<ul class="mb-0 ps-3 pe-3">
<li>
Butuh bantuan? Hubungi WhatsApp <strong>Instalasi Gizi</strong>:
<a href="https://wa.me/08815611382 " target="_blank">08815611382 </a> <br>

View File

@ -6,7 +6,7 @@
<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="/logo/logo_rsabhk.png" width="170" alt="Logo RSAB HARAPAN KITA" class="logo-img">
<img src="/logo/logo_rsabhk.png" alt="Logo RSAB HARAPAN KITA" class="logo-img">
<h1 class="sitename"></h1>
</a>

View File

@ -11,11 +11,11 @@ use App\Http\Controllers\MasterMcuController;
use App\Http\Controllers\MenuController;
use App\Http\Controllers\PesananController;
use App\Mail\NotifikasiCustomer;
use Barryvdh\DomPDF\Facade\Pdf;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Route;
// Route::get('/blank', function () {
// return view('layouts.blank');
// });
@ -80,12 +80,12 @@ Route::group(['middleware' => ['auth']], function(){
Route::get('datatable/pekerjaan', [PesananController::class, 'getPekerjaan']);
Route::post('pekerjaan/export', [PesananController::class, 'exportPekerjaan']);
Route::get('/pekerjaan/detail/{id}', [PesananController::class, 'getPekerjaanDetail']);
Route::post('/pekerjaan/label', [PesananController::class, 'downloadLabel']);
Route::get('/pekerjaan/label', [PesananController::class, 'downloadLabel']);
});
Route::post('/logout', [AuthController::class, 'logout']);
});
// LAPORAN LABEL + SAMA PERHITUNGAN KALORI belum selesai
Route::get('/', [CustomerController::class, 'index']);
Route::get('/checkout', [CustomerController::class, 'checkout']);
@ -106,3 +106,8 @@ Route::get('/success-mcu', [CustomerController::class, 'successMcu']);
Route::get('/dumy', function(){
return view('guest.layout_mail');
});
Route::get('/label', function(){
$pdf = Pdf::loadView('dashboard.label.index');
return $pdf->stream('label_.pdf');
});