diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index 30d0939..d20aee6 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -28,112 +28,153 @@ class CustomerController extends Controller $search = request('search'); $jenis_menu = request('jenis_menu'); $perPage = request()->get('per_page', 12); - - return self::menuOrder($search, $jenis_menu, $perPage); + $filters = explode(',', request('filters')); // + return self::menuOrder($search, $jenis_menu, $perPage, $filters); } - private static function menuOrder($search = null, $jenis_menu = null, $perPage) + private static function menuOrder($search = null, $jenis_menu = null, $perPage, $filters = []) { - // 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 . '%'); + $filterCollection = collect($filters); + $includeSameday = $filterCollection->contains('someday'); + $includeNormal = $filterCollection->contains('normal'); + + $menuMapping = [ + 'menu1' => ['1', '11', '21'], + 'menu2' => ['2', '12', '22'], + 'menu3' => ['3', '13', '23'], + 'menu4' => ['4', '14', '24'], + 'menu5' => ['5', '15', '25'], + 'menu6' => ['6', '16', '26'], + 'menu7' => ['7', '17', '27'], + 'menu8' => ['8', '18', '28'], + 'menu9' => ['9', '19', '29'], + 'menu10' => ['10', '20', '30'], + 'menu31' => ['31'], + ]; + + $payload = []; + foreach ($menuMapping as $menuKey => $values) { + if ($filterCollection->contains($menuKey)) { + $payload = array_merge($payload, $values); } - - 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', - 'mn.apakah_someday', - 'mn.apakah_menu_siang', - 'mn.apakah_menu_sore', - ) - ->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'); - - $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'); - // Step 3: Gabungkan data menu + klasifikasi - $result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { - 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, - '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() : [], - ]; - }); - - 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(), - ] - ]); } + $payload = array_unique($payload); + + $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 . '%'); + } + + if ($includeSameday && !$includeNormal) { + $menuQuery->where('mn.apakah_someday', true); + } elseif (!$includeSameday && $includeNormal) { + $menuQuery->where('mn.apakah_someday', false); + } + if (!empty($payload)) { + $menuQuery->whereExists(function ($q) use ($payload) { + $q->select(DB::raw(1)) + ->from('public.detail_menu_paket_harian as dmph') + ->whereRaw('dmph.master_menu_id = mn.master_menu_id') + ->whereIn('dmph.tgl_harian', $payload); + }); + } + + $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', + 'mn.apakah_someday', + 'mn.apakah_menu_siang', + 'mn.apakah_menu_sore', + ) + ->paginate($perPage); + $menuIds = collect($paginated->items())->pluck('master_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_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) + ->when(!empty($payload), function ($query) use ($payload) { + $query->whereIn('dmph.tgl_harian', $payload); + }) + ->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'); + + $result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { + 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, + '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() : [], + ]; + }); + + 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(), + ] + ]); + } // paket do komen dulu diff --git a/public/js/order_guest/functions.js b/public/js/order_guest/functions.js index 878c3db..646e868 100644 --- a/public/js/order_guest/functions.js +++ b/public/js/order_guest/functions.js @@ -7,7 +7,7 @@ $(document).ready(function(){ per_page: 12, } - fetchMenu(filterState) + fetchMenu(filterState, getActiveFilters()) $('#tabJenisMenu .nav-link').on('click', function(e){ e.preventDefault(); @@ -18,7 +18,7 @@ $(document).ready(function(){ filterState.jenis_menu = jenis - fetchMenu(filterState) + fetchMenu(filterState, getActiveFilters()) }) let searchTimout; @@ -28,7 +28,7 @@ $(document).ready(function(){ searchTimout = setTimeout(() => { filterState.search = keyword; - fetchMenu(filterState) + fetchMenu(filterState, getActiveFilters()) }, 300) }) }) @@ -36,7 +36,27 @@ $(document).ready(function(){ function changePerPage(select) { const newPerPage = parseInt(select.value); filterState.per_page = newPerPage - fetchMenu(filterState) + fetchMenu(filterState, getActiveFilters()) } + const menuAvailable = document.getElementById('menu_available') + document.querySelectorAll('[data-filter-menu]').forEach(btn => { + btn.addEventListener('click', function(){ + this.classList.toggle('active') + const normalBtns = document.querySelectorAll('[data-filter-menu="normal"]'); + const normalIsActive = Array.from(normalBtns).some(btn => btn.classList.contains('active')); + + if(normalIsActive){ + menuAvailable.classList.remove('d-none') + }else{ + menuAvailable.classList.add('d-none') + } + + fetchMenu(filterState, getActiveFilters()) + }) + }) + function getActiveFilters() { + return Array.from(document.querySelectorAll('[data-filter-menu].active')) + .map(btn => btn.dataset.filterMenu); + } \ No newline at end of file diff --git a/public/js/order_guest/index.js b/public/js/order_guest/index.js index 5912b9a..e656b70 100644 --- a/public/js/order_guest/index.js +++ b/public/js/order_guest/index.js @@ -7,8 +7,8 @@ - function fetchMenu(filter = {}) { - + function fetchMenu(filter = {}, activeFilters = []) { + const containerGuest = $("#order_guest_id"); if(filter.jenis_menu === "konsultasi"){ const jadwalList = [ @@ -53,13 +53,20 @@ return containerGuest.html(html); } + + if (activeFilters.length > 0) { + filter.filters = activeFilters.join(','); + } + let params = new URLSearchParams({ page: filter.page || 1, per_page: filter.per_page || 12, search: filter.search || '', - jenis_menu: filter.jenis_menu || '' - }).toString(); + jenis_menu: filter.jenis_menu || '', + filters: filter.filters + }).toString(); + containerGuest.html('

Memuat data....

'); diff --git a/resources/views/guest/index.blade.php b/resources/views/guest/index.blade.php index 99e4b4a..e341a05 100644 --- a/resources/views/guest/index.blade.php +++ b/resources/views/guest/index.blade.php @@ -19,26 +19,31 @@ -
+
Ketersediaan Menu
- - + +
-
-
Kategori Menu
+
@@ -68,5 +73,4 @@ - @endsection