input('search'); $perPage = $request->input('perPage', 10); // Default 10 data per halaman $query = Imunisasi::with(['anak', 'jenisImunisasi']); if ($search) { $query->whereHas('anak', function($q) use ($search) { $q->where('nama_anak', 'like', "%{$search}%"); }) ->orWhereHas('jenisImunisasi', function($q) use ($search) { $q->where('nama', 'like', "%{$search}%"); }) ->orWhere('status', 'like', "%{$search}%"); } $imunisasi = $query->orderBy('created_at', 'desc')->paginate($perPage); // Dapatkan semua jadwal imunisasi yang tersedia $availableJadwal = $this->getAvailableJadwalImunisasi(); return view('imunisasi', compact('imunisasi', 'search', 'availableJadwal')); } /** * Show the form for creating a new resource. */ public function create() { $action = 'create'; $dataAnak = Anak::all(); $jenisImunisasi = JenisImunisasi::all(); // Dapatkan semua jadwal imunisasi yang tersedia $availableJadwal = $this->getAvailableJadwalImunisasi(); return view('imunisasi', compact('action', 'dataAnak', 'jenisImunisasi', 'availableJadwal')); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $validator = Validator::make($request->all(), [ 'anak_id' => 'required|exists:anak,id', 'jenis_id' => 'required|exists:jenis_imunisasi,id', 'tanggal' => 'required|date', 'status' => 'required|in:' . implode(',', Imunisasi::$statusList), ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } // Validasi apakah umur anak sesuai dengan jenis imunisasi $anak = Anak::findOrFail($request->anak_id); $jenisImunisasi = JenisImunisasi::findOrFail($request->jenis_id); $tanggalLahir = Carbon::parse($anak->tanggal_lahir); $umurHari = $tanggalLahir->diffInDays(Carbon::parse($request->tanggal)); if ($umurHari < $jenisImunisasi->min_umur_hari || $umurHari > $jenisImunisasi->max_umur_hari) { return redirect()->back() ->with('error', 'Umur anak (' . $umurHari . ' hari) tidak sesuai dengan rentang umur yang disarankan untuk imunisasi ' . $jenisImunisasi->nama . ' (' . $jenisImunisasi->min_umur_hari . '-' . $jenisImunisasi->max_umur_hari . ' hari)') ->withInput(); } Imunisasi::create($request->all()); return redirect()->route('imunisasi.index') ->with('success', 'Data imunisasi berhasil ditambahkan!'); } /** * Display the specified resource. */ public function show(string $id) { $imunisasi = Imunisasi::with(['anak', 'jenisImunisasi'])->findOrFail($id); if (request()->ajax()) { return response()->json([ 'imunisasi' => $imunisasi, 'anak' => $imunisasi->anak, 'jenisImunisasi' => $imunisasi->jenisImunisasi ]); } $action = 'show'; return view('imunisasi', compact('imunisasi', 'action')); } /** * Show the form for editing the specified resource. */ public function edit(string $id) { $imunisasi = Imunisasi::with(['anak', 'jenisImunisasi'])->findOrFail($id); if (request()->ajax()) { // Get all children and immunization types for dropdowns $dataAnak = Anak::all(); $jenisImunisasi = JenisImunisasi::all(); // Format data tanggal untuk input HTML $imunisasi->tanggal = optional($imunisasi->tanggal)->format('Y-m-d'); // Convert ID ke integer untuk mempermudah perbandingan di JavaScript $formattedData = [ 'imunisasi' => [ 'id' => (int)$imunisasi->id, 'anak_id' => (int)$imunisasi->anak_id, 'jenis_id' => (int)$imunisasi->jenis_id, 'tanggal' => $imunisasi->tanggal, 'status' => $imunisasi->status, ], 'anak' => $imunisasi->anak, 'jenisImunisasi' => $imunisasi->jenisImunisasi, 'dataAnak' => $dataAnak->map(function($anak) { $anak->id = (int)$anak->id; return $anak; }), 'jenisImunisasiList' => $jenisImunisasi->map(function($jenis) { $jenis->id = (int)$jenis->id; return $jenis; }) ]; return response()->json($formattedData); } $dataAnak = Anak::all(); $jenisImunisasi = JenisImunisasi::all(); $action = 'edit'; return view('imunisasi', compact('imunisasi', 'action', 'dataAnak', 'jenisImunisasi')); } /** * Update the specified resource in storage. */ public function update(Request $request, string $id) { // If this is a JSON request (likely from AJAX or API) if ($request->expectsJson() || $request->ajax()) { $validator = Validator::make($request->all(), [ 'status' => 'required|in:' . implode(',', Imunisasi::$statusList), ]); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 422); } $imunisasi = Imunisasi::findOrFail($id); $imunisasi->status = $request->status; $imunisasi->save(); return response()->json([ 'success' => true, 'message' => 'Status imunisasi berhasil diperbarui!', 'data' => $imunisasi ]); } // Regular form submission $validator = Validator::make($request->all(), [ 'anak_id' => 'required|exists:anak,id', 'jenis_id' => 'required|exists:jenis_imunisasi,id', 'tanggal' => 'required|date', 'status' => 'required|in:' . implode(',', Imunisasi::$statusList), ]); if ($validator->fails()) { if ($request->ajax()) { return response()->json(['errors' => $validator->errors()], 422); } return redirect()->back() ->withErrors($validator) ->withInput(); } $imunisasi = Imunisasi::findOrFail($id); $imunisasi->update($request->all()); if ($request->ajax()) { return response()->json([ 'success' => true, 'message' => 'Data imunisasi berhasil diperbarui!' ]); } return redirect()->route('imunisasi.index') ->with('success', 'Data imunisasi berhasil diperbarui!'); } /** * Remove the specified resource from storage. */ public function destroy(string $id) { $imunisasi = Imunisasi::findOrFail($id); $imunisasi->delete(); return redirect()->route('imunisasi.index') ->with('success', 'Data imunisasi berhasil dihapus!'); } /** * Mendapatkan jadwal imunisasi yang tersedia untuk anak-anak berdasarkan umur */ private function getAvailableJadwalImunisasi() { // Dapatkan semua jadwal imunisasi yang akan datang $upcomingJadwal = JadwalImunisasi::with('jenisImunisasi') ->where('tanggal', '>=', Carbon::today()) ->orderBy('tanggal', 'asc') ->get(); // Dapatkan semua anak $dataAnak = Anak::all(); $availableJadwal = []; // Untuk setiap jadwal, cek anak-anak yang memenuhi syarat umur foreach ($upcomingJadwal as $jadwal) { $jenisImunisasi = $jadwal->jenisImunisasi; if (!$jenisImunisasi) continue; $eligibleChildren = []; // Cek setiap anak foreach ($dataAnak as $anak) { $tanggalLahir = Carbon::parse($anak->tanggal_lahir); $umurHari = $tanggalLahir->diffInDays(Carbon::now()); // Periksa apakah anak berada dalam rentang umur yang sesuai if ($umurHari >= $jenisImunisasi->min_umur_hari && $umurHari <= $jenisImunisasi->max_umur_hari) { // Cek apakah anak sudah terdaftar untuk imunisasi ini $existingImunisasi = Imunisasi::where('anak_id', $anak->id) ->where('jenis_id', $jadwal->jenis_imunisasi_id) ->first(); $eligibleChildren[] = [ 'anak' => $anak, 'umur_hari' => $umurHari, 'already_registered' => $existingImunisasi ? true : false, 'existing_imunisasi' => $existingImunisasi ]; } } // Jika ada anak yang memenuhi syarat, tambahkan jadwal ke daftar if (count($eligibleChildren) > 0) { $availableJadwal[] = [ 'jadwal' => $jadwal, 'jenis_imunisasi' => $jenisImunisasi, 'eligible_children' => $eligibleChildren ]; } } return $availableJadwal; } /** * Mendaftarkan anak untuk imunisasi dari jadwal yang sudah ada */ public function registerFromJadwal(Request $request) { $validator = Validator::make($request->all(), [ 'anak_id' => 'required|exists:anak,id', 'jadwal_imunisasi_id' => 'required|exists:jadwal_imunisasi,id', ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } // Dapatkan jadwal imunisasi $jadwal = JadwalImunisasi::with('jenisImunisasi')->findOrFail($request->jadwal_imunisasi_id); // Verifikasi anak $anak = Anak::findOrFail($request->anak_id); // Verifikasi umur anak $tanggalLahir = Carbon::parse($anak->tanggal_lahir); $umurHari = $tanggalLahir->diffInDays(Carbon::now()); if ($umurHari < $jadwal->jenisImunisasi->min_umur_hari || $umurHari > $jadwal->jenisImunisasi->max_umur_hari) { return redirect()->back() ->with('error', 'Umur anak (' . $umurHari . ' hari) tidak sesuai dengan rentang umur yang disarankan untuk imunisasi ' . $jadwal->jenisImunisasi->nama . ' (' . $jadwal->jenisImunisasi->min_umur_hari . '-' . $jadwal->jenisImunisasi->max_umur_hari . ' hari)') ->withInput(); } // Cek apakah anak sudah terdaftar untuk imunisasi ini $existingImunisasi = Imunisasi::where('anak_id', $anak->id) ->where('jenis_id', $jadwal->jenis_imunisasi_id) ->first(); if ($existingImunisasi) { return redirect()->back() ->with('error', 'Anak sudah terdaftar untuk imunisasi ' . $jadwal->jenisImunisasi->nama) ->withInput(); } // Buat data imunisasi baru Imunisasi::create([ 'anak_id' => $anak->id, 'jenis_id' => $jadwal->jenis_imunisasi_id, 'tanggal' => $jadwal->tanggal, 'status' => Imunisasi::STATUS_BELUM ]); return redirect()->route('imunisasi.index') ->with('success', 'Anak berhasil didaftarkan untuk imunisasi!'); } public function excel() { return Excel::download(new ImunisasiExport, 'data-imunisasi.xlsx'); } }