import React, { useState, useEffect } from 'react'; import { Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, FormControlLabel, Checkbox } from '@mui/material'; import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto'; import publicacionService from '../../services/Distribucion/publicacionService'; import type { PlantaDto } from '../../models/dtos/Impresion/PlantaDto'; import plantaService from '../../services/Impresion/plantaService'; interface SeleccionaReporteTiradasPublicacionesSeccionesProps { onGenerarReporte: (params: { idPublicacion: number; fechaDesde: string; // Primer día del mes fechaHasta: string; // Último día del mes idPlanta?: number | null; consolidado: boolean; }) => Promise; onCancel: () => void; isLoading?: boolean; apiErrorMessage?: string | null; } const SeleccionaReporteTiradasPublicacionesSecciones: React.FC = ({ onGenerarReporte, isLoading, apiErrorMessage }) => { const [idPublicacion, setIdPublicacion] = useState(''); const [mesAnio, setMesAnio] = useState(new Date().toISOString().substring(0, 7)); // Formato "YYYY-MM" const [idPlanta, setIdPlanta] = useState(''); const [consolidado, setConsolidado] = useState(false); const [publicaciones, setPublicaciones] = useState([]); const [plantas, setPlantas] = useState([]); const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); useEffect(() => { const fetchData = async () => { setLoadingDropdowns(true); try { const [pubData, plantaData] = await Promise.all([ publicacionService.getAllPublicaciones(undefined, undefined, true), plantaService.getAllPlantas() ]); setPublicaciones(pubData.map(p => p)); setPlantas(plantaData); } catch (error) { console.error("Error al cargar datos:", error); setLocalErrors(prev => ({ ...prev, dropdowns: 'Error al cargar publicaciones o plantas.' })); } finally { setLoadingDropdowns(false); } }; fetchData(); }, []); useEffect(() => { if (consolidado) { setIdPlanta(''); // Limpiar planta si es consolidado } }, [consolidado]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!idPublicacion) errors.idPublicacion = 'Debe seleccionar una publicación.'; if (!mesAnio) errors.mesAnio = 'Debe seleccionar un Mes/Año.'; if (!consolidado && !idPlanta) { errors.idPlanta = 'Seleccione una planta si no es consolidado.'; } setLocalErrors(errors); return Object.keys(errors).length === 0; }; const handleGenerar = () => { if (!validate()) return; const [year, month] = mesAnio.split('-').map(Number); const fechaDesde = new Date(year, month - 1, 1).toISOString().split('T')[0]; const fechaHasta = new Date(year, month, 0).toISOString().split('T')[0]; onGenerarReporte({ idPublicacion: Number(idPublicacion), fechaDesde, fechaHasta, idPlanta: consolidado ? null : Number(idPlanta), consolidado }); }; return ( Parámetros: Tiradas por Publicación y Secciones Publicación {localErrors.idPublicacion && {localErrors.idPublicacion}} { setMesAnio(e.target.value); setLocalErrors(p => ({ ...p, mesAnio: null })); }} margin="normal" fullWidth required error={!!localErrors.mesAnio} helperText={localErrors.mesAnio} disabled={isLoading} InputLabelProps={{ shrink: true }} /> setConsolidado(e.target.checked)} disabled={isLoading} /> } label="Consolidado (Todas las Plantas)" sx={{ mt: 1, mb: 1 }} /> Planta {localErrors.idPlanta && {localErrors.idPlanta}} {apiErrorMessage && {apiErrorMessage}} {localErrors.dropdowns && {localErrors.dropdowns}} ); }; export default SeleccionaReporteTiradasPublicacionesSecciones;