'Pesanan Pending' ]; return view('dashboard.pesanan.pending.index', $payload); } public function getDataPending(){ $tanggal = request('tanggal'); if(!empty($tanggal)){ $tanggalFormatted = collect($tanggal)->map(function ($tgl){ return Carbon::parse($tgl)->toDateString(); })->toArray(); }else{ $tanggalFormatted = [Carbon::now()->toDateString()]; } $dataPending = Order::whereIn('status_order', [ 'Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU' ]) ->select(DB::raw('COUNT(DISTINCT DATE(entry_at)) as total')) ->value('total'); $orders = DB::connection('dbOrderGizi')->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->where('o.statusenabled', true) ->whereRaw( "DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")", $tanggalFormatted ) ->whereIn('o.status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU']) ->select( 'o.order_id', 'o.entry_at', 'o.no_order', 'o.nama_pemesan', 'o.jenis_customer', 'o.cara_pembayaran', 'o.status_order', 'o.total_harga', 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', 'o.nama_institusi', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); $grouped = $orders->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); $selesaiDetail = $items->where('detail_status_order', 'Selesai')->count(); $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; return [ 'order_id' => $first->order_id, 'entry_at' => $first->entry_at, 'no_order' => $first->no_order, 'nama_pemesan' => $first->nama_pemesan, 'jenis_customer' => $first->jenis_customer, 'total_harga' => $first->total_harga, 'status_order' => $first->status_order, 'cara_pembayaran' => $first->cara_pembayaran, 'bukti_pembayaran' => $first->bukti_pembayaran, 'medical_record' => $first->medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, 'note_dibatalkan' => $first->note_dibatalkan, 'nama_institusi' => $first->nama_institusi, ]; }) ->filter(function($item){ return $item['total_detail'] > 0 && $item['total_detail'] != $item['selesai_detail']; })->values(); return response()->json([ 'status' => true, 'rows' => $grouped->values(), 'total' => $grouped->count(), 'dataPending'=> $dataPending ]); } public function actionOrder(Request $request, string $order_id){ DB::connection('dbOrderGizi')->beginTransaction(); try { $order = Order::where('order_id', $order_id)->first(); $action = $request->query('action'); $payload = [ 'pegawai_id_confirm_order' => auth()->user()->id, 'pegawai_name_confirm_order' => auth()->user()->full_name, 'pegawai_at_confirm_order' => Carbon::now(), 'status_order' => $action ?? 'Dibatalkan', ]; if(!$action){ $payload['note_dibatalkan'] = request('note_dibatalkan'); } $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; } } DB::connection('dbOrderGizi')->commit(); return response()->json([ 'status' => true, 'message' => $action ? 'Konfirmasi Order Gizi telah disetujui!' : 'Konfirmasi Order Gizi telah dibatalkan' ]); } catch (\Throwable $th) { DB::connection('dbOrderGizi')->rollBack(); return response()->json([ 'status' => false, 'message' => 'Gagal melakukan Konfirmasi Order Gizi' ]); //throw $th; } } 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, 'pegawai_name_confirm_order' => auth()->user()->full_name, 'pegawai_at_confirm_order' => Carbon::now(), 'status_order' => 'Lunas', ]; 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){ Mail::to($order->email)->send(new NotifikasiKonfirmasiPembayaran($order->nama_pemesan, $order->no_order, $order->total_harga)); } DB::connection('dbOrderGizi')->commit(); return response()->json([ 'status' => true, 'message' =>'Konfirmasi Order Gizi telah disetujui!' ]); } catch (\Throwable $th) { DB::connection('dbOrderGizi')->rollBack(); return response()->json([ 'status' => false, 'message' => 'Gagal melakukan Konfirmasi Order Gizi' ]); //throw $th; } } public function getDataOrderDetail($order_id){ $data = Order::with('orderDetail')->where('order_id', $order_id)->first(); return response()->json($data); } public function updateDetailStatusOrder($order_detail_id){ $orderDetail = OrderDetail::where('order_detail_id', $order_detail_id)->first(); $payload = [ 'status_order' => 'Selesai', 'modified_at' => Carbon::now(), ]; $orderDetail->update($payload); return response()->json([ 'status' => true, ]); } public function dataPending(){ $data = Order::selectRaw('DATE(entry_at) as tgl, COUNT(*) as total') ->whereIn('status_order', [ 'Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU' ]) ->groupBy(DB::raw('DATE(entry_at)')) ->orderBy('tgl', 'asc') ->get(); return response()->json([ 'status' => true, 'rows' => $data->values(), 'total' => $data->count() ]); } public function indexSelesai() { $payload = [ 'title' => 'Pesanan Selesai' ]; return view('dashboard.pesanan.selesai.index', $payload); } public function getDataSelesai(){ $tanggal = request('tanggal'); if(!empty($tanggal)){ $tanggalFormatted = collect($tanggal)->map(function ($tgl){ return Carbon::parse($tgl)->toDateString(); })->toArray(); }else{ $tanggalFormatted = [Carbon::now()->toDateString()]; } $orders = DB::connection('dbOrderGizi')->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->where(['o.statusenabled' => true]) ->whereRaw( "DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")", $tanggalFormatted ) ->select( 'o.order_id', 'o.entry_at', 'o.no_order', 'o.nama_pemesan', 'o.jenis_customer', 'o.total_harga', 'o.cara_pembayaran', 'o.status_order', 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', 'o.evidence_medical_record', 'o.nama_institusi', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); $grouped = $orders->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); $selesaiDetail = $items->where('detail_status_order', 'Selesai')->count(); $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; return [ 'order_id' => $first->order_id, 'entry_at' => $first->entry_at, 'no_order' => $first->no_order, 'nama_pemesan' => $first->nama_pemesan, 'jenis_customer' => $first->jenis_customer, 'total_harga' => $first->total_harga, 'status_order' => $first->status_order, 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, 'medical_record' => $first->medical_record, 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, 'note_dibatalkan' => $first->note_dibatalkan, 'nama_institusi' => $first->nama_institusi, ]; }) ->filter(function($item){ return $item['total_detail'] > 0 && $item['total_detail'] === $item['selesai_detail']; }) ->values(); return response()->json([ 'status' => true, 'rows' => $grouped->values(), 'total' => $grouped->count() ]); } public function pekerjaan(){ $data = [ 'title' => 'List Pekerjaan Order Gizi' ]; return view('dashboard.pesanan.pekerjaan.index', $data); } public function getPekerjaan(){ $data = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q){ $q->where('status_order', 'Lunas'); }); $tanggal = request('tanggal'); $status = request('status'); if(!empty($tanggal)){ $flattened = is_array($tanggal[0]) ? Arr::flatten($tanggal) : $tanggal; $data->whereIn('tgl_antar', $flattened); }else{ $now = Carbon::now()->format('Y-m-d'); $data->where('tgl_antar', $now); } // if($status !== "all"){ // $data->where('status_order', $status); // } $dataPending = OrderDetail::whereHas('order', function($query) { $query->where('status_order', 'Lunas'); })->where('status_order', 'Pending') ->select(DB::raw('COUNT(DISTINCT DATE(tgl_antar)) as total')) ->value('total'); $data = $data->get(); return response()->json([ 'rows' => $data->values(), 'total' => $data->count(), 'dataPending' => $dataPending ]); } public function dataPekerjaanPending(){ $data = OrderDetail::with('order')->where('status_order', 'Pending') ->select(DB::raw('DATE(tgl_antar) as tgl'), DB::raw('COUNT(*) as total')) ->whereHas('order', function($query) { $query->where('status_order', 'Lunas'); // filter status di tabel orders }) ->groupBy(DB::raw('DATE(tgl_antar)')) ->orderBy('tgl', 'asc') ->get(); return response()->json([ 'status' => true, 'rows' => $data->values(), 'total' => $data->count() ]); } public function getPekerjaanDetail($order_detail_id){ $data = OrderDetail::where('order_detail_id', $order_detail_id)->with(['order', 'menu', 'masterMcu'])->first(); return response()->json([ 'status' => true, 'data' => $data ]); } public function exportPekerjaan(){ $startDate = request('start_date'); $endDate = request('end_date'); $type_customer = request('type_customer'); $type = request('type'); $orderDetail = OrderDetail::with(['menu', 'masterMcu', 'order', 'karbohidrat'])->whereHas('order', function($q) use($type_customer){ $q->where('status_order', 'Lunas'); if($type_customer !== 'all'){ $q->where('jenis_customer', $type_customer); } })->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'); $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, 'startDate' => $startDateFormatted, 'endDate' => $endDateFormatted ]; $pdf = Pdf::loadView('dashboard.pesanan.pekerjaan.pdf', $data); 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: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 Pembayaran", "Jenis Customer", "Ruangan", "Status Pesanan", "Jenis Menu", "Menu Pesanan", "Karbohidrat", "Total Kalori (kal)", "Jumlah", "Tanggal Antar", "Waktu Makan / Jam Layanan", "Harga Total", "Catatan"]; $sheet->fromArray($headers, null, 'A4'); $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; $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); $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 ?? "-"); // Border tiap baris $sheet->getStyle("A{$row}:P{$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){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; $sheet->setAutoFilter("A4:P{$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(); $type = request('type'); $type_customer = request('type_customer'); $query = Order::where('statusenabled', true) ->whereBetween('entry_at', [$startDate, $endDate]) ->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU']); 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); } } 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:T1'); $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->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"]; $sheet->fromArray($headers, null, 'A4'); $sheet->getStyle('A4:T4')->applyFromArray([ 'font' => ['bold' => true], 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], 'borders' => [ 'allBorders' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN ] ] ]); $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); // 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 ?? "-"); // Border tiap baris $sheet->getStyle("A{$row}:T{$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){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; $sheet->setAutoFilter("A4:T{$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') ->whereHas('orderDetail') // hanya order yang punya detail ->whereDoesntHave('orderDetail', function($q) { $q->where('status_order', '!=', 'Selesai'); }) ->get(); $title= 'pesanan-selesai'; $titlePdf = 'LAPORAN PESANAN SELESAI'; if($type === 'pdf'){ return $this->pdfHelper($startDate, $endDate, $order, $titlePdf, $title); }else{ return $this->excelHelper($startDate, $endDate, $order, $title); } } public function countKonfirmasiPesanan(){ $count = Order::where('statusenabled', true)->whereIn('status_order', ['Menunggu Konfirmasi Pembayaran', 'Menunggu Konfirmasi Pembayaran Via Billing', 'Menunggu Konfirmasi Pesanan MCU'])->count(); return response()->json([ 'status' => true, 'count' => $count, ]); } public function countVerifikasiPesanan(){ $count = OrderDetail::where('status_order', 'Pending')->with('order')->whereHas('order', function($q){ $q->where('status_order', 'Lunas'); })->count(); return response()->json([ 'status' => true, 'count' => $count, ]); } public function laporanPesanan(){ $data = [ 'title' => 'Laporan Pesanan' ]; return view('dashboard.pesanan.laporan.pesanan.index', $data); } public function getLaporanPesanan(){ $tanggal = request('tanggal'); if(!empty($tanggal)){ $tanggalFormatted = collect($tanggal)->map(function ($tgl){ return Carbon::parse($tgl)->toDateString(); })->toArray(); }else{ $tanggalFormatted = [Carbon::now()->toDateString()]; } $orders = self::helperLaporanPesanan($tanggalFormatted); $grouped = $orders->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); $selesaiDetail = $items->where('detail_status_order', 'Selesai')->count(); $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; return [ 'order_id' => $first->order_id, 'entry_at' => $first->entry_at, 'no_order' => $first->no_order, 'nama_pemesan' => $first->nama_pemesan, 'jenis_customer' => $first->jenis_customer, 'total_harga' => $first->total_harga, 'status_order' => $first->status_order, 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, 'medical_record' => $first->medical_record, 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, 'note_dibatalkan' => $first->note_dibatalkan, 'nama_institusi' => $first->nama_institusi, ]; }) ->values(); return response()->json([ 'status' => true, 'rows' => $grouped->values(), 'total' => $grouped->count() ]); } public function helperLaporanPesanan($tanggalFormatted){ $data = DB::connection('dbOrderGizi')->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->where(['o.statusenabled' => true, 'o.status_order' => 'Lunas']) ->whereRaw( "DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")", $tanggalFormatted ) ->select( 'o.order_id', 'o.entry_at', 'o.no_order', 'o.nama_pemesan', 'o.jenis_customer', 'o.total_harga', 'o.cara_pembayaran', 'o.status_order', 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', 'o.evidence_medical_record', 'o.nama_institusi', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); return $data; } public function exportLaporanPesanan(){ $startDate = Carbon::parse(request('start_date'))->startOfDay(); $endDate = Carbon::parse(request('end_date'))->endOfDay(); $type = request('type'); $type_customer = request('type_customer'); $query = Order::where('statusenabled', true)->where('status_order', 'Lunas'); if($type_customer !== 'all'){ $query->where('jenis_customer', $type_customer); } $order = $query->whereBetween('entry_at', [$startDate, $endDate])->with('orderDetail')->get(); if($type === 'pdf'){ return $this->pdfPesanan($startDate, $endDate, $order); }else{ return $this->excelPesanan($startDate, $endDate, $order); } } public function pdfPesanan($startDate, $endDate, $order){ $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); $data = [ 'laporan' => 'Laporan Pesanan', 'waktu_cetak' => $waktu_cetak, 'orders' => $order, 'startDate' => $startDateFormatted, 'endDate' => $endDateFormatted ]; $pdf = Pdf::loadView('dashboard.pesanan.laporan.pesanan.pdfPesanan', $data); return $pdf->stream('laporan-pesanan-' . now()->format('Ymd-His') . '.pdf'); } public function excelPesanan($startDate, $endDate, $order){ $startDateFormatted = Carbon::parse($startDate)->locale('id')->translatedFormat('d F Y'); $endDateFormatted = Carbon::parse($endDate)->locale('id')->translatedFormat('d F Y'); $waktu_cetak = Carbon::now()->locale('id')->translatedFormat('d F Y'); $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setCellValue('A1', "Laporan Pesanan dari {$startDateFormatted} sampai {$endDateFormatted}"); $sheet->mergeCells('A1: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:S2'); $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"]; $sheet->fromArray($headers, null, 'A4'); $sheet->getStyle('A4:S4')->applyFromArray([ 'font' => ['bold' => true], 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER], 'borders' => [ 'allBorders' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN ] ] ]); $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); // 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); 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 ?? "-"); // Border tiap baris $sheet->getStyle("A{$row}:S{$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){ $sheet->getColumnDimension($col)->setAutoSize(true); } $lastRow = $row - 1; $sheet->setAutoFilter("A4:S{$lastRow}"); // Download file $fileName = 'laporan-pesanan-' . now()->format('Ymd-His') . '.xlsx'; $writer = new Xlsx($spreadsheet); // Output ke browser header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header("Content-Disposition: attachment; filename=\"{$fileName}\""); header('Cache-Control: max-age=0'); $writer->save('php://output'); exit; } public function 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 === "MCU" ? $item->nama_institusi . ' - ' . $item->jenis_customer : $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 = [ 'title' => 'Semua Pesanan', ]; return view('dashboard.pesanan.semua.index', $payload); } public function getSemuaPekerjaan(){ $tanggal = request('tanggal'); if(!empty($tanggal)){ $tanggalFormatted = collect($tanggal)->map(function ($tgl){ return Carbon::parse($tgl)->toDateString(); })->toArray(); }else{ $tanggalFormatted = [Carbon::now()->toDateString()]; } $orders = DB::connection('dbOrderGizi')->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->where(['o.statusenabled' => true]) ->whereRaw( "DATE(o.entry_at) IN (" . implode(',', array_fill(0, count($tanggalFormatted), '?')) . ")", $tanggalFormatted ) ->select( 'o.order_id', 'o.entry_at', 'o.no_order', 'o.nama_pemesan', 'o.jenis_customer', 'o.total_harga', 'o.cara_pembayaran', 'o.status_order', 'o.bukti_pembayaran', 'o.note_dibatalkan', 'o.medical_record', 'o.evidence_medical_record', 'o.nama_institusi', 'od.status_order as detail_status_order' )->get()->groupBy('order_id'); $grouped = $orders->map(function($items){ $first = $items->first(); $totalDetail = $items->count(); $selesaiDetail = $items->where('detail_status_order', 'Selesai')->count(); $progress = $totalDetail > 0 ? round(($selesaiDetail / $totalDetail) * 100) : 0; return [ 'order_id' => $first->order_id, 'entry_at' => $first->entry_at, 'no_order' => $first->no_order, 'nama_pemesan' => $first->nama_pemesan, 'jenis_customer' => $first->jenis_customer, 'total_harga' => $first->total_harga, 'status_order' => $first->status_order, 'bukti_pembayaran' => $first->bukti_pembayaran, 'cara_pembayaran' => $first->cara_pembayaran, 'medical_record' => $first->medical_record, 'evidence_medical_record' => $first->evidence_medical_record, 'progress' => $progress, 'total_detail' => $totalDetail, 'selesai_detail' => $selesaiDetail, 'note_dibatalkan' => $first->note_dibatalkan, 'nama_institusi' => $first->nama_institusi, ]; }) ->values(); return response()->json([ 'status' => true, 'rows' => $grouped->values(), 'total' => $grouped->count() ]); } public function downloadLabel(){ $data = request('data'); $dataArray = explode(',', $data); $orderDetail = OrderDetail::whereIn('order_detail_id', $dataArray)->with(['masterMcu', 'menu', 'order'])->get(); $pdf = Pdf::loadView('dashboard.label.multi', compact('orderDetail')); return $pdf->stream('label_.pdf'); } /** * Show the form for creating a new resource. */ public function create() { // } /** * Store a newly created resource in storage. */ public function store(Request $request) { // } /** * Display the specified resource. */ public function show(string $id) { // } /** * Show the form for editing the specified resource. */ public function edit(string $id) { // } /** * Update the specified resource in storage. */ public function update(Request $request, string $id) { // } /** * Remove the specified resource from storage. */ public function destroy(string $id) { // } }