"use client" import { useState, useEffect } from "react" import { DashboardLayout } from "@/components/dashboard-layout" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Button } from "@/components/ui/button" import { apiFetch } from "@/lib/apiutils" import { toast } from "sonner" import { FileText, Printer, Calendar, MapPin, Search } from "lucide-react" export default function HistorialLotesPage() { const [campanas, setCampanas] = useState([]) const [productores, setProductores] = useState([]) const [establecimientos, setEstablecimientos] = useState([]) const [lotes, setLotes] = useState([]) const [campanaSeleccionada, setCampanaSeleccionada] = useState("todas") const [productorSeleccionado, setProductorSeleccionado] = useState("") const [loteSeleccionado, setLoteSeleccionado] = useState("todos") const [lotesFiltrados, setLotesFiltrados] = useState([]) const [recetas, setRecetas] = useState([]) const [loading, setLoading] = useState(false) const [hasSearched, setHasSearched] = useState(false) const [mounted, setMounted] = useState(false) useEffect(() => { setMounted(true) }, []) useEffect(() => { // Fetch initial data apiFetch("/campanas?all=1").then(res => res.json()).then(data => setCampanas(data.data || [])) apiFetch("/productores?all=1").then(res => res.json()).then(data => { // Deduplicate producers by ID just in case const uniqueProducers = Array.from(new Map((data.data || []).map((p: any) => [p.id, p])).values()) as any[]; setProductores(uniqueProducers) }) apiFetch("/establecimientos?all=1").then(res => res.json()).then(data => setEstablecimientos(data.data || [])) apiFetch("/lotes").then(res => res.json()).then(data => setLotes(data)) // Lotes API is not paginated by default }, []) useEffect(() => { if (productorSeleccionado) { // Find establishments for this producer const estabs = establecimientos.filter(e => String(e.productor_id) === productorSeleccionado) const estabIds = estabs.map(e => String(e.id)) // Find lots for those establishments const lotesProd = lotes.filter(l => estabIds.includes(String(l.establecimiento_id))) setLotesFiltrados(lotesProd) setLoteSeleccionado("todos") } else { setLotesFiltrados([]) setLoteSeleccionado("todos") } }, [productorSeleccionado, establecimientos, lotes]) const handleBuscar = async () => { if (!productorSeleccionado) { toast.error("Seleccione un Productor") return } setLoading(true) setHasSearched(true) try { let url = `/recetas?limit=all&productor_id=${productorSeleccionado}` if (campanaSeleccionada && campanaSeleccionada !== "todas") { url += `&campana_id=${campanaSeleccionada}` } if (loteSeleccionado && loteSeleccionado !== "todos") { url += `&lote_id=${loteSeleccionado}` } else { // If no specific lot selected, but we want only the lots of this producer: // By default, the productor_id filter already scopes the recipes to this producer. } const res = await apiFetch(url) const data = await res.json() setRecetas(data.data || []) } catch (e) { toast.error("Error al obtener el historial") } finally { setLoading(false) } } const handlePrint = () => { window.print() } const productorNombre = productores.find(p => String(p.id) === productorSeleccionado)?.nombre || "" const campanaNombre = campanaSeleccionada === "todas" ? "Todas las Campañas" : (campanas.find(c => String(c.id) === campanaSeleccionada)?.nombre || "") const loteNombre = loteSeleccionado === "todos" ? "Todos los Lotes" : (lotes.find(l => String(l.id) === loteSeleccionado)?.nombre || "") if (!mounted) return null return (

Historial de Lotes

Revise las labores aplicadas por productor, campaña y lote

Filtros del Informe Seleccione los parámetros para generar el historial de labores
{/* PRINT VIEW HEADER */}
AgroRecetas

Historial de Lotes

Fecha de emisión: {new Date().toLocaleDateString('es-AR')}

Productor: {productorNombre}

Campaña: {campanaNombre}

Lote/s: {loteNombre}

{/* RESULTS */} {hasSearched && (
{recetas.length === 0 ? (

No se encontraron recetas para los filtros seleccionados.

) : ( recetas.map(receta => { // If a specific lot is selected, we might want to ONLY show the products/details applied to THAT lot. // However, since recipes usually apply the same labor to all its lots, we just show the whole recipe. // Or we can filter the items array to only the selected lot. const itemsToShow = loteSeleccionado !== "todos" ? receta.items.filter((it: any) => String(it.lote_id) === loteSeleccionado) : receta.items; if (itemsToShow.length === 0) return null; const labor = itemsToShow[0]?.labor || "Labor"; const lotesAffected = itemsToShow.map((it: any) => it.lote?.nombre).join(", "); const cultivosAffected = Array.from(new Set(itemsToShow.map((it: any) => it.cultivo?.nombre).filter(Boolean))).join(", "); const productos = itemsToShow[0]?.productos || []; return (
Receta N° {receta.numero} - {labor} Fecha: {receta.fecha} | Establecimiento: {receta.establecimiento?.nombre}
Lotes afectados: {lotesAffected}
{cultivosAffected && (
Cultivo: {cultivosAffected}
)}
{productos.length > 0 ? (
{productos.map((prod: any) => ( ))}
Producto Dosis Cantidad Total
{prod.nombre_producto} {Number(prod.dosis)} {prod.unidad} {Number(prod.cantidad_total).toFixed(3)} {prod.unidad.split("/")[0]}
) : (

Sin productos en esta labor.

)} {receta.observaciones && (
Observaciones: {receta.observaciones}
)}
) }) )}
)}
) }