mirror of
https://github.com/efrainsosa27/cotizador-helgen.git
synced 2026-10-24 05:16:48 +00:00
Cobranza: buscador para abrir cualquier proyecto desde el resumen (también sin cotización aceptada)
Sin él, un proyecto nuevo no se podía abrir para marcar su primera cotización aceptada (el resumen solo lista proyectos con contrato). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
b99630ba00
commit
06ef8249c3
@ -170,6 +170,13 @@ const esperar=async(n=10)=>{for(let i=0;i<n;i++) await new Promise(r=>setImmedia
|
||||
assert.equal(csv[0].charCodeAt(0),0xFEFF,'BOM para Excel'); assert(csv[0].includes('"Contratado con IVA","Cobrado","Saldo"'));
|
||||
assert.equal(csv[1],'"PRY-2026-0003","Techo","\'=Luis, ""SA""","Helgen","Firmado","MXN",11600.00,5000.00,6600.00,43.1,"Instalación",3480.00,"2026-10-20",2,4850.00,5150.00,51.5');
|
||||
assert(csv[3].endsWith(',0,,,'),'sin margen: celdas vacías'); assert.equal(csv.length,4);
|
||||
// Desde el resumen se abre cualquier proyecto, también uno sin cotización aceptada (no está en la tabla)
|
||||
const nAntes=B.llamadas.filter(c=>c.funcion==='getCobranzaProyecto').length;
|
||||
B.$('resProyecto').value='PRY-2026-0001 — Luis — Solar MX — Techo'; B.$('resProyecto').disparar('change'); await esperar();
|
||||
const abiertos=B.llamadas.filter(c=>c.funcion==='getCobranzaProyecto');
|
||||
assert.equal(abiertos.length,nAntes+1); assert.equal(abiertos.pop().args[0],'PRY-2026-0001');
|
||||
assert(!B.$('cobVistaProyecto').classList.contains('oculto')&&B.$('resProyecto').value==='','abre el proyecto y limpia el buscador');
|
||||
B.run('verResumenCob()'); await esperar();
|
||||
// Clic en un renglón abre el proyecto; "← Resumen" regresa
|
||||
B.respuestas.getCobranzaProyecto={ok:true,datos:{proyecto:PRY,cotizaciones:[],contrato:null,esquema:[],resumen:null,pagos:[],puedeAceptar:true,puedeFirmar:false,metodos:[],hoy:'2026-10-20'}};
|
||||
B.run("abrirProyectoCob('PRY-2026-0001')"); await esperar();
|
||||
|
||||
@ -278,6 +278,9 @@
|
||||
<div id="cobVistaResumen">
|
||||
<div class="modulo">
|
||||
<h2>1 · Resumen de cobranza</h2>
|
||||
<!-- Todos los proyectos (también sin cotización aceptada): desde aquí se marca la primera aceptada -->
|
||||
<div style="margin-bottom:12px"><label>Abrir un proyecto (todos, también sin cotización aceptada)</label>
|
||||
<input id="resProyecto" list="cobProyectosList" autocomplete="off" placeholder="Busca por folio, cliente o nombre"></div>
|
||||
<div id="resTotales" class="nota">Cargando…</div>
|
||||
<div class="acciones">
|
||||
<input id="resBuscar" placeholder="Buscar por folio, cliente o nombre…" oninput="pintarResumenCob()" style="flex:1; min-width:220px">
|
||||
@ -1010,6 +1013,12 @@
|
||||
return (folio && COB_PROYECTOS.find(p => p.folio === folio)) || null;
|
||||
}
|
||||
$('cobProyecto').addEventListener('change', () => { const p = proyectoCobElegido(); if (p) abrirProyectoCob(p.folio); });
|
||||
// Desde el resumen: cualquier proyecto (el resumen solo lista los que tienen contrato)
|
||||
$('resProyecto').addEventListener('change', () => {
|
||||
const folio = ($('resProyecto').value.trim().match(/^PRY-\d{4}-\d{4}/i) || [''])[0].toUpperCase();
|
||||
const p = folio && COB_PROYECTOS.find(x => x.folio === folio);
|
||||
if (p) { $('resProyecto').value = ''; abrirProyectoCob(p.folio); }
|
||||
});
|
||||
|
||||
function abrirProyectoCob(folio) {
|
||||
$('cobVistaResumen').classList.add('oculto'); $('cobVistaProyecto').classList.remove('oculto');
|
||||
|
||||
Loading…
Reference in New Issue
Block a user