order_gizi/app/Http/Controllers/PesananController.php

1138 lines
50 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Mail\NotifikasiKonfirmasiPembayaran;
use App\Models\Order;
use App\Models\OrderDetail;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class PesananController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$payload = [
'title' => '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:O1');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(14);
$sheet->getStyle('A1')->getAlignment()->setHorizontal('center');
$sheet->setCellValue('A2', "Waktu Cetak: {$waktu_cetak}");
$sheet->mergeCells('A2:O2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal('center');
// Header tabel
$headers = ["No", "Nomor Order", "Nama Pemesan", "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:O4')->applyFromArray([
'font' => ['bold' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER],
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
]
]
]);
$sheet->getStyle('A4:O4')->getFont()->setBold(true);
$sheet->getStyle('A4:O4')->getAlignment()->setHorizontal('center');
$sheet->getStyle('A4:O4')->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?->jenis_customer === "MCU" ? $item?->order?->nama_institusi . '- MCU' : $item?->order?->jenis_customer);
if($item->order?->jenis_customer === "Keluarga Pasien / Penunggu Pasien"){
$sheet->setCellValue("E{$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("E{$row}", $item?->order?->bagian_instalasi ?? '-');
}else{
$sheet->setCellValue("E{$row}", '-');
}
$sheet->setCellValue("F{$row}", $item?->status_order ?? "-");
if($item->menu?->masterMcu){
$sheet->setCellValue("G{$row}", 'Menu MCU');
}else{
$sheet->setCellValue("G{$row}", $item?->menu?->apakah_someday ? "Menu Someday" : "Menu Normal");
}
$sheet->setCellValue("H{$row}", $item?->menu?->nama_menu ?? $item?->masterMcu?->nama_mcu);
$karbohidratNama = $item?->karbohidrat?->nama_karbohidrat ?? '-';
$karbohidratNilai = $item?->karbohidrat?->nilai_kalori ?? '-';
$sheet->setCellValue("I{$row}", $karbohidratNama . ($karbohidratNilai !== '-' ? " ({$karbohidratNilai} kal)" : ''));
$sheet->setCellValue("J{$row}", $item?->total_kalori ?? '-');
$sheet->setCellValue("K{$row}", $item?->jumlah ?? '-');
$sheet->setCellValue("L{$row}", $item?->tgl_antar ? Carbon::parse($item->tgl_antar)->translatedFormat('d F Y') : "Tanggal Antar");
$sheet->setCellValue("M{$row}", $item?->type ?? $item->jam_layanan);
$sheet->setCellValue("N{$row}", $item?->order?->total_harga);
$sheet->setCellValue("O{$row}", $item?->catatan ?? "-");
// Border tiap baris
$sheet->getStyle("A{$row}:O{$row}")->getBorders()->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$totalPendapatan += $item?->order?->total_harga;
$row++;
}
$sheet->getStyle("L{$row}:N{$row}")->getFont()->setBold(true);
$sheet->getStyle("L{$row}:N{$row}")->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$sheet->setCellValue("L{$row}", 'Total Pendapatan');
$sheet->setCellValue("N{$row}", $totalPendapatan);
// Auto size kolom
foreach(range('A', 'O') as $col){
$sheet->getColumnDimension($col)->setAutoSize(true);
}
$lastRow = $row - 1;
$sheet->setAutoFilter("A4:O{$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 Someday" : "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 Someday" : "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)
{
//
}
}