363 lines
15 KiB
PHP
363 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Order;
|
|
use App\Models\OrderDetail;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class CustomerController extends Controller
|
|
{
|
|
public function index(){
|
|
$payload = [
|
|
'title' => 'Halaman Utama'
|
|
];
|
|
return view('guest.index', $payload);
|
|
}
|
|
|
|
|
|
public function dataOrder(){
|
|
$search = request('search');
|
|
$jenis_menu = request('jenis_menu');
|
|
$perPage = request()->get('per_page', 12);
|
|
if($jenis_menu === "paket"){
|
|
return self::dataPaketMenuOrder($search, $perPage);
|
|
}
|
|
|
|
return self::menuOrder($search, $jenis_menu, $perPage);
|
|
}
|
|
|
|
|
|
private static function menuOrder($search = null, $jenis_menu = null, $perPage)
|
|
{
|
|
// Step 1: Ambil ID menu sesuai filter
|
|
$menuQuery = DB::connection('dbOrderGizi')
|
|
->table('public.master_menu as mn')
|
|
->where('mn.statusenabled', true);
|
|
|
|
if (!empty($jenis_menu)) {
|
|
$menuQuery->where('mn.jenis_menu', 'ILIKE', '%' . $jenis_menu . '%');
|
|
}
|
|
|
|
if (!empty($search)) {
|
|
$menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%');
|
|
}
|
|
|
|
$paginated = $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'
|
|
)
|
|
->paginate($perPage);
|
|
$menuIds = collect($paginated->items())->pluck('master_menu_id')->toArray();
|
|
|
|
// Step 2: Ambil semua klasifikasi untuk menu tersebut
|
|
$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');
|
|
|
|
// Step 3: Gabungkan data menu + klasifikasi
|
|
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi) {
|
|
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,
|
|
'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() : [],
|
|
];
|
|
});
|
|
|
|
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(),
|
|
]
|
|
]);
|
|
}
|
|
|
|
|
|
|
|
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'
|
|
)->paginate($perPage);
|
|
|
|
$paketMenuIds = collect($paginated->items())->pluck('master_paket_menu_id')->toArray();
|
|
|
|
$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(){
|
|
$payload = [
|
|
'title' => 'Checkout '
|
|
];
|
|
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_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' => "Pending"
|
|
];
|
|
$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_kp'],
|
|
'status_order' => "Pending"
|
|
];
|
|
foreach ($cart['pesanan'] as $value) {
|
|
$payloadOrderDetail['jumlah'] = $value['jumlah'];
|
|
$payloadOrderDetail['tgl_antar'] = $value['tgl'];
|
|
$payloadOrderDetail['type'] = $value['kategoriPemesanan'];
|
|
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...
|
|
DB::commit();
|
|
return response()->json([
|
|
'status' => true,
|
|
'data' => $order,
|
|
'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');
|
|
$evidence = request()->file('bukti_pembayaran');
|
|
|
|
|
|
$order = Order::where('no_order', $noOrder)->first();
|
|
// Simpan file ke storage
|
|
$path = $evidence->store('bukti_pembayaran', 'public');
|
|
// Update data order
|
|
$order->update([
|
|
'bukti_pembayaran' => $path,
|
|
'cara_pembayaran' => 'Transfer',
|
|
'tgl_pembayaran' => Carbon::now()
|
|
]);
|
|
|
|
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',
|
|
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,
|
|
// tambahkan field tambahan jika diperlukan
|
|
];
|
|
})->values(),
|
|
];
|
|
|
|
|
|
return response()->json([
|
|
'status' => true,
|
|
'data' => $result,
|
|
], 200);
|
|
}
|
|
}
|