// Modal para registrar un pago nuevo. function RegistrarPagoModal({ factura, vendedora, onClose, onSaved }) { const T = window.T; const { Icon } = window; // Fallback si Icon no existe, usamos SVG inline const CameraIcon = () => ( ); const billing = window.useBilling ? window.useBilling(factura?.vendedoraId) : { state: window.loadBilling(), loading: false }; const state = billing.state; const pagos = state.pagos.filter(p => p.facturaId === factura.id); const saldo = window.facturaSaldo(factura, pagos); const [metodo, setMetodo] = React.useState('Pago Móvil'); const [monto, setMonto] = React.useState(saldo.toFixed(2)); const [banco, setBanco] = React.useState('Banesco'); const [referencia, setReferencia] = React.useState(''); const [fecha, setFecha] = React.useState(new Date().toISOString().slice(0, 10)); const [nota, setNota] = React.useState(''); const [captura, setCaptura] = React.useState(null); const [error, setError] = React.useState(''); const [submitting, setSubmitting] = React.useState(false); const metodos = ['Pago Móvil', 'Transferencia', 'Efectivo']; const bancos = ['Banesco', 'Mercantil', 'Venezuela', 'Provincial', 'BNC', 'Bicentenario', 'Otro']; const onFile = (e) => { const f = e.target.files[0]; if (!f) return; const reader = new FileReader(); reader.onload = (ev) => setCaptura(ev.target.result); reader.readAsDataURL(f); }; const submit = async () => { setError(''); const m = parseFloat(monto); if (!m || m <= 0) { setError('Ingresa un monto válido'); return; } if (metodo !== 'Efectivo' && !referencia) { setError('Ingresa la referencia'); return; } if (metodo !== 'Efectivo' && !captura) { setError('Sube la captura del pago'); return; } if (!fecha) { setError('Ingresa la fecha del pago'); return; } setSubmitting(true); try { const payload = { facturaId: factura.id, vendedoraId: vendedora.id, monto: m, metodo, banco: metodo === 'Efectivo' ? '' : banco, referencia, fecha, capturaDataUrl: captura, nota, }; if (window.pedidosApi && window.pedidosApi.registrarPago) { const res = await window.pedidosApi.registrarPago(payload); if (!res.ok) { setError(res.error || 'No se pudo registrar el pago'); setSubmitting(false); return; } } else { window.registrarPago(payload); } onSaved(); } catch (e) { console.error(e); setError('Error inesperado: ' + (e.message || e)); setSubmitting(false); } }; return (
e.stopPropagation()} style={{ width: '100%', background: T.paper, borderRadius: '28px 28px 0 0', maxHeight: '92%', display: 'flex', flexDirection: 'column', }}>
Registrar pago
Saldo {window.fmtMoney(saldo)}
{/* Método */}
Método
{metodos.map(m => ( ))}
Monto
Fecha
{metodo !== 'Efectivo' && ( <>
Banco
Referencia
Captura del pago
)}
Nota (opcional)
{error && (
{error}
)}
); } function Lbl({ children }) { const T = window.T; return
{children}
; } function Input({ value, onChange, placeholder, type = 'text' }) { const T = window.T; return ( onChange(e.target.value)} placeholder={placeholder} style={{ width: '100%', padding: '12px 14px', borderRadius: 12, background: T.paperAlt, border: `1px solid ${T.hairline}`, fontFamily: T.sans, fontSize: 14, color: T.ink, outline: 'none', boxSizing: 'border-box', }} /> ); } function selStyle(T) { return { width: '100%', padding: '12px 14px', borderRadius: 12, background: T.paperAlt, border: `1px solid ${T.hairline}`, fontFamily: T.sans, fontSize: 14, color: T.ink, outline: 'none', boxSizing: 'border-box', }; } window.RegistrarPagoModal = RegistrarPagoModal;