From decddbb97315c0cd059ac5d3ea9f7bb5fb4ad2a9 Mon Sep 17 00:00:00 2001 From: "Efrain (Helgen)" Date: Tue, 20 Oct 2026 17:11:56 -0600 Subject: [PATCH] Cotizaciones: columna V con el tipo de cambio usado en cotizaciones USD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La interfaz manda el tipo de cambio con que convirtió los precios del catálogo; el servidor lo valida (1–1000, 4 decimales) y lo guarda solo en cotizaciones en USD. En MXN, en filas viejas o con precios capturados sin tipo de cambio queda vacía. El encabezado se agrega solo (patrón de ENCABEZADOS_COTIZACIONES). Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 10 +++++----- Code.js | 9 ++++++--- tests/cotizacion.test.js | 10 +++++++++- tests/interfaz.test.js | 4 +++- tests/proyectos.test.js | 2 +- tests/sesion.test.js | 4 ++-- web/cotizador/index.html | 2 ++ 7 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 64af9b5..b1223c7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -176,7 +176,7 @@ o son lógica pura (sección 5 del archivo, sin servicios de Google, probables e - `redondear(n)`, `formatoMoneda(n)`, `escaparHtml(s)`, `importeConLetra(n, moneda)` ("MIL CIENTO SESENTA PESOS 02/100 M.N."; en USD "MIL CIENTO SESENTA DÓLARES 02/100 USD"). - `normalizarCotizacion(p, ivaTasa)` — limpia cliente/conceptos, exige nombre y ≥1 concepto, calcula importes y totales, `marca`, - `moneda` (`monedaDeCotizacion`: vacía = MXN; solo MXN/USD). + `moneda` (`monedaDeCotizacion`: vacía = MXN; solo MXN/USD) y `tipoCambio` (solo USD, validado con `tipoCambioDesdeValores`). - Cobranza: `esquemaPorOmision`, `validarEsquema` (1–10 etapas, nombres únicos, % > 0 con 2 decimales, suma exacta 100), `montosDeEsquema` (la última etapa absorbe los centavos), `convertirMoneda`, `repartirPago` (etapa elegida → siguientes → anteriores; en centavos), `resumenCobranza` (vuelve a repartir los pagos Vigentes en orden de registro), `validarFechaIso`, @@ -235,10 +235,11 @@ Capa de sesión y `fetch` en `