"use client" import { useState, Suspense } from "react" import { DashboardLayout } from "@/components/dashboard-layout" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Badge } from "@/components/ui/badge" import { Pencil, Eye } from "lucide-react" import Link from "next/link" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { apiFetch } from "@/lib/apiutils" import { PaginationControl } from "@/components/ui/pagination-control" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { getErrorMessage } from "@/lib/apiutils" import { Plus } from "lucide-react" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { useApi } from "@/lib/use-api" import { toast } from "sonner" interface Establecimiento { id: string nombre: string productor_id: string ubicacion: string hectareas: number productor?: { nombre: string } } interface Campana { id: string nombre: string establecimiento_id: string cultivo: string fecha_inicio: string // snake_case from API fecha_fin: string // snake_case from API status: "activa" | "finalizada" rinde_qq_ha?: number produccion_total?: number rinde_estimado?: number produccion_estimada?: number rinde_por_cultivo?: { cultivo: string superficie: number produccion: number rinde: number }[] cultivos_unicos?: string[] labores_count: number establecimiento?: { hectareas: number } } function CampanasContent() { // Dialog Logic (Create & Edit) const [isDialogOpen, setIsDialogOpen] = useState(false) const [editingId, setEditingId] = useState(null) const [formData, setFormData] = useState({ nombre: "", fecha_inicio: "", fecha_fin: "", estado: "activa" }) // Global Campanas (Main View) const [page, setPage] = useState(1) const { data: campanasData, mutate } = useApi(`/campanas?limit=10&page=${page}`) const campanas = (campanasData?.data || []).map((c: any) => ({ ...c, status: c.estado })) as Campana[] const total = campanasData?.total || 0 const lastPage = campanasData?.last_page || 1 const getStatusColor = (status: string) => { const colors = { activa: "bg-green-100 text-green-800 border-green-300", finalizada: "bg-gray-100 text-gray-800 border-gray-300", } return colors[status as keyof typeof colors] || colors.activa } const handleOpenCreate = () => { setEditingId(null) setFormData({ nombre: "", fecha_inicio: "", fecha_fin: "", estado: "activa" }) setIsDialogOpen(true) } const handleOpenEdit = (campana: Campana) => { setEditingId(campana.id) setFormData({ nombre: campana.nombre, fecha_inicio: campana.fecha_inicio.split('T')[0], fecha_fin: campana.fecha_fin.split('T')[0], estado: campana.status }) setIsDialogOpen(true) } const handleSaveCampaign = async (forceActivation = false) => { if (!formData.nombre || !formData.fecha_inicio || !formData.fecha_fin) { toast.error("Por favor completa todos los campos requeridos") return } try { const bodyPayload = { ...formData, force_activation: forceActivation } let res; if (editingId) { res = await apiFetch(`/campanas/${editingId}`, { method: "PUT", body: JSON.stringify(bodyPayload) }) } else { res = await apiFetch("/campanas", { method: "POST", body: JSON.stringify(bodyPayload) }) } if (res.ok) { toast.success(editingId ? "Campaña actualizada exitosamente." : "Campaña creada exitosamente.") setIsDialogOpen(false) setEditingId(null) setFormData({ nombre: "", fecha_inicio: "", fecha_fin: "", estado: "activa" }) mutate() } else if (res.status === 409) { const errorData = await res.json() if (errorData.error_code === 'ACTIVE_CAMPAIGN_EXISTS') { if (window.confirm(errorData.message)) { // User agreed to auto-deactivate other campaigns handleSaveCampaign(true) } } else { toast.error(errorData.message || "Error al guardar la campaña") } } else { const msg = await getErrorMessage(res) toast.error(msg) } } catch (e) { console.error(e) toast.error("Error de conexión") } } return (

Gestión de Campañas

Administra las campañas agrícolas.

{editingId ? "Editar Campaña" : "Nueva Campaña"} {editingId ? "Modifica los datos de la campaña." : "Crea una nueva campaña (período)."}
{ if (e.target.value.length <= 50) { setFormData({ ...formData, nombre: e.target.value }) } }} maxLength={50} className={formData.nombre.length >= 50 ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {formData.nombre.length >= 50 && (

Has alcanzado el límite máximo de 50 caracteres.

)}
setFormData({ ...formData, fecha_inicio: e.target.value })} />
setFormData({ ...formData, fecha_fin: e.target.value })} />
Nombre Fecha Inicio Fecha Fin Estado Rendimientos Acciones {campanas.length === 0 ? ( No se encontraron campañas. ) : ( campanas.map((campana) => ( {campana.nombre} {new Date(campana.fecha_inicio).toLocaleDateString()} {new Date(campana.fecha_fin).toLocaleDateString()} {campana.status}
{!campana.rinde_por_cultivo || campana.rinde_por_cultivo.length === 0 ? ( - ) : ( campana.rinde_por_cultivo.map((rc, idx) => (
{rc.cultivo}: {rc.rinde} qq/ha
)) )}
)) )}
) } export default function CampanasPage() { return ( Cargando filtros...}> ) }