import React, { useState, useEffect } from 'react'; import { Modal, Box, Typography, TextField, Button, CircularProgress, Alert, FormControl, InputLabel, Select, MenuItem, type SelectChangeEvent, InputAdornment } from '@mui/material'; import type { FacturaDto } from '../../../models/dtos/Suscripciones/FacturaDto'; import type { CreatePagoDto } from '../../../models/dtos/Suscripciones/CreatePagoDto'; import type { FormaPagoDto } from '../../../models/dtos/Suscripciones/FormaPagoDto'; import formaPagoService from '../../../services/Suscripciones/formaPagoService'; const modalStyle = { position: 'absolute' as 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: { xs: '95%', sm: '80%', md: '500px' }, bgcolor: 'background.paper', border: '2px solid #000', boxShadow: 24, p: 4, maxHeight: '90vh', overflowY: 'auto' }; interface PagoManualModalProps { open: boolean; onClose: () => void; onSubmit: (data: CreatePagoDto) => Promise; factura: FacturaDto | null; errorMessage?: string | null; clearErrorMessage: () => void; } const PagoManualModal: React.FC = ({ open, onClose, onSubmit, factura, errorMessage, clearErrorMessage }) => { const [formData, setFormData] = useState>({}); const [formasDePago, setFormasDePago] = useState([]); const [loading, setLoading] = useState(false); const [loadingFormasPago, setLoadingFormasPago] = useState(false); const [localErrors, setLocalErrors] = useState<{ [key: string]: string | null }>({}); useEffect(() => { const fetchFormasDePago = async () => { setLoadingFormasPago(true); try { const data = await formaPagoService.getAllFormasDePago(); setFormasDePago(data.filter(fp => !fp.requiereCBU)); } catch (error) { setLocalErrors(prev => ({ ...prev, formasDePago: 'Error al cargar formas de pago.' })); } finally { setLoadingFormasPago(false); } }; if (open && factura) { fetchFormasDePago(); setFormData({ idFactura: factura.idFactura, monto: factura.saldoPendiente, // Usar el saldo pendiente como valor por defecto fechaPago: new Date().toISOString().split('T')[0] }); setLocalErrors({}); } }, [open, factura]); const validate = (): boolean => { const errors: { [key: string]: string | null } = {}; if (!formData.idFormaPago) errors.idFormaPago = "Seleccione una forma de pago."; if (!formData.fechaPago) errors.fechaPago = "La fecha de pago es obligatoria."; const monto = formData.monto ?? 0; const saldo = factura?.saldoPendiente ?? 0; if (monto <= 0) { errors.monto = "El monto debe ser mayor a cero."; } else if (monto > saldo) { // Usamos toFixed(2) para mostrar el formato de moneda correcto en el mensaje errors.monto = `El monto no puede superar el saldo pendiente de $${saldo.toFixed(2)}.`; } setLocalErrors(errors); return Object.keys(errors).length === 0; }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; const finalValue = name === 'monto' && value !== '' ? parseFloat(value) : value; setFormData(prev => ({ ...prev, [name]: finalValue })); if (localErrors[name]) setLocalErrors(prev => ({ ...prev, [name]: null })); if (errorMessage) clearErrorMessage(); }; const handleSelectChange = (e: SelectChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); if (localErrors[name]) setLocalErrors(prev => ({ ...prev, [name]: null })); if (errorMessage) clearErrorMessage(); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); clearErrorMessage(); if (!validate()) return; setLoading(true); let success = false; try { await onSubmit(formData as CreatePagoDto); success = true; } catch (error) { success = false; } finally { setLoading(false); if (success) onClose(); } }; if (!factura) return null; return ( Registrar Pago Manual Saldo Pendiente: ${factura.saldoPendiente.toFixed(2)} Forma de Pago $ }} inputProps={{ step: "0.01" }} /> {errorMessage && {errorMessage}} ); }; export default PagoManualModal;