withCount('kittens'); // 2. Filter Nama Indukan (Sire atau Dam) if ($request->filled('parent_name')) { $name = $request->parent_name; $query->where(function($q) use ($name) { $q->whereHas('sire', fn($sq) => $sq->where('nama_kucing', 'like', "%{$name}%")) ->orWhereHas('dam', fn($sq) => $sq->where('nama_kucing', 'like', "%{$name}%")); }); } // 3. Filter Ras Dinamis if ($request->filled('ras')) { $ras = $request->ras; $query->where(function($q) use ($ras) { $q->whereHas('sire', fn($sq) => $sq->where('ras', $ras)) ->orWhereHas('dam', fn($sq) => $sq->where('ras', $ras)); }); } // 4. PERBAIKAN: Filter Registry (Mendukung Multiple Choice ICA, CFA, dll) if ($request->filled('registry')) { $reg = is_array($request->registry) ? $request->registry : [$request->registry]; $query->where(function($q) use ($reg) { $q->whereIn('registry', $reg) // Cek di table matting ->orWhereHas('sire', fn($sq) => $sq->whereIn('registry', $reg)) // Cek di table cats (sire) ->orWhereHas('dam', fn($sq) => $sq->whereIn('registry', $reg)); // Cek di table cats (dam) }); } // 5. Filter Periode Perkawinan if ($request->filled('start_date') && $request->filled('end_date')) { $query->whereBetween('tgl_kawin_awal', [ Carbon::parse($request->start_date)->startOfDay(), Carbon::parse($request->end_date)->endOfDay() ]); } // 6. Filter Status Induk Betina if ($request->filled('status')) { $status = $request->status; $query->whereHas('dam', fn($q) => $q->where('status', $status)); } // 7. Handle Export if ($request->filled('export')) { $data = $query->latest()->get(); return $this->processExport($data, $request->export); } // 8. Eksekusi dengan Pagination $mattings = $query->latest()->paginate(15)->withQueryString(); // 9. Data Pendukung UI (Mengambil data unik dari database agar dropdown akurat) $breeds = Cat::distinct()->whereNotNull('ras')->pluck('ras'); $registries = ['ICA', 'CFA', 'WCF', 'FFF', 'LOOF']; $statuses = ['Breeding', 'Hamil', 'Teradopsi', 'RIP']; return view('pages.reports.matting.index', compact( 'mattings', 'breeds', 'registries', 'statuses' )); } protected function processExport($data, $format) { $fileName = "Lineage_Report_" . now()->format('Ymd_His'); if ($format === 'xlsx') { return Excel::download(new MattingExport($data), "{$fileName}.xlsx"); } // Penyempurnaan PDF: Tambahkan opsi font dan akses file lokal $pdf = Pdf::loadView('pages.reports.matting.pdf', [ 'data' => $data, 'setting' => Setting::pluck('value', 'key') ]); return $pdf->setPaper('a4', 'landscape') ->setOption([ 'tempDir' => public_path(), 'chroot' => public_path(), 'isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true, // Penting agar gambar dari storage muncul di PDF ]) ->setWarnings(false) ->download("{$fileName}.pdf"); } public function show($id) { // Eager loading mendalam: load sire/dam (untuk foto), pic (registrar), dan kittens $matting = Matting::with(['sire', 'dam', 'pic', 'kittens.cat'])->findOrFail($id); return view('pages.reports.matting.show', compact('matting')); } }