'Halaman Utama' ]; return view('guest.index', $payload); } public function dataOrder(){ $search = request('search'); $jenis_menu = request('jenis_menu'); $perPage = request()->get('per_page', 50); $tanggal_awal = (int) request('tanggal_awal'); $tanggal_akhir = (int) request('tanggal_akhir'); return self::menuOrder($search, $jenis_menu, $perPage, $tanggal_awal, $tanggal_akhir); } private static function menuOrder($search = null, $jenis_menu = null, $perPage, $tanggal_awal = null, $tanggal_akhir = null) { $payloadHari = []; if (!empty($tanggal_awal) && !empty($tanggal_akhir)) { if ($tanggal_awal > 0 && $tanggal_akhir >= $tanggal_awal) { $payloadHari = range($tanggal_awal, $tanggal_akhir); } } $menuIdTanggalValid = []; if (!empty($payloadHari)) { $menuIdTanggalValid = DB::connection('dbOrderGizi') ->table('public.detail_menu_paket_harian') ->whereIn('tgl_harian', $payloadHari) ->pluck('master_menu_id') ->unique() ->toArray(); } // Step 2: Query menu $menuQuery = DB::connection('dbOrderGizi') ->table('public.master_menu as mn') ->where(['mn.statusenabled' => true, 'mn.status' => true]); if (!empty($jenis_menu)) { $menuQuery->where('mn.jenis_menu', 'ILIKE', '%' . $jenis_menu . '%'); } if (!empty($search)) { $menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%'); } $menuQuery->where(function ($q) use ($menuIdTanggalValid, $payloadHari) { if (!empty($menuIdTanggalValid)) { // Jika ada filter tanggal: tampilkan menu sesuai tanggal atau yang someday $q->whereIn('mn.master_menu_id', $menuIdTanggalValid) ->orWhere('mn.apakah_someday', true); }else if($payloadHari){ $q->where('mn.apakah_someday', true); } // Jika TIDAK ada tanggal, tidak perlu where apapun — biarkan tampil semua menu }); // } $menuItems = $menuQuery->select( 'mn.master_menu_id', 'mn.nama_menu', 'mn.foto', 'mn.jenis_menu', 'mn.harga_public', 'mn.harga_karyawan', 'mn.harga_keluarga_pasien', 'mn.status', 'mn.deskripsi', 'mn.apakah_someday', 'mn.apakah_menu_siang', 'mn.apakah_menu_sore', )->get(); $menuIds = $menuItems->pluck('master_menu_id')->toArray(); if (empty($menuIds)) { return self::emptyMenuResponse($perPage); } // Step 3: Relasi data tambahan $klasifikasi = DB::connection('dbOrderGizi') ->table('public.klasifikasi_menu_diet as kmd') ->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id') ->whereIn('kmd.master_menu_id', $menuIds) ->select('kmd.master_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet') ->get() ->groupBy('master_menu_id'); $dmph = DB::connection('dbOrderGizi') ->table('public.detail_menu_paket_harian as dmph') ->whereIn('dmph.master_menu_id', $menuIds) ->select('dmph.master_menu_id', 'dmph.tgl_harian') ->get() ->groupBy('master_menu_id'); $kkal = DB::connection('dbOrderGizi') ->table('public.klasifikasi_menu_kalori as kmk') ->join('public.kalori as k', 'k.kalori_id', 'kmk.kalori_id') ->whereIn('kmk.master_menu_id', $menuIds) ->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori') ->get() ->groupBy('master_menu_id'); function buildGroupLabel($tglList, $isSomeday){ if($isSomeday) return 'Menu Sameday'; if(empty($tglList)) return '-'; $days = collect($tglList) ->map(fn($t) => substr($t, -2)) ->unique() ->sort() ->values(); // Jika semua tanggal memiliki digit terakhir yang sama, gabungkan $tanggal = implode(',', $days->toArray()); return 'Menu Normal Tersedia Tanggal ' . $tanggal; } // Step 4: Transform response $enriched = $menuItems->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { $tglList = isset($dmph[$menu->master_menu_id]) ? collect($dmph[$menu->master_menu_id])->pluck('tgl_harian')->toArray() : []; $groupLabel = buildGroupLabel($tglList, $menu->apakah_someday); return [ 'master_menu_id' => $menu->master_menu_id, 'nama' => $menu->nama_menu, 'foto' => $menu->foto, 'jenis_menu' => $menu->jenis_menu, 'harga_public' => $menu->harga_public, 'harga_karyawan' => $menu->harga_karyawan, 'harga_keluarga_pasien' => $menu->harga_keluarga_pasien, 'status' => $menu->status, 'deskripsi' => $menu->deskripsi, 'apakah_someday' => $menu->apakah_someday, 'apakah_menu_sore' => $menu->apakah_menu_sore, 'apakah_menu_siang' => $menu->apakah_menu_siang, 'group_label' => $groupLabel, 'klasifikasiMenu' => isset($klasifikasi[$menu->master_menu_id]) ? $klasifikasi[$menu->master_menu_id]->map(function ($item) { return [ 'kategori_diet_id' => $item->kategori_diet_id, 'nama_kategori_diet' => $item->nama_kategori_diet, ]; })->values() : [], 'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) { return [ 'tgl_harian' => $item->tgl_harian ]; })->values() : [], 'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) { return [ 'nilai_kalori' => $item->nilai_kalori, ]; })->values() : [], ]; }); // Urutkan: someday → tgl_harian terdekat $sorted = $enriched->sortBy(function ($menu) { $hariIni = now()->day; $isSomeday = $menu['apakah_someday'] ? 0 : 1; if ($menu['apakah_someday']) { return [0, 0]; } $tglTerdekat = collect($menu['dmph'])->pluck('tgl_harian') ->map(function ($tgl) use ($hariIni) { return $tgl >= $hariIni ? $tgl : $tgl + 31; }) ->sort() ->first() ?? 99; return [$isSomeday, $tglTerdekat]; })->values(); // Paginate manual (setelah sort) $total = $sorted->count(); $currentPage = request()->get('page', 1); $offset = ($currentPage - 1) * $perPage; $pagedData = $sorted->slice($offset, $perPage)->values(); return response()->json([ 'status' => true, 'message' => 'Berhasil mendapatkan data', 'data' => [ 'data' => $pagedData, 'current_page' => (int) $currentPage, 'last_page' => (int) ceil($total / $perPage), 'per_page' => (int) $perPage, 'total' => $total, ] ]); } private static function emptyMenuResponse($perPage) { return response()->json([ 'status' => true, 'message' => 'Tidak ada menu ditemukan', 'data' => [ 'data' => [], 'current_page' => 1, 'last_page' => 1, 'per_page' => $perPage, 'total' => 0, ] ]); } // paket do komen dulu // private static function dataPaketMenuOrder($search = null, $perPage){ // $query = DB::connection('dbOrderGizi')->table('public.master_paket_menu as mpn') // ->where('mpn.statusenabled', true); // if(!empty($search)){ // $query->where('mpn.nama_paket', 'ILIKE', '%' . $search . '%'); // } // $paginated = $query->select( // 'mpn.master_paket_menu_id', // 'mpn.nama_paket', // 'mpn.foto', // 'mpn.harga_public', // 'mpn.harga_karyawan', // 'mpn.harga_keluarga_pasien', // 'mpn.deskripsi', // 'mpn.status', // 'dmph.detail_menu_paket_harian_id', // 'dmph.tgl_harian' // )->paginate($perPage); // $paketMenuIds = collect($paginated->items())->pluck('master_paket_menu_id')->toArray(); // dd($paketMenuIds); // $klasifikasi = DB::connection('dbOrderGizi') // ->table('public.klasifikasi_menu_diet as kmd') // ->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id') // ->whereIn('kmd.master_paket_menu_id', $paketMenuIds) // ->select('kmd.master_paket_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet') // ->get() // ->groupBy('master_paket_menu_id'); // $result = collect($paginated->items())->map(function ($paketMenu) use ($klasifikasi) { // return [ // 'master_paket_menu_id' => $paketMenu->master_paket_menu_id, // 'nama' => $paketMenu->nama_paket, // 'foto' => $paketMenu->foto, // 'jenis_menu' => "paket", // 'harga_public' => $paketMenu->harga_public, // 'harga_karyawan' => $paketMenu->harga_karyawan, // 'harga_keluarga_pasien' => $paketMenu->harga_keluarga_pasien, // 'status' => $paketMenu->status, // 'deskripsi' => $paketMenu->deskripsi, // 'klasifikasiMenu' => isset($klasifikasi[$paketMenu->master_paket_menu_id]) ? $klasifikasi[$paketMenu->master_paket_menu_id]->map(function ($item) { // return [ // 'kategori_diet_id' => $item->kategori_diet_id, // 'nama_kategori_diet' => $item->nama_kategori_diet, // ]; // })->values() : [], // ]; // }); // return response()->json([ // 'status' => true, // 'message' => 'Berhasil mendapatkan data', // 'data' => [ // 'data' => $result, // 'current_page' => $paginated->currentPage(), // 'last_page' => $paginated->lastPage(), // 'per_page' => $paginated->perPage(), // 'total' => $paginated->total(), // ] // ]); // } public function checkout(){ $karbohidrat = Karbohidrat::where('statusenabled', true)->select('karbohidrat_id', 'nama_karbohidrat', 'nilai_kalori')->get(); $payload = [ 'title' => 'Checkout ', 'karbohidrat' => $karbohidrat ]; return view('guest.checkout.checkout_payment', $payload); } public function submitCheckout(){ $dataCart = request()->input('cartResult'); $biodataResult = request()->input('biodataResult'); $totalHarga = request()->input('totalHarga'); DB::beginTransaction(); try { $jenisCustomer = $biodataResult['jenis_customer']; $today = now()->toDateString(); $jumlahHariIni = Order::whereDate('entry_at', $today)->count(); $urutan = $jumlahHariIni + 1; $noOrder = 'TX/CT/GIZI/' . now()->year .'/'. now()->month .'/' . now()->day .'/' . Str::random(6) .'/' . str_pad($urutan, 4, '0', STR_PAD_LEFT); $payloadOrder = [ 'no_order' => $noOrder, 'jenis_customer' => $jenisCustomer, 'nama_pemesan' => $biodataResult['nama_pemesan'], 'jenis_kelamin' => $biodataResult['jenis_kelamin'], // 'tanggal_lahir' => $biodataResult['tanggal_lahir'], 'no_wa' => $biodataResult['no_whatsapp'], 'tinggi_badan' => $biodataResult['tinggi_badan'], 'berat_badan' => $biodataResult['berat_badan'], 'nama_pasien' => $biodataResult['nama_pasien'], 'ruang_perawatan' => $biodataResult['ruang_perawatan'], 'no_kamar_perawatan' => $biodataResult['no_kamar'], 'kelas_perawatan' => $biodataResult['kelas_perawatan'], 'bagian_instalasi' => $biodataResult['bagian_instalasi'], 'no_ekstensien' => $biodataResult['no_ekstensien'], 'total_harga' => $totalHarga, 'status_order' => "Belum Bayar", 'email' => $biodataResult['email'], 'alamat' => $biodataResult['alamat'], 'entry_at' => Carbon::now()->format('Y-m-d H:i:s.u'), ]; $order = Order::create($payloadOrder); foreach ($dataCart as $cart) { $payloadOrderDetail = [ 'order_id' => $order->order_id, 'harga_satuan' => $jenisCustomer === "Karyawan RSAB Harapan Kita" ? $cart['harga_karyawan'] : $cart['harga_public'], 'status_order' => "Pending" ]; foreach ($cart['pesanan'] as $value) { $payloadOrderDetail['jumlah'] = $value['jumlah']; $payloadOrderDetail['tgl_antar'] = $value['tgl']; $payloadOrderDetail['type'] = $value['kategoriPemesanan']; $payloadOrderDetail['karbohidrat_id'] = $value['karbohidrat_id'] ?? null; $payloadOrderDetail['catatan'] = $value['catatan'] ?? null; if($cart['jenis_menu'] === "paket"){ $payloadOrderDetail['master_paket_menu_id'] = $cart['id_menu']; }else{ $payloadOrderDetail['master_menu_id'] = $cart['id_menu']; } OrderDetail::create($payloadOrderDetail); } } //code... if($order->email){ Mail::to($order->email)->queue(new NotifikasiCustomer($order->nama_pemesan, $order->no_order, $order->total_harga)); } DB::commit(); return response()->json([ 'status' => true, 'data' => $order, 'entry_at' => Carbon::now(), 'message' => 'Data berhasil disimpan' ]); } catch (\Throwable $th) { DB::rollBack(); return response()->json([ 'status' => false, 'message' => 'Data gagal disimpan ' . $th->getMessage() ]); } } public function finishCheckout(){ DB::beginTransaction(); try { $noOrder = request('no_order_result'); $medical_record = request('medical_record'); $evidence = request()->file('bukti_pembayaran'); $caraPembayaran = request('cara_pembayaran'); $order = Order::where('no_order', $noOrder)->first(); // Simpan file ke storage if (!$order) { return response()->json(['status' => false, 'message' => 'Nomor order tidak ditemukan'], 404); } $entryAt = Carbon::parse($order->entry_at)->copy()->addMinutes(10); if(Carbon::now()->gt($entryAt)){ return response()->json(['status' => false, 'message' => 'Waktu pembayaran sudah habis, lakukan pemesanan ulang'],403); } $payload = [ 'tgl_pembayaran' => Carbon::now() ]; if($caraPembayaran === "transfer"){ if (!$evidence) { return response()->json(['status' => false, 'message' => 'Bukti pembayaran wajib diunggah'], 422); } $path = $evidence->store('bukti_pembayaran', 'public'); $payload['bukti_pembayaran'] = $path; $payload['cara_pembayaran'] = 'Transfer'; $payload['status_order'] = 'Menunggu Konfirmasi Pembayaran'; }else{ $payload['cara_pembayaran'] = 'Billing'; $payload['status_order'] = 'Menunggu Konfirmasi Pembayaran Via Billing'; $payload['medical_record'] = $medical_record ?? null; } // Update data order $order->update($payload); if($order->email){ Mail::to($order->email)->queue(new NotifikasiPembayaran($order->nama_pemesan, $order->no_order)); } DB::commit(); session()->flash('payment_success', true); session()->flash('no_order', $noOrder); return response([ 'status' => true, 'message' => 'Terima kasih atas pesanan Anda. Mohon tunggu, kami sedang memprosesnya' ], 200); return back()->with('success', 'Bukti pembayaran berhasil diunggah.'); } catch (\Throwable $th) { DB::rollBack(); return response([ 'status' => false, 'message' => 'Gagal melakukan pesanan!' ], 500); } } public function success(){ if(!session()->has('payment_success')){ return redirect('/'); } $payload = [ 'title' => 'Berhasil Melakukan Pembayaran ', 'no_order' => session('no_order') ]; return view('guest.success_page', $payload); } public function checkOrder(){ $payload = [ 'title' => 'Check Order' ]; return view('guest.check_order.index', $payload); } public function searchOrder(){ $noOrder = request('no_order'); $order = DB::connection('dbOrderGizi') ->table('public.order as o') ->leftJoin('public.order_detail as od', 'od.order_id', '=', 'o.order_id') ->leftJoin('public.master_menu as mm', 'mm.master_menu_id', '=', 'od.master_menu_id') ->leftJoin('public.master_paket_menu as mpm', 'mpm.master_paket_menu_id', '=', 'od.master_paket_menu_id') ->where('o.no_order', 'ILIKE', '%' . $noOrder . '%') ->select( 'o.*', 'od.order_detail_id', 'od.jumlah', 'od.tgl_antar', 'od.harga_satuan', 'od.status_order as status_order_detail', 'od.catatan', DB::raw("COALESCE(mm.nama_menu, mpm.nama_paket) as nama_item"), DB::raw("COALESCE(mm.foto, mpm.foto) as foto"), ) ->get(); if ($order->isEmpty()) { return response()->json([ 'status' => false, 'message' => 'Pesanan tidak ditemukan' ], 404); } $data = $order->first(); $result = [ 'order_id' => $data->order_id, 'nama_pemesan' => $data->nama_pemesan, 'jenis_kelamin' => $data->jenis_kelamin, 'tgl_pesanan' => $data->entry_at, 'tgl_pembayaran' => $data->tgl_pembayaran, 'bukti_bayar' => $data->bukti_pembayaran, 'cara_pembayaran' => $data->cara_pembayaran, 'status_order' => $data->status_order, 'total_harga' => $data->total_harga, 'no_order' => $data->no_order, 'jenis_customer' => $data->jenis_customer, 'no_wa' => $data->no_wa, // pasien 'nama_pasien' => $data->nama_pasien, 'kelas_perawatan' => $data->kelas_perawatan, 'no_kamar_perawatan' => $data->no_kamar_perawatan, 'ruang_perawatan' => $data->ruang_perawatan, // karyawan 'no_ekstensien' => $data->no_ekstensien, 'bagian_instalasi' => $data->bagian_instalasi, 'items' => $order->map(function ($item) { return [ 'order_detail_id' => $item->order_detail_id, 'nama_item' => $item->nama_item, 'tgl_antar' => $item->tgl_antar, 'foto' => $item->foto, 'jumlah' => $item->jumlah, 'harga_satuan' => $item->harga_satuan, 'status_order' => $item->status_order_detail, 'catatan' => $item->catatan ?? '-' // tambahkan field tambahan jika diperlukan ]; })->values(), ]; return response()->json([ 'status' => true, 'data' => $result, ], 200); } }