NIM_E31222534/app/Http/Controllers/PerkembanganAnakController.php

343 lines
13 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\PerkembanganAnak;
use App\Models\Anak;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use App\Exports\PerkembanganExport;
use Maatwebsite\Excel\Facades\Excel;
class PerkembanganAnakController extends Controller
{
public function index(Request $request)
{
$search = $request->input('search');
$perPage = $request->input('perPage', 10); // Default 10 data per halaman
// Ambil semua anak yang memiliki setidaknya satu data perkembangan
// Muat relasi perkembangan anak terbaru
$query = Anak::has('perkembanganAnak')->with(['perkembanganAnak' => function($query) {
$query->orderBy('tanggal', 'desc')->orderBy('created_at', 'desc'); // Ambil yang terbaru berdasarkan tanggal
}, 'pengguna']);
if ($search) {
$query->where(function($q) use ($search) {
$q->where('nama_anak', 'like', "%{$search}%")
->orWhereHas('perkembanganAnak', function($sq) use ($search) {
$sq->where('tanggal', 'like', "%{$search}%");
});
});
}
// Dapatkan hasil paginasi dari query Anak
$anakPaginator = $query->orderBy('created_at', 'desc')->paginate($perPage);
// Sekarang, proses koleksi Anak di halaman saat ini untuk mendapatkan data perkembangan terbaru
$perkembanganCollection = collect();
foreach ($anakPaginator as $anak) {
if ($anak->perkembanganAnak && $anak->perkembanganAnak->count() > 0) {
$latest = $anak->perkembanganAnak->first(); // Ambil data perkembangan terbaru
if ($latest) {
$latest->setRelation('anak', $anak); // Tambahkan relasi anak
$perkembanganCollection->push($latest);
}
}
}
// Gunakan paginator yang ada tetapi dengan koleksi baru
$perkembangan = new \Illuminate\Pagination\LengthAwarePaginator(
$perkembanganCollection,
$anakPaginator->total(),
$anakPaginator->perPage(),
$anakPaginator->currentPage(),
['path' => \Illuminate\Support\Facades\Request::url()]
);
// Set query string dari request asli ke paginator
$perkembangan->appends($request->query());
return view('perkembangan_anak', compact('perkembangan', 'search'));
}
public function create()
{
$action = 'create';
$dataAnak = Anak::all();
return view('perkembangan_anak', compact('action', 'dataAnak'));
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'anak_id' => 'required|exists:anak,id',
'tanggal' => 'required|date',
'berat_badan' => 'required|numeric|between:0,999.99',
'tinggi_badan' => 'required|numeric|between:0,999.99',
]);
if ($validator->fails()) {
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
}
return redirect()->back()
->withErrors($validator)
->withInput();
}
try {
$perkembangan = PerkembanganAnak::create($request->all());
if ($request->ajax()) {
return response()->json([
'success' => true,
'message' => 'Data perkembangan anak berhasil ditambahkan!',
'data' => $perkembangan
]);
}
return redirect()->route('perkembangan.index')
->with('success', 'Data perkembangan anak berhasil ditambahkan!');
} catch (\Exception $e) {
\Log::error('Error storing perkembangan: ' . $e->getMessage());
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data: ' . $e->getMessage()
], 500);
}
return redirect()->back()
->with('error', 'Gagal menyimpan data: ' . $e->getMessage())
->withInput();
}
}
public function show($id)
{
try {
$perkembangan = PerkembanganAnak::with(['anak.pengguna'])->findOrFail($id);
if (request()->ajax()) {
return response()->json([
'success' => true,
'perkembangan' => $perkembangan,
'anak' => $perkembangan->anak
]);
}
$action = 'show';
return view('perkembangan_anak', compact('perkembangan', 'action'));
} catch (\Exception $e) {
\Log::error('Error in show perkembangan: ' . $e->getMessage());
if (request()->ajax()) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
return redirect()->route('perkembangan.index')
->with('error', 'Terjadi kesalahan saat mengambil data: ' . $e->getMessage());
}
}
public function edit($id)
{
try {
$perkembangan = PerkembanganAnak::with('anak')->findOrFail($id);
$dataAnak = \App\Models\Anak::all();
if (request()->ajax()) {
return response()->json([
'success' => true,
'perkembangan' => $perkembangan,
'anak' => $perkembangan->anak,
'dataAnak' => $dataAnak
]);
}
$action = 'edit';
$return_to_riwayat = request()->query('return_to_riwayat');
return view('perkembangan_anak', compact('perkembangan', 'action', 'dataAnak', 'return_to_riwayat'));
} catch (\Exception $e) {
\Log::error('Error in edit perkembangan: ' . $e->getMessage());
if (request()->ajax()) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
return redirect()->route('perkembangan.index')
->with('error', 'Terjadi kesalahan saat mengambil data: ' . $e->getMessage());
}
}
public function update(Request $request, $id)
{
$validator = Validator::make($request->all(), [
'anak_id' => 'required|exists:anak,id',
'tanggal' => 'required|date',
'berat_badan' => 'required|numeric|between:0,999.99',
'tinggi_badan' => 'required|numeric|between:0,999.99',
]);
if ($validator->fails()) {
if ($request->ajax()) {
return response()->json(['errors' => $validator->errors()], 422);
}
return redirect()->back()
->withErrors($validator)
->withInput();
}
try {
// Get the old record
$oldRecord = PerkembanganAnak::findOrFail($id);
// Create new record with updated data
$newRecord = new PerkembanganAnak();
$newRecord->anak_id = $request->anak_id;
$newRecord->tanggal = $request->tanggal;
$newRecord->berat_badan = $request->berat_badan;
$newRecord->tinggi_badan = $request->tinggi_badan;
$newRecord->updated_from_id = $id; // Reference to the old record
$newRecord->save();
// Mark old record as updated
$oldRecord->update([
'is_updated' => true,
'updated_by_id' => $newRecord->id
]);
// Update related stunting records if any
if ($oldRecord) {
$terkaitStunting = \App\Models\Stunting::where('perkembangan_id', $oldRecord->id)->get();
foreach ($terkaitStunting as $stunting) {
$stunting->perkembangan_id = $newRecord->id;
$stunting->save();
}
}
if ($request->ajax()) {
return response()->json([
'success' => true,
'message' => 'Data perkembangan anak berhasil diperbarui!',
'data' => [
'old_record' => $oldRecord,
'new_record' => $newRecord,
'redirect_url' => $request->header('Referer') ?: route('perkembangan.index')
]
]);
}
// Periksa jika ada parameter return_to_riwayat
if ($request->has('return_to_riwayat')) {
$anak_id = $request->input('return_to_riwayat');
return redirect()->route('perkembangan.riwayat', $anak_id)
->with('success', 'Data perkembangan anak berhasil diperbarui!');
}
// Periksa jika request berasal dari halaman riwayat dan redirect kembali ke halaman tersebut
$referrer = $request->header('Referer');
if ($referrer && strpos($referrer, 'perkembangan/riwayat') !== false) {
return redirect($referrer)
->with('success', 'Data perkembangan anak berhasil diperbarui!');
}
return redirect()->route('perkembangan.index')
->with('success', 'Data perkembangan anak berhasil diperbarui!');
} catch (\Exception $e) {
\Log::error('Error updating perkembangan: ' . $e->getMessage());
if ($request->ajax()) {
return response()->json([
'success' => false,
'message' => 'Gagal memperbarui data: ' . $e->getMessage()
], 500);
}
return redirect()->back()
->with('error', 'Gagal memperbarui data: ' . $e->getMessage())
->withInput();
}
}
public function destroy($id)
{
try {
$perkembangan = PerkembanganAnak::findOrFail($id);
// Cek apakah ada data stunting yang terkait dengan perkembangan ini
$terkaitStunting = \App\Models\Stunting::where('perkembangan_id', $perkembangan->id)->count();
if ($terkaitStunting > 0) {
return redirect()->route('perkembangan.index')
->with('error', 'Data perkembangan anak tidak dapat dihapus karena masih terkait dengan data stunting! Hapus data stunting terkait terlebih dahulu.');
}
$perkembangan->delete();
return redirect()->route('perkembangan.index')
->with('success', 'Data perkembangan anak berhasil dihapus!');
} catch (\Exception $e) {
return redirect()->route('perkembangan.index')
->with('error', 'Gagal menghapus data: ' . $e->getMessage());
}
}
public function riwayat($anak_id)
{
try {
// Cari data anak
$anak = \App\Models\Anak::findOrFail($anak_id);
// Ambil parameter perPage dari request dengan default 5 data per halaman
$perPage = request()->input('perPage', 5);
// Log untuk debugging
\Log::info('Riwayat perPage: ' . $perPage);
\Log::info('Request all: ' . json_encode(request()->all()));
// Ambil semua data perkembangan untuk anak ini dengan pagination
$perkembangan = PerkembanganAnak::where('anak_id', $anak_id)
->orderBy('tanggal', 'desc')
->paginate($perPage)
->appends(['perPage' => $perPage]); // Penting! Menambahkan parameter ke link pagination
if ($perkembangan->isEmpty()) {
return redirect()->route('perkembangan.index')
->with('error', 'Tidak ada data riwayat perkembangan untuk anak ini');
}
$action = 'riwayat';
return view('perkembangan_anak', compact('perkembangan', 'anak', 'action'));
} catch (\Exception $e) {
\Log::error('Error in riwayat perkembangan: ' . $e->getMessage());
return redirect()->route('perkembangan.index')
->with('error', 'Terjadi kesalahan saat mengambil data riwayat: ' . $e->getMessage());
}
}
public function excel()
{
return Excel::download(new PerkembanganExport, 'data-perkembangan-anak.xlsx');
}
}