import React, { useState, useEffect } from 'react'; import { Modal, Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, RadioGroup, FormControlLabel, Radio, InputAdornment } from '@mui/material'; import type { PagoDistribuidorDto } from '../../../models/dtos/Contables/PagoDistribuidorDto'; import type { CreatePagoDistribuidorDto } from '../../../models/dtos/Contables/CreatePagoDistribuidorDto'; import type { UpdatePagoDistribuidorDto } from '../../../models/dtos/Contables/UpdatePagoDistribuidorDto'; import type { DistribuidorDto } from '../../../models/dtos/Distribucion/DistribuidorDto'; import type { TipoPago } from '../../../models/Entities/TipoPago'; import type { EmpresaDto } from '../../../models/dtos/Distribucion/EmpresaDto'; import distribuidorService from '../../../services/Distribucion/distribuidorService'; import tipoPagoService from '../../../services/Contables/tipoPagoService'; import empresaService from '../../../services/Distribucion/empresaService'; const modalStyle = { /* ... (mismo estilo) ... */ position: 'absolute' as 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: { xs: '90%', sm: 600 }, bgcolor: 'background.paper', border: '2px solid #000', boxShadow: 24, p: 4, maxHeight: '90vh', overflowY: 'auto' }; interface PagoDistribuidorFormModalProps { open: boolean; onClose: () => void; onSubmit: (data: CreatePagoDistribuidorDto | UpdatePagoDistribuidorDto, idPago?: number) => Promise; initialData?: PagoDistribuidorDto | null; errorMessage?: string | null; clearErrorMessage: () => void; } const PagoDistribuidorFormModal: React.FC = ({ open, onClose, onSubmit, initialData, errorMessage, clearErrorMessage }) => { const [idDistribuidor, setIdDistribuidor] = useState(''); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [tipoMovimiento, setTipoMovimiento] = useState<'Recibido' | 'Realizado'>('Recibido'); const [recibo, setRecibo] = useState(''); const [monto, setMonto] = useState(''); const [idTipoPago, setIdTipoPago] = useState(''); const [detalle, setDetalle] = useState(''); const [idEmpresa, setIdEmpresa] = useState(''); const [distribuidores, setDistribuidores] = useState([]); const [tiposPago, setTiposPago] = useState([]); const [empresas, setEmpresas] = useState([]); const [loading, setLoading] = useState(false); const [loadingDropdowns, setLoadingDropdowns] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); const isEditing = Boolean(initialData); useEffect(() => { // Esta función se encarga de cargar los datos de los dropdowns. const fetchDropdownData = async () => { setLoadingDropdowns(true); try { const [distData, tiposPagoData, empresasData] = await Promise.all([ distribuidorService.getAllDistribuidores(), tipoPagoService.getAllTiposPago(), empresaService.getAllEmpresas() ]); setDistribuidores(distData); setTiposPago(tiposPagoData); setEmpresas(empresasData); } catch (error) { console.error("Error al cargar datos para dropdowns", error); setLocalErrors(prev => ({...prev, dropdowns: 'Error al cargar datos necesarios.'})); } finally { setLoadingDropdowns(false); } }; if (open) { fetchDropdownData(); setIdDistribuidor(initialData?.idDistribuidor || ''); setFecha(initialData?.fecha || new Date().toISOString().split('T')[0]); setTipoMovimiento(initialData?.tipoMovimiento || 'Recibido'); setRecibo(initialData?.recibo?.toString() || ''); setMonto(initialData?.monto?.toString() || ''); setIdTipoPago(initialData?.idTipoPago || ''); setDetalle(initialData?.detalle || ''); setIdEmpresa(initialData?.idEmpresa || ''); setLocalErrors({}); } }, [open, initialData]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!idDistribuidor) errors.idDistribuidor = 'Seleccione un distribuidor.'; if (!fecha.trim()) errors.fecha = 'La fecha es obligatoria.'; else if (!/^\d{4}-\d{2}-\d{2}$/.test(fecha)) errors.fecha = 'Formato de fecha inválido.'; if (!tipoMovimiento) errors.tipoMovimiento = 'Seleccione un tipo de movimiento.'; if (!recibo.trim() || isNaN(parseInt(recibo)) || parseInt(recibo) <= 0) errors.recibo = 'Nro. Recibo es obligatorio y numérico.'; if (!monto.trim() || isNaN(parseFloat(monto)) || parseFloat(monto) <= 0) errors.monto = 'Monto debe ser un número positivo.'; if (!idTipoPago) errors.idTipoPago = 'Seleccione un tipo de pago.'; if (!idEmpresa) errors.idEmpresa = 'Seleccione una empresa (para el saldo).'; setLocalErrors(errors); return Object.keys(errors).length === 0; }; const handleInputChange = (fieldName: string) => { if (localErrors[fieldName]) setLocalErrors(prev => ({ ...prev, [fieldName]: null })); if (errorMessage) clearErrorMessage(); }; const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); clearErrorMessage(); if (!validate()) return; setLoading(true); try { const montoNum = parseFloat(monto); if (isEditing && initialData) { const dataToSubmit: UpdatePagoDistribuidorDto = { monto: montoNum, idTipoPago: Number(idTipoPago), detalle: detalle || undefined, }; // << INICIO DE LA CORRECCIÓN >> await onSubmit(dataToSubmit, initialData.idPago); // << FIN DE LA CORRECCIÓN >> } else { const dataToSubmit: CreatePagoDistribuidorDto = { idDistribuidor: Number(idDistribuidor), fecha, tipoMovimiento, recibo: parseInt(recibo, 10), monto: montoNum, idTipoPago: Number(idTipoPago), detalle: detalle || undefined, idEmpresa: Number(idEmpresa), }; await onSubmit(dataToSubmit); } onClose(); } catch (error: any) { console.error("Error en submit de PagoDistribuidorFormModal:", error); } finally { setLoading(false); } }; return ( {isEditing ? 'Editar Pago de Distribuidor' : 'Registrar Nuevo Pago de Distribuidor'} Distribuidor {localErrors.idDistribuidor && {localErrors.idDistribuidor}} Empresa (del Saldo) {localErrors.idEmpresa && {localErrors.idEmpresa}} {setFecha(e.target.value); handleInputChange('fecha');}} margin="dense" fullWidth error={!!localErrors.fecha} helperText={localErrors.fecha || ''} disabled={loading || isEditing} InputLabelProps={{ shrink: true }} autoFocus={!isEditing} /> Tipo de Movimiento {setTipoMovimiento(e.target.value as 'Recibido' | 'Realizado'); handleInputChange('tipoMovimiento');}} > } label="Recibido de Distribuidor" disabled={loading || isEditing}/> } label="Realizado a Distribuidor" disabled={loading || isEditing}/> {localErrors.tipoMovimiento && {localErrors.tipoMovimiento}} {setRecibo(e.target.value); handleInputChange('recibo');}} margin="dense" fullWidth error={!!localErrors.recibo} helperText={localErrors.recibo || ''} disabled={loading || isEditing} inputProps={{min:1}} /> {setMonto(e.target.value); handleInputChange('monto');}} margin="dense" fullWidth error={!!localErrors.monto} helperText={localErrors.monto || ''} disabled={loading} inputProps={{step: "0.01", min:0.05, lang:"es-AR" }} InputProps={{ startAdornment: $ }} /> Tipo de Pago {localErrors.idTipoPago && {localErrors.idTipoPago}} setDetalle(e.target.value)} margin="dense" fullWidth multiline rows={2} disabled={loading} /> {errorMessage && {errorMessage}} {localErrors.dropdowns && {localErrors.dropdowns}} ); }; export default PagoDistribuidorFormModal;