diff --git a/Code.js b/Code.js index 8e7ffdb..fa151e4 100644 --- a/Code.js +++ b/Code.js @@ -3207,8 +3207,12 @@ function normalizarPagoProveedor(p, orden) { const d = p || {}; const fecha = validarFechaIso(d.fecha, orden.hoy, 'La fecha del pago'); if (orden.fechaOrden && fecha < orden.fechaOrden) throw new Error('La fecha del pago no puede ser anterior a la orden (' + orden.fechaOrden + ').'); - const pago = normalizarPago(Object.assign({}, d, { fecha: fecha, etapaOrden: 1 }), - { moneda: orden.moneda, etapas: 1, hoy: orden.hoy }); + let pago; + try { + pago = normalizarPago(Object.assign({}, d, { fecha: fecha, etapaOrden: 1 }), { moneda: orden.moneda, etapas: 1, hoy: orden.hoy }); + } catch (e) { + throw new Error(String(e.message).replace('El proyecto es en', 'La orden es en')); // aquí la moneda de referencia es la de la orden + } if (Math.abs(aCentavos(pago.montoAplicado) - aCentavos(orden.total)) > aCentavos(TOLERANCIA_PAGO)) { throw new Error('El pago (' + formatoMoneda(pago.montoAplicado) + ' ' + orden.moneda + ') debe ser igual al total de la orden (' + formatoMoneda(orden.total) + ' ' + orden.moneda + ').'); diff --git a/tests/interfaz.test.js b/tests/interfaz.test.js index f1d0a7b..3c6cf0e 100644 --- a/tests/interfaz.test.js +++ b/tests/interfaz.test.js @@ -286,6 +286,8 @@ const esperar=async(n=10)=>{for(let i=0;isetImmedia B.run('pintarCobranza('+JSON.stringify({...firmada,puedeDesbloquear:true})+')'); assert(/Desbloquear contrato/.test(B.$('cobContrato').innerHTML)); + // .oculto gana sobre clases con display propio (.acciones, .tiles…), aunque estén definidas después (pasó en PRUEBAS, 23/10/2026) + assert(/\.oculto \{ display:none !important; \}/.test(html),'.oculto con !important'); // ===== Compras (con permiso, sin cobranza): requisiciones → orden → pago → cierre ===== const C=montar({ivaTasa:0.16,catalogo:CAT,tipoCambio:TC,clientes:[],proyectos:[],marcas:{},permisos:{cobranza:false,desbloqueo:false,compras:true,requisicion:false}}); await esperar(5); diff --git a/tests/requisiciones.test.js b/tests/requisiciones.test.js index 987cc3a..ee87895 100644 --- a/tests/requisiciones.test.js +++ b/tests/requisiciones.test.js @@ -145,7 +145,7 @@ assert.deepEqual([pp.fecha,pp.monto,pp.monedaPago,pp.tipoCambio,pp.montoAplicado assert.equal(P.normalizarPagoProveedor({fecha:'2026-10-21',monto:2319,metodo:'Efectivo'},ORDEN).referencia,'','efectivo sin referencia'); assert.equal(P.normalizarPagoProveedor({fecha:'2026-10-21',monto:125.41,monedaPago:'USD',tipoCambio:18.5,metodo:'Cheque',referencia:'1'},ORDEN).montoAplicado,2320.09); for(const [mal,re] of [[{monto:2321.01},/debe ser igual al total de la orden \(\$2,320\.00 MXN\)/],[{monto:2318.99},/igual al total/], - [{monto:0},/mayor a 0/],[{monedaPago:'USD',monto:125.41},/tipo de cambio/],[{metodo:'Bitcoin'},/método de pago/], + [{monto:0},/mayor a 0/],[{monedaPago:'USD',monto:125.41},/La orden es en MXN y el pago en USD: captura el tipo de cambio/],[{metodo:'Bitcoin'},/método de pago/], [{referencia:''},/referencia/],[{fecha:'2026-10-23'},/no puede ser futura/],[{fecha:'2026-10-19'},/anterior a la orden/],[{fecha:''},/obligatoria/]]){ assert.throws(()=>P.normalizarPagoProveedor({fecha:'2026-10-21',monto:2320,metodo:'Transferencia',referencia:'R',...mal},ORDEN),re,JSON.stringify(mal)); } diff --git a/web/cotizador/index.html b/web/cotizador/index.html index 6875283..203ece5 100644 --- a/web/cotizador/index.html +++ b/web/cotizador/index.html @@ -49,7 +49,7 @@ .aviso { padding:12px 14px; border-radius:6px; margin-bottom:16px; display:none; } .aviso.ok { background:#E6FBF7; border:1px solid var(--teal); display:block; } .aviso.error { background:#FEE2E2; border:1px solid #DC2626; display:block; } - .oculto { display:none; } + .oculto { display:none !important; } /* gana sobre .acciones, .tiles, .grid… (display) aunque estén definidas después */ .fila-cat { cursor:pointer; } .fila-cat:hover td { background:var(--cielo); } .fila-cat.editando td { background:#E6FBF7; }