import React, { useState, useEffect } from 'react'; import { Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, FormControlLabel, Checkbox } from '@mui/material'; import type { PlantaDropdownDto } from '../../models/dtos/Impresion/PlantaDropdownDto'; import plantaService from '../../services/Impresion/plantaService'; interface SeleccionaReporteConsumoBobinasSeccionProps { onGenerarReporte: (params: { fechaDesde: string; fechaHasta: string; idPlanta?: number | null; consolidado: boolean; }) => Promise; onCancel: () => void; isLoading?: boolean; apiErrorMessage?: string | null; } const SeleccionaReporteConsumoBobinasSeccion: React.FC = ({ onGenerarReporte, onCancel, isLoading, apiErrorMessage }) => { const [fechaDesde, setFechaDesde] = useState(new Date().toISOString().split('T')[0]); const [fechaHasta, setFechaHasta] = useState(new Date().toISOString().split('T')[0]); const [idPlanta, setIdPlanta] = useState(''); const [consolidado, setConsolidado] = useState(false); const [plantas, setPlantas] = useState([]); const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); useEffect(() => { const fetchPlantas = async () => { setLoadingDropdowns(true); try { const plantasData = await plantaService.getPlantasForDropdown(); setPlantas(plantasData); } catch (error) { console.error("Error al cargar plantas:", error); setLocalErrors(prev => ({ ...prev, dropdowns: 'Error al cargar plantas.' })); } finally { setLoadingDropdowns(false); } }; fetchPlantas(); }, []); useEffect(() => { if (consolidado) { setIdPlanta(''); } }, [consolidado]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!fechaDesde) errors.fechaDesde = 'Fecha Desde es obligatoria.'; if (!fechaHasta) errors.fechaHasta = 'Fecha Hasta es obligatoria.'; if (fechaDesde && fechaHasta && new Date(fechaDesde) > new Date(fechaHasta)) { errors.fechaHasta = 'Fecha Hasta no puede ser anterior a Fecha Desde.'; } 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; onGenerarReporte({ fechaDesde, fechaHasta, idPlanta: consolidado ? null : Number(idPlanta), consolidado }); }; return ( Parámetros: Consumo de Bobinas por Sección { setFechaDesde(e.target.value); setLocalErrors(p => ({ ...p, fechaDesde: null, fechaHasta: null })); }} margin="normal" fullWidth required error={!!localErrors.fechaDesde} helperText={localErrors.fechaDesde} disabled={isLoading} InputLabelProps={{ shrink: true }} /> { setFechaHasta(e.target.value); setLocalErrors(p => ({ ...p, fechaHasta: null })); }} margin="normal" fullWidth required error={!!localErrors.fechaHasta} helperText={localErrors.fechaHasta} 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 SeleccionaReporteConsumoBobinasSeccion;