diff --git a/app/Http/Controllers/PesananController.php b/app/Http/Controllers/PesananController.php index 1565c26..51aa947 100644 --- a/app/Http/Controllers/PesananController.php +++ b/app/Http/Controllers/PesananController.php @@ -129,6 +129,7 @@ class PesananController extends Controller public function actionOrderViaBilling(Request $request, string $order_id){ DB::connection('dbOrderGizi')->beginTransaction(); try { + $order = Order::where('order_id', $order_id)->first(); $payload = [ 'pegawai_id_confirm_order' => auth()->user()->id, @@ -137,6 +138,11 @@ class PesananController extends Controller 'status_order' => 'Lunas', 'cara_pembayaran' => 'Billing' ]; + if($request->hasFile('evidence_medical_record')){ + $file = $request->file('evidence_medical_record'); + $path = $file->store('evidence_medical_record', 'public'); + $payload['evidence_medical_record'] = $path; + } $order->update($payload); if($order->email){ @@ -210,6 +216,8 @@ class PesananController extends Controller 'o.status_order', 'o.bukti_pembayaran', 'o.note_dibatalkan', + 'o.medical_record', + 'o.evidence_medical_record', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); @@ -228,6 +236,8 @@ class PesananController extends Controller 'status_order' => $first->status_order, 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, + 'medical_record' => $first->medical_record, + 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, @@ -284,13 +294,28 @@ class PesananController extends Controller public function exportPekerjaan(){ $startDate = request('start_date'); $endDate = request('end_date'); - $now = Carbon::now()->format('Y-m-d H-i'); - $orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q){ + $type_customer = request('type_customer'); + $type = request('type'); + + $orderDetail = OrderDetail::with(['menu', 'paketMenu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){ $q->where('status_order', 'Lunas'); + if($type_customer !== 'all'){ + $q->where('jenis_customer', $type_customer); + } })->whereBetween('tgl_antar', [$startDate, $endDate])->get(); + + if($type === 'pdf'){ + return $this->helperPdfPekerjaan($orderDetail, $startDate, $endDate); + }else{ + return $this->helperExcelPekerjaan($orderDetail, $startDate, $endDate); + } + } + + public function helperPdfPekerjaan($orderDetail, $startDate, $endDate){ $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); - $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $now = Carbon::now()->format('Y-m-d H-i'); $data = [ 'pekerjaan' => $orderDetail, 'waktu_cetak' => $waktu_cetak, @@ -301,35 +326,202 @@ class PesananController extends Controller return $pdf->stream("daftar-pesanan-{$now}.pdf"); } + public function helperExcelPekerjaan($orderDetail, $startDate, $endDate){ + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + $sheet->setCellValue('A1', "Menu Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); + $sheet->mergeCells('A1:K1'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); + $sheet->mergeCells('A2:K2'); + $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); + + // Header tabel + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pesanan", "Menu Pesanan", "Karbohidrat", "Jumlah", "Tanggal Antar", "Waktu Makan", "Catatan"]; + $sheet->fromArray($headers, null, 'A4'); + $sheet->getStyle('A4:K4')->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + ] + ] + ]); + $sheet->getStyle('A4:K4')->getFont()->setBold(true); + $sheet->getStyle('A4:K4')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A4:K4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + // Isi data + $row = 5; + 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?->jenis_customer); + $sheet->setCellValue("E{$row}", $item?->status_order ?? "-"); + $sheet->setCellValue("F{$row}", $item?->menu?->nama_menu ?? '-'); + $karbohidratNama = $item?->karbohidrat?->nama_karbohidrat ?? '-'; + $karbohidratNilai = $item?->karbohidrat?->nilai_kalori ?? '-'; + $sheet->setCellValue("G{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} Kkal)" : '')); + $sheet->setCellValue("H{$row}", $item?->jumlah ?? '-'); + $sheet->setCellValue("I{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); + $sheet->setCellValue("J{$row}", $item?->type ?? "-"); + $sheet->setCellValue("K{$row}", $item?->catatan ?? "-"); + // Border tiap baris + $sheet->getStyle("A{$row}:K{$row}")->getBorders()->getAllBorders() + ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $row++; + } + // Auto size kolom + foreach(range('A', 'K') as $col){ + $sheet->getColumnDimension($col)->setAutoSize(true); + } + $lastRow = $row - 1; + $sheet->setAutoFilter("A4:K{$lastRow}"); + // Download file + $fileName = 'menu-pesanan' . now()->format('Ymd-His') . '.xlsx'; + $writer = new Xlsx($spreadsheet); + + // Output ke browser + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header('Cache-Control: max-age=0'); + + $writer->save('php://output'); + exit; + } + public function exportPending(){ $startDate = Carbon::parse(request('start_date'))->startOfDay(); $endDate = Carbon::parse(request('end_date'))->endOfDay(); - $order = Order::where('statusenabled', true) + $type = request('type'); + $type_customer = request('type_customer'); + $query = Order::where('statusenabled', true) ->whereBetween('entry_at', [$startDate, $endDate]) - ->with('orderDetail') - ->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing']) - ->get(); - $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); - $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); - $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + ->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing']); + if($type_customer !== 'all'){ + $query->where('jenis_customer', $type_customer); + } + $order = $query->with('orderDetail')->get(); + $title= 'konfirmasi-pesanan'; + $titlePdf = 'LAPORAN KONFIRMASI PESANAN'; + if($type === 'pdf'){ + return $this->pdfHelper($startDate, $endDate, $order, $titlePdf, $title); + }else{ + return $this->excelHelper($startDate, $endDate, $order, $title); + } - $data = [ - 'laporan' => 'LAPORAN KONFIRMASI PESANAN', - 'waktu_cetak' => $waktu_cetak, - 'orders' => $order, - 'startDate' => $startDateFormatted, - 'endDate' => $endDateFormatted - ]; - $pdf = Pdf::loadView('dashboard.pesanan.pending.pdf', $data); + } - return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); + public function pdfHelper($startDate, $endDate, $order, $titlePdf, $title){ + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + + $data = [ + 'laporan' => $titlePdf, + 'waktu_cetak' => $waktu_cetak, + 'orders' => $order, + 'startDate' => $startDateFormatted, + 'endDate' => $endDateFormatted + ]; + $pdf = Pdf::loadView('dashboard.pesanan.pending.pdf', $data); + + return $pdf->stream($title . now()->format('Ymd-His') . '.pdf'); + } + + public function excelHelper($startDate, $endDate, $order, $title){ + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + $sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); + $sheet->mergeCells('A1:P1'); + $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->getStyle('A2')->getAlignment()->setHorizontal('center'); + + // Header tabel + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Status Pembayaran", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"]; + $sheet->fromArray($headers, null, 'A4'); + $sheet->getStyle('A4:Q4')->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \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; + 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); + $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 ?? '-'); + $sheet->setCellValue("M{$row}", $detail?->jumlah ?? '-'); + $sheet->setCellValue("N{$row}", $detail?->status_order ?? "-"); + $sheet->setCellValue("O{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); + $sheet->setCellValue("P{$row}", $detail?->type ?? "-"); + $sheet->setCellValue("Q{$row}", $detail?->catatan ?? "-"); + // Border tiap baris + $sheet->getStyle("A{$row}:Q{$row}")->getBorders()->getAllBorders() + ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + + $row++; + } + } + + // Auto size kolom + foreach(range('A', 'Q') as $col){ + $sheet->getColumnDimension($col)->setAutoSize(true); + } + $lastRow = $row - 1; + $sheet->setAutoFilter("A4:Q{$lastRow}"); + // Download file + $fileName = $title . now()->format('Ymd-His') . '.xlsx'; + $writer = new Xlsx($spreadsheet); + + // Output ke browser + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header('Cache-Control: max-age=0'); + + $writer->save('php://output'); + exit; } public function exportSelesai(){ $startDate = Carbon::parse(request('start_date'))->startOfDay(); $endDate = Carbon::parse(request('end_date'))->endOfDay(); - + $type = request('type'); $order = Order::where('statusenabled', true) ->whereBetween('entry_at', [$startDate, $endDate]) ->with('orderDetail') @@ -338,20 +530,14 @@ class PesananController extends Controller $q->where('status_order', '!=', 'Selesai'); }) ->get(); + $title= 'pesanan-selesai'; + $titlePdf = 'LAPORAN PESANAN SELESAI'; - $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); - $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); - $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); - - $data = [ - 'waktu_cetak' => $waktu_cetak, - 'orders' => $order, - 'startDate' => $startDateFormatted, - 'endDate' => $endDateFormatted - ]; - $pdf = Pdf::loadView('dashboard.pesanan.selesai.pdf', $data); - - return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); + if($type === 'pdf'){ + return $this->pdfHelper($startDate, $endDate, $order, $titlePdf, $title); + }else{ + return $this->excelHelper($startDate, $endDate, $order, $title); + } } public function countKonfirmasiPesanan(){ @@ -405,6 +591,7 @@ class PesananController extends Controller 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, 'medical_record' => $first->medical_record, + 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, @@ -440,6 +627,7 @@ class PesananController extends Controller 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', + 'o.evidence_medical_record', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); return $data; @@ -477,7 +665,7 @@ class PesananController extends Controller 'startDate' => $startDateFormatted, 'endDate' => $endDateFormatted ]; - $pdf = Pdf::loadView('dashboard.pesanan.pending.pdf', $data); + $pdf = Pdf::loadView('dashboard.pesanan.laporan.pesanan.pdfPesanan', $data); return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); } @@ -490,43 +678,61 @@ class PesananController extends Controller $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); - $sheet->mergeCells('A1:G1'); + $sheet->mergeCells('A1:P1'); $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); - $sheet->mergeCells('A2:G2'); + $sheet->mergeCells('A2:P2'); $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); // Header tabel - $headers = ["No", "Nomor Order", "Nama Customer", "Jenis Customer", "Tanggal Pesanan", "Total", "Detail Pesanan"]; + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Jenis Kelamin", "NO.HP/WA", "Email" , "Cara Pembayaran", "Tanggal Pesan", "Harga Total", "Menu Pesanan", "Jumlah", "Status Pesanan", "Tanggal Antar", "Waktu Makan", "Catatan"]; $sheet->fromArray($headers, null, 'A4'); - $sheet->getStyle('A4:G4')->getFont()->setBold(true); - $sheet->getStyle('A4:G4')->getAlignment()->setHorizontal('center'); - $sheet->getStyle('A4:G4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $sheet->getStyle('A4:P4')->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + ] + ] + ]); + $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); // Isi data $row = 5; foreach ($order as $index => $item) { - $sheet->setCellValue("A{$row}", $index + 1); - $sheet->setCellValue("B{$row}", $item->no_order); - $sheet->setCellValue("C{$row}", $item->nama_pemesan); - $sheet->setCellValue("D{$row}", $item->jenis_customer); - $sheet->setCellValue("E{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i')); - $sheet->setCellValue("F{$row}", $item->total_harga); - $sheet->setCellValue("G{$row}", $item->orderDetail->map(function ($detail) { - return $detail->nama_menu . ' x' . $detail->jumlah; - })->implode(', ')); + 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); + $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); - // Border tiap baris - $sheet->getStyle("A{$row}:G{$row}")->getBorders()->getAllBorders() + $sheet->setCellValue("K{$row}", $detail?->menu?->nama_menu ?? '-'); + $sheet->setCellValue("L{$row}", $detail?->jumlah ?? '-'); + $sheet->setCellValue("M{$row}", $detail?->status_order ?? "-"); + $sheet->setCellValue("N{$row}", $detail?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar"); + $sheet->setCellValue("O{$row}", $detail?->type ?? "-"); + $sheet->setCellValue("P{$row}", $detail?->catatan ?? "-"); + // Border tiap baris + $sheet->getStyle("A{$row}:P{$row}")->getBorders()->getAllBorders() ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); - $row++; + $row++; + } } // Auto size kolom - foreach(range('A', 'G') as $col){ + foreach(range('A', 'P') as $col){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; @@ -544,6 +750,139 @@ class PesananController extends Controller exit; } + public function exportLaporanPendapatan(){ + $startDate = Carbon::parse(request('start_date'))->startOfDay(); + $endDate = Carbon::parse(request('end_date'))->endOfDay(); + $type = request('type'); + $type_customer = request('type_customer'); + $query = Order::where('statusenabled', true)->where('status_order', 'Lunas'); + if($type_customer !== 'all'){ + $query->where('jenis_customer', $type_customer); + } + $order = $query->whereBetween('entry_at', [$startDate, $endDate])->get(); + + if($type === 'pdf'){ + return $this->pdfPendapatan($startDate, $endDate, $order); + }else{ + return $this->excelPendapatan($startDate, $endDate, $order); + } + } + + public function exportSemuaPesanan(){ + $startDate = Carbon::parse(request('start_date'))->startOfDay(); + $endDate = Carbon::parse(request('end_date'))->endOfDay(); + $type = request('type'); + $type_customer = request('type_customer'); + $query = Order::where('statusenabled', true) + ->whereBetween('entry_at', [$startDate, $endDate]); + if($type_customer !== 'all'){ + $query->where('jenis_customer', $type_customer); + } + $order = $query->with('orderDetail')->get(); + $title= 'semua-pesanan'; + $titlePdf = 'LAPORAN SEMUA PESANAN'; + if($type === 'pdf'){ + return $this->pdfHelper($startDate, $endDate, $order, $titlePdf, $title); + }else{ + return $this->excelHelper($startDate, $endDate, $order, $title); + } + } + + public function pdfPendapatan($startDate, $endDate, $order){ + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + $data = [ + 'laporan' => 'Laporan Pendapatan', + 'waktu_cetak' => $waktu_cetak, + 'orders' => $order, + 'startDate' => $startDateFormatted, + 'endDate' => $endDateFormatted + ]; + $pdf = Pdf::loadView('dashboard.pesanan.laporan.pesanan.pdfPendapatan', $data); + + return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); + } + + public function excelPendapatan($startDate, $endDate, $order){ + $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); + $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); + $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + $sheet->setCellValue('A1', "Laporan Pendapatan dari {$startDateFormatted} sampai {$endDateFormatted}"); + $sheet->mergeCells('A1:G1'); + $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14); + $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + + $sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}"); + $sheet->mergeCells('A2:G2'); + $sheet->getStyle('A2')->getAlignment()->setHorizontal('center'); + + // Header tabel + $headers = ["No", "Nomor Order", "Nama Pemesan", "Jenis Customer", "Cara Pembayaran", "Tanggal Pesan", "Harga Total"]; + $sheet->fromArray($headers, null, 'A4'); + $sheet->getStyle('A4:G4')->applyFromArray([ + 'font' => ['bold' => true], + 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + ] + ] + ]); + $sheet->getStyle('A4:G4')->getFont()->setBold(true); + $sheet->getStyle('A4:G4')->getAlignment()->setHorizontal('center'); + $sheet->getStyle('A4:G4')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + + // Isi data + $row = 5; + $totalPendapatan = 0; + foreach ($order as $index => $item) { + $sheet->setCellValue("A{$row}", $index + 1); + $sheet->setCellValue("B{$row}", $item->no_order); + $sheet->setCellValue("C{$row}", $item->nama_pemesan); + $sheet->setCellValue("D{$row}", $item->jenis_customer); + $sheet->setCellValue("E{$row}", $item->cara_pembayaran); + $sheet->setCellValue("F{$row}", Carbon::parse($item->entry_at)->translatedFormat('d F Y H:i')); + $sheet->setCellValue("G{$row}", $item->total_harga); + $totalPendapatan += $item->total_harga; + // Border tiap baris + $sheet->getStyle("A{$row}:G{$row}")->getBorders()->getAllBorders() + ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + $row++; + } + $sheet->setCellValue("F{$row}", "Total Pendapatan"); + $sheet->setCellValue("G{$row}", $totalPendapatan); + $sheet->getStyle("F{$row}:G{$row}")->applyFromArray([ + 'font' => ['bold' => true], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + ] + ] + ]); + + + // Auto size kolom + foreach(range('A', 'G') as $col){ + $sheet->getColumnDimension($col)->setAutoSize(true); + } + $lastRow = $row - 1; + $sheet->setAutoFilter("A4:G{$lastRow}"); + // Download file + $fileName = 'laporan-pendapatan-' . now()->format('Ymd-His') . '.xlsx'; + $writer = new Xlsx($spreadsheet); + + // Output ke browser + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header("Content-Disposition: attachment; filename=\"{$fileName}\""); + header('Cache-Control: max-age=0'); + + $writer->save('php://output'); + exit; + } public function indexSemua(){ $payload = [ @@ -580,6 +919,7 @@ class PesananController extends Controller 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', + 'o.evidence_medical_record', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); @@ -598,6 +938,8 @@ class PesananController extends Controller 'status_order' => $first->status_order, 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, + 'medical_record' => $first->medical_record, + 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, diff --git a/app/Mail/NotifikasiCustomer.php b/app/Mail/NotifikasiCustomer.php index 5cad41a..b2b19cd 100644 --- a/app/Mail/NotifikasiCustomer.php +++ b/app/Mail/NotifikasiCustomer.php @@ -30,44 +30,11 @@ class NotifikasiCustomer extends Mailable * Get the message content definition. */ public function build(){ - return $this->subject('Konfirmasi Pesanan Anda')->html(" -
Halo, {$this->pemesan},
-Terima kasih telah melakukan pemesanan. Berikut detail pesanan Anda:
- -| No. Order | -{$this->noOrder} | -
| Tanggal | -" . now()->format('d M Y H:i') . " | -
| Status | -Menunggu Pembayaran | -
| Nominal Harus Bayar | -Rp ". number_format($this->total_harga, 0,',', '.') - ." | -
Silakan segera lakukan pembayaran ke rekening berikut:
-Jika Anda tidak merasa melakukan pesanan ini, abaikan email ini.
- -© " . date('Y') . " RSAB Harapan Kita
-Halo, {$this->pemesan},
-Pembayaran kamu untuk pesanan #{$this->noOrder} telah berhasil kami verifikasi.
+ return $this->subject('Pembayaran Telah Dikonfirmasi') + ->view('mail_view.konfirmasi_pesanan') + ->with([ + 'pemesan' => $this->pemesan, + 'noOrder' => $this->noOrder, + 'total_harga' => $this->total_harga, + ]); -| Nomor Order | -{$this->noOrder} | -
| Total Pembayaran | -Rp " . number_format($this->total_harga, 0, ',', '.') . " | -
| Status | -Pembayaran Diterima | -
Pesanan kamu sedang kami proses. Silakan tunggu pemberitahuan berikutnya untuk pengambilan makanan.
- -© " . date('Y') . " RSAB Harapan Kita
-Halo, {$this->pemesan},
-Kami telah menerima bukti pembayaran untuk pesanan kamu dengan nomor {$this->noOrder}.
-Tim kami akan segera memverifikasi pembayaran tersebut.
- -Mohon tunggu konfirmasi selanjutnya dari admin. Kami akan kirimkan email ketika pembayaran telah diverifikasi.
- -Terima kasih telah melakukan pemesanan.
- -© " . date('Y') . " RSAB Harapan Kita
-
+
Nama Menu: ${detail?.menu?.nama_menu || '-'}
@@ -38,10 +38,12 @@ function fetchDetailOrder(order_id){ ${data.bukti_pembayaran ? `Jenis Customer: ${data.jenis_customer}
+Jenis Kelamin: ${data?.jenis_kelamin}
+Jenis Customer: ${data?.jenis_customer}
+Email: ${data?.email || '-'}
+No.Hp / WA: ${data?.no_wa || '-'}
+Tinggi Badan / Berat Badan: ${data?.tinggi_badan || '-'} / ${data?.berat_badan || '-'}
${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? `Nama Menu: ${data?.menu?.nama_menu || data?.paket_menu?.nama_menu}
@@ -24,10 +24,13 @@ function detailOrder(id){ ${data?.status_order} +Catatan: ${data?.catatan || '-'}
Pemesan: ${data?.order?.nama_pemesan || '-'}
Jenis Kelamin: ${data?.order?.jenis_kelamin || '-'}
-Jenis Customer: ${data?.order?.jenis_customer || '-'}
+No.HP / WA: ${data?.order?.no_wa || '-'}
+Email: ${data?.order?.email || '-'}
+Tinggi Badan / Berat Badan: ${data?.order?.tinggi_badan || '-'} / ${data?.order?.berat_badan || '-'}
${data?.order?.jenis_customer === "Masyarakat Umum" ? `Alamat: ${data?.order?.alamat || '-'}
` : data?.order?.jenis_customer === "Karyawan RSAB Harapan Kita" ? ` diff --git a/public/js/pesanan_pending/_init.js b/public/js/pesanan_pending/_init.js index 41e17fe..d99fd3d 100644 --- a/public/js/pesanan_pending/_init.js +++ b/public/js/pesanan_pending/_init.js @@ -13,6 +13,7 @@ const formActionProgressOrder = $("#formActionProgressOrder") const modalExport = document.getElementById('modalExportPending'); +const modalExportPekerjaan = document.getElementById('modalExportPekerjaan'); const datatableOfPekerjaan = $("#datatableVerifikasiMakananOffcanvas") const modalDetailOrder = document.getElementById('modalDetailOrderOf'); diff --git a/public/js/pesanan_pending/of_dt.js b/public/js/pesanan_pending/of_dt.js index f73a1d8..cac7d45 100644 --- a/public/js/pesanan_pending/of_dt.js +++ b/public/js/pesanan_pending/of_dt.js @@ -18,8 +18,26 @@ document.addEventListener('DOMContentLoaded', function () { }); initPekerjaanDt(); + getReminderVerifikasiMakananOffCanvas() }); +const getReminderVerifikasiMakananOffCanvas = () => { + $.ajax({ + url: `/dashboard/count/verifikasi-pesanan`, + success: function (response) { + const konfirmasiPesanan = document.getElementById("konfirmasi_pesanan_offcanvas"); + let count = response.count; + + konfirmasiPesanan.classList.remove('d-none'); + if(count === 0){ + konfirmasiPesanan.classList.add('d-none'); + } + konfirmasiPesanan.innerText = count; + }, + }); +}; + + // Update Label Tanggal function updateTimeLabel(dates) { const $timeLabel = $("#confirm_pekerjaan_time"); @@ -190,9 +208,10 @@ function detailOrder(id){Harga Satuan: Rp ${parseInt(data?.harga_satuan || 0).toLocaleString('id-ID')}
Status Pesanan: - ${data?.status_order} + ${data?.status_order}
+Catatan: ${data?.catatan || '-'}
Pemesan: ${data?.order?.nama_pemesan || '-'}
Jenis Kelamin: ${data?.order?.jenis_kelamin || '-'}
@@ -232,8 +251,8 @@ function detailOrder(id){ function exportPekerjaan(){ const offcanvas = bootstrap.Offcanvas.getInstance(document.getElementById('offcanvasKonfirmasiPesanan')) || new bootstrap.Offcanvas(document.getElementById('offcanvasKonfirmasiPesanan')); offcanvas.hide(); - new bootstrap.Modal(modalExport).show(); - document.getElementById('formExport').setAttribute('action', '/dashboard/pekerjaan/export') + new bootstrap.Modal(modalExportPekerjaan).show(); + // document.getElementById('formExport').setAttribute('action', '/dashboard/pekerjaan/export') } function approve(e){ @@ -273,6 +292,7 @@ document.getElementById('formActionApproveOrder').addEventListener('submit', fun }); datatableOfPekerjaan.bootstrapTable('refresh'); getReminderVerifikasiMakanan() + getReminderVerifikasiMakananOffCanvas() bootstrap.Modal.getInstance(modalActionOrderPekerjaan).hide(); } else { throw new Error(data.message || 'Terjadi kesalahan saat mengubah status.'); diff --git a/public/js/pesanan_selesai/detail_order.js b/public/js/pesanan_selesai/detail_order.js index dc95636..2d7d545 100644 --- a/public/js/pesanan_selesai/detail_order.js +++ b/public/js/pesanan_selesai/detail_order.js @@ -11,7 +11,7 @@ function fetchDetailOrder(order_id){
+
Nama Menu: ${detail?.menu?.nama_menu || '-'}
@@ -33,68 +33,79 @@ function fetchDetailOrder(order_id){ }).join(''); const html = ` -
- Jenis Customer: ${data.jenis_customer}
- - ${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? ` -Nama Pasien: ${data.nama_pasien}
-Nomor Kamar: ${data.no_kamar_perawatan}
-Ruang Perawatan: ${data.ruang_perawatan}
-Kelas Perawatan: ${data.kelas_perawatan}
-Bagian / Instalasi: ${data.bagian_instalasi}
-Ekstensien: ${data.no_ekstensien || '-'}
-No Order: ${data.no_order}
-Metode Pembayaran: ${data.cara_pembayaran}
- ${data?.cara_pembayaran === 'Billing' ? ` -No.Medical Record: ${data.medical_record}
- `: ''} -Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}
-Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}
+ + ${data.bukti_pembayaran ? ` +
+ Jenis Customer: ${data?.jenis_customer}
+Email: ${data?.email || '-'}
+No.Hp / WA: ${data?.no_wa || '-'}
+Tinggi Badan / Berat Badan: ${data?.tinggi_badan || '-'} / ${data?.berat_badan || '-'}
+ + ${ + data?.jenis_customer === "Masyarakat Umum" + ? ` +Alamat: ${data?.alamat || '-'}
+ ` + : data?.jenis_customer === "Karyawan RSAB Harapan Kita" + ? ` +Bagian / Instalasi: ${data?.bagian_instalasi || '-'}
+No Ekstensien: ${data?.no_ekstensien || '-'}
+ ` + : ` +Nama Pasien: ${data?.nama_pasien || '-'}
+Ruang Perawatan: ${data?.ruang_perawatan || '-'}
+Nomor Kamar Perawatan: ${data?.no_kamar_perawatan || '-'}
+Kelas Perawatan: ${data?.kelas_perawatan || '-'}
+ ` + } + +No Order: ${data.no_order}
+Metode Pembayaran: ${data.cara_pembayaran}
+ ${data?.cara_pembayaran === 'Billing' ? ` +No. Medical Record: ${data.medical_record}
+ ` : ''} +Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}
+Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}
+Harga: Rp ${parseInt(detail?.harga_satuan || 0).toLocaleString('id-ID')}
Status Pesanan: + id="status_badge_${detail?.order_detail_id}"> ${detail?.status_order}
@@ -33,70 +33,80 @@ function fetchDetailOrder(order_id){ }).join(''); const html = ` -
-
- Jenis Customer: ${data.jenis_customer}
- - ${data?.jenis_customer === 'Keluarga Pasien / Penunggu Pasien' ? ` -Nama Pasien: ${data.nama_pasien}
-Nomor Kamar: ${data.no_kamar_perawatan}
-Ruang Perawatan: ${data.ruang_perawatan}
-Kelas Perawatan: ${data.kelas_perawatan}
-Bagian / Instalasi: ${data.bagian_instalasi}
-Ekstensien: ${data.no_ekstensien || '-'}
-No Order: ${data.no_order}
-Metode Pembayaran: ${data.cara_pembayaran}
- ${data?.cara_pembayaran === 'Billing' ? ` -No.Medical Record: ${data.medical_record}
- `: ''} -Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}
-Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}
+ + ${data.bukti_pembayaran ? ` +
+ Jenis Kelamin: ${data?.jenis_kelamin}
+Jenis Customer: ${data?.jenis_customer}
+Email: ${data?.email || '-'}
+No.Hp / WA: ${data?.no_wa || '-'}
+Tinggi Badan / Berat Badan: ${data?.tinggi_badan || '-'} / ${data?.berat_badan || '-'}
+ + ${ + data?.jenis_customer === "Masyarakat Umum" + ? ` +Alamat: ${data?.alamat || '-'}
+ ` + : data?.jenis_customer === "Karyawan RSAB Harapan Kita" + ? ` +Bagian / Instalasi: ${data?.bagian_instalasi || '-'}
+No Ekstensien: ${data?.no_ekstensien || '-'}
+ ` + : ` +Nama Pasien: ${data?.nama_pasien || '-'}
+Ruang Perawatan: ${data?.ruang_perawatan || '-'}
+Nomor Kamar Perawatan: ${data?.no_kamar_perawatan || '-'}
+Kelas Perawatan: ${data?.kelas_perawatan || '-'}
+ ` + } + +No Order: ${data.no_order}
+Metode Pembayaran: ${data.cara_pembayaran}
+ ${data?.cara_pembayaran === 'Billing' ? ` +No. Medical Record: ${data.medical_record}
+ ` : ''} +Tanggal Pembayaran: ${data.tgl_pembayaran || '-'}
+Total Harga: Rp ${parseInt(data.total_harga).toLocaleString('id-ID')}
+
+ | No | +No Order | +Status Bayar | +Nama Pemesan | +Jenis Customer | +Harga Total | + +|||
|---|---|---|---|---|---|---|---|---|
| {{ $no++ }} | +{{ $order->no_order }} | +{{ $order->status_order . ' ('. $order->cara_pembayaran .')' }} | +{{ $order->nama_pemesan }} | +{{ $order->jenis_customer }} | +Rp {{ number_format($order->total_harga, 0, '.', '.') }} | +|||
| Tidak ada data pendapatan | +||||||||
| Total Pendapatan: | +Rp {{ number_format($totalPendapatan, 0, '.', '.') }} | +|||||||
+ | No | +No Order | +Status Bayar | +Nama Pemesan | +Menu | +Status Order | +Jumlah | +Harga Satuan (Rp) | +Tanggal Antar | +Waktu Makan | +
|---|---|---|---|---|---|---|---|---|---|
| {{ $i === 0 ? $no++ : '' }} | +{{ $i === 0 ? $order->no_order : '' }} | +{{ $i === 0 ? (($order->status_order === "Belum Bayar" || $order->status_order === "Dibatalkan" ) ? $order->status_order : $order->status_order . ' ('. $order->cara_pembayaran .')' ) : '' }} | +
+ @if ($i === 0)
+ {{ $order->nama_pemesan }}
+ @if ($order->jenis_customer)
+ ({{ $order->jenis_customer }}) + @endif + @endif + |
+ {{ $detail->menu->nama_menu ?? '-' }} | +{{ $detail->status_order ?? '-' }} | +{{ $detail->jumlah }} | +{{ number_format($detail->harga_satuan, 0, ',', '.') }} | ++ {{ $detail->tgl_antar + ? \Carbon\Carbon::parse($detail->tgl_antar)->locale('id')->translatedFormat('d F Y') + : '-' }} + | +{{ $detail->type }} | +
| Tidak ada data pesanan | +|||||||||