Compare commits
1 Commits
production
...
real_time
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ba0935880 |
28
app/Events/MessageSent.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
namespace App\Events;
|
||||
|
||||
use Illuminate\Broadcasting\Channel;
|
||||
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class MessageSent implements ShouldBroadcast
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public $message;
|
||||
|
||||
public function __construct($message)
|
||||
{
|
||||
$this->message = $message;
|
||||
}
|
||||
|
||||
public function broadcastOn()
|
||||
{
|
||||
return new Channel('test');
|
||||
}
|
||||
|
||||
public function broadcastAs()
|
||||
{
|
||||
return 'MessageSent';
|
||||
}
|
||||
}
|
||||
@ -155,7 +155,6 @@ class CustomerController extends Controller
|
||||
return [
|
||||
'master_menu_id' => $menu->master_menu_id,
|
||||
'nama' => $menu->nama_menu,
|
||||
'exist_foto' => file_exists(public_path('gambar/' . $menu->foto)) ? true : false,
|
||||
'foto' => $menu->foto,
|
||||
'jenis_menu' => $menu->jenis_menu,
|
||||
'harga_public' => $menu->harga_public,
|
||||
@ -188,7 +187,7 @@ class CustomerController extends Controller
|
||||
|
||||
// Urutkan: someday → tgl_harian terdekat
|
||||
$sorted = $enriched->sortBy(function ($menu) {
|
||||
$besok = now()->addDay()->day;
|
||||
$hariIni = now()->day;
|
||||
$isSomeday = $menu['apakah_someday'] ? 0 : 1;
|
||||
|
||||
if ($menu['apakah_someday']) {
|
||||
@ -196,11 +195,8 @@ class CustomerController extends Controller
|
||||
}
|
||||
|
||||
$tglTerdekat = collect($menu['dmph'])->pluck('tgl_harian')
|
||||
->map(function ($tgl) use ($besok) {
|
||||
if ($tgl == $besok) {
|
||||
return 0; // Besok paling awal
|
||||
}
|
||||
return $tgl > $besok ? $tgl : $tgl + 31;
|
||||
->map(function ($tgl) use ($hariIni) {
|
||||
return $tgl >= $hariIni ? $tgl : $tgl + 31;
|
||||
})
|
||||
->sort()
|
||||
->first() ?? 99;
|
||||
@ -289,7 +285,7 @@ class CustomerController extends Controller
|
||||
'entry_at' => Carbon::now()->format('Y-m-d H:i:s.u'),
|
||||
];
|
||||
if($jenisCustomer === "Karyawan RSAB Harapan Kita"){
|
||||
$nip_pns = Karyawan::where('namalengkap',$biodataResult['nama_pemesan'])->first()?->nip_pns;
|
||||
$nip_pns = Karyawan::where('namalengkap',$biodataResult['nama_pemesan'])->first()->nip_pns;
|
||||
$payloadOrder['nip'] = $nip_pns ?? null;
|
||||
$payloadOrder['bagian_instalasi'] = $biodataResult['bagian_instalasi'] ?? null;
|
||||
$payloadOrder['no_ekstensien'] = $biodataResult['no_ekstensien'] ?? null;
|
||||
@ -321,12 +317,7 @@ class CustomerController extends Controller
|
||||
}
|
||||
//code...
|
||||
if($order->email){
|
||||
try {
|
||||
Mail::to($order->email)->send(new NotifikasiCustomer($order->nama_pemesan, $order->no_order, $order->total_harga));
|
||||
} catch (\Throwable $th) {
|
||||
//throw $th;
|
||||
}
|
||||
|
||||
Mail::to($order->email)->send(new NotifikasiCustomer($order->nama_pemesan, $order->no_order, $order->total_harga));
|
||||
}
|
||||
DB::connection('dbOrderGizi')->commit();
|
||||
return response()->json([
|
||||
@ -384,22 +375,13 @@ class CustomerController extends Controller
|
||||
$order->update($payload);
|
||||
|
||||
if($order->email){
|
||||
try {
|
||||
Mail::to($order->email)->send(
|
||||
new NotifikasiPembayaran($order->nama_pemesan, $order->no_order)
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
// log error biar bisa ditelusuri nanti
|
||||
// \Log::error('Gagal mengirim email ke ' . $order->email . ': ' . $e->getMessage());
|
||||
// continue tanpa break flow
|
||||
}
|
||||
Mail::to($order->email)->send(new NotifikasiPembayaran($order->nama_pemesan, $order->no_order));
|
||||
}
|
||||
DB::connection('dbOrderGizi')->commit();
|
||||
session()->flash('payment_success', true);
|
||||
session()->flash('no_order', $noOrder);
|
||||
return response([
|
||||
'status' => true,
|
||||
'no_order' => $noOrder,
|
||||
'message' => 'Terima kasih atas pesanan Anda. Mohon tunggu, kami sedang memprosesnya'
|
||||
], 200);
|
||||
return back()->with('success', 'Bukti pembayaran berhasil diunggah.');
|
||||
@ -450,8 +432,6 @@ class CustomerController extends Controller
|
||||
'od.status_order as status_order_detail',
|
||||
'od.catatan',
|
||||
'od.total_kalori',
|
||||
'od.type',
|
||||
'od.jam_layanan',
|
||||
DB::raw('COALESCE(mm.nama_menu, mcu.nama_mcu) as nama_item'),
|
||||
'mm.foto as foto'
|
||||
)
|
||||
@ -494,15 +474,12 @@ class CustomerController extends Controller
|
||||
'order_detail_id' => $item->order_detail_id,
|
||||
'nama_item' => $item->nama_item,
|
||||
'tgl_antar' => $item->tgl_antar,
|
||||
'exist_foto' => file_exists(public_path('gambar/' . $item->foto)) ? true : false,
|
||||
'foto' => $item->foto,
|
||||
'jumlah' => $item->jumlah,
|
||||
'harga_satuan' => $item->harga_satuan,
|
||||
'status_order' => $item->status_order_detail,
|
||||
'catatan' => $item->catatan ?? '-',
|
||||
'total_kalori' => $item->total_kalori,
|
||||
'type' => $item->type,
|
||||
'jam_layanan' => $item->jam_layanan,
|
||||
'total_kalori' => $item->total_kalori
|
||||
// tambahkan field tambahan jika diperlukan
|
||||
];
|
||||
})->values(),
|
||||
|
||||
@ -38,7 +38,7 @@ class PesananController extends Controller
|
||||
$tanggalFormatted = [Carbon::now()->toDateString()];
|
||||
}
|
||||
|
||||
$dataPending = Order::where('statusenabled', true)->whereIn('status_order', [
|
||||
$dataPending = Order::whereIn('status_order', [
|
||||
'Menunggu Konfirmasi Pembayaran',
|
||||
'Menunggu Konfirmasi Pembayaran Via Billing',
|
||||
'Menunggu Konfirmasi Pesanan MCU'
|
||||
@ -121,13 +121,8 @@ class PesananController extends Controller
|
||||
}
|
||||
$order->update($payload);
|
||||
|
||||
if($order->email && $order->status_order === "Lunas"){
|
||||
try {
|
||||
//code...
|
||||
Mail::to($order->email)->send(new NotifikasiKonfirmasiPembayaran($order->nama_pemesan, $order->no_order, $order->total_harga));
|
||||
} catch (\Throwable $th) {
|
||||
//throw $th;
|
||||
}
|
||||
if($order->email){
|
||||
Mail::to($order->email)->send(new NotifikasiKonfirmasiPembayaran($order->nama_pemesan, $order->no_order, $order->total_harga));
|
||||
}
|
||||
|
||||
DB::connection('dbOrderGizi')->commit();
|
||||
@ -200,7 +195,6 @@ class PesananController extends Controller
|
||||
|
||||
public function dataPending(){
|
||||
$data = Order::selectRaw('DATE(entry_at) as tgl, COUNT(*) as total')
|
||||
->where('statusenabled', true)
|
||||
->whereIn('status_order', [
|
||||
'Menunggu Konfirmasi Pembayaran',
|
||||
'Menunggu Konfirmasi Pembayaran Via Billing',
|
||||
@ -399,18 +393,18 @@ class PesananController extends Controller
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$sheet->setCellValue('A1', "Menu Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
|
||||
$sheet->mergeCells('A1:P1');
|
||||
$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:P2');
|
||||
$sheet->mergeCells('A2:L2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
|
||||
|
||||
// Header tabel
|
||||
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Pembayaran", "Jenis Customer", "Ruangan", "Status Pesanan", "Jenis Menu", "Menu Pesanan", "Karbohidrat", "Total Kalori (kal)", "Jumlah", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Harga Total", "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:P4')->applyFromArray([
|
||||
$sheet->getStyle('A4:L4')->applyFromArray([
|
||||
'font' => ['bold' => true],
|
||||
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
|
||||
'borders' => [
|
||||
@ -419,58 +413,37 @@ 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: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;
|
||||
$totalPendapatan = 0;
|
||||
foreach ($orderDetail as $index => $item) {
|
||||
$sheet->setCellValue("A{$row}", $index + 1);
|
||||
$sheet->setCellValue("B{$row}", $item?->order?->no_order);
|
||||
$sheet->setCellValue("C{$row}", $item?->order?->nama_pemesan);
|
||||
$sheet->setCellValue("D{$row}", $item?->order?->cara_pembayaran);
|
||||
$sheet->setCellValue("E{$row}", $item?->order?->jenis_customer === "MCU" ? $item?->order?->nama_institusi . '- MCU' : $item?->order?->jenis_customer);
|
||||
if($item->order?->jenis_customer === "Keluarga Pasien / Penunggu Pasien"){
|
||||
$sheet->setCellValue("F{$row}", $item?->order?->kelas_perawatan . '/' . $item?->order?->no_kamar_perawatan . '/' . $item?->order?->ruang_perawatan);
|
||||
}else if($item->order?->jenis_customer === "Karyawan RSAB Harapan Kita"){
|
||||
$sheet->setCellValue("F{$row}", $item?->order?->bagian_instalasi ?? '-');
|
||||
}else{
|
||||
$sheet->setCellValue("F{$row}", '-');
|
||||
}
|
||||
$sheet->setCellValue("G{$row}", $item?->status_order ?? "-");
|
||||
if($item->menu?->masterMcu){
|
||||
$sheet->setCellValue("H{$row}", 'Menu MCU');
|
||||
}else{
|
||||
$sheet->setCellValue("H{$row}", $item?->menu?->apakah_someday ? "Menu Sameday" : "Menu Normal");
|
||||
}
|
||||
$sheet->setCellValue("I{$row}", $item?->menu?->nama_menu ?? $item?->masterMcu?->nama_mcu);
|
||||
$sheet->setCellValue("D{$row}", $item?->order?->jenis_customer === "MCU" ? $item?->order?->nama_institusi . '- MCU' : $item?->order?->jenis_customer);
|
||||
$sheet->setCellValue("E{$row}", $item?->status_order ?? "-");
|
||||
$sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? $item?->masterMcu?->nama_mcu);
|
||||
$karbohidratNama = $item?->karbohidrat?->nama_karbohidrat ?? '-';
|
||||
$karbohidratNilai = $item?->karbohidrat?->nilai_kalori ?? '-';
|
||||
$sheet->setCellValue("J{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} kal)" : ''));
|
||||
$sheet->setCellValue("K{$row}", $item?->total_kalori ?? '-');
|
||||
$sheet->setCellValue("L{$row}", $item?->jumlah ?? '-');
|
||||
$sheet->setCellValue("M{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
|
||||
$sheet->setCellValue("N{$row}", $item?->type ?? $item->jam_layanan);
|
||||
$sheet->setCellValue("O{$row}", $item?->order?->total_harga);
|
||||
$sheet->setCellValue("P{$row}", $item?->catatan ?? "-");
|
||||
$sheet->setCellValue("G{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} kal)" : ''));
|
||||
$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}:P{$row}")->getBorders()->getAllBorders()
|
||||
$sheet->getStyle("A{$row}:L{$row}")->getBorders()->getAllBorders()
|
||||
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
$totalPendapatan += $item?->order?->total_harga;
|
||||
$row++;
|
||||
}
|
||||
$sheet->getStyle("L{$row}:O{$row}")->getFont()->setBold(true);
|
||||
$sheet->getStyle("L{$row}:O{$row}")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
$sheet->setCellValue("M{$row}", 'Total Pendapatan');
|
||||
$sheet->setCellValue("O{$row}", $totalPendapatan);
|
||||
|
||||
// Auto size kolom
|
||||
foreach(range('A', 'P') as $col){
|
||||
foreach(range('A', 'L') as $col){
|
||||
$sheet->getColumnDimension($col)->setAutoSize(true);
|
||||
}
|
||||
$lastRow = $row - 1;
|
||||
$sheet->setAutoFilter("A4:P{$lastRow}");
|
||||
$sheet->setAutoFilter("A4:L{$lastRow}");
|
||||
// Download file
|
||||
$fileName = 'menu-pesanan' . now()->format('Ymd-His') . '.xlsx';
|
||||
$writer = new Xlsx($spreadsheet);
|
||||
@ -530,19 +503,20 @@ class PesananController extends Controller
|
||||
$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:T1');
|
||||
$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:T2');
|
||||
$sheet->mergeCells('A2:R2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
|
||||
|
||||
// Header tabel
|
||||
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Ruangan", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Jenis Pembayaran", "Tanggal Pesan", "Harga Total", "Jenis Menu", "Menu Pesanan", "Total Kalori", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "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:T4')->applyFromArray([
|
||||
$sheet->getStyle('A4:R4')->applyFromArray([
|
||||
'font' => ['bold' => true],
|
||||
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
|
||||
'borders' => [
|
||||
@ -551,64 +525,47 @@ class PesananController extends Controller
|
||||
]
|
||||
]
|
||||
]);
|
||||
$sheet->getStyle('A4:T4')->getFont()->setBold(true);
|
||||
$sheet->getStyle('A4:T4')->getAlignment()->setHorizontal('center');
|
||||
$sheet->getStyle('A4:T4')->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
|
||||
$totalPendapatan = 0;
|
||||
$row = 5;
|
||||
foreach ($order as $index => $item) {
|
||||
foreach($item->orderDetail as $detail){
|
||||
|
||||
$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 === "MCU" ? $item->nama_institusi . '-' . $item->jenis_customer : $item->jenis_customer);
|
||||
if($item->jenis_customer === "Keluarga Pasien / Penunggu Pasien"){
|
||||
$sheet->setCellValue("E{$row}", $item->kelas_perawatan . '/' . $item->no_kamar_perawatan . '/' . $item->ruang_perawatan);
|
||||
}else if($item->jenis_customer === "Karyawan RSAB Harapan Kita"){
|
||||
$sheet->setCellValue("E{$row}", $item->bagian_instalasi ?? '-');
|
||||
}else{
|
||||
$sheet->setCellValue("E{$row}", '-');
|
||||
}
|
||||
$sheet->setCellValue("F{$row}", $item->status_order);
|
||||
$sheet->setCellValue("G{$row}", $item->jenis_kelamin);
|
||||
$sheet->setCellValue("H{$row}", $item->no_wa);
|
||||
$sheet->setCellValue("I{$row}", $item->email);
|
||||
$sheet->setCellValue("J{$row}", $item->cara_pembayaran);
|
||||
$sheet->setCellValue("K{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
|
||||
$sheet->setCellValue("L{$row}", $item->total_harga);
|
||||
if($detail?->masterMcu){
|
||||
$sheet->setCellValue("M{$row}", 'Menu MCU');
|
||||
}else{
|
||||
$sheet->setCellValue("M{$row}", $detail?->menu?->apakah_someday ? "Menu Sameday" : "Menu Normal");
|
||||
}
|
||||
$sheet->setCellValue("N{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu);
|
||||
$sheet->setCellValue("O{$row}", $detail?->total_kalori ?? '-');
|
||||
$sheet->setCellValue("P{$row}", $detail?->jumlah ?? '-');
|
||||
$sheet->setCellValue("Q{$row}", $detail?->status_order ?? "-");
|
||||
$sheet->setCellValue("R{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
|
||||
$sheet->setCellValue("S{$row}", $detail?->type ?? $detail->jam_layanan);
|
||||
$sheet->setCellValue("T{$row}", $detail?->catatan ?? "-");
|
||||
$sheet->setCellValue("E{$row}", $item->status_order);
|
||||
$sheet->setCellValue("F{$row}", $item->jenis_kelamin);
|
||||
$sheet->setCellValue("G{$row}", $item->no_wa);
|
||||
$sheet->setCellValue("H{$row}", $item->email);
|
||||
$sheet->setCellValue("I{$row}", $item->cara_pembayaran);
|
||||
$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 ?? $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}:T{$row}")->getBorders()->getAllBorders()
|
||||
$sheet->getStyle("A{$row}:R{$row}")->getBorders()->getAllBorders()
|
||||
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
if($item->status_order === "Lunas"){
|
||||
$totalPendapatan += $item?->total_harga;
|
||||
}
|
||||
|
||||
$row++;
|
||||
}
|
||||
}
|
||||
$sheet->getStyle("K{$row}:L{$row}")->getFont()->setBold(true);
|
||||
$sheet->getStyle("K{$row}:L{$row}")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
$sheet->setCellValue("K{$row}", 'Total Pendapatan');
|
||||
$sheet->setCellValue("L{$row}", $totalPendapatan);
|
||||
|
||||
// Auto size kolom
|
||||
foreach(range('A', 'T') as $col){
|
||||
foreach(range('A', 'R') as $col){
|
||||
$sheet->getColumnDimension($col)->setAutoSize(true);
|
||||
}
|
||||
$lastRow = $row - 1;
|
||||
$sheet->setAutoFilter("A4:T{$lastRow}");
|
||||
$sheet->setAutoFilter("A4:R{$lastRow}");
|
||||
// Download file
|
||||
$fileName = $title . now()->format('Ymd-His') . '.xlsx';
|
||||
$writer = new Xlsx($spreadsheet);
|
||||
@ -784,18 +741,18 @@ class PesananController extends Controller
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}");
|
||||
$sheet->mergeCells('A1:R1');
|
||||
$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:S2');
|
||||
$sheet->mergeCells('A2:Q2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
|
||||
|
||||
// Header tabel
|
||||
$headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Ruangan", "Jenis Kelamin", "NO.HP/WA", "Email" , "Jenis Pembayaran", "Tanggal Pesan", "Harga Total", "Jenis Menu", "Menu Pesanan", "Total Kalori (kal)", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan / Jam Layanan", "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:S4')->applyFromArray([
|
||||
$sheet->getStyle('A4:Q4')->applyFromArray([
|
||||
'font' => ['bold' => true],
|
||||
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
|
||||
'borders' => [
|
||||
@ -804,63 +761,46 @@ class PesananController extends Controller
|
||||
]
|
||||
]
|
||||
]);
|
||||
$sheet->getStyle('A4:S4')->getFont()->setBold(true);
|
||||
$sheet->getStyle('A4:S4')->getAlignment()->setHorizontal('center');
|
||||
$sheet->getStyle('A4:S4')->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;
|
||||
$totalPendapatan = 0;
|
||||
foreach ($order as $index => $item) {
|
||||
foreach($item->orderDetail as $detail){
|
||||
$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 === "MCU" ? $item->nama_institusi . '-' . $item->jenis_customer : $item->jenis_customer);
|
||||
if($item->jenis_customer === "Keluarga Pasien / Penunggu Pasien"){
|
||||
$sheet->setCellValue("E{$row}", $item->kelas_perawatan . '/' . $item->no_kamar_perawatan . '/' . $item->ruang_perawatan);
|
||||
}else if($item->jenis_customer === "Karyawan RSAB Harapan Kita"){
|
||||
$sheet->setCellValue("E{$row}", $item->bagian_instalasi ?? '-');
|
||||
}else{
|
||||
$sheet->setCellValue("E{$row}", '-');
|
||||
}
|
||||
$sheet->setCellValue("F{$row}", $item->jenis_kelamin);
|
||||
$sheet->setCellValue("G{$row}", $item->no_wa);
|
||||
$sheet->setCellValue("H{$row}", $item->email);
|
||||
$sheet->setCellValue("I{$row}", $item->cara_pembayaran);
|
||||
$sheet->setCellValue("J{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
|
||||
$sheet->setCellValue("K{$row}", $item->total_harga);
|
||||
$sheet->setCellValue("E{$row}", $item->jenis_kelamin);
|
||||
$sheet->setCellValue("F{$row}", $item->no_wa);
|
||||
$sheet->setCellValue("G{$row}", $item->email);
|
||||
$sheet->setCellValue("H{$row}", $item->cara_pembayaran);
|
||||
$sheet->setCellValue("I{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i'));
|
||||
$sheet->setCellValue("J{$row}", $item->total_harga);
|
||||
|
||||
if($detail?->masterMcu){
|
||||
$sheet->setCellValue("L{$row}", 'Menu MCU');
|
||||
}else{
|
||||
$sheet->setCellValue("L{$row}", $detail?->menu?->apakah_someday ? "Menu Sameday" : "Menu Normal");
|
||||
}
|
||||
$sheet->setCellValue("M{$row}", $detail?->menu?->nama_menu ?? $detail?->masterMcu?->nama_mcu);
|
||||
$sheet->setCellValue("N{$row}", $detail?->total_kalori ?? '-');
|
||||
$sheet->setCellValue("O{$row}", $detail?->jumlah ?? '-');
|
||||
$sheet->setCellValue("P{$row}", $detail?->status_order ?? "-");
|
||||
$sheet->setCellValue("Q{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "-");
|
||||
$sheet->setCellValue("R{$row}", $detail?->type ?? $detail->jam_layanan);
|
||||
$sheet->setCellValue("S{$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}:S{$row}")->getBorders()->getAllBorders()
|
||||
$sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders()
|
||||
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
$totalPendapatan += $item->total_harga;
|
||||
|
||||
$row++;
|
||||
}
|
||||
}
|
||||
$sheet->getStyle("I{$row}:K{$row}")->getFont()->setBold(true);
|
||||
$sheet->getStyle("I{$row}:K{$row}")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
$sheet->setCellValue("I{$row}", 'Total Pendapatan');
|
||||
$sheet->setCellValue("K{$row}", $totalPendapatan);
|
||||
// dd($totalPendapatan);
|
||||
|
||||
// Auto size kolom
|
||||
foreach(range('A', 'S') as $col){
|
||||
foreach(range('A', 'Q') as $col){
|
||||
$sheet->getColumnDimension($col)->setAutoSize(true);
|
||||
}
|
||||
$lastRow = $row - 1;
|
||||
$sheet->setAutoFilter("A4:S{$lastRow}");
|
||||
$sheet->setAutoFilter("A4:Q{$lastRow}");
|
||||
// Download file
|
||||
$fileName = 'laporan-pesanan-' . now()->format('Ymd-His') . '.xlsx';
|
||||
$writer = new Xlsx($spreadsheet);
|
||||
|
||||
@ -1,178 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Survey;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Arr;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||||
|
||||
class SurveyController extends Controller
|
||||
{
|
||||
public function index(Request $request){
|
||||
if(!session()->has('payment_success')){
|
||||
return redirect('/');
|
||||
}
|
||||
$no_order = $request->query('no_order');
|
||||
$type = $request->query('type');
|
||||
$data = [
|
||||
'title' => 'Survey Gizi',
|
||||
'mcu' => false,
|
||||
'no_order' => $no_order,
|
||||
'type' => $type
|
||||
];
|
||||
return view('guest.survey.index', $data);
|
||||
}
|
||||
|
||||
public function store(){
|
||||
DB::connection('dbOrderGizi')->beginTransaction();
|
||||
try {
|
||||
$payload =[
|
||||
'no_order' => request('no_order'),
|
||||
'type' => request('type'),
|
||||
'keterangan' => request('kritik_saran'),
|
||||
'kepuasan' => request('kepuasan'),
|
||||
'created_at' => now()
|
||||
];
|
||||
Survey::create($payload);
|
||||
DB::connection('dbOrderGizi')->commit();
|
||||
session()->flash('payment_success', true);
|
||||
session()->flash('no_order', $payload['no_order']);
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Survei berhasil disimpan'
|
||||
]);
|
||||
} catch (\Throwable $th) {
|
||||
DB::connection('dbOrderGizi')->rollBack();
|
||||
return response()->json([
|
||||
'status' => false,
|
||||
'message' => 'Data gagal disimpan ' . $th->getMessage()
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function datatable(){
|
||||
$data = Survey::query();
|
||||
$tanggal = request('tanggal');
|
||||
if(!empty($tanggal)){
|
||||
$flattened = is_array($tanggal[0]) ? Arr::flatten($tanggal) : $tanggal;
|
||||
$data->whereIn(DB::raw('DATE(created_at)'), $flattened);
|
||||
}else{
|
||||
$now = Carbon::now()->format('Y-m-d');
|
||||
$data->whereDate('created_at', $now);
|
||||
}
|
||||
$data = $data->get();
|
||||
return response()->json([
|
||||
'rows' => $data->values(),
|
||||
'total' => $data->count(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function chartDataSurvey(Request $request)
|
||||
{
|
||||
$tanggal = $request->query('tanggal');
|
||||
if(is_string($tanggal)) $tanggal = json_decode($tanggal, true);
|
||||
|
||||
$query = Survey::query();
|
||||
if (!empty($tanggal) && is_array($tanggal)) {
|
||||
$query->whereIn(DB::raw('DATE(created_at)'), $tanggal);
|
||||
} else {
|
||||
$query->whereDate('created_at', Carbon::today());
|
||||
}
|
||||
|
||||
$allData = $query->get();
|
||||
|
||||
// Pisahkan data untuk perhitungan Card
|
||||
$dataBaru = $allData->where('type', 'pengguna_baru');
|
||||
$dataLama = $allData->where('type', 'pelanggan_setia');
|
||||
|
||||
return response()->json([
|
||||
'responden' => [
|
||||
'baru' => $dataBaru->count(),
|
||||
'lama' => $dataLama->count(),
|
||||
],
|
||||
'kepuasan_baru' => [
|
||||
'total' => $dataBaru->count(),
|
||||
'puas' => $dataBaru->where('kepuasan', 'Puas')->count(),
|
||||
'tidak_puas' => $dataBaru->where('kepuasan', 'Tidak Puas')->count(),
|
||||
],
|
||||
'kepuasan_lama' => [
|
||||
'total' => $dataLama->count(),
|
||||
'puas' => $dataLama->where('kepuasan', 'Puas')->count(),
|
||||
'tidak_puas' => $dataLama->where('kepuasan', 'Tidak Puas')->count(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
public function dashboardSurvey(){
|
||||
$data = [
|
||||
'title' => 'List Survey Order Gizi'
|
||||
];
|
||||
return view('dashboard.survey.index', $data);
|
||||
}
|
||||
|
||||
public function exportSurveyExcel(){
|
||||
$startDate = Carbon::parse(request('start_date'))->startOfDay();
|
||||
$endDate = Carbon::parse(request('end_date'))->endOfDay();
|
||||
$data = Survey::whereBetween('created_at', [$startDate, $endDate])->get();
|
||||
$waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y');
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
$sheet->setCellValue('A1', "Laporan Survei dari {$startDate->format('Y-m-d')} sampai {$endDate->format('Y-m-d')}");
|
||||
$sheet->mergeCells('A1:E1');
|
||||
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
|
||||
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
|
||||
|
||||
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
|
||||
$sheet->mergeCells('A2:E2');
|
||||
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
|
||||
|
||||
// Header tabel
|
||||
$headers = ["No", "Nama", "Tipe Survei", "Kepuasan", "Kritik dan Saran"];
|
||||
$sheet->fromArray($headers, null, 'A4');
|
||||
$sheet->getStyle('A4:E4')->applyFromArray([
|
||||
'font' => ['bold' => true],
|
||||
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
|
||||
'borders' => [
|
||||
'allBorders' => [
|
||||
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
|
||||
]
|
||||
]
|
||||
]);
|
||||
$sheet->getStyle('A4:E4')->getFont()->setBold(true);
|
||||
$sheet->getStyle('A4:E4')->getAlignment()->setHorizontal('center');
|
||||
$sheet->getStyle('A4:E4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
|
||||
// Isi data
|
||||
$row = 5;
|
||||
foreach ($data as $index => $item) {
|
||||
$sheet->setCellValue("A{$row}", $index + 1);
|
||||
$sheet->setCellValue("B{$row}", $item->order->nama_pemesan);
|
||||
$sheet->setCellValue("C{$row}", $item->type === "pelanggan_setia" ? "Pelanggan Setia" : "Pengguna Baru");
|
||||
$sheet->setCellValue("D{$row}", $item->kepuasan);
|
||||
$sheet->setCellValue("E{$row}", $item->keterangan);
|
||||
$row++;
|
||||
}
|
||||
// Auto size kolom
|
||||
foreach(range('A', 'E') as $col){
|
||||
$sheet->getColumnDimension($col)->setAutoSize(true);
|
||||
}
|
||||
$lastRow = $row - 1;
|
||||
$sheet->setAutoFilter("A4:E{$lastRow}");
|
||||
// Download file
|
||||
$fileName = "Laporan Survei {$startDate->format('Y-m-d')} sampai {$endDate->format('Y-m-d')} ". '.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;
|
||||
}
|
||||
}
|
||||
@ -31,7 +31,7 @@ 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', 'apakah_someday', 'apakah_mcu');
|
||||
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');
|
||||
|
||||
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Survey extends Model
|
||||
{
|
||||
protected $connection = 'dbOrderGizi';
|
||||
protected $table = 'public.survey';
|
||||
public $timestamps = false;
|
||||
protected $primaryKey = "id";
|
||||
protected $with = ['order'];
|
||||
protected $fillable =[
|
||||
'no_order',
|
||||
'type',
|
||||
'keterangan',
|
||||
'kepuasan',
|
||||
'created_at'
|
||||
];
|
||||
|
||||
public function order(){
|
||||
return $this->belongsTo(Order::class, 'no_order', 'no_order')->select('no_order', 'nama_pemesan');
|
||||
}
|
||||
}
|
||||
@ -8,6 +8,7 @@ return Application::configure(basePath: dirname(__DIR__))
|
||||
->withRouting(
|
||||
web: __DIR__.'/../routes/web.php',
|
||||
commands: __DIR__.'/../routes/console.php',
|
||||
channels: __DIR__.'/../routes/channels.php',
|
||||
health: '/up',
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware): void {
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
"barryvdh/laravel-dompdf": "^3.1",
|
||||
"barryvdh/laravel-snappy": "^1.0",
|
||||
"laravel/framework": "^12.0",
|
||||
"laravel/reverb": "^1.5",
|
||||
"laravel/tinker": "^2.10.1",
|
||||
"phpoffice/phpspreadsheet": "^4.5"
|
||||
},
|
||||
|
||||
1002
composer.lock
generated
82
config/broadcasting.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Broadcaster
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default broadcaster that will be used by the
|
||||
| framework when an event needs to be broadcast. You may set this to
|
||||
| any of the connections defined in the "connections" array below.
|
||||
|
|
||||
| Supported: "reverb", "pusher", "ably", "redis", "log", "null"
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('BROADCAST_CONNECTION', 'null'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Broadcast Connections
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define all of the broadcast connections that will be used
|
||||
| to broadcast events to other systems or over WebSockets. Samples of
|
||||
| each available type of connection are provided inside this array.
|
||||
|
|
||||
*/
|
||||
|
||||
'connections' => [
|
||||
|
||||
'reverb' => [
|
||||
'driver' => 'reverb',
|
||||
'key' => env('REVERB_APP_KEY'),
|
||||
'secret' => env('REVERB_APP_SECRET'),
|
||||
'app_id' => env('REVERB_APP_ID'),
|
||||
'options' => [
|
||||
'host' => env('REVERB_HOST'),
|
||||
'port' => env('REVERB_PORT', 443),
|
||||
'scheme' => env('REVERB_SCHEME', 'https'),
|
||||
'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
|
||||
],
|
||||
'client_options' => [
|
||||
// Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
|
||||
],
|
||||
],
|
||||
|
||||
'pusher' => [
|
||||
'driver' => 'pusher',
|
||||
'key' => env('PUSHER_APP_KEY'),
|
||||
'secret' => env('PUSHER_APP_SECRET'),
|
||||
'app_id' => env('PUSHER_APP_ID'),
|
||||
'options' => [
|
||||
'cluster' => env('PUSHER_APP_CLUSTER'),
|
||||
'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
|
||||
'port' => env('PUSHER_PORT', 443),
|
||||
'scheme' => env('PUSHER_SCHEME', 'https'),
|
||||
'encrypted' => true,
|
||||
'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
|
||||
],
|
||||
'client_options' => [
|
||||
// Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
|
||||
],
|
||||
],
|
||||
|
||||
'ably' => [
|
||||
'driver' => 'ably',
|
||||
'key' => env('ABLY_KEY'),
|
||||
],
|
||||
|
||||
'log' => [
|
||||
'driver' => 'log',
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'null',
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
94
config/reverb.php
Normal file
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Reverb Server
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option controls the default server used by Reverb to handle
|
||||
| incoming messages as well as broadcasting message to all your
|
||||
| connected clients. At this time only "reverb" is supported.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('REVERB_SERVER', 'reverb'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Reverb Servers
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define details for each of the supported Reverb servers.
|
||||
| Each server has its own configuration options that are defined in
|
||||
| the array below. You should ensure all the options are present.
|
||||
|
|
||||
*/
|
||||
|
||||
'servers' => [
|
||||
|
||||
'reverb' => [
|
||||
'host' => env('REVERB_SERVER_HOST', '0.0.0.0'),
|
||||
'port' => env('REVERB_SERVER_PORT', 8080),
|
||||
'path' => env('REVERB_SERVER_PATH', ''),
|
||||
'hostname' => env('REVERB_HOST'),
|
||||
'options' => [
|
||||
'tls' => [],
|
||||
],
|
||||
'max_request_size' => env('REVERB_MAX_REQUEST_SIZE', 10_000),
|
||||
'scaling' => [
|
||||
'enabled' => env('REVERB_SCALING_ENABLED', false),
|
||||
'channel' => env('REVERB_SCALING_CHANNEL', 'reverb'),
|
||||
'server' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'username' => env('REDIS_USERNAME'),
|
||||
'password' => env('REDIS_PASSWORD'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
'timeout' => env('REDIS_TIMEOUT', 60),
|
||||
],
|
||||
],
|
||||
'pulse_ingest_interval' => env('REVERB_PULSE_INGEST_INTERVAL', 15),
|
||||
'telescope_ingest_interval' => env('REVERB_TELESCOPE_INGEST_INTERVAL', 15),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Reverb Applications
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may define how Reverb applications are managed. If you choose
|
||||
| to use the "config" provider, you may define an array of apps which
|
||||
| your server will support, including their connection credentials.
|
||||
|
|
||||
*/
|
||||
|
||||
'apps' => [
|
||||
|
||||
'provider' => 'config',
|
||||
|
||||
'apps' => [
|
||||
[
|
||||
'key' => env('REVERB_APP_KEY'),
|
||||
'secret' => env('REVERB_APP_SECRET'),
|
||||
'app_id' => env('REVERB_APP_ID'),
|
||||
'options' => [
|
||||
'host' => env('REVERB_HOST'),
|
||||
'port' => env('REVERB_PORT', 443),
|
||||
'scheme' => env('REVERB_SCHEME', 'https'),
|
||||
'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
|
||||
],
|
||||
'allowed_origins' => ['*'],
|
||||
'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
|
||||
'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
|
||||
'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
|
||||
],
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
];
|
||||
4
env_prod
@ -3,7 +3,7 @@ APP_ENV=production
|
||||
APP_KEY=base64:R54Pgs6qwWsP6eKZGCcHNd7rrsSSU0DsWSbFHwaT4Bc=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://127.0.0.1:8000/
|
||||
APP_TIMEZONE=Asia/Jakarta
|
||||
APP_TIMEZONE =Asia/Jakarta
|
||||
APP_LOCALE=en
|
||||
APP_FALLBACK_LOCALE=en
|
||||
APP_FAKER_LOCALE=en_US
|
||||
@ -23,7 +23,7 @@ LOG_LEVEL=debug
|
||||
DB_CONNECTION_ORDER_GIZI= pgsql
|
||||
DB_HOST_ORDER_GIZI = 172.16.88.22
|
||||
DB_PORT_ORDER_GIZI = 5432
|
||||
DB_DATABASE_ORDER_GIZI = lms_mutu
|
||||
DB_DATABASE_ORDER_GIZI = order_gizi
|
||||
DB_USERNAME_ORDER_GIZI = simrs
|
||||
DB_PASSWORD_ORDER_GIZI = @S1mrs.3205@
|
||||
|
||||
|
||||
2413
package-lock.json
generated
Normal file
@ -10,7 +10,9 @@
|
||||
"@tailwindcss/vite": "^4.0.0",
|
||||
"axios": "^1.8.2",
|
||||
"concurrently": "^9.0.1",
|
||||
"laravel-echo": "^2.2.0",
|
||||
"laravel-vite-plugin": "^1.2.0",
|
||||
"pusher-js": "^8.4.0",
|
||||
"tailwindcss": "^4.0.0",
|
||||
"vite": "^6.2.4"
|
||||
}
|
||||
|
||||
@ -305,7 +305,7 @@ h6 {
|
||||
}
|
||||
|
||||
.header .logo img {
|
||||
max-height: 60px;
|
||||
max-height: 36px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
@ -347,10 +347,6 @@ h6 {
|
||||
.header .navmenu {
|
||||
order: 3;
|
||||
}
|
||||
.header .logo img {
|
||||
max-height: 35px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
.scrolled .header {
|
||||
|
||||
|
Before Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 466 KiB |
|
Before Width: | Height: | Size: 758 B After Width: | Height: | Size: 758 B |
@ -1,7 +1,8 @@
|
||||
|
||||
async function submitOrderToServer(){
|
||||
const totalHarga = hitungTotalHarga();
|
||||
|
||||
if (sessionStorage.getItem('order_id')) {
|
||||
if (sessionStorage.getItem('order_id')) {
|
||||
currentStep = 2;
|
||||
showStep(currentStep);
|
||||
return;
|
||||
@ -32,12 +33,7 @@ async function submitOrderToServer(){
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('message '+error);
|
||||
Swal.fire({
|
||||
title: 'Gagal!',
|
||||
text: 'Terdapat kesalahan coba lagi nanti!',
|
||||
icon: 'error',
|
||||
confirmButtonText: 'Tutup!'
|
||||
})
|
||||
alert('Terdapat kesalahan coba lagi nanti!')
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,41 +104,22 @@ async function submitOrderToServer(){
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result.status) {
|
||||
// ✅ Hapus sessionStorage di client
|
||||
clearSession()
|
||||
Swal.fire({
|
||||
title: '<span style="color: #00796b;">Pesanan Berhasil!</span>',
|
||||
title: 'Pesanan Berhasil!',
|
||||
text: 'Terima kasih, pesanan Anda sedang kami siapkan.',
|
||||
icon: 'success',
|
||||
iconColor: '#2e7d32', // Warna hijau Kemenkes
|
||||
html: `
|
||||
<p class="text-muted mb-4">Terima kasih, pesanan Anda sedang kami siapkan.</p>
|
||||
<div class="p-3 border-0 rounded-4 shadow-sm mb-3" style="background-color: #f1f8f7;">
|
||||
<p class="small fw-bold mb-3 text-uppercase" style="color: #004d40; letter-spacing: 1px;">Bantu Kami Meningkatkan Layanan:</p>
|
||||
|
||||
<button type="button" onclick="location.href='/survey?no_order=${result.no_order}&type=pengguna_baru'"
|
||||
class="btn w-100 mb-3 py-3 border-0 shadow-sm transition-hover"
|
||||
style="background-color: #00a99d; color: white; border-radius: 12px;">
|
||||
<div class="fw-bold px-2">Saya Pengguna Baru</div>
|
||||
<div style="font-size: 0.75rem; opacity: 0.9;">Survei kemudahan aplikasi pemesanan</div>
|
||||
</button>
|
||||
|
||||
<button type="button" onclick="location.href='/survey?no_order=${result.no_order}&type=pelanggan_setia'"
|
||||
class="btn w-100 py-3 border-0 shadow-sm transition-hover"
|
||||
style="background-color: #005eb8; color: white; border-radius: 12px;">
|
||||
<div class="fw-bold px-2">Saya Pelanggan Setia</div>
|
||||
<div style="font-size: 0.75rem; opacity: 0.9;">Survei rasa, variasi, dan penampilan menu</div>
|
||||
</button>
|
||||
</div>
|
||||
`,
|
||||
showConfirmButton: false,
|
||||
showCancelButton: false,
|
||||
allowOutsideClick: false,
|
||||
allowEscapeKey: false
|
||||
})
|
||||
confirmButtonText: 'Berhasil!',
|
||||
confirmButtonColor: '#28a745'
|
||||
}).then(() => {
|
||||
window.location.href = "/success-page"; // kehalaman success
|
||||
});
|
||||
} else {
|
||||
clearSession()
|
||||
Swal.fire({
|
||||
Swal.fire({
|
||||
title: 'Gagal!',
|
||||
text: result.message,
|
||||
icon: 'error',
|
||||
@ -153,12 +130,8 @@ async function submitOrderToServer(){
|
||||
}
|
||||
} catch (err) {
|
||||
clearSession()
|
||||
Swal.fire({
|
||||
title: 'Gagal!',
|
||||
text: "Terjadi kesalahan saat mengirim data.",
|
||||
icon: 'error',
|
||||
confirmButtonText: 'Tutup!'
|
||||
})
|
||||
console.error(err);
|
||||
alert("Terjadi kesalahan saat mengirim data.");
|
||||
}finally{
|
||||
buttonSubmit.prop('disabled', false).html('Selesaikan Pesanan');
|
||||
}
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
<i class="fa-solid fa-pencil"></i>
|
||||
</button>
|
||||
`
|
||||
console.log(row);
|
||||
|
||||
buttons += `
|
||||
<button class="btn btn-sm btn-danger me-2" onclick="deleteMasterMcu(this)"
|
||||
|
||||
@ -370,7 +370,6 @@
|
||||
</div>
|
||||
`;
|
||||
list?.forEach(menu => {
|
||||
|
||||
html += `
|
||||
<style>
|
||||
.menu-card {
|
||||
@ -390,8 +389,7 @@
|
||||
|
||||
<!-- GAMBAR + NAMA DI DALAM GAMBAR -->
|
||||
<div class="position-relative">
|
||||
|
||||
<img src="${menu.exist_foto ? `/gambar/${menu?.foto}` : '/gambar/default.png'}"
|
||||
<img src="gambar/${menu.foto || '3.jpeg'}"
|
||||
class="rounded shadow-sm object-fit-cover w-100" height="150"
|
||||
alt="${menu.nama_menu}">
|
||||
|
||||
@ -402,7 +400,7 @@
|
||||
<!-- di dalam .position-relative (gambar) -->
|
||||
<!-- Nama + kalori di dalam gambar (bawah) -->
|
||||
<div class="position-absolute bottom-0 start-0 p-2 w-100">
|
||||
<h5 class="fw-bold text-white mb-0" style="font-size:.80rem; max-width: 100%;">${menu.nama.length > 25 ? menu.nama.substring(0, 30) + '...' : menu.nama}</h5>
|
||||
<h6 class="fw-bold text-white mb-0" style="font-size:.75rem; max-width: 85%;">${menu.nama.length > 15 ? menu.nama.substring(0, 17) + '...' : menu.nama}</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>`: ''}
|
||||
${(menu.klasifikasiMenu || [])
|
||||
@ -431,6 +429,13 @@
|
||||
</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 mb-1">
|
||||
<strong>Harga</strong>
|
||||
<strong class="text-success">Rp ${parseInt(menu.harga_public).toLocaleString('id-ID')}</strong>
|
||||
@ -464,7 +469,6 @@
|
||||
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
|
||||
data-kalori="${(menu.kalori || []).map(kkal => kkal.nilai_kalori).join(', ')}"
|
||||
data-foto="${menu.foto}"
|
||||
data-exist_foto="${menu.exist_foto}"
|
||||
data-apakah_menu_sore="${menu.apakah_menu_sore}"
|
||||
data-apakah_menu_siang="${menu.apakah_menu_siang}"
|
||||
data-apakah_someday="${menu.apakah_someday}">
|
||||
@ -481,8 +485,7 @@
|
||||
data-klasifikasi_menu="${(menu.klasifikasiMenu || []).map(tag => tag.nama_kategori_diet).join(', ')}"
|
||||
data-tgl_tersedia="${(menu.dmph || []).map(tgl => tgl.tgl_harian).join(', ')}"
|
||||
data-kalori="${(menu.kalori || []).map(kkal => kkal.nilai_kalori).join(', ')}"
|
||||
${menu.exist_foto ? `data-foto=${menu.foto}` : `data-foto="default.png"`}
|
||||
|
||||
data-foto="${menu.foto}"
|
||||
data-apakah_menu_sore="${menu.apakah_menu_sore}"
|
||||
data-apakah_menu_siang="${menu.apakah_menu_siang}"
|
||||
data-apakah_someday="${menu.apakah_someday}">
|
||||
@ -547,7 +550,6 @@
|
||||
const someday = el.data('apakah_someday');
|
||||
const siang = el.data('apakah_menu_siang');
|
||||
const sore = el.data('apakah_menu_sore');
|
||||
const exist_foto = el.data('exist_foto');
|
||||
|
||||
const klasifikasiMenu = tags.map(tag => `
|
||||
<span class="badge bg-secondary me-1 mb-1">${tag}</span>
|
||||
@ -579,11 +581,7 @@
|
||||
`;
|
||||
|
||||
$('#checkoutModal').modal('show');
|
||||
if(exist_foto){
|
||||
$('#cathering_order_photo').attr('src', `/gambar/${el.data('foto') || 'default.png'}`);
|
||||
}else{
|
||||
$('#cathering_order_photo').attr('src', `/gambar/default.png`);
|
||||
}
|
||||
$('#cathering_order_photo').attr('src', `/gambar/${el.data('foto') || 'default.jpg'}`);
|
||||
|
||||
$('#cathering_order_name').html(`
|
||||
<div>${el.data('nama_menu')}</div>`);
|
||||
@ -604,7 +602,6 @@
|
||||
$('#cathering_order_price_public').text("Rp " + parseInt(el.data('harga_public') || 0).toLocaleString('id-ID'));
|
||||
$('#tag_klasifikasi_menu').html(klasifikasiMenu);
|
||||
$('#tgl_menu_tersedia').html(tglMenuTersedia);
|
||||
$('#exist_foto').val(exist_foto ? 1 : 0);
|
||||
$('#apakah_someday').val(someday ? 1 : 0);
|
||||
$('#apakah_menu_siang').val(siang ? 1 : 0);
|
||||
$('#apakah_menu_sore').val(sore ? 1 : 0);
|
||||
@ -733,7 +730,6 @@
|
||||
foto: $(e).data('foto'),
|
||||
jenis_menu: $(e).data('jenis_menu'),
|
||||
deskripsi: $(e).data('deskripsi'),
|
||||
exist_foto: $(e).data('exist_foto'),
|
||||
apakah_menu_siang: $(e).data('apakah_menu_siang'),
|
||||
apakah_menu_sore: $(e).data('apakah_menu_sore'),
|
||||
apakah_someday: $(e).data('apakah_someday'),
|
||||
|
||||
@ -7,7 +7,6 @@ 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">
|
||||
@ -102,7 +101,7 @@ document.getElementById('formActionApproveOrder').addEventListener('submit', fun
|
||||
backdrop: true,
|
||||
});
|
||||
datatablePekerjaan.bootstrapTable('refresh');
|
||||
|
||||
|
||||
modalActionOrder.removeEventListener('hidden.bs.modal', handler); // ✅ pakai DOM
|
||||
getReminderVerifikasiMakanan()
|
||||
};
|
||||
|
||||
@ -89,7 +89,7 @@
|
||||
{
|
||||
title: "Cara Pembayaran",
|
||||
formatter: function(value, row){
|
||||
return row?.cara_pembayaran || '-'
|
||||
return row?.cara_pembayaran || 'MCU'
|
||||
},
|
||||
sortable: true,
|
||||
},
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
{
|
||||
title: "Cara Pembayaran",
|
||||
formatter: function(value, row){
|
||||
return row?.cara_pembayaran || '-'
|
||||
return row?.cara_pembayaran || 'MCU'
|
||||
},
|
||||
sortable: true,
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 286 KiB |
@ -1 +1,5 @@
|
||||
import './bootstrap';
|
||||
window.Echo.channel('test')
|
||||
.listen('.MessageSent', (e) => {
|
||||
console.log("Pesan diterima:", e.message);
|
||||
});
|
||||
|
||||
23
resources/js/bootstrap.js
vendored
@ -2,3 +2,26 @@ import axios from 'axios';
|
||||
window.axios = axios;
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
|
||||
/**
|
||||
* Echo exposes an expressive API for subscribing to channels and listening
|
||||
* for events that are broadcast by Laravel. Echo and event broadcasting
|
||||
* allow your team to quickly build robust real-time web applications.
|
||||
*/
|
||||
|
||||
import './echo';
|
||||
|
||||
|
||||
import Echo from "laravel-echo";
|
||||
import Pusher from "pusher-js";
|
||||
|
||||
window.Pusher = Pusher;
|
||||
|
||||
window.Echo = new Echo({
|
||||
broadcaster: 'reverb',
|
||||
key: import.meta.env.VITE_REVERB_APP_KEY ?? "app-key",
|
||||
wsHost: '127.0.0.1',
|
||||
wsPort: 8080,
|
||||
forceTLS: false,
|
||||
enabledTransports: ['ws'],
|
||||
});
|
||||
|
||||
14
resources/js/echo.js
Normal file
@ -0,0 +1,14 @@
|
||||
import Echo from 'laravel-echo';
|
||||
|
||||
import Pusher from 'pusher-js';
|
||||
window.Pusher = Pusher;
|
||||
|
||||
window.Echo = new Echo({
|
||||
broadcaster: 'reverb',
|
||||
key: import.meta.env.VITE_REVERB_APP_KEY,
|
||||
wsHost: import.meta.env.VITE_REVERB_HOST,
|
||||
wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
|
||||
wssPort: import.meta.env.VITE_REVERB_PORT ?? 443,
|
||||
forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
|
||||
enabledTransports: ['ws', 'wss'],
|
||||
});
|
||||
@ -71,17 +71,12 @@
|
||||
gap: 8px; /* jarak antar elemen */
|
||||
}
|
||||
.footer-logo {
|
||||
margin-top:5px;
|
||||
height: 40px; /* samakan tinggi logo */
|
||||
height: 45px; /* samakan tinggi logo */
|
||||
}
|
||||
.footer-text {
|
||||
font-size: 12px;
|
||||
margin-left:-12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.footer-text-muted {
|
||||
font-size: 10.5px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@ -115,7 +110,7 @@
|
||||
<td>Ruang Perawatan/No Kamar</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?->ruang_perawatan ?? '-'}} / {{ $label?->order?->no_kamar_perawatan ?? '-'}}
|
||||
{{ $label?->order?->kelas_perawatan ?? '-'}} / {{ $label?->order?->no_kamar_perawatan ?? '-'}}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
@ -153,12 +148,9 @@
|
||||
@if($label->total_kalori)
|
||||
<tr><td>Total Kalori</td><td>: {{ $label->total_kalori }}</td></tr>
|
||||
@endif
|
||||
<tr><td>Catatan</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?->catatan ?? '-' }}
|
||||
</span></td>
|
||||
</tr>
|
||||
@if($label->order?->jenis_customer !== 'MCU')
|
||||
<tr><td>Harga Satuan</td><td>: Rp {{ number_format($label?->harga_satuan, 0, ',', '.') }}</td></tr>
|
||||
@endif
|
||||
<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)
|
||||
@ -177,12 +169,16 @@
|
||||
|
||||
<div class="footer">
|
||||
<div class="footer-content">
|
||||
<img src="{{ public_path('logo/halal_gizi.png') }}" alt="Halal" class="footer-logo">
|
||||
<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>
|
||||
<span class="footer-text-muted">Makanan sebaiknya dikonsumsi dalam waktu maksimal 2 jam setelah diberikan</span>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -12,7 +12,6 @@
|
||||
<input type="hidden" id="apakah_menu_siang">
|
||||
<input type="hidden" id="apakah_menu_sore">
|
||||
<input type="hidden" id="tgl_tersedia">
|
||||
<input type="hidden" id="exist_foto">
|
||||
<img id="cathering_order_photo" class="img-fluid rounded shadow" style="max-height: 370px; width:270px;" alt="Foto Menu">
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
document.write(new Date().getFullYear());
|
||||
</script>
|
||||
, made with by
|
||||
<span class="footer-link fw-bolder">TIM SIMRS</a>
|
||||
<a href="https://themeselection.com" target="_blank" class="footer-link fw-bolder">TIM SIMRS</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@ -109,14 +109,6 @@
|
||||
<div data-i18n="User interface">Laporan Pesanan </div>
|
||||
</a>
|
||||
</li>
|
||||
<li class="menu-item {{ Request::is('dashboard/survey') ? 'active' : '' }}">
|
||||
<a href="/dashboard/survey" class="menu-link">
|
||||
<i class="menu-icon tf-icons bx bx-box"></i>
|
||||
<div data-i18n="User interface">Survei </div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
{{-- <li class="menu-item {{ Request::is('dashboard/laporan-pesanan') ? 'active' : '' }}">
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
<li class="nav-item navbar-dropdown dropdown-user dropdown">
|
||||
<a class="nav-link dropdown-toggle hide-arrow" href="javascript:void(0);" data-bs-toggle="dropdown">
|
||||
<div class="avatar avatar-online">
|
||||
<img src="/assets/img/avatars/8.jpg" alt class="w-px-40 h-auto rounded-circle" />
|
||||
<img src="/assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
|
||||
</div>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-end">
|
||||
@ -39,11 +39,12 @@
|
||||
<div class="d-flex">
|
||||
<div class="flex-shrink-0 me-3">
|
||||
<div class="avatar avatar-online">
|
||||
<img src="/assets/img/avatars/8.jpg" alt class="w-px-40 h-auto rounded-circle" />
|
||||
<img src="/assets/img/avatars/1.png" alt class="w-px-40 h-auto rounded-circle" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<span class="fw-semibold d-block">Admin</span>
|
||||
<span class="fw-semibold d-block">John Doe</span>
|
||||
<small class="text-muted">Admin</small>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
@ -75,6 +75,7 @@
|
||||
}
|
||||
|
||||
th:nth-child(6), td:nth-child(6) {
|
||||
width: 110px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@ -125,7 +126,6 @@
|
||||
<th>Waktu Makan <br/> /Jam Layanan</th>
|
||||
<th>Menu</th>
|
||||
<th>Karbohidrat</th>
|
||||
<th>Catatan</th>
|
||||
<th>Total Kalori</th>
|
||||
<th>Keterangan</th>
|
||||
<th>Jumlah</th>
|
||||
@ -157,7 +157,6 @@
|
||||
-
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $row['catatan'] ? $row['catatan'] . ' kal' : '' }}</td>
|
||||
<td>{{ $row['total_kalori'] ? $row['total_kalori'] . ' kal' : '' }}</td>
|
||||
<td class="keterangan">
|
||||
@php
|
||||
|
||||
@ -1,183 +0,0 @@
|
||||
@extends('dashboard.layouts.main')
|
||||
@section('body_main')
|
||||
<div class="container-xxl flex-grow-1 container-p-y">
|
||||
<h4 class="fw-bold py-3 mb-4">
|
||||
<span class="text-muted fw-light">Dashboard /</span> Survei
|
||||
</h4>
|
||||
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6 mb-3">
|
||||
<div class="card border-0 shadow-sm h-100" style="border-left: 5px solid #00a99d !important;">
|
||||
<div class="card-header pb-0">
|
||||
<h6 class=" fw-normal mb-0">Statistik Pengguna Baru Total <b id="confirm_pb_total"></b></h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<canvas id="barChartBaru" style="max-height: 150px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<div class="card border-0 shadow-sm h-100" style="border-left: 5px solid #005eb8 !important;">
|
||||
<div class="card-header pb-0">
|
||||
<h6 class=" fw-normal mb-0">Statistik Pelanggan Setia Total <b id="confirm_ps_total"></b></h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<canvas id="barChartLama" style="max-height: 150px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h5 class="mb-0">Data Detail Survei <strong id="confirm_date_survey"></strong></h5>
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportSurvei()">
|
||||
<i class="fa fa-download me-1"></i> Export
|
||||
</button>
|
||||
<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="datatableSurvey"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@include('dashboard.survey.modal.export')
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
|
||||
<script>
|
||||
const datatable = $("#datatableSurvey");
|
||||
const modalExport = document.getElementById('modalExportSurvei');
|
||||
// Inisialisasi variabel Chart agar bisa di-destroy saat update
|
||||
let chartBaruObj, chartLamaObj;
|
||||
|
||||
function initDt(selectDate = []) {
|
||||
datatable.bootstrapTable('destroy');
|
||||
datatable.bootstrapTable({
|
||||
url: "/dashboard/datatable/survey",
|
||||
method: 'get',
|
||||
queryParams: function(params) {
|
||||
params.tanggal = selectDate;
|
||||
return params;
|
||||
},
|
||||
showColumns: true,
|
||||
pagination: true,
|
||||
serverSide: true,
|
||||
pageSize: 10,
|
||||
columns: [
|
||||
{ title: "Nama Pelanggan", field: 'order.nama_pemesan' },
|
||||
{
|
||||
title: "Type Survei",
|
||||
field: 'type',
|
||||
formatter: (v, row) => row?.type === "pengguna_baru" ? "Pengguna Baru" : "Pelanggan Setia"
|
||||
},
|
||||
{ title: "Kepuasan", field: 'kepuasan' },
|
||||
{ title: "Kritik dan Saran", field: 'keterangan' },
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
// Fungsi perbaikan untuk Bar Chart Horizontal
|
||||
function updateBarChart(chartId, puas, tidakPuas) {
|
||||
const ctx = document.getElementById(chartId).getContext('2d');
|
||||
|
||||
// Hancurkan instance lama agar tidak tumpang tindih saat hover
|
||||
if (chartId === 'barChartBaru' && chartBaruObj) chartBaruObj.destroy();
|
||||
if (chartId === 'barChartLama' && chartLamaObj) chartLamaObj.destroy();
|
||||
|
||||
const config = {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: ['Puas', 'Tidak Puas'],
|
||||
datasets: [{
|
||||
data: [puas, tidakPuas],
|
||||
backgroundColor: [
|
||||
chartId === 'barChartBaru' ? '#00a99d' : '#005eb8',
|
||||
'#dc3545'
|
||||
],
|
||||
borderRadius: 5,
|
||||
barThickness: 20
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
indexAxis: 'y',
|
||||
responsive: true,
|
||||
maintainAspectRatio: false,
|
||||
plugins: {
|
||||
legend: { display: false },
|
||||
tooltip: { enabled: true }
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
beginAtZero: true,
|
||||
grid: { display: false },
|
||||
ticks: { stepSize: 1, precision: 0 }
|
||||
},
|
||||
y: { grid: { display: false } }
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (chartId === 'barChartBaru') chartBaruObj = new Chart(ctx, config);
|
||||
else chartLamaObj = new Chart(ctx, config);
|
||||
}
|
||||
|
||||
async function loadCharts(selectDate = []) {
|
||||
try {
|
||||
const dateParam = encodeURIComponent(JSON.stringify(selectDate));
|
||||
const response = await fetch(`/dashboard/chart/survey?tanggal=${dateParam}`);
|
||||
const data = await response.json();
|
||||
console.log(data);
|
||||
|
||||
// 1. Update Statistik Bar Chart Pengguna Baru
|
||||
if(data.kepuasan_baru) {
|
||||
updateBarChart('barChartBaru', data.kepuasan_baru.puas, data.kepuasan_baru.tidak_puas);
|
||||
$("#confirm_pb_total").text(data.kepuasan_baru.total);
|
||||
}
|
||||
|
||||
// 2. Update Statistik Bar Chart Pelanggan Setia
|
||||
if(data.kepuasan_lama) {
|
||||
updateBarChart('barChartLama', data.kepuasan_lama.puas, data.kepuasan_lama.tidak_puas);
|
||||
$("#confirm_ps_total").text(data.kepuasan_lama.total);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error("Error load chart:", error);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
flatpickr('#tanggal', {
|
||||
dateFormat: "Y-m-d",
|
||||
mode: "multiple",
|
||||
locale: "id",
|
||||
onValueUpdate: function(selectedDates) {
|
||||
const formatted = 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(formatted);
|
||||
loadCharts(formatted);
|
||||
|
||||
let text = formatted.length > 0 ? ': ' + formatted.join(', ') : 'Hari Ini';
|
||||
$("#confirm_date_survey").text(text);
|
||||
}
|
||||
});
|
||||
|
||||
$("#confirm_date_survey").text('Hari Ini');
|
||||
initDt();
|
||||
loadCharts();
|
||||
});
|
||||
|
||||
function exportSurvei(){
|
||||
new bootstrap.Modal(modalExport).show()
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
@ -1,50 +0,0 @@
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="modalExportSurvei" 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</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
|
||||
<!-- Modal Form -->
|
||||
<form action="/dashboard/survey/export" method="POST">
|
||||
@csrf
|
||||
<div class="modal-body">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<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">
|
||||
<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>
|
||||
@ -69,7 +69,6 @@
|
||||
}
|
||||
const data = order.data;
|
||||
(data.items || []).forEach(item => {
|
||||
console.log(item);
|
||||
|
||||
const harga = parseInt(item.harga_satuan);
|
||||
const jumlah = parseInt(item.jumlah);
|
||||
@ -78,7 +77,7 @@
|
||||
<div class="card mb-2 shadow-sm">
|
||||
<div class="row g-0">
|
||||
<div class="${data?.cara_pembayaran === "MCU" ? 'd-none' : 'col-md-4 p-2'}">
|
||||
<img src="${item.exist_foto ? `/gambar/${item.foto }` : '/gambar/default.png'}" class="img-fluid rounded-start" alt="${item.nama_item}" style="max-height: 150px; width:100%; object-fit: cover;">
|
||||
<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="${data?.cara_pembayaran === "MCU" ? 'col-md-12' : 'col-md-8'}">
|
||||
<div class="card-body py-2 px-3 mt-2">
|
||||
@ -90,7 +89,6 @@
|
||||
<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>
|
||||
<p class="mb-0 small">Waktu : ${item?.type || item?.jam_layanan}</p>
|
||||
<p class="badge text-white
|
||||
${item?.status_order === 'Pending'? 'bg-primary'
|
||||
: data.status_order === 'Belum Bayar' ? '' : 'bg-success'}">
|
||||
@ -157,20 +155,6 @@
|
||||
<div class="text-dark">${data?.no_ekstensien || '-'}</div>
|
||||
</div>
|
||||
</div>
|
||||
${data?.status_order === "Lunas" ? `
|
||||
<div class="col-md-12">
|
||||
<div class="bg-light p-3 rounded shadow-sm small">
|
||||
<div class="fw-semibold text-secondary mb-1">Informasi Penting</div>
|
||||
<div class="text-dark">
|
||||
Bagi <strong>Karyawan</strong>, makanan yang dipesan <strong>harus diambil sendiri</strong> (tidak diantar).
|
||||
Pengambilan dapat dilakukan di <strong>Instalasi Gizi (Ruang Distribusi Makan)</strong> dengan jadwal:
|
||||
<ul class="mt-2 mb-0 ps-3 list-unstyled">
|
||||
<li>Siang: <strong>12.00 - 13.00 WIB</strong></li>
|
||||
<li>Sore: <strong>16.00 - 17.00 WIB</strong></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>` : ''}
|
||||
` : data?.jenis_customer === "Keluarga Pasien / Penunggu Pasien" ?
|
||||
`
|
||||
<div class="col-md-6">
|
||||
@ -197,17 +181,6 @@
|
||||
<div class="text-dark">${data?.kelas_perawatan || '-'}</div>
|
||||
</div>
|
||||
</div>
|
||||
${data?.status_order === "Lunas" ? `
|
||||
<div class="col-md-12">
|
||||
<div class="bg-light p-3 rounded shadow-sm small">
|
||||
<div class="fw-semibold text-secondary mb-1">Informasi Penting</div>
|
||||
<div class="text-dark">
|
||||
Bagi Keluarga atau Penunggu Pasien, makanan yang dipesan <strong>akan diantarkan</strong> ke ruang perawatan
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
` : ''}
|
||||
|
||||
` : data?.jenis_customer === "Masyarakat Umum" ? ` <div class="col-md-12">
|
||||
<div class="bg-light p-3 rounded shadow-sm small">
|
||||
<div class="fw-semibold text-secondary mb-1">Alamat</div>
|
||||
@ -221,6 +194,7 @@
|
||||
<div class="bg-white rounded-4 border p-3 shadow-sm mb-4">
|
||||
<h6 class="fw-semibold mb-3">Item Pesanan</h6>
|
||||
${itemHTML}
|
||||
|
||||
<div class="text-end mt-3">
|
||||
<h6>Total Seluruh Pesanan: <strong class="text-success">Rp ${parseInt(data?.total_harga).toLocaleString('id-ID')}</strong></h6>
|
||||
</div>
|
||||
|
||||
@ -48,7 +48,6 @@
|
||||
</section>
|
||||
@include('guest.checkout.modal.noteOrder')
|
||||
@include('guest.checkout.modal.confirmPaymentBilling')
|
||||
@include('guest.checkout.modal.attentionModeUmum')
|
||||
<script>
|
||||
const karhohidrats = {!! json_encode($karbohidrat) !!}
|
||||
</script>
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
<div class="modal fade" id="modalAttentionModeUmum" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered modal-md">
|
||||
<div class="modal-content shadow rounded-4">
|
||||
|
||||
<!-- Modal Header -->
|
||||
<div class="modal-header bg-warning bg-opacity-10 border-bottom-0">
|
||||
<h5 class="modal-title fw-bold text-warning">
|
||||
<i class="fa-solid fa-circle-info me-2"></i> Informasi Pemesanan Masyarakat Umum
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Tutup"></button>
|
||||
</div>
|
||||
|
||||
<!-- Modal Body -->
|
||||
<div class="modal-body">
|
||||
<p class="mb-2">
|
||||
<strong>Perhatian:</strong> Pemesanan untuk <strong>Masyarakat Umum</strong>:
|
||||
</p>
|
||||
<ul class="mb-3 ps-3">
|
||||
<li>
|
||||
Bagi masyarakat umum ,<strong>makanan yang dipesan harus diambil sendiri / tidak diantar/ dapat menggunakan jasa antar online yang dipesan oleh konsumen sendiri</strong>, diambil di Instalsi Gizi RSAB Harapan Kita
|
||||
</li>
|
||||
<li>
|
||||
Waktu pengambilan makanan:
|
||||
<ul class="ps-3 mt-1">
|
||||
<li>Siang: <strong>12.00 - 13.00 WIB</strong></li>
|
||||
<li>Sore: <strong>16.00 - 17.00 WIB</strong></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.</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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- Modal Footer -->
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary rounded-pill" data-bs-dismiss="modal">
|
||||
Saya Mengerti
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -1,8 +1,14 @@
|
||||
<div class="form-step active">
|
||||
<div class="form-step active">
|
||||
<div class="row g-3 mb-4">
|
||||
<input type="hidden" name="cart_data" id="cart_data">
|
||||
<div class="col-md-6">
|
||||
<label for="exampleInputEmail1" class="form-label">Apakah Anda Seorang ? <span class="text-danger">*</span></label>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita" required>
|
||||
<label class="form-check-label" for="radio_karyawan" >
|
||||
Karyawan RSAB Harapan Kita
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_kp" value="Keluarga Pasien / Penunggu Pasien" required>
|
||||
<label class="form-check-label" for="radio_kp">
|
||||
@ -10,34 +16,10 @@
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita" required>
|
||||
<label class="form-check-label" for="radio_karyawan" >
|
||||
Karyawan RSAB Harapan Kita
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_karyawan" value="Karyawan RSAB Harapan Kita (Rapat Internal, Seminar /Pelatihan)" required>
|
||||
<label class="form-check-label" for="radio_karyawan" >
|
||||
Karyawan RSAB Harapan Kita (Rapat Internal, Seminar /Pelatihan)
|
||||
</label>
|
||||
</div>
|
||||
{{-- <div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_public" value="Masyarakat Umum" required>
|
||||
<label class="form-check-label" for="radio_public">
|
||||
Masyarakat Umum
|
||||
</label>
|
||||
</div> --}}
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_public" value="Masyarakat Umum (Personal)" required>
|
||||
<label class="form-check-label" for="radio_public">
|
||||
Masyarakat Umum (Personal)
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="jenis_customer" id="radio_public" value="Masyarakat Umum (Corporate)" required>
|
||||
<label class="form-check-label" for="radio_public">
|
||||
Masyarakat Umum (Corporate)
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
@ -68,7 +50,6 @@
|
||||
<div class="col-md-12">
|
||||
<label class="form-label">Email <span class="text-danger">*</span></label>
|
||||
<input type="email" class="form-control" name="email" id="email" required>
|
||||
<div id="help_email_karyawan" class="form-text d-none">Notifikasi dari sistem belum dapat dikirim ke email dengan domain @rsabhk.co.id, oleh karena itu karyawan disarankan memakai alamat email lain</div>
|
||||
</div>
|
||||
{{-- <div class="col-md-6">
|
||||
<label class="form-label">Tanggal Lahir</label>
|
||||
@ -100,11 +81,8 @@
|
||||
<option value="Ruang Cempaka">Ruang Cempaka</option>
|
||||
<option value="Ruang Widuri">Ruang Widuri</option>
|
||||
<option value="Ruang Teratai">Ruang Teratai</option>
|
||||
<option value="Ruang Anggrek">Ruang Anggrek</option>
|
||||
<option value="Klinik Anggrek">Klinik Melati</option>
|
||||
<option value="Ruang VK">Ruang VK</option>
|
||||
<option value="Klinik Melati">Klinik Melati</option>
|
||||
<option value="Ruang Tanjung">Ruang Tanjung</option>
|
||||
<option value="Ruang Gambir">Ruang Gambir</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@ -120,7 +98,7 @@
|
||||
<option value="VIP A">VIP A</option>
|
||||
<option value="VIP B">VIP B</option>
|
||||
<option value="Kelas I">Kelas I</option>
|
||||
<option value="Klinik Melati">Klinik Melati</option>
|
||||
<option value="Mesa Tesa">Mesa Tesa</option>
|
||||
</select>
|
||||
</div>
|
||||
{{-- End Pasien --}}
|
||||
@ -145,11 +123,7 @@
|
||||
</div>
|
||||
{{-- End Umum --}}
|
||||
|
||||
|
||||
</div>
|
||||
<button type="button" class="btn btn-success w-100 next-step">Lanjutkan</button>
|
||||
</div>
|
||||
{{-- <script>
|
||||
new TomSelect("#ruang_perawatan",{
|
||||
sortField: {field: "text"}
|
||||
})
|
||||
</script> --}}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
<div class="form-step d-none">
|
||||
<div class="form-step d-none">
|
||||
<h5 class="mb-4">Langkah 2: Konfirmasi Pemesanan</h5>
|
||||
|
||||
{{-- Ringkasan Pesanan --}}
|
||||
@ -9,75 +9,74 @@
|
||||
{{-- Akan diisi oleh JavaScript --}}
|
||||
</div>
|
||||
|
||||
{{-- Tombol Navigasi --}}
|
||||
<div class="d-flex justify-content-between mt-4">
|
||||
<button type="button" class="btn btn-secondary prev-step">Sebelumnya</button>
|
||||
<button type="button" class="btn btn-success next-step" id="btnSimpanPemesanan">Lanjutkan</button>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info py-3 px-4 border-4 mt-3 d-none" id="karyawan" role="alert">
|
||||
<div class="fw-bold mb-2">
|
||||
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||
<div class="alert alert-info py-3 px-4 small border-start border-4 border-primary mt-3 d-none" id="karyawan" role="alert">
|
||||
<div class="fw-bold mb-2">
|
||||
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||
</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 Sameday:</strong>.
|
||||
<ul class="ps-3 mt-1">
|
||||
<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>
|
||||
Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.
|
||||
</li>
|
||||
<li>
|
||||
Pengambilan makanan dilakukan sendiri di <strong>Instalasi Gizi (Ruang Distribusi Makan)</strong>:
|
||||
<ul class="ps-3 mt-1">
|
||||
<li>Siang: <strong>12.00 – 13.00 WIB</strong></li>
|
||||
<li>Sore: <strong>16.00 – 17.00 WIB</strong></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
Jenis karbohidrat dapat dipilih sesuai pilihan yang tersedia.
|
||||
</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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p class="mb-2">
|
||||
Bagi Karyawan, makanan yang dipesan <strong>harus diambil sendiri</strong> (tidak diantar).
|
||||
Pengambilan dilakukan di <strong>Instalasi Gizi (Ruang Distribusi Makan)</strong> dengan jadwal berikut:
|
||||
</p>
|
||||
<ul class="mb-0 ps-3">
|
||||
<li>Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.</li>
|
||||
<li>
|
||||
Waktu pengambilan makanan:
|
||||
<ul class="ps-3 mt-1">
|
||||
<li>Siang: <strong>12.00 - 13.00 WIB</strong></li>
|
||||
<li>Sore: <strong>16.00 - 17.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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info py-3 px-4 border-4 mt-3 d-none" id="pasien" role="alert">
|
||||
<div class="fw-bold mb-2">
|
||||
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||
<div class="alert alert-info py-3 px-4 small border-start border-4 border-primary mt-3 d-none" id="pasien" role="alert">
|
||||
<div class="fw-bold mb-2">
|
||||
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||
</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 Sameday:</strong>.
|
||||
<ul class="ps-3 mt-1">
|
||||
<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>
|
||||
Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.
|
||||
</li>
|
||||
<li>
|
||||
Jenis karbohidrat dapat dipilih sesuai pilihan yang tersedia.
|
||||
</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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p class="mb-2">
|
||||
Bagi Keluarga atau Penunggu Pasien, makanan yang dipesan <strong>akan diantarkan</strong> ke ruang perawatan.
|
||||
</p>
|
||||
<ul class="mb-0 ps-3">
|
||||
<li>
|
||||
Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.
|
||||
</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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="alert alert-info py-3 px-4 border-4 mt-3 d-none" id="umum" role="alert">
|
||||
<div class="fw-bold mb-2">
|
||||
<i class="fa fa-info-circle me-1"></i>Informasi Penting
|
||||
</div>
|
||||
<p class="mb-2">
|
||||
Bagi masyarakat umum ,<strong>makanan yang dipesan harus diambil sendiri / tidak diantar/ dapat menggunakan jasa antar online yang dipesan oleh konsumen sendiri</strong>, diambil di Instalasi Gizi RSAB Harapan Kita.
|
||||
</p>
|
||||
<ul class="mb-0 ps-3">
|
||||
<li>
|
||||
Waktu pengambilan makanan:
|
||||
<ul class="ps-3 mt-1">
|
||||
<li>Siang: <strong>12.00 - 13.00 WIB</strong></li>
|
||||
<li>Sore: <strong>16.00 - 17.00 WIB</strong></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Pemesanan tidak dapat dibatalkan dan tidak ada pengembalian uang.</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>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<div class="card shadow-sm p-4">
|
||||
<div class="row justify-content-center text-center">
|
||||
<div class="col-12 col-sm-10 col-md-8 col-lg-6 mb-3">
|
||||
<img src="/logo/qris.jpg" alt="Pembayaran"
|
||||
<img src="gambar/qris.jpg" alt="Pembayaran"
|
||||
class="img-fluid rounded shadow w-100"
|
||||
style="max-width: 500px; height: auto;">
|
||||
</div>
|
||||
@ -35,13 +35,13 @@
|
||||
<!-- Bank -->
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 col-sm-12 fw-semibold">Bank</div>
|
||||
<div class="col-md-6 col-sm-12 text-sm-end">Bank BRI</div>
|
||||
<div class="col-md-6 col-sm-12 text-sm-end">Bank BCA</div>
|
||||
</div>
|
||||
|
||||
<!-- Nama Rekening -->
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-6 col-sm-12 fw-semibold">Nama Rek.</div>
|
||||
<div class="col-md-6 col-sm-12 text-sm-end">RPL 182 RSAB HARKIT OPR BLU PENERIMAAN</div>
|
||||
<div class="col-md-6 col-sm-12 text-sm-end">RSAB Harapan Kita</div>
|
||||
</div>
|
||||
|
||||
<!-- No Rek -->
|
||||
@ -53,7 +53,7 @@
|
||||
<i class="fa fa-copy me-1"></i> Salin
|
||||
</button>
|
||||
</div>
|
||||
<strong id="noRekText" class="d-block text-sm-end">096201000073308</strong>
|
||||
<strong id="noRekText" class="d-block text-sm-end">1234-5678-9101</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -105,9 +105,6 @@
|
||||
<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>
|
||||
<p class="text-muted small text-center px-2 py-2">
|
||||
<strong>Makanan yg sudah dipesan tidak dapat dibatalkan, dan tidak ada pengembalian uang</strong>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -49,10 +49,6 @@
|
||||
></script>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css" />
|
||||
<script src="https://cdn.jsdelivr.net/gh/mcstudios/glightbox/dist/js/glightbox.min.js"></script>
|
||||
|
||||
{{-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tom-select/2.4.3/css/tom-select.bootstrap5.min.css" integrity="sha512-gKMzEZw+6phm9jAZ9p9x0MdnT2I8U+cv68/UFA0y/RhG4zh2OKSCW4jkjGTzSXvS9oxxKzJD1Om9VD6xKf8y0A==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/tom-select/2.4.3/js/tom-select.complete.js" integrity="sha512-cv8SyZZkoW3eB3rWs0JsM/wNxKZe59+tMN8ewVIu24I1EAeBOT6lqkdty/iMxo3OJGvrFRYIrrGwM5BJqAXsYw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> --}}
|
||||
</head>
|
||||
|
||||
<body class="index-page">
|
||||
|
||||
@ -5,7 +5,6 @@
|
||||
<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/gizi.png" alt="Logo RSAB HARAPAN KITA" class="" style="height:125px;">
|
||||
<img src="/logo/logo_rsabhk.png" alt="Logo RSAB HARAPAN KITA" class="logo-img">
|
||||
<h1 class="sitename"></h1>
|
||||
</a>
|
||||
@ -17,7 +16,7 @@
|
||||
MCU
|
||||
</button>
|
||||
@endif
|
||||
<button type="button" class="btn btn-outline-success position-relative d-flex lh-sm" style="font-size:14px;" onclick="checkOrderHref()">
|
||||
<button type="button" class="btn btn-outline-success position-relative me-1 d-flex" style="font-size:14px;" onclick="checkOrderHref()">
|
||||
Check Order
|
||||
</button>
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<div class="container">
|
||||
<div class="card shadow-lg p-4 mx-auto" style="max-width: 600px;">
|
||||
<div class="mb-4">
|
||||
<img src="/logo/success.svg" alt="Success" style="width: 100px;">
|
||||
<img src="{{ asset('gambar/success.svg') }}" alt="Success" style="width: 100px;">
|
||||
</div>
|
||||
<h3 class="text-success mb-3">Pesanan Anda Berhasil!</h3>
|
||||
<p class="lead">Terima kasih atas pesanan Anda. Kami akan segera menyiapkannya dan menghubungi Anda jika diperlukan.</p>
|
||||
|
||||
@ -1,155 +0,0 @@
|
||||
@extends('guest.layout.main')
|
||||
@section('body_main_guests')
|
||||
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8 col-lg-7">
|
||||
|
||||
<div class="text-center mb-5">
|
||||
@if($type === "pengguna_baru")
|
||||
<h2 class="fw-bold text-dark mb-3">Form Kepuasan Pelanggan Terkait Penggunaan Aplikasi Catering Gizi RSABHK</h2>
|
||||
@else
|
||||
<h2 class="fw-bold text-dark mb-3">Form Kepuasan Pelanggan Catering Instalasi Gizi RSAB HK </h2>
|
||||
@endif
|
||||
<p class="text-secondary mx-auto" style="max-width: 500px;">
|
||||
Terima kasih telah memesan di <strong>Catering Instalasi Gizi RSAB HK</strong>. Masukan Anda sangat berarti bagi peningkatan kualitas layanan kami.
|
||||
</p>
|
||||
<div class="mx-auto mt-3"></div>
|
||||
</div>
|
||||
<form action="" method="POST" id="surveyForm">
|
||||
@csrf
|
||||
<div class="card border-0 shadow-sm mb-4 overflow-hidden" style="border-radius: 15px;">
|
||||
{{-- <div class="card-body p-4">
|
||||
<div class="d-flex align-items-center mb-3">
|
||||
<div class="bg-light rounded-circle p-2 me-3">
|
||||
<i class="fas fa-user text-primary"></i>
|
||||
</div>
|
||||
<label class="form-label fw-semibold mb-0">Nama Pelanggan <span class="text-danger">*</span></label>
|
||||
</div>
|
||||
<input type="text" name="nama_pelanggan" class="form-control custom-input" placeholder="Masukkan nama lengkap Anda..." required>
|
||||
</div> --}}
|
||||
</div>
|
||||
|
||||
<div class="card border-0 shadow-sm mb-4" style="border-radius: 15px;">
|
||||
<div class="card-body p-4 text-center">
|
||||
@if($type === "pengguna_baru")
|
||||
<label class="form-label fw-semibold d-block mb-4">Menurut Anda apakah aplikasi pemesanan catering gizi saat ini mudah untuk digunakan? <span class="text-danger">*</span></label>
|
||||
@else
|
||||
<label class="form-label fw-semibold d-block mb-4">Bagaimana pelayanan catering gizi yang anda dapatkan ? <span class="text-danger">*</span></label>
|
||||
@endif
|
||||
<p class="text-muted small mb-4"><i class="fas fa-info-circle me-1"></i> Silakan pilih salah satu ikon di bawah ini</p>
|
||||
<input type="hidden" name="type" value={{ $type }} />
|
||||
<input type="hidden" name="no_order" value={{ $no_order }} />
|
||||
<div class="row g-3">
|
||||
<div class="col-6">
|
||||
<input type="radio" class="btn-check" name="kepuasan" id="puas" value="Puas" required>
|
||||
<label class="btn btn-outline-light w-100 p-4 emoji-card" for="puas">
|
||||
<div class="emoji-icon mb-2"><img src="/logo/nice.png" style="height:120px;"/> </div>
|
||||
<div class="fw-bold text-dark">Puas</div>
|
||||
</label>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<input type="radio" class="btn-check" name="kepuasan" id="tidak_puas" value="Tidak Puas">
|
||||
<label class="btn btn-outline-light w-100 p-4 emoji-card" for="tidak_puas">
|
||||
<div class="emoji-icon mb-2"><img src="/logo/no_nice.png" style="height:120px;"/></div>
|
||||
<div class="fw-bold text-dark">Tidak Puas</div>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card border-0 shadow-sm mb-4" style="border-radius: 15px;">
|
||||
<div class="card-body p-4">
|
||||
<div class="d-flex align-items-center mb-3">
|
||||
<div class="bg-light rounded-circle p-2 me-3">
|
||||
<i class="fas fa-comment-dots text-primary"></i>
|
||||
</div>
|
||||
<label class="form-label fw-semibold mb-0">Kritik dan Saran <span class="text-danger">*</span></label>
|
||||
</div>
|
||||
<textarea name="kritik_saran" class="form-control custom-input" rows="3" placeholder="Tuliskan masukan atau saran Anda di sini..." required></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end mb-5">
|
||||
{{-- <button type="reset" class="btn btn-light px-4 fw-medium text-muted">Tutup</button> --}}
|
||||
<button type="submit" class="btn btn-primary px-5 fw-bold shadow-sm">Kirim Masukan</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Emoji Card Selector */
|
||||
.emoji-card {
|
||||
border: 2px solid #9b9c9e !important;
|
||||
border-radius: 15px !important;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.emoji-icon {
|
||||
font-size: 2.5rem;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.btn-check:checked + .emoji-card {
|
||||
background-color: #b8ddff !important;
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.btn-check:checked + .emoji-card .emoji-icon {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.emoji-card:hover {
|
||||
border-color: #0c0c0c !important;
|
||||
background: #0f0f0f;
|
||||
}
|
||||
|
||||
/* Requirement text */
|
||||
.text-danger {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
$("#surveyForm").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>Memperoses')
|
||||
const formData = new FormData(this);
|
||||
try {
|
||||
const response = await fetch('/survey', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
|
||||
}
|
||||
});
|
||||
const result = await response.json()
|
||||
if(result.status){
|
||||
Swal.fire({
|
||||
title: 'Survei Berhasil!',
|
||||
text: 'Terima kasih, Masukan anda sangat berarti bagi kami.',
|
||||
icon: 'success',
|
||||
confirmButtonText: 'Berhasil!',
|
||||
confirmButtonColor: '#28a745'
|
||||
}).then(() => {
|
||||
window.location.href = "/success-page"; // kehalaman success
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
Swal.fire({
|
||||
title: 'Gagal!',
|
||||
text: "Terjadi kesalahan saat mengirim melakukan survei.",
|
||||
icon: 'error',
|
||||
confirmButtonText: 'Tutup!'
|
||||
})
|
||||
}finally{
|
||||
buttonSubmit.prop('disabled', false).html('Selesaikan Survei')
|
||||
}
|
||||
})
|
||||
</script>
|
||||
@endsection
|
||||
7
routes/channels.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Broadcast;
|
||||
|
||||
Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
|
||||
return (int) $user->id === (int) $id;
|
||||
});
|
||||
@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use App\Events\MessageSent;
|
||||
use App\Http\Controllers\AuthController;
|
||||
use App\Http\Controllers\CustomerController;
|
||||
use App\Http\Controllers\DashboardController;
|
||||
@ -10,7 +11,6 @@ use App\Http\Controllers\KlasifikasiMenuController;
|
||||
use App\Http\Controllers\MasterMcuController;
|
||||
use App\Http\Controllers\MenuController;
|
||||
use App\Http\Controllers\PesananController;
|
||||
use App\Http\Controllers\SurveyController;
|
||||
use App\Mail\NotifikasiCustomer;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Barryvdh\Snappy\Facades\SnappyPdf;
|
||||
@ -84,11 +84,6 @@ Route::group(['middleware' => ['auth']], function(){
|
||||
Route::get('/pekerjaan/detail/{id}', [PesananController::class, 'getPekerjaanDetail']);
|
||||
Route::get('/pekerjaan/label', [PesananController::class, 'downloadLabel']);
|
||||
Route::get('/data/pending-pekerjaan', [PesananController::class, 'dataPekerjaanPending']);
|
||||
|
||||
Route::get('/survey', [SurveyController::class, 'dashboardSurvey']);
|
||||
Route::get('/datatable/survey', [SurveyController::class, 'datatable']);
|
||||
Route::get('/chart/survey', [SurveyController::class, 'chartDataSurvey']);
|
||||
Route::post('/survey/export', [SurveyController::class, 'exportSurveyExcel']);
|
||||
});
|
||||
|
||||
Route::post('/logout', [AuthController::class, 'logout']);
|
||||
@ -108,10 +103,6 @@ Route::post('/order-mcu', [CustomerController::class, 'storeMcu']);
|
||||
Route::get('/success-mcu', [CustomerController::class, 'successMcu']);
|
||||
Route::get('/karyawan', [CustomerController::class, 'karyawan']);
|
||||
Route::get('/unit-instalasi', [CustomerController::class, 'unitInstalasi']);
|
||||
Route::get('/server-time', fn()=> response()->json(['now' => now()]));
|
||||
Route::get('/survey', [SurveyController::class, 'index']);
|
||||
Route::post('/survey', [SurveyController::class, 'store']);
|
||||
|
||||
|
||||
// Route::get('/send-mail', function(){
|
||||
// Mail::to('skyjok14@gmail.com')->queue(new NotifikasiCustomer('Test'));
|
||||
@ -125,3 +116,8 @@ Route::post('/survey', [SurveyController::class, 'store']);
|
||||
// return $pdf->stream('label_.pdf');
|
||||
|
||||
// });
|
||||
|
||||
Route::get('/send-test', function(){
|
||||
broadcast(new MessageSent('HALO INI DARI SERVER'));
|
||||
return 'event terkirim';
|
||||
});
|
||||
|
||||