1138 lines
50 KiB
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)
|
|
{
|
|
//
|
|
}
|
|
}
|