diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php index d20aee6..0c9b23b 100644 --- a/app/Http/Controllers/CustomerController.php +++ b/app/Http/Controllers/CustomerController.php @@ -8,6 +8,7 @@ use App\Models\Karbohidrat; use App\Models\Order; use App\Models\OrderDetail; use Carbon\Carbon; +use Carbon\CarbonPeriod; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; @@ -28,39 +29,37 @@ class CustomerController extends Controller $search = request('search'); $jenis_menu = request('jenis_menu'); $perPage = request()->get('per_page', 12); - $filters = explode(',', request('filters')); // - return self::menuOrder($search, $jenis_menu, $perPage, $filters); + $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, $filters = []) + private static function menuOrder($search = null, $jenis_menu = null, $perPage, $tanggal_awal = null, $tanggal_akhir = null) { - $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); + $payloadHari = []; + if (!empty($tanggal_awal) && !empty($tanggal_akhir)) { + if ($tanggal_awal > 0 && $tanggal_akhir >= $tanggal_awal) { + $payloadHari = range($tanggal_awal, $tanggal_akhir); } } - $payload = array_unique($payload); + // Step 1: Ambil menu_id yang sesuai tanggal + $menuIdTanggalValid = []; + if (!empty($payloadHari)) { + $menuIdTanggalValid = DB::connection('dbOrderGizi') + ->table('public.detail_menu_paket_harian') + ->whereIn('tgl_harian', $payloadHari) + ->pluck('master_menu_id') + ->unique() + ->toArray(); + // Jika tidak ada menu di tanggal tersebut, return kosong langsung + if (empty($menuIdTanggalValid)) { + return self::emptyMenuResponse($perPage); + } + } + // Step 2: Query menu $menuQuery = DB::connection('dbOrderGizi') ->table('public.master_menu as mn') ->where('mn.statusenabled', true); @@ -73,38 +72,31 @@ class CustomerController extends Controller $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); - }); + if (!empty($menuIdTanggalValid)) { + $menuQuery->whereIn('mn.master_menu_id', $menuIdTanggalValid); } + $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); - $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(); + 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') @@ -116,9 +108,6 @@ class CustomerController extends Controller $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'); @@ -129,8 +118,10 @@ class CustomerController extends Controller ->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori') ->get() ->groupBy('master_menu_id'); - + + // Step 4: Transform response $result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) { + return [ 'master_menu_id' => $menu->master_menu_id, 'nama' => $menu->nama_menu, @@ -152,7 +143,7 @@ class CustomerController extends Controller })->values() : [], 'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) { return [ - 'tgl_harian' => $item->tgl_harian, + 'tgl_harian' => $item->tgl_harian ]; })->values() : [], 'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) { @@ -176,6 +167,22 @@ class CustomerController extends Controller ]); } + 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){ diff --git a/app/Http/Controllers/MenuController.php b/app/Http/Controllers/MenuController.php index 1771538..df2e2ca 100644 --- a/app/Http/Controllers/MenuController.php +++ b/app/Http/Controllers/MenuController.php @@ -280,7 +280,7 @@ class MenuController extends Controller 'kmk.kalori_id', 'k.nilai_kalori' ) - ->get()->groupBy('master_menu_id'); + ->orderBy('mn.entry_at', 'desc')->get()->groupBy('master_menu_id'); $grouped = $data->map(function($items){ $first = $items->first(); diff --git a/public/gambar/8dY9w9VBXYg2aR4.jpeg b/public/gambar/8dY9w9VBXYg2aR4.jpeg new file mode 100644 index 0000000..8be4df9 Binary files /dev/null and b/public/gambar/8dY9w9VBXYg2aR4.jpeg differ diff --git a/public/gambar/GPhScYOLRXhCNuZ.jpg b/public/gambar/GPhScYOLRXhCNuZ.jpg new file mode 100644 index 0000000..322ca31 Binary files /dev/null and b/public/gambar/GPhScYOLRXhCNuZ.jpg differ diff --git a/public/gambar/IY690j402Rjs4M3.jpg b/public/gambar/IY690j402Rjs4M3.jpg new file mode 100644 index 0000000..6c8cd04 Binary files /dev/null and b/public/gambar/IY690j402Rjs4M3.jpg differ diff --git a/public/gambar/kf0NqtLWFSnPcV5.jpg b/public/gambar/kf0NqtLWFSnPcV5.jpg new file mode 100644 index 0000000..d7fdf6b Binary files /dev/null and b/public/gambar/kf0NqtLWFSnPcV5.jpg differ diff --git a/public/gambar/nPwsfRiIqPlWPmG.jpg b/public/gambar/nPwsfRiIqPlWPmG.jpg new file mode 100644 index 0000000..322ca31 Binary files /dev/null and b/public/gambar/nPwsfRiIqPlWPmG.jpg differ diff --git a/public/gambar/txkrSnBJAeGRYz4.jpg b/public/gambar/txkrSnBJAeGRYz4.jpg new file mode 100644 index 0000000..322ca31 Binary files /dev/null and b/public/gambar/txkrSnBJAeGRYz4.jpg differ diff --git a/public/gambar/uFq7WBhHan3G8Uo.jpg b/public/gambar/uFq7WBhHan3G8Uo.jpg new file mode 100644 index 0000000..652eaab Binary files /dev/null and b/public/gambar/uFq7WBhHan3G8Uo.jpg differ diff --git a/public/js/checkout/index.js b/public/js/checkout/index.js index ce8efc3..8a43dad 100644 --- a/public/js/checkout/index.js +++ b/public/js/checkout/index.js @@ -316,10 +316,10 @@ function renderCartSummary() { ${item.apakah_someday ? `` : `
@@ -395,8 +395,7 @@ function renderCartSummary() { const itemHTML = `
-
@@ -421,14 +420,14 @@ function renderCartSummary() { ${item.kalori ? `
Kalori: ${item.kalori} kkal
` : ''} -
Silakan isi tanggal pemesanan, catatan pemesanan (opsional) dan pilih karbohidrat yang diinginkan
+
Silahkan isi tanggal pemesanan, pilih karbohidrat dan catatan pemesanan (opsional) yang diinginkan
${pesananHTML}
' +
Total: Rp ${itemTotal.toLocaleString('id-ID')}
@@ -688,16 +687,17 @@ function initFlatpickrTersedia(item, i) { const menitBatasFlat = 13 * 60; const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat; - + const tglString = Array.isArray(item?.tgl_tersedia) + ? item?.tgl_tersedia.join(',') // kalau array → gabung jadi string + : String(item?.tgl_tersedia); // Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap - const dayNumbers = (item.tgl_tersedia || "") + const dayNumbers = (tglString || "") .split(',') .map(s => s.trim()) .filter(s => s !== '' && !isNaN(s)) .map(s => parseInt(s)); - // Generate tanggal dalam format YYYY-MM-DD untuk 3 bulan ke depan let availableDates = []; const bulanKeDepan = 3; diff --git a/public/js/menu/action.js b/public/js/menu/action.js index cd2f862..a3a3ffa 100644 --- a/public/js/menu/action.js +++ b/public/js/menu/action.js @@ -99,8 +99,8 @@ function initSelectize(formElement) { formElement.querySelectorAll('.money').forEach(input => { input.addEventListener('input', function () { - let angka = this.value.replace(/[^0-9]/g, ''); - this.value = formatAngka(angka); + let angka = this.value.replace(/[^0-9]/g, ''); + this.value = formatAngka(angka); }); }); @@ -131,12 +131,27 @@ document.addEventListener('DOMContentLoaded', function () { const money = document.querySelectorAll('.money') money.forEach(input => { - input.addEventListener('input', function(){ - let angka = this.value.replace(/[^0-9]/g, ''); - this.value = formatAngka(angka) - }) - }) + input.addEventListener('input', function () { + // Simpan posisi kursor awal + let start = this.selectionStart; + console.log(start); + let end = this.selectionEnd; + + // Ambil angka saja + let angka = this.value.replace(/[^0-9]/g, ''); + let formatted = formatAngka(angka); + + // Hitung perbedaan panjang string sebelum dan sesudah format + let selisih = formatted.length - this.value.length; + + // Update value + this.value = formatted; + + // Pulihkan posisi kursor (geser sesuai perubahan panjang) + this.setSelectionRange(start + selisih, end + selisih); + }); + }); }); @@ -362,9 +377,10 @@ function editMasterMenu(e) { kalori: JSON.parse(decodeURIComponent(el.data('kalori') || '[]')), kategori_diet: JSON.parse(decodeURIComponent(el.data('kategori_diet') || '[]')), }; - console.log(dataOld); - - + if(el.data('foto')){ + document.getElementById('gambar_old').classList.remove('d-none') + document.getElementById('gambar_old').setAttribute('href', `/gambar/${el.data('foto')}`) + } // Set value ke input form $("#nama_edit").val(dataOld.nama_menu); $("#harga_public_edit").val(dataOld.harga_public); diff --git a/public/js/menu/dt.js b/public/js/menu/dt.js index e86a83f..064037e 100644 --- a/public/js/menu/dt.js +++ b/public/js/menu/dt.js @@ -29,6 +29,7 @@ buttons += `
-
- +
-
Ketersediaan Menu
-
- - -
-
+
+ Pilih Tanggal Makanan + + + +
- - + +
+ +
+ @endsection