CJ
Hola, Cajero
0
Cobros hoy
$0
Saldo en caja
$0
Efectivo
$0
Transferencias
Ultimos cobros
📭
Sin cobros hoy
0 pagos
$0
📋
Cargando historial...
👥
Busca un cliente para cobrar
-
-
$0
deuda pendiente
Facturas pendientes
Sin facturas pendientes
Ultimos pagos
Sin pagos recientes
📸
Sin comprobantes pendientes
CJ
Cajero
Cajero
'); w.document.close(); w.print(); } function abrirPago(){ if(!currentClient)return;var saldo=parseFloat(currentClient.saldo_total)||0; document.getElementById('pago-cliente-info').textContent=currentClient.nombre+' - '+(currentClient.documento||currentClient.telefono||''); document.getElementById('pago-deuda').textContent=fmtAR(saldo); document.getElementById('pago-monto').value=saldo>0?saldo:''; document.getElementById('pago-notas').value='';document.getElementById('pago-metodo').value='efectivo'; document.getElementById('btn-confirmar-pago').disabled=false;document.getElementById('btn-confirmar-pago').innerHTML='✅ Confirmar Cobro'; openModal('modal-pago');setTimeout(function(){document.getElementById('pago-monto').focus();},300); } function confirmarPago(){ var monto=parseFloat(document.getElementById('pago-monto').value); if(!monto||monto<=0){toast('Ingresa un monto valido');return;} if(!currentClient){toast('Error: sin cliente');return;} var btn=document.getElementById('btn-confirmar-pago');btn.disabled=true;btn.innerHTML='⌛ Procesando...'; var body={cliente_id:currentClient.id,monto:monto,metodo:document.getElementById('pago-metodo').value,notas:document.getElementById('pago-notas').value}; fetch('/api/pagos',{method:'POST',headers:H(),body:JSON.stringify(body)}).then(function(r){return r.json();}).then(function(d){ if(d.ok){ closeModal('modal-pago'); toast('Pago de '+fmtAR(monto)+' registrado'); currentClient.saldo_total=d.nuevo_saldo||0; document.getElementById('det-saldo').textContent=fmtAR(d.nuevo_saldo||0); loadPagos(currentClient.id); loadFacturas(currentClient.id); // Sprint 0.6: modal con boton para imprimir comprobante if(d.pago_id){ mostrarModalPagoOK(d.pago_id, monto); } } else{toast('Error: '+(d.detail||d.error||'Error desconocido'));} btn.disabled=false;btn.innerHTML='✅ Confirmar Cobro'; }).catch(function(e){toast('Error de conexion');btn.disabled=false;btn.innerHTML='✅ Confirmar Cobro';}); } function mostrarModalPagoOK(pagoId, monto){ document.getElementById('po-monto').textContent = fmtAR(monto); document.getElementById('po-pago-id').value = pagoId; openModal('modal-pago-ok'); } function imprimirComprobantePago(){ var pagoId = document.getElementById('po-pago-id').value; if(!pagoId) return; fetch('/api/pagos/'+pagoId+'/recibo-pdf',{headers:H()}) .then(function(r){return r.ok ? r.blob() : null;}) .then(function(blob){ if(!blob){toast('No se pudo generar el comprobante');return;} var url = URL.createObjectURL(blob); window.open(url, '_blank'); setTimeout(function(){URL.revokeObjectURL(url);}, 60000); closeModal('modal-pago-ok'); }).catch(function(e){toast('Error al generar PDF');console.warn(e);}); } function loadComprobantes(){ fetch('/api/comprobantes-wa?estado=pendiente&limit=20',{headers:H()}).then(function(r){return r.json();}).then(function(d){ var comps=d.comprobantes||[];var el=document.getElementById('lista-comprobantes'); if(!comps.length){el.innerHTML='
Sin comprobantes pendientes
';return;} el.innerHTML=comps.map(function(c){ var imgTag=c.imagen_base64?'':''; return '
📸
'+(c.cliente_nombre||c.nombre_wa||'Desconocido')+'
Monto: '+(c.monto_declarado?fmtAR(c.monto_declarado):'No indicado')+' - '+(c.created_at||'').substring(0,16)+'
'+imgTag+(c.notas?'
'+c.notas+'
':'')+'
'; }).join(''); }).catch(function(){}); } function confirmarComp(compId,clienteId,monto){ var m=prompt('Monto a confirmar:',monto||'');if(!m)return; fetch('/api/comprobantes-wa/'+compId+'/confirmar',{method:'POST',headers:H(),body:JSON.stringify({monto:parseFloat(m),notas:'Confirmado desde App Cajero'})}).then(function(r){return r.json();}).then(function(d){ if(d.ok||d.pago_id){toast('Comprobante confirmado');loadComprobantes();loadHome();}else toast('Error: '+(d.detail||d.error||'')); }).catch(function(){toast('Error de conexion');}); } function rechazarComp(compId){ if(!confirm('Rechazar este comprobante?'))return; fetch('/api/comprobantes-wa/'+compId+'/rechazar',{method:'POST',headers:H(),body:JSON.stringify({motivo:'Rechazado desde App Cajero'})}).then(function(r){return r.json();}).then(function(d){ if(d.ok){toast('Comprobante rechazado');loadComprobantes();}else toast('Error: '+(d.detail||d.error||'')); }).catch(function(){toast('Error de conexion');}); } // Set caja name from user before loading // Get user name from auth var _uname = ''; try { var _xhr = new XMLHttpRequest(); _xhr.open('GET', '/api/auth/verify', false); _xhr.setRequestHeader('Authorization', 'Bearer '+(localStorage.getItem('fg_token')||'')); _xhr.send(); if(_xhr.status===200) { var _ud = JSON.parse(_xhr.responseText); _uname = (_ud.usuario||_ud.user||_ud||{}).nombre || ''; } } catch(e){} _cajaName = _cajaUserMap[(_uname||'').toLowerCase()] || _cajaUserMap[usuario.nombre||''] || usuario.nombre || ''; console.log('Caja name:', _cajaName); loadHome(); // Set default dates for historial (empty = all dates) document.getElementById('hist-desde').value = ''; document.getElementById('hist-hasta').value = ''; var _histOffset = 0; var _histData = []; function loadHistorial() { _histOffset = 0; _histData = []; _fetchHistorial(false); } function loadHistorialMore() { _fetchHistorial(true); } function _fetchHistorial(append) { var q = (document.getElementById('hist-buscar').value || '').trim(); var desde = document.getElementById('hist-desde').value || ''; var hasta = document.getElementById('hist-hasta').value || ''; var medio = document.getElementById('hist-medio').value || ''; var url = '/api/caja/historial-pagos?limit=50&offset=' + _histOffset; if (desde) url += '&fecha_desde=' + desde; if (hasta) url += '&fecha_hasta=' + hasta; if (medio) url += '&medio=' + medio; if (q) url += '&q=' + encodeURIComponent(q); fetch(url, {headers: H()}).then(function(r) { return r.json(); }).then(function(d) { var pagos = d.pagos || d.movimientos || d || []; if (!Array.isArray(pagos)) pagos = []; if (append) { _histData = _histData.concat(pagos); } else { _histData = pagos; } _histOffset = _histData.length; var el = document.getElementById('historial-lista'); var countEl = document.getElementById('hist-count'); var totalEl = document.getElementById('hist-total'); var moreBtn = document.getElementById('hist-more'); if (!_histData.length) { el.innerHTML = '
📋
Sin pagos encontrados
'; countEl.textContent = '0 pagos'; totalEl.textContent = '$0'; moreBtn.style.display = 'none'; return; } var total = 0; var icons = {efectivo: '\u{1F4B5}', transferencia: '\u{1F3E6}', mercadopago: '\u{1F4F1}', tarjeta: '\u{1F4B3}'}; el.innerHTML = _histData.map(function(m) { total += parseFloat(m.monto || 0); var fecha = (m.fecha_pago || m.creado_en || '').substring(0, 10); var hora = (m.creado_en || '').substring(11, 16); return '
' + '
' + (icons[m.medio_pago || m.medio] || '\u{1F4B0}') + '
' + '
' + '
' + (m.cliente_nombre || m.nombre || '-') + '
' + '
' + (m.medio_pago || m.medio || 'efectivo') + ' \u2022 ' + fecha + ' ' + hora + '
' + '
' + '
' + '
' + fmtAR(m.monto) + '
' + '
' + (m.estado || '') + '
' + '
'; }).join(''); var serverTotal = d.total_count || _histData.length; var serverMonto = d.total_monto || total; countEl.textContent = serverTotal + ' pagos' + (_histData.length < serverTotal ? ' (mostrando ' + _histData.length + ')' : ''); totalEl.textContent = fmtAR(serverMonto); moreBtn.style.display = pagos.length >= 50 ? '' : 'none'; }).catch(function(e) { document.getElementById('historial-lista').innerHTML = '
Error cargando historial
'; }); }