# Historial de Actualizaciones del Sistema de Cotizaciones

---


## Versión 1.0.520 - 11 de Junio de 2026

- **Emisión DTE — kardex del ERP correcto:** al registrar el movimiento de stock en `geitems_mov` ahora se asigna **`ITMID = MAX(ITMID)+1`** (el correlativo lógico que el ERP usa para mostrar el kardex, distinto del PK `itmid1`) y en **`ITMDES`** queda el número de documento (ej. `FAC.ELEC(33)142447`). Además se graba **`CA_ID = 0`** en `gefac_enc`.

---


## Versión 1.0.519 - 11 de Junio de 2026

- **Emisión DTE — cabecera de factura más completa:** al guardar la factura en el ERP ahora se llenan correctamente: **FATERMS** (código de condición de pago de la cotización), **FAREF** (texto de la condición de pago), **FATIPOCOT** (código de tipo de cotización, ej. NV/TI, desde `getipos`), **FAPRIO=0**, **FANOTA1/2/3** en blanco (no NULL) y **FAENVIO/FAENVIODES** (transportista y su descripción; en blanco si no hay envío).

---


## Versión 1.0.517 - 11 de Junio de 2026

- **Emisión DTE — estados:** la factura nace con estado **"Generada"** y pasa a **"GEN./IMP."** cuando el DTE se envía a facturacion (se escribe el TXT de dte_plano). Además, la **cotización** facturada cambia de **ACTIVA a COMPLETA** (`gecot_enc.COESTADO`).
- **Historial — ícono Emitir factura:** junto a la columna **Origen** del historial aparece un ícono 🧾 para emitir la factura directamente (solo cotizaciones del ERP, en estado ACTIVA, para admin con proveedor DTE configurado). Tras emitir, el listado se refresca.

---


## Versión 1.0.515 - 11 de Junio de 2026

- **Emisión DTE — vencimiento de la factura:** al emitir, la factura ahora graba la **fecha de vencimiento** (`gefac_enc.FAFECVEN`) calculada desde la **condición de pago**: crédito a **30/45/60/90/120 días** → fecha de emisión + esos días; cualquier otra condición (contado, efectivo, transferencia…) → la **misma fecha de emisión**. Es un dato interno (no se imprime en el PDF).

---


## Versión 1.0.513 - 11 de Junio de 2026

- **Facturación DTE — botón "Emitir factura" + fix:** se agregó el botón **🧾 Emitir factura** en la vista de la cotización (historial del ERP), visible solo para admin y con un proveedor DTE configurado; si ya está facturada muestra **✅ Facturada**. Se corrigió un error al emitir (`Out of range value for column 'CODFACT'`): la columna `gecot_det.CODFACT` es un **flag** `decimal(1,0)`, así que la cotización se marca facturada con `CODFACT=1` (el número de factura se relaciona por `gefac_enc.FANROCOT`).

---


## Versión 1.0.510 - 11 de Junio de 2026

- **Cotización (ERP) — fecha de despacho:** al guardar la cotización en el ERP ahora se registra la **fecha de despacho** en `gecot_enc.COFECDESP`. En el formulario hay un campo nuevo "Fecha de despacho" que viene por defecto con **el día siguiente** a la creación y se puede **modificar**. Si no se indica, el backend usa COFEC + 1 día.

---


## Versión 1.0.508 - 11 de Junio de 2026

- **Facturación DTE — emisión EN VIVO (cotización → factura):** botón **Emitir factura** (tras previsualizar) que, en una sola transacción: asigna el folio (`MAX(FANRO)+1` de `FATIPO='FEL'` con bloqueo), inserta la cabecera `gefac_enc` y el detalle `gefac_det`, registra el movimiento de stock en `geitems_mov` y llama al procedimiento `recalcular_stock` (que actualiza `geitems_mae`), marca la cotización como facturada (`gecot_det.CODFACT`) y deja el **TXT `dte_plano`** en la carpeta configurada para que facturacion.cl lo suba. Incluye confirmación y valida que la cotización no esté ya facturada.

---


## Versión 1.0.507 - 11 de Junio de 2026

- **Facturación DTE — observaciones fijas:** el TXT ahora incluye el bloque `->Observacion<-`. Las líneas 2 y 3 salen de los **descriptores fijos 100011/100012** (`gedescriptores.texto`); si están vacíos, se usan las notas de la cotización. La línea 1 es siempre la nota de la cotización. Nuevo **editor en Conexiones → 🧾 Facturación DTE** para cargar/editar esos dos textos. Como van en el TXT, también aparecen en el PDF timbrado que devuelve facturacion.cl.

---


## Versión 1.0.504 - 11 de Junio de 2026

- **Facturación DTE — generador TXT según spec oficial:** se ajustó el generador del archivo plano de facturacion.cl a la [especificación oficial](https://www.facturacion.cl/manualintegracion/archivoplano.php): bloque `Totales` con `PorcDesctoTot` (% descuento global desde `CODESC_POR`) + `ValorDesctoTot`; `Detalle` con el orden correcto `PorcDescto;ValorDescto;PorcRecgo;ValorRecgo;ValorExento;Valor` y precio bruto; `Giro` y `Email` tomados de los datos maestros del cliente (`gecli.CLIGIRO/CLIMAIL`); `FormaPago` (1=Contado/2=Crédito) según la condición de pago.

---


## Versión 1.0.503 - 11 de Junio de 2026

- **Facturación DTE — previsualización (sin escribir):** desde **Conexiones → 🧾 Facturación DTE** se puede previsualizar la factura de una cotización: genera el **TXT `dte_plano`** (formato facturacion.cl) y muestra el **plan de inserts** en el ERP (`gefac_enc`, `gefac_det`, `geitems_mov` + `recalcular_stock` sobre la columna de stock correcta), **sin tocar la base ni el disco**. Folio estimado = `MAX(FANRO)+1` sobre `FATIPO='FEL'`. Sirve para validar contra una emisión real de gestion2006 antes de activar la emisión en vivo.

---


## Versión 1.0.501 - 11 de Junio de 2026

- **Facturación electrónica (DTE) — selector de proveedor por empresa:** nueva pestaña **Conexiones → 🧾 Facturación DTE** para elegir con qué motor emite cada empresa: **facturacion.cl** (programa `dte_plano`, intercambio por archivos TXT en `C:\gestion2006\dte`) o **LibreDTE** (API). Incluye la opción de descontar stock al emitir (`geitems_mae` + `geitems_mov`). Queda armada la arquitectura de "enchufe" (un botón de emisión, varios motores); la emisión real se implementa en el siguiente paso.

---


## Versión 1.0.499 - 11 de Junio de 2026

- **Conciliación bancaria — cartola en PDF:** ahora el sistema **sí lee la cartola en PDF**. Como las cartolas PDF no quedan con columnas limpias, se agregó un lector que recorre el PDF **línea por línea** buscando una **fecha + montos** (formato chileno `1.234.567`) y arma los abonos para el cruce por monto. Si el PDF no trae movimientos legibles, ahora muestra un **mensaje claro** sugiriendo Excel/CSV.

---


## Versión 1.0.496 - 11 de Junio de 2026

- **Pantalla de Despachos:** ya no muestra las cotizaciones marcadas como **"retira cliente"** (`CORETIRA=1`). En el picking solo aparece lo que efectivamente hay que **despachar/enviar**.

---


## Versión 1.0.494 - 11 de Junio de 2026

- **Conexiones → nueva pestaña "Acceso HTTPS (guía)":** guía paso a paso para publicar el sistema en `https://app.graficanet.cl` usando Caddy (reverse proxy) sin tocar el correo ni el hosting actual. Incluye los datos de la conexión detectados, reserva de IP, apertura de puertos 80/443, registro CNAME al DDNS, instalación de Caddy, Caddyfile y comandos.

---


## Versión 1.0.492 - 11 de Junio de 2026

- **Foto al solicitar acceso (corrección):** ahora el formulario de consentimiento aparece y la foto se captura correctamente. Antes la configuración (`login_foto_activa`) se leía *después* de mostrar el login, por lo que el sistema creía que la foto estaba desactivada y nunca la pedía.

---


## Versión 1.0.491 - 11 de Junio de 2026

- **Logo Kognit (transparente)**: Se reemplazó el logo por la versión con **fondo transparente**, que se ve mejor sobre el fondo del login.

---


## Versión 1.0.488 - 11 de Junio de 2026

- **Foto al solicitar acceso — interruptor**: En **Conexiones → 🔐 Accesos al sitio** se agregó un panel de configuración para **activar/desactivar la captura de fotografía** del equipo que solicita acceso, con el **texto legal/consentimiento editable**. Al activarlo, cuando un equipo no autorizado pide acceso se le solicita aceptar el consentimiento y se captura una foto (cámara), que el administrador ve junto a la solicitud en el historial. *(La cámara requiere HTTPS o localhost y permiso del navegador; si no hay cámara, la solicitud se envía sin foto.)*

---


## Versión 1.0.485 - 11 de Junio de 2026

- **Login — logo o texto (no ambos)**: Como el logo de Kognit ya incluye el nombre, ahora si el **logo carga** se muestra **solo el logo**; si por algún motivo **no carga**, aparece el **texto "Kognit"** como respaldo (antes salían los dos).

---


## Versión 1.0.483 - 11 de Junio de 2026

- **Fix logo del login**: El login no mostraba el logo porque el servidor no tenía una ruta para `/logo.png` (la imagen daba 404). Se agregó la **ruta pública `/logo.png`** que entrega `files/logo.png`; ahora el logo de Kognit aparece en el inicio de sesión.

---


## Versión 1.0.481 - 11 de Junio de 2026

- **Login — logo responsive**: El logo de Kognit en el login se ajusta automáticamente al tamaño de pantalla (entre 130 y 200 px, máximo 30% del alto) para verse bien en cualquier resolución.

---


## Versión 1.0.479 - 11 de Junio de 2026

- **Nuevo nombre: Kognit**: El sistema pasa a llamarse **Kognit**, con su **logo** en la pantalla de inicio de sesión y el nombre actualizado en el **título de la pestaña**, la **barra superior** (cuando no hay empresa conectada), la **app instalable (PWA)** y textos del backend (pie de informes PDF, asunto de correo de prueba).
- **Fix menú — dropdown abierto**: El menú desplegable de los grupos (ej. "Doctos. Venta") ahora **se cierra** al elegir una opción o al hacer clic fuera (antes quedaba abierto).

---


## Versión 1.0.475 - 11 de Junio de 2026

- **Informe Por vendedor — % facturado**: Se agregó la columna **"% Fact."** que muestra el **porcentaje de cotizaciones facturadas** de cada vendedor (facturadas / total), con semáforo de color (verde ≥70%, ámbar ≥40%, rojo <40%) y total general.

---


## Versión 1.0.473 - 11 de Junio de 2026

- **Pantalla de Despachos**: cada tarjeta muestra la **fecha y hora del ticket** (cuando no es del día en curso) y, si está facturada, la **fecha de la factura**. Además, al marcar **"Entregado a transporte"** el despacho **ya no desaparece al instante**: se mantiene visible el día en que se marca y sale al día siguiente (antes desaparecía de inmediato si el ticket era de un día anterior).
- **Permiso "Planilla de caja"**: el botón 🧾 Planilla Caja ahora es **parametrizable por usuario** (permiso aparte); el vendedor solo lo ve si se le habilita.
- **Conciliación — PDF de cartola**: además de Excel/CSV, ahora se puede **subir el PDF** de la cartola del banco para conciliar (lectura best-effort del texto del PDF).

---


## Versión 1.0.471 - 11 de Junio de 2026

- **Pantalla de Despachos — ventana corta**: El modo "Hoy + pendientes" ya **no trae despachos de meses anteriores**: usa una ventana reciente (7 días) para mostrar los de **hoy** y arrastrar los **pendientes** de los últimos días (incluye el fin de semana). Para revisar despachos antiguos están el **modo Semana** y *Informes → Ventas → Despachos*.

---


## Versión 1.0.468 - 11 de Junio de 2026

- **Pantalla de Despachos — facturado + pendientes**: Cada tarjeta ahora indica si está **FACTURADO** (verde) o **SIN FACTURAR** (naranja), remarcado con color de fondo. Además se muestran **todos los despachos** del período (incluidos los pendientes/sin facturar), igual que en *Informes → Ventas → Despachos* (antes la pantalla solo traía un subconjunto).

---


## Versión 1.0.466 - 11 de Junio de 2026

- **Permiso "Pantalla de despachos"**: En los permisos del usuario (vendedor/supervisor) se agregó **🚚 Pantalla de despachos**. Con ese permiso el vendedor ve la **Pantalla de picking** aunque no tenga el permiso de Informes.

---


## Versión 1.0.465 - 11 de Junio de 2026

- **Fix Pantalla de Despachos — arrastrar y soltar**: El drag & drop movía la tarjeta visualmente pero no cambiaba el estado (faltaba `dataTransfer.setData`/`dropEffect`, requerido por varios navegadores para completar el "drop"). Ahora soltar la tarjeta en otra columna **sí cambia el estado**, y el auto-refresco no interrumpe un arrastre en curso.

---


## Versión 1.0.463 - 11 de Junio de 2026

- **Pantalla de Despachos — picking del día + vista semana**: La pantalla ahora muestra **cotizaciones con despacho activas y NO facturadas** (el universo del picking). Tiene dos modos:
  - **Hoy + pendientes** (por defecto): resalta los despachos del **día en curso (HOY)** y **arrastra los pendientes** no entregados de días previos (lo que queda el viernes aparece el lunes); los "Entregado a transporte" solo se ven el mismo día.
  - **Semana**: tablero de la semana (Lun–Vie) con navegación ◀ ▶.
- Mantiene drag & drop, modo edición, filtro por vendedor, auto-refresco (25s) y pantalla completa.

---


## Versión 1.0.459 - 11 de Junio de 2026

- **Pantalla de Despachos — arrastrar y soltar**: En modo edición, las tarjetas se pueden **arrastrar entre columnas** (drag & drop) para cambiar el estado del despacho, además del selector. La columna se resalta al soltar.

---


## Versión 1.0.457 - 11 de Junio de 2026

- **Pantalla de Despachos (tipo picking)**: Nuevo módulo de menú **🚚 Pantalla** con un **tablero Kanban** que muestra los despachos de la semana en columnas por estado (**Activo · Preparado · En reparto · Entregado a transporte**), al estilo de las pantallas de pedidos de los locales de comida. Incluye **auto-refresco cada 25 s**, **navegación por semana**, **filtro por vendedor**, **modo edición** para cambiar el estado desde la misma pantalla y botón de **pantalla completa**. Pensado para un monitor en bodega/ventas o para que cada vendedor vea el estado de sus despachos.

---


## Versión 1.0.456 - 11 de Junio de 2026

- **Asistente — preferencia por usuario**: El estado del asistente (silencio y voz elegida) ahora se guarda **por usuario en el servidor** (`cot_usuarios`), así cada persona mantiene su configuración en cualquier equipo (antes solo quedaba en el navegador).

---


## Versión 1.0.454 - 11 de Junio de 2026

- **Fix — "Ver boucher"**: Al ver el boucher de un despacho aparecía *"Autenticación requerida"* (se abría en pestaña nueva sin el token). Ahora se abre con la sesión autenticada (descarga interna → se muestra la imagen).

---


## Versión 1.0.453 - 11 de Junio de 2026

- **Asistente de voz — arreglado y parametrizable**: Se corrigió el asistente (faltaban funciones internas que lo dejaban inoperativo). Ahora **inicia en silencio** (no habla solo al entrar) y junto al botón **🎙️ Asistente** hay un botón **🔇/🔊** para activar o silenciar la voz y un **⚙** para **elegir la voz** (con opción de probarla). Comandos de voz ampliados: nueva cotización, historial, inventario, ventas, despachos, documentos, informes, inicio, y "silencio"/"activar".

---


## Versión 1.0.451 - 11 de Junio de 2026

- **Conexiones — Saldos / anticipos (gepagos_ant)**: Nuevo tab en Conexiones para revisar y **cambiar el estado** de los saldos/anticipos del ERP: **CO** (cobrado) / **PE** (pendiente). Se busca por **cliente o RUT** y se filtra por estado; al cambiar el estado se **escribe en `gepagos_ant.PAESTADO`** con **autorización** (admin/superadmin) y queda **auditado** (quién/cuándo, valor anterior→nuevo).

---


## Versión 1.0.449 - 11 de Junio de 2026

- **Planilla Caja — boletas y ventas a crédito**: La planilla del día ahora incluye **boletas** (además de facturas; las boletas se identifican con "B " antes del número). Las **ventas a crédito** (condición de pago `FATERMS` = 30/45/60/+ días o "Credito") van a la columna **Crédito** con su **vencimiento** (FAFECVEN) y **dejan de aparecer como pendientes**: los pendientes quedan solo como **contado sin pago**.
- **Pago**: en la columna Pago el enlace de un documento sin pago ahora dice **"Asignar"** (antes "marcar").

---


## Versión 1.0.446 - 11 de Junio de 2026

- **Pago a crédito — fecha de vencimiento**: Al elegir el medio **Crédito** en "Registrar pago", se piden los **días de crédito** (ej. 60) y se **calcula automáticamente la fecha de pago** sumando esos días a la fecha de la factura (editable). En la Planilla de Caja ese vencimiento se muestra en la columna **"Vence"** (que también sirve para los cheques a fecha).

---


## Versión 1.0.436 - 11 de Junio de 2026

- **Planilla Caja — desglose de pagos múltiples**: Cuando una factura se pagó con **más de un pago** (varios medios, o varios pagos del mismo medio, como **dos Transbank para completar el monto**), la planilla muestra el **desglose** bajo el código F.Pago (ej. *T.Créd 15.112 + T.Créd 21.945*) y en el Excel se agrega la columna **"Detalle pagos"**. Aplica a pagos del sistema y del ERP (gepagos).

---


## Versión 1.0.434 - 10 de Junio de 2026

- **Planilla Caja lee el ERP (gepagos)**: La planilla toma los pagos registrados en el **ERP**: una factura pagada en el ERP **muestra su medio** y **ya no aparece como pendiente**. Prioridad: pago del sistema (`cot_concil_banco`) → pago del ERP → PENDIENTE.
- **Inicio — KPI "Clientes del mes"**: El 4° KPI dejó de ser "Clientes registrados" (total histórico de `gecli`) y ahora muestra los **clientes con compra en el mes**, con el detalle **X nuevos · Y recurrentes** (nuevos = primera compra este mes; recurrentes = 2+ compras en el mes).

---


## Versión 1.0.432 - 10 de Junio de 2026

- **Planilla Caja — columna "Monto factura"**: Se agregó la columna **Monto factura** (después de Cliente), para cuadrar el **saldo mayor pago**.
- **Planilla Caja — pendientes reales**: La lista de **Facturas pendientes** excluye las facturas ya **pagadas en el ERP** (`gepagos`), no solo las pagadas dentro del sistema.

---


## Versión 1.0.430 - 10 de Junio de 2026

- **Asignar abono — evita duplicar pagos**: El buscador de facturas del "Asignar →" solo muestra **facturas sin pago asociado**, para no asignar por error un abono a una factura ya pagada/conciliada.

---


## Versión 1.0.428 - 10 de Junio de 2026

- **Un abono para varias facturas**: Cuando un cliente paga **varias facturas en una sola transferencia/Transbank**, el abono se puede **repartir entre varias facturas**: "Asignar →" multi-factura con auto-reparto editable (muestra Asignado/Restante), y **combos automáticos** que detectan 2-3 facturas del mismo cliente que suman el abono.

---


## Versión 1.0.427 - 10 de Junio de 2026

- **Planilla Caja — cheques al día vs a fecha**: Un cheque cuyo **vencimiento no es del día** se registra como **cheque a fecha** (código **CHF**): se muestra su fecha y su monto suma en **"Cheques a fecha"**. Los del día quedan como **CHE** en **"Pagos al día"**.

---


## Versión 1.0.424 - 10 de Junio de 2026

- **Columna Pago — combo de medios**: Cuando una factura se paga con **más de un medio**, la columna Pago del libro muestra la combinación (ej. **Transf + Cheque**, **Transf + NC**).

---


## Versión 1.0.422 - 10 de Junio de 2026

- **Registrar pago — cheque más legible**: Los campos del cheque (N° cheque, Banco, Vencimiento) son más grandes y con etiquetas.

---


## Versión 1.0.421 - 10 de Junio de 2026

- **Conciliación — asignar abono a factura pendiente**: Cuando un abono de la cartola **no calza por monto**, el botón **"Asignar →"** permite elegir la **factura pendiente** correspondiente. Si el abono es **menor al total**, queda como **abono parcial** (◑) y se puede **complementar después**; si ya había un pago, el abono se **suma** al existente.

---


## Versión 1.0.418 - 10 de Junio de 2026

- **Pago con varios medios**: Una misma factura puede pagarse con **más de un medio a la vez** (ej. transferencia + cheque). En "Registrar pago" se agregan **líneas de medio** ("+ Agregar medio"), cada una con su monto y datos. La **Planilla de Caja** reparte cada medio en su columna y muestra el F.Pago combinado (ej. `TRA+CHE`).

---


## Versión 1.0.416 - 10 de Junio de 2026

- **Pagos del Libro de Ventas (Fase 2) — Planilla de Caja**: Nuevo botón **🧾 Planilla Caja** que genera el informe del día: una fila por documento con el monto en la columna de su medio, fila de **Totales**, bloque **Resumen** (Facturado, Pagos al día, Cheques a fecha, Tarjetas de crédito, Créditos, NC/saldo, Pendientes, Saldo mayor) y lista de **Facturas pendientes**. Se puede **Imprimir**, exportar a **Excel** y **enviar por email**.

---


## Versión 1.0.414 - 10 de Junio de 2026

- **Pagos del Libro de Ventas (Fase 1) — "Registrar pago"**: El marcado de pago pasó a un modal completo con **medios** ampliados (transferencia, depósito, efectivo, tarjeta crédito/débito, WebPay, cheque, saldo a favor/NC, crédito, otro); **monto pagado** editable (paga de menos = falta; paga de más = saldo a favor / **monedero**); **saldos a favor del cliente** consultando `gepagos_ant` (estado `PE`, solo lectura) para aplicarlos; y datos de **cheque** (N°/banco/vencimiento/monto). Guardado en `cot_concil_banco` (ampliada) + tabla `cot_monedero`.

---


## Versión 1.0.413 - 10 de Junio de 2026

- **Transbank — se quita la conexión en vivo**: Como el portal de Transbank protege el login con **reCAPTCHA**, la conexión automática no es viable. Se eliminó esa opción (UI y backend) y el botón queda solo con **"Subir archivo"**: descargas el Excel de *Mis Ventas → Descargar información* y lo subes; el cruce y marcado funcionan igual.

---


## Versión 1.0.411 - 10 de Junio de 2026

- **Transbank conexión — login real**: Se ajustó el inicio de sesión con los **selectores exactos** del Portal 3.0 de Transbank (RUT `#_LoginWebPortlet_username`, contraseña `#_LoginWebPortlet_contrasena`, botón Ingresar). Mensajes de error más claros según dónde falle.
- **Aviso reCAPTCHA**: El login de Transbank usa **reCAPTCHA** (anti-robot), que la conexión automática no puede resolver. Si bloquea, el sistema lo informa y la vía recomendada es **"Subir archivo"** (descargar el Excel de "Descargar información" y subirlo), que ya funciona.

---


## Versión 1.0.409 - 10 de Junio de 2026

- **Transbank — conexión descarga el archivo**: La opción "Conectarme" ahora **inicia sesión, pulsa "Descargar información" y lee el Excel descargado localmente** (en vez de raspar la tabla en pantalla) — más robusto. Si no logra descargar, guarda la página para diagnóstico.
- **Lectura de Excel reforzada**: Se concatenan **todas las hojas** y, si openpyxl en modo `read_only` no entrega filas, se **reintenta sin read_only** (corrige el "Encabezados detectados: ninguno").

---


## Versión 1.0.407 - 10 de Junio de 2026

- **Fix Transbank — conexión en vivo**: La consulta en vivo fallaba con *"Playwright Sync API inside the asyncio loop"*. Ahora el navegador headless corre en un **hilo aparte**, compatible con el servidor async.
- **Fix Transbank — lectura del Excel**: La detección del encabezado ahora busca en **todas las filas y hojas** del archivo, y si no calza muestra un **diagnóstico** con los encabezados detectados (para ajustar el mapeo de columnas al export real de "Descargar información").

---


## Versión 1.0.405 - 10 de Junio de 2026

- **Transbank — parser ajustado al export real (xlsx)**: Se afinó la lectura del archivo de Mis Ventas para tomar la columna correcta **"Monto movimiento"** (el xlsx trae varias columnas de monto: afecto, cuota, vuelto…), además de **Medio de pago**, **Código de autorización de la venta** y **N° de boleta**. La detección de columnas ahora prioriza el nombre más específico. Si por error se sube el **PDF** (Transbank reparte las columnas entre páginas), avisa que descargue el reporte en **Excel/CSV**.

---


## Versión 1.0.404 - 10 de Junio de 2026

- **Transbank — dos modos**: El botón Transbank ahora ofrece **Subir archivo** (la cartola descargada) o **Conectarme en vivo**. La conexión en vivo entra a *Mis Ventas* con tu **usuario y clave que ingresas en el momento** (no se guardan) y lee las ventas — más rápido que descargar el archivo. El cruce y el marcado son idénticos (medio + código de autorización).
  - La conexión en vivo requiere un **navegador headless (Playwright)** instalado en el servidor (`pip install playwright` y `python -m playwright install chromium`). Si no está, avisa y se puede usar "Subir archivo".

---


## Versión 1.0.402 - 10 de Junio de 2026

- **Libro de Ventas — Importar pagos Transbank (Mis Ventas)**: Nuevo botón **📥 Transbank (archivo)**. Se descarga del portal Transbank → *Mis Ventas* → **"Descargar cartola de movimientos"** (Excel/CSV) y se sube. El sistema lee **fecha, medio de pago, monto y código de autorización**, los cruza con las facturas/boletas por **monto + fecha**, y al confirmar los marca con su **medio** (tarjeta crédito/débito/prepago) y el **código de autorización** como referencia. Captura también las ventas presenciales por POS que no llegan por correo. **No se guardan credenciales**. (Se evaluó el login automático al portal, pero el export de archivo es más seguro y estable.)

---


## Versión 1.0.401 - 10 de Junio de 2026

- **Despachos — nombre del vendedor**: En "Cotizaciones por facturar" (y en las tarjetas del tablero) ahora se muestra el **nombre del vendedor** (`gevend.VENNOM`) en lugar del código.
- **Despachos — tablero colapsable**: El tablero "Despachos de la semana" se puede **plegar/desplegar** con un clic en su título; el estado se recuerda.

---


## Versión 1.0.398 - 10 de Junio de 2026

- **Despachos como módulo de menú**: Ahora existe un botón propio **🚚 Despachos** en el menú, que abre directamente *Ventas → tab Despachos*. Al ser un módulo, se puede **incluir en un grupo del menú** (Parámetros → Conexiones → Grupos del menú) como cualquier otra opción.
- **Fix grupos del menú (no se guardaban/aparecían)**: Un grupo **sin módulos asignados** no se guarda ni se muestra (un grupo necesita al menos un módulo). Antes esto era silencioso; ahora al guardar **avisa** cuántos grupos quedaron sin módulos. Así, para crear el grupo de Despachos basta agregar el grupo y marcar el módulo **Despachos**.

---


## Versión 1.0.396 - 10 de Junio de 2026

- **Fix Despachos (Error interno)**: El comodín `%` de los `LIKE` del filtro de estado se confundía con el marcador de parámetros de PyMySQL y provocaba "Error interno del servidor". Se escapó como `%%`; el tablero semanal y "por facturar" vuelven a cargar normalmente (excluyendo modificadas/anuladas).

---


## Versión 1.0.394 - 10 de Junio de 2026

- **Despachos — fix filtro de estado**: El estado en `gecot_enc.COESTADO` se guarda como **texto** ("MODIFICADA", "ANULADA", "ACTIVA", "PENDIENTE"), no como código corto. Se corrigió el filtro (por texto) para que el tablero semanal y la lista de "por facturar" **realmente excluyan las cotizaciones modificadas y anuladas** (antes una versión modificada seguía apareciendo junto a la vigente).

---


## Versión 1.0.392 - 10 de Junio de 2026

- **Despachos — tablero semanal**: El tablero ahora muestra **solo las cotizaciones activas/pendientes**, excluyendo las **modificadas y anuladas** (`COESTADO` no en M/AN/N), igual que la lista de "por facturar".

---


## Versión 1.0.389 - 10 de Junio de 2026

- **Despachos — Cotizaciones por facturar**: Se excluyen las cotizaciones **modificadas y anuladas**; ahora solo aparecen las de estado **activo/pendiente** (con transporte y sin facturar).

---


## Versión 1.0.388 - 10 de Junio de 2026

- **Despachos — Cotizaciones por facturar**: Ahora la lista muestra **solo las cotizaciones que tienen transporte asignado** (`COENVIO`) y están pendientes de facturar, no todas las activas.

---


## Versión 1.0.385 - 10 de Junio de 2026

- **Despachos — tablero semanal y estados**: En *Informes → Ventas → Despachos* se agregó un **tablero por día (Lunes a Viernes)** con los despachos de la semana (cliente, N°, neto, transporte), navegación **◀ semana ▶ / Hoy**, y un **estado por despacho**: *Activo → Preparado → En reparto → Entregado a transporte*. En "Entregado a transporte" se puede **subir/ver la imagen del boucher** (comprobante). Los estados se guardan en `cot_despacho_estado` (con usuario y fecha), sin tocar el ERP.
- **Cotizaciones por facturar**: nueva sub-sección dentro de Despachos que lista las cotizaciones **activas sin factura** de la semana (N°, fecha, cliente, neto, transporte, vendedor) con su total.
- *Nota:* WhatsApp no permite descargar imágenes automáticamente sin la API de WhatsApp Business; por eso el boucher se **adjunta manualmente** (foto/imagen).

---


## Versión 1.0.383 - 10 de Junio de 2026

- **Pagos WebPay por correo (IMAP)**: Nuevo botón **💳 WebPay (correo)** en el Libro de Ventas. Lee (solo lectura) los correos de notificación de pago de Transbank (`webpaycl@transbank.cl`), extrae **monto, empresa, fecha y Orden de pago**, y los **cruza con las facturas pendientes** del período para conciliarlos en un clic (quedan como medio **WebPay** con su **Orden de pago** como referencia).
  - **Cuenta de correo configurable** (servidor IMAP, cuenta, remitente, carpeta) desde el mismo panel; por defecto Gmail. La **clave se guarda cifrada** (Fernet) en `imap_config.json` y el acceso es de **solo lectura**.
  - En Gmail se requiere una **clave de aplicación** (verificación en 2 pasos), no la clave normal.

---


## Versión 1.0.382 - 10 de Junio de 2026

- **Medio de pago — Orden de pago / Referencia**: Al marcar un pago manual ahora se puede registrar la **Orden de pago / N° de operación**, **obligatoria al elegir WebPay**. Queda guardada (columna `referencia` en `cot_concil_banco`) y se muestra en el detalle del pago.

---


## Versión 1.0.380 - 10 de Junio de 2026

- **Libro de Ventas — medio de pago manual**: Además de la conciliación con la cartola (transferencia), ahora se puede marcar un documento como pagado por **otro medio**: WebPay, efectivo, tarjeta de crédito, tarjeta de débito, cheque u otro. En la columna **Pago** de la vista Pro: en los pendientes aparece "marcar" y en los pagados se muestra el ✔ con el medio; al hacer clic se puede cambiar el medio o **quitar** el pago. Se guarda en `cot_concil_banco` (nueva columna `medio`).

---


## Versión 1.0.377 - 10 de Junio de 2026

- **Libro de Ventas — filtro por pago**: Nuevo selector **Pago** en la vista Pro: *Todos*, *✔ Transferidos* o *⏳ Pendientes*, para ver al instante qué documentos ya están pagados (conciliados con la cartola) y cuáles siguen pendientes.

---


## Versión 1.0.375 - 10 de Junio de 2026

- **Conciliación bancaria — RUT en la descripción**: Algunos abonos de Banco de Chile traen el **RUT del cliente embebido en la glosa** (ej. `Pago: Proveedores 0805702001`). Ahora el cruce busca el RUT del documento dentro de la descripción (tolerando ceros a la izquierda y el dígito verificador pegado), lo que mejora el calce y el desempate cuando hay varios documentos con el mismo monto.

---


## Versión 1.0.373 - 10 de Junio de 2026

- **Conciliación bancaria — lectura completa de la cartola**: El lector de cartolas en HTML (las `.xls` de Banco de Chile) ahora **junta las filas de todas las tablas** del archivo, soportando **tablas anidadas** (layout del banco) y movimientos repartidos en varias tablas/páginas, y busca el encabezado de Movimientos en todo el documento. Antes solo leía la tabla más grande y se perdían abonos (mostraba pocos respecto al Excel real).

---


## Versión 1.0.370 - 10 de Junio de 2026

- **Conciliación bancaria — ventana de fechas**: Como la factura se emite **al confirmar el pago** en la cartola (proceso diario), el abono puede aparecer el **mismo día o el día anterior** a la emisión. Antes el cruce exigía que el pago fuera posterior a la factura y descartaba esos casos; ahora acepta el abono desde 31 días antes hasta 185 días después de la emisión.

---


## Versión 1.0.368 - 10 de Junio de 2026

- **Conciliación bancaria — diagnóstico**: Cuando no hay coincidencias, ahora se muestra un panel comparando los **abonos leídos de la cartola** vs los **documentos pendientes del período**, para ver al instante si el problema es la lectura de la columna Abonos o el período cargado (las facturas suelen pagarse el mes siguiente). El detalle del cabezal indica abonos · documentos pendientes · coincidencias.
- **Libro de Ventas — orden**: La vista **Pro** ordena los documentos por **fecha de mayor a menor** (lo más reciente primero). La vista Clásica (SII) se mantiene cronológica como el libro oficial.

---


## Versión 1.0.365 - 10 de Junio de 2026

- **Conciliación bancaria — desempate por descripción**: Cuando varios documentos tienen el **mismo monto**, el cruce ahora usa el **nombre del depositante** que viene en la descripción de la cartola para elegir el correcto (además del RUT si lo hubiera). Cada coincidencia muestra su **confianza**: las de confianza **alta** (RUT/nombre coincide, o monto único) se **premarcar**; las que comparten monto se resaltan en amarillo con ⚠ para que las revises antes de confirmar. Validado con cartola **Banco de Chile** (columna *Abonos (CLP)*, descripción con el nombre del que transfiere).

---


## Versión 1.0.363 - 10 de Junio de 2026

- **Conciliación bancaria — más formatos de cartola**: La lectura de la cartola ahora reconoce el tipo de archivo **por su contenido** (no por la extensión): `.xlsx`, `.csv` y las cartolas **`.xls` que en realidad son HTML** (muy común en la banca chilena). Si la cartola es un `.xls` binario antiguo, avisa que la guardes como `.xlsx` o `.csv`.

---


## Versión 1.0.362 - 10 de Junio de 2026

- **Libro de Ventas — Conciliación bancaria (subir cartola)**: Nuevo botón **🏦 Conciliar banco**. Se sube la **cartola** que se descarga del banco (Excel o CSV) y el sistema:
  - Detecta automáticamente las columnas (Fecha / Abono-Monto / Glosa / RUT) y lee solo los **abonos** (ingresos).
  - Cruza cada abono con las **facturas/boletas pendientes** del período por **monto exacto** (bonus si coincide el RUT del depositante; el pago debe ser igual o posterior a la emisión, hasta 180 días).
  - Muestra las coincidencias para que el usuario **confirme** (puede desmarcar las que no correspondan).
  - Los documentos confirmados quedan marcados como **Transferido ✔** en el libro, con nuevos KPIs **Transferido** y **Pendiente**.
  - **Seguridad**: se trabaja solo con la cartola que el usuario sube manualmente; **no se guardan claves ni se conecta al banco**. Persiste en la tabla `cot_concil_banco`.

---


## Versión 1.0.359 - 10 de Junio de 2026

- **Libro de Ventas — Excel**: La exportación a Excel ahora incluye, al final de la hoja, las **dos tablas de cierre** igual que en el libro impreso: **Totales** (Boletas / Facturas / Notas de Crédito / TOTAL con Neto, IVA y Total) y **Correlativos** (rango, emitidas, anuladas y total de documentos por tipo), con encabezados sombreados y bordes (formato SII).

---


## Versión 1.0.357 - 10 de Junio de 2026

- **Libro de Ventas — ajustes**: Los cuadros de **totales y correlativos** ahora quedan **centrados en la hoja** (vista clásica / impresión). Se corrigió la **descarga a Excel** (daba "Autenticación requerida": se abría en pestaña nueva sin el token; ahora descarga con la sesión autenticada).

---


## Versión 1.0.354 - 09 de Junio de 2026

- **Documentos emitidos — Libro de Ventas (SII)**: Nuevo tab "📚 Libro de Ventas" que une Facturas, Boletas y Notas de Crédito del período (por fecha de emisión) en el formato del libro del SII.
  - **Dos vistas**: *Clásica (SII)* idéntica al libro oficial (encabezado empresa/RUT, tabla, totales y cuadro de correlativos) lista para imprimir/PDF; y *Pro* con tarjetas KPI (Neto/IVA/Total y conteos), buscador y subtotales.
  - **Exportar**: Imprimir/PDF (formato SII) y **Excel (.xlsx)**.
  - Cod.SII por tipo (33 factura, 34 exenta, 39/38 boleta, 61 NC); NC en negativo; neto de NC = `NCNETO − NCDESC`.
  - **Validado**: los totales coinciden exactamente con el libro de ventas real de mayo (neto 97.922.107 · IVA 18.605.216 · total 116.527.323).

---


## Versión 1.0.351 - 09 de Junio de 2026

- **Barra superior — cabecera más limpia**: La base de datos conectada + su estado (punto verde/rojo) y la **versión** se movieron a una **segunda línea bajo el nombre de la empresa**, en texto pequeño. Así el nombre de la empresa queda solo y limpio en la primera línea.

---


## Versión 1.0.347 - 09 de Junio de 2026

- **Geografía de Ventas — Vendedores en lista desplegable**: El selector de vendedores (que era una fila de casillas) pasó a una **lista desplegable con multi-selección**. El botón muestra un resumen ("Todos", los nombres si son 1–2, o "N seleccionados"), con botones "Todos/Ninguno" dentro; se cierra al hacer clic fuera.

---


## Versión 1.0.345 - 09 de Junio de 2026

- **Reposición — Compras solo del proveedor**: Al seleccionar un proveedor, el sistema **pregunta** si quieres ver en la descripción de cada producto **solo las compras de ese proveedor** (importaciones/nacionales) o **todas**. Queda un checkbox "Mostrar solo compras de este proveedor" para cambiarlo cuando quieras. (Ej.: en Allen, al elegir "Wenzhou Hope" puedes ver solo sus compras en vez de todos los proveedores del producto.)

---


## Versión 1.0.343 - 09 de Junio de 2026

- **Nuevo módulo "Documentos emitidos"**: Facturas, Boletas y Notas de Crédito salieron de Informes a su propio módulo de menú con esas 3 pestañas. **Informes** queda con Cotizaciones y Comisiones. Se respetan los permisos (Facturas/Boletas requieren permiso *facturas*; Notas de Crédito requiere *informes*).
- **Nombres de pestañas configurables**: En Parámetros → Conexiones → "🏷 Nombres de pestañas" se puede renombrar cada pestaña (Cotizaciones, Comisiones, Facturas, Boletas, Notas de Crédito). En blanco = nombre por defecto.
- **Iconos para los grupos del menú**: El editor de grupos ahora tiene un **selector de iconos** (paleta integrada) en lugar de escribir el emoji a mano.

---


## Versión 1.0.339 - 09 de Junio de 2026

- **Menú submenús — ajustes**: El dropdown de la barra superior ahora **flota correctamente** (posición fija, ya no lo recortaba el menú ni generaba barras de scroll) y se **corrigió la paleta del submenú** (el texto se veía blanco sobre blanco; ahora es oscuro y legible, con resaltado azul al pasar/seleccionar).

---


## Versión 1.0.334 - 09 de Junio de 2026

- **Menú colapsable con submenús (grupos)**: El menú ahora puede agrupar módulos en menús desplegables.
  - **Sidebar**: acordeón vertical (clic en el grupo expande/colapsa sus opciones).
  - **Barra superior**: el grupo abre un dropdown.
  - El grupo del módulo activo se resalta y se abre solo; se recuerda qué grupos quedaron abiertos.
  - Si un grupo queda sin opciones visibles para el rol, se oculta automáticamente.
  - **Configurable** en Parámetros → Conexiones → "📂 Grupos del menú": crear/eliminar grupos, ícono, título y qué módulos contiene (un módulo solo puede estar en un grupo; los no asignados quedan como botones directos). Agrupación por defecto: Cotizaciones (Nueva/Historial), Ventas (Ventas/Facturas/Informes), Administración (Parámetros/Usuarios/Mi Empresa/Conexiones); Inicio e Inventario quedan directos.

---


## Versión 1.0.332 - 09 de Junio de 2026

- **Kardex — Cliente del documento**: Cada movimiento ahora muestra el **nombre del cliente del documento relacionado** (ej. FEL 142359 → su cliente), resuelto por folio desde las cabeceras: facturas (`gefac_enc.FANOM`), boletas (`gebol_enc.BOLNOM`) y notas de crédito (`genc_enc.NCNOM`). Si el documento no se encuentra, usa el nombre del propio movimiento.
- **Kardex — Tipo de documento**: Bajo el código del tipo (FEL/BEL…) se muestra su **nombre** (FAC.ELEC, BOLETA ELEC.…) desde `getipos`.

---


## Versión 1.0.330 - 09 de Junio de 2026

- **Reposición — Fijar encabezado**: Nuevo interruptor "📌 Fijar encabezado al desplazar" sobre la tabla. Activado (por defecto) la barra de Código/Descripción/Stock queda fija al hacer scroll; desactivado, se desplaza con el contenido.
- **Conexión a la BD más robusta**: El servidor ahora **reintenta** la conexión activa (3 intentos con espera) antes de caer al respaldo/"modo sin BD", evitando quedar sin BD por cortes transitorios. Se agregaron timeouts de lectura/escritura.

---


## Versión 1.0.327 - 09 de Junio de 2026

- **Reposición — Categorías parametrizables**: La clasificación por **Tipo/Calidad/Espesor/Largo** ahora tiene un **interruptor maestro por empresa** (Parámetros → 🏷 Categorías → "Activar clasificación por categorías en Reposición"). Si se desactiva, no aparecen esos filtros (útil para empresas donde no aplica, como acero inoxidable). Para Allen queda activo.
- **Reposición — Buscador de proveedores**: El filtro de Proveedor pasó de lista simple a un **buscador con autocompletado** (escribes el nombre o RUT y filtra); con botón ✕ para quitarlo.
- **Reposición — Campo "Buscar producto" más ancho** (más del doble) para ver mejor descripciones largas.

---


## Versión 1.0.324 - 09 de Junio de 2026

- **Inventario / Kardex — Costos**: El kardex ahora muestra el **costo del producto** (tarjeta nueva, desde `geitems_mae.ITCOSTO`) y una columna **Costo** por cada movimiento con el costo de la factura (`geitems_mov.ITMCOSTO`); al pasar el mouse sobre el costo se ve el total (costo × cantidad).

---


## Versión 1.0.320 - 09 de Junio de 2026

- **Reposición — Tipos de venta como lista desplegable**: El selector de "Tipos de venta" pasó de casillas sueltas a una **lista desplegable con selección múltiple** (en la misma fila de Meta stock). El botón muestra un resumen ("Todos", los nombres si son 1–2, o "N seleccionados") y al abrir se eligen los tipos; se cierra al hacer clic fuera.

---


## Versión 1.0.318 - 09 de Junio de 2026

- **Reposición — Búsqueda avanzada**: Se quitó el botón "Lista de Productos" (la lista no aportaba) y en su lugar hay un botón **⚙ Más filtros** que abre un panel de **filtros avanzados** sobre el informe: **texto multi-palabra** (busca todas las palabras en código, descripción, categoría y proveedor), **proveedor contiene**, **rango de stock**, **rango de cobertura (meses)**, **urgencia** (🔴🟡🟢⚪) y **solo "A comprar" > 0**. Todo se combina en vivo con la búsqueda y la familia.

---


## Versión 1.0.316 - 09 de Junio de 2026

- **Reposición — Generar pedido (Fase 2)**: Ahora puedes **seleccionar productos** con casillas (incluye "seleccionar todos") y pulsar **🛒 Generar pedido**. Se abre una ventana con el pedido para un **proveedor**, con la **cantidad sugerida editable** (a comprar) y el último costo, y botones para **Imprimir/PDF** y **Exportar Excel** (CSV). Pensado para pedir por proveedor (ej. filtras Sanitario 316L, seleccionas y generas el pedido).

---


## Versión 1.0.314 - 09 de Junio de 2026

- **Categorías de productos (Fase 1)**: Nueva forma de clasificar productos para la reposición.
  - **Configurador** en Parámetros → **🏷 Categorías** (superadmin): define **Tipos** y asígnalos a cada **familia**; lista de **Calidades** (316L/316/304L/304…) y patrones de **Espesor/Largo**.
  - El sistema clasifica cada producto: **Tipo** según su familia y **Calidad/Espesor/Largo** leídos de la descripción (con detección por límites para no confundir el "304" de un rodamiento `6304` con el acero 304).
  - En **Reposición**: filtros por **Tipo, Calidad, Espesor (rango) y Largo (rango)**, mostrados como etiquetas en cada producto. Útil para pedirle al proveedor solo lo de un tipo (ej. sanitarios 316L).
  - *Próxima fase*: seleccionar productos y generar el pedido por proveedor.

---


## Versión 1.0.311 - 09 de Junio de 2026

- **Reposición — Lista de Productos solo consulta**: El botón "Lista de Productos" en Reposición abre el catálogo en **modo consulta** (sin el botón "Agregar"), ya que ahí solo se buscan/ven productos, no se agregan a una cotización. En Nueva cotización el catálogo sigue con "Agregar".

---


## Versión 1.0.309 - 09 de Junio de 2026

- **Reposición — "Con importaciones"**: La casilla cambió de "Solo importaciones" a **"🌍 Con importaciones"**: por defecto se ven las **compras locales** (órdenes de compra) y, al activarla, se **suman las importaciones**. (Al marcarla/desmarcarla recalcula.)
- **Botones en línea**: "Lista de Productos", "Imprimir" y "Email" ahora se muestran en una fila (antes se apilaban en columna).

---


## Versión 1.0.304 - 09 de Junio de 2026

- **Reposición — buscador con autocompletar**: El campo "Buscar producto" ahora sugiere productos del informe a medida que escribes (estilo Nueva cotización, mostrando código, descripción y stock) y filtra la tabla al elegir uno.

---


## Versión 1.0.302 - 09 de Junio de 2026

- **Reposición — más opciones de proveedores**:
  - **Casilla "🌍 Solo importaciones"** para listar solo productos con compras por importación; y los proveedores de importación se incluyen en el filtro "Proveedor".
  - Se muestra la **cantidad de la última compra** antes del costo (ej. `🌍 SANSUN VALVE 40 u × $980 (2026-03) · Ref C-988`).
  - **Interruptor "Mostrar proveedores"** para ocultar esa información y acortar el listado en pantalla.
  - Botón **"📋 Lista de Productos"** que abre el catálogo completo.

---


## Versión 1.0.300 - 09 de Junio de 2026

- **Reposición — proveedor de importaciones correcto**: El nombre del proveedor de cada importación ahora se obtiene de **`gecli`** (proveedores = `CLITIPO='P'`), uniendo `geitems_man.MAPRO` con `gecli.CLIRUT`. Antes se usaba un cruce equivocado por número de orden de compra y mostraba proveedores que no correspondían (ej. CHILECTRA, EQUIFAX). El sistema detecta solo la columna de enlace.

---


## Versión 1.0.298 - 09 de Junio de 2026

- **Reposición — compras por importación**: Además de las órdenes de compra, ahora se incluyen las **importaciones/ingresos** registrados en `geitems_man` (`MATIPDOC='IM'`) con detalle en `geitems_mand`. Por cada producto se muestra el proveedor (obtenido vía la orden de compra `MAOC`→`geord_enc.ORNOM`), el **costo de la última entrada** (`MAPREC`), la fecha y la **referencia `MAREF`**. En la tabla las importaciones se marcan con 🌍 (las órdenes con 🏭) y en el PDF con `[IMP]`.

---


## Versión 1.0.295 - 09 de Junio de 2026

- **Reposición — proveedores en el PDF**: El reporte imprimible/PDF de reposición ahora incluye una columna **"Proveedores (últ. costo)"** con los proveedores de cada producto y el costo de su última compra (igual que en pantalla).

---


## Versión 1.0.293 - 07 de Junio de 2026

- **Reposición — proveedores y último costo**: Bajo la descripción de cada producto se muestran **todos los proveedores** que lo han vendido, con el **costo de su última compra** y el mes (desde las órdenes de compra `geord_enc` + `geord_det`). Ej.: `🏭 ACME $1.234 (2026-05)`.
- **Filtro por proveedor**: Nuevo selector "Proveedor" en la barra de Reposición para ver solo los productos comprados a un proveedor específico.

---


## Versión 1.0.292 - 07 de Junio de 2026

- **Caché de inventario parametrizable**: En *Parámetros → Conexiones* (superadmin) nueva sección **"⚡ Caché del inventario"** para **activar/desactivar** la caché y fijar su **duración (segundos)**. Si el servidor/base es rápido, se puede **desactivar** y mostrar siempre datos **en vivo**; si conviene velocidad, se deja activa con la duración deseada. Al guardar se aplica de inmediato.

---


## Versión 1.0.291 - 07 de Junio de 2026

- **Inventario más rápido (caché en servidor)**: El listado de inventario ahora trabaja sobre un **snapshot en memoria por base de datos** (se reconstruye con una sola consulta y se reutiliza por ~3 minutos). El filtrado, orden y paginado se resuelven en el servidor sobre esa copia, evitando consultas pesadas repetidas → la navegación entre páginas y las búsquedas responden casi al instante. Botón **↻ Actualizar** para traer datos frescos al momento, y la caché se **invalida automáticamente** al activar/desactivar un producto. (El stock/precio puede tardar hasta ~3 min en reflejar cambios hechos directamente en el ERP; usa Actualizar para forzarlo.)

---


## Versión 1.0.290 - 07 de Junio de 2026

- **Corrección en Boletas — cliente equivocado**: Al listar boletas, el nombre del cliente se tomaba primero de `gecli` buscando por RUT y solo usaba el nombre de la boleta como respaldo. Con el **RUT genérico 1-9 (consumidor final)** esa búsqueda devolvía **otro cliente**. Ahora se prioriza el **nombre que quedó en la boleta** (`BOLNOM`) y se recurre a `gecli` solo si la boleta no trae nombre. Además, el RUT mostrado es el de la boleta. Aplica al panel **Informes → Boletas** y a la vista combinada de documentos.

---


## Versión 1.0.289 - 07 de Junio de 2026

- **Menú parametrizable (superadmin)**: En *Parámetros → Conexiones*, nueva sección **"🧩 Módulos del menú"** para elegir **qué módulos aparecen** (activar/desactivar) y su **orden** (botones ↑ ↓). Aplica a **todos** los usuarios. Importante: ocultar un módulo aquí es global; además, cada módulo sigue respetando los permisos por rol (no se mostrará a quien no lo tenga). Los cambios se aplican al instante al guardar.

---


## Versión 1.0.288 - 07 de Junio de 2026

- **Pasada móvil en Inicio y Nueva cotización**: En celulares (≤600px) los formularios de *Nueva cotización* y los bloques de *Inicio* pasan a **una sola columna** (datos del cliente, condiciones, KPIs), con menos relleno para aprovechar la pantalla. La **tabla de ítems** (12 columnas) ahora se desplaza horizontalmente dentro de su propio contenedor, sin romper el diseño.

---


## Versión 1.0.287 - 07 de Junio de 2026

- **Responsive en celulares + hamburguesa a la derecha**: En teléfonos (≤768px) la barra muestra la marca a la izquierda y el botón **☰ siempre a la derecha**. Al tocarlo se despliega el menú en **columna** (incluyendo avatar y **Salir** al final). En pantallas grandes el menú se mantiene como esté configurado (arriba o lateral).

---


## Versión 1.0.286 - 07 de Junio de 2026

- **Menú lateral (sidebar) configurable**: En *Parámetros → Conexiones* (solo superadmin) se puede elegir la **disposición del menú**: **Arriba** (barra horizontal, como siempre) o **Lateral** (columna a la izquierda, estilo panel). Aplica a todos los usuarios. En pantallas chicas el menú siempre se colapsa en el botón ☰ (independiente de esta opción).

---


## Versión 1.0.285 - 07 de Junio de 2026

- **Menú superior agrupado a la derecha** y, en **pantallas chicas**, colapsado en un botón **☰** que despliega el menú en **columna** (se cierra al elegir una opción). En pantallas grandes sigue horizontal.
- **Conexiones activas → sesiones en línea (superadmin)**: nueva sección "🟢 En línea ahora" que muestra quién está conectado **en tiempo real** (mediante un latido cada 25 s), con **hora de conexión, última actividad y hora de desconexión**, y estado **En línea / Desconectado**.
- **Desconectar con aviso**: el superadmin puede **enviar un mensaje y desconectar** una sesión; al usuario se le muestra el mensaje y se le cierra la sesión automáticamente. (Desconexión cooperativa: el cliente obedece en su siguiente latido, pocos segundos.)

---


## Versión 1.0.283 - 06 de Junio de 2026

- **Multi-empresa: armado rápido de carpetas**: Nuevo `crear_empresas.bat CARPETA_BASE nombre1 nombre2 …` que crea de una vez la carpeta de datos de cada empresa y copia dentro `.secret.key` y `conexiones.json` (sin pisar lo existente). Tras eso, solo falta instalar el servicio de cada empresa y dejar activa su conexión. Guía actualizada en `LEEME_MULTIEMPRESA.txt`.

---


## Versión 1.0.282 - 06 de Junio de 2026

**Base multi-empresa (Opción A: una copia de código, varias instancias)** — preparativo para atender varias empresas en el mismo servidor sin riesgo:

- **Carpeta de datos por instancia (`GW_DATA_DIR`)**: `app.py` ahora lee/escribe toda su configuración y datos (conexiones.json, .secret.key, smtp/ftp/app_config, empresa.json, logos, cachés, logs) desde la carpeta indicada por la variable de entorno `GW_DATA_DIR`. Si no se define, usa la carpeta del código (comportamiento de siempre, sin cambios). El código y los estáticos (HTML, íconos) se comparten.
- **Instalador por empresa**: `servicio_instalar_empresa.bat NOMBRE PUERTO CARPETA_DATOS` crea un servicio de Windows independiente por empresa (puerto y datos propios), y `servicio_desinstalar_empresa.bat NOMBRE` lo quita.
- **Una URL por empresa (opcional)**: `Caddyfile.ejemplo` para poner Caddy como reverse proxy con HTTPS automático (subdominio → puerto). Guía completa en `LEEME_MULTIEMPRESA.txt`.
- Nota: en esta modalidad cada empresa es su propia URL/login (no hay login único cruzando empresas).

---


## Versión 1.0.281 - 06 de Junio de 2026

- **Fecha de documentos en hora de Chile (servidor)**: El backend ahora calcula la fecha de los documentos con la zona horaria **America/Santiago** (helpers `_now_cl()` / `_today_cl()` usando `zoneinfo` + paquete `tzdata`), de modo que aunque el servidor esté en UTC, la cotización/nota nace con la **fecha local chilena** y no corrida. Complementa el arreglo del frontend (v1.0.280). **Requiere instalar dependencias** (`pip install -r requirements.txt`, que ahora incluye `tzdata`) y **reiniciar el servidor**.

---


## Versión 1.0.280 - 06 de Junio de 2026

- **Corrección del desfase de fecha (zona horaria)**: La fecha del día se calculaba con `toISOString()`, que usa **UTC**, por lo que en Chile (UTC-4/-3) "hoy" saltaba al día siguiente por la tarde/noche. Ahora se usa la **fecha local** del dispositivo mediante un helper `_fechaLocal()`. Afecta a: fecha de la nueva cotización, filtros por defecto de informes/historial/reposición, semana en curso, últimas compras y nombre de archivos exportados.

---


## Versión 1.0.279 - 06 de Junio de 2026

- **Catálogo de productos offline**: La "Lista de Productos" (catálogo completo) ahora se llena desde la copia local cuando no hay conexión (o si falla la red), con familias, stock y precios. Antes quedaba vacío offline.
- **Últimas compras offline**: Al cargar un cliente sin conexión, se muestran sus últimas compras desde la copia guardada en el dispositivo. Ahora se cachea **toda** consulta del cliente (antes no se guardaba porque el set por defecto lleva rango de fechas).
- **Barra superior a prueba de cualquier ancho (Safari/iPad)**: El menú de navegación se desliza horizontalmente y el bloque de usuario con **Salir** queda fijo a la derecha en cualquier resolución (no solo ≤1024px), resolviendo que en iPads grandes/landscape los botones de salir no aparecieran. Se respetan las áreas seguras de la pantalla (notch/bordes).

---


## Versión 1.0.278 - 06 de Junio de 2026

- **Botón flotante offline siempre visible (tablet)**: El botón flotante de la bandeja offline (abajo a la derecha) ahora aparece para cualquier usuario con permiso de nota de venta local **aunque todavía no haya notas guardadas**. Antes solo se mostraba si ya existían notas en la cola, por lo que en una tablet recién configurada no había forma de abrir la bandeja para pulsar "⬇️ Actualizar datos" (sincronizar el catálogo) antes de salir a terreno. Cuando no hay pendientes muestra la etiqueta "Offline" sin el contador.

---


## Versión 1.0.277 - 06 de Junio de 2026

- **Barra superior adaptada a tablet (iPad/Safari)**: En pantallas medianas (≤1024px) la barra superior crece a dos filas: la marca arriba y, debajo, el menú de navegación con **desplazamiento horizontal** y el bloque de usuario con el botón **Salir siempre visible** a la derecha. Antes, con muchos módulos, los botones **Conexiones** y **Salir** quedaban fuera de pantalla. En pantallas muy angostas (≤560px) se oculta el nombre de usuario para no tapar "Salir".

---


## Versión 1.0.276 - 06 de Junio de 2026

- **PDF offline casi idéntico al oficial**: La vista imprimible de las notas locales (botón PDF) ahora replica el diseño del PDF del servidor: encabezado con empresa/RUT/dirección, N° y tipo de documento, bloque "INFORMACIÓN" del cliente en dos columnas, tabla de productos con columnas **Concepto · Cant. · U.M. · P. Unit · Dto.1% · Dto.2% · P. Neto · Total** (filas alternas y paleta del sistema), bloques de Observación / Condición de pago / firma del Vendedor, y totales (Subtotal, Descuento, Total Neto, IVA 19%, Valor Final). Resuelve el nombre del vendedor y la descripción del tipo desde los datos offline. Lleva un sello "📴 Generada offline".
- **Aviso de modo offline**: Al perder la conexión aparece un cuadro con las **instrucciones para trabajar sin internet** (buscar productos/clientes locales, crear "Nota de venta (local)", generar PDF, y que todo se sube solo al volver la red). Se cierra con "Entendido" y vuelve a avisar si la conexión se cae nuevamente. También aparece si la app se abre ya sin conexión.

---


## Versión 1.0.275 - 06 de Junio de 2026

**Modo offline para trabajar en tablet sin internet (PWA)** — pensado para terreno: se abre la app una vez con wifi y luego se cotiza sin conexión; al volver internet, todo se sube al ERP solo.

- **Paquete de sincronización** (`GET /api/sync/paquete`): entrega productos+precios+stock, clientes, vendedores, familias, condiciones de pago, tipos y transportistas de la BD activa. La tablet lo guarda en **IndexedDB**.
- **Sincronización automática al haber red**: descarga/actualiza el catálogo al cargar la app y al recuperar conexión (máx. cada 6 h); botón **"⬇️ Actualizar datos"** e indicador de última actualización en la bandeja offline.
- **Búsqueda offline**: productos (autocompletado), clientes por RUT y por nombre leen de la copia local cuando no hay red.
- **Historial/últimas compras offline**: se guarda en el dispositivo lo consultado con red por cliente y queda disponible sin conexión.
- **PDF offline**: botón **PDF** en las notas locales aún no sincronizadas genera una vista imprimible en el dispositivo ("Guardar como PDF"), sin servidor.
- Creación de documentos offline mediante "Nota de venta (local)" con cola e idempotencia (ya existente), ahora con catálogo y clientes locales.

---


## Versión 1.0.273 - 06 de Junio de 2026

- **Informes → Por vendedor: facturado vs pendiente**: La columna "Monto" se dividió en **Monto facturado** (cotizaciones en estado FACTURADO) y **Monto pendiente x facturar** (lo no facturado, excluyendo ANULADA/RECHAZADA/VENCIDA). Se agregó fila TOTAL.
- **Comisiones → % del descuento**: Junto al monto de descuento se muestra el **% que representa sobre el neto bruto** (`descuento / neto bruto`), en la fila de familia raíz, subfamilias, vendedores, fila TOTAL y la tarjeta KPI "Descuento Total".
- **Comisiones → nuevo tab 📊 Comparador**: Compara **ventas (neto), descuento $ y descuento %** con gráfico de barras (ventas vs descuento + % encima) y tabla. Tres modos: **entre vendedores**, **entre familias** y **entre periodos** (período actual vs. el anterior de igual duración, calculado automáticamente).

---


## Versión 1.0.271 - 04 de Junio de 2026

- **Inventario respeta `geparam.cf_tipo_bodega`**: Al mostrar el inventario, si `cf_tipo_bodega = 0` el stock es `geitems_mae.ITSTOCK`; si `= 1` es la suma de las bodegas (comportamiento anterior). Si la columna/tabla no existe, se mantiene la detección automática. Se evalúa por base de datos (se re-detecta al cambiar de conexión).
- **Admin: cambiar tipo de documento (COTIPO)**: Nueva pestaña **🏷 Tipo Doc** en *Parámetros* (visible para admin y superadmin). Busca una cotización por número y cambia su tipo (NV, TI, CO, etc.). La cabecera (`gecot_enc.COTIPO`) y el detalle (`gecot_det.CODTIPO`) se actualizan juntos para no romper el ERP. Los tipos válidos salen de `getipos` (tipo=1). Cada cambio queda auditado en `cot_estado_log` (acción `cambiar-tipo`: usuario, fecha/hora, IP y equipo).
- **Botón "🛒 Últimas compras" reubicado**: Pasó del bloque de RUT del cliente a la barra de productos, entre *Lista de Productos* y el buscador de productos de la cotización.

---


## Versión 1.0.251 - 04 de Junio de 2026

- **WhatsApp: elegir App o Web**: El modal de envío por WhatsApp ahora tiene **dos botones**: **📱 Abrir App** (abre la aplicación de WhatsApp instalada en el equipo vía `whatsapp://`) y **🌐 WhatsApp Web** (abre web.whatsapp.com en el navegador). Antes siempre iba a la web aunque la app estuviera instalada. Ahora el usuario elige el destino en cada envío.

---


## Versión 1.0.250 - 04 de Junio de 2026

- **Logo de empresa por base de datos**: Al subir el logo en *Parámetros → Mi Empresa*, queda asociado a la **base de datos activa**. Si se cambia de conexión (ej. de allen a gamspa), el logo del PDF y los correos cambia automáticamente al de esa empresa. Cada logo se guarda en `logo_{bd}.png/jpg` y se registra en `logos_bd.json`. **Requiere reiniciar el servidor.**

---


## Versión 1.0.249 - 04 de Junio de 2026

- **Script PHP como tercer método de subida de PDF al hosting**: En *Parámetros → Mi Empresa → Subir PDF*, nuevo protocolo **⚡ Script PHP**. Funciona vía HTTPS estándar (puerto 443) sin FTP ni WebDAV: se descarga un archivo `upload.php` generado con tu token secreto, se sube una sola vez al hosting (desde cPanel → Administrador de archivos) y el sistema envía los PDFs con un simple POST. El token se guarda cifrado. Incluye botón "🔌 Probar conexión" (verifica que el script responda) y "⬆️ Probar subida" (sube un PDF real de prueba). **Requiere reiniciar el servidor.**

---


## Versión 1.0.248 - 04 de Junio de 2026

- **WebDAV como alternativa al FTP para subir PDFs al hosting**: En *Parámetros → Mi Empresa → Subida de PDF*, nuevo selector **FTP/FTPS** o **WebDAV/HTTPS**. El modo WebDAV sube los PDFs por HTTPS (puerto 443), sin puertos pasivos ni firewalls especiales — resuelve el timeout de FTP con cPanel. Solo necesita la URL de la carpeta y las credenciales de cPanel. En WhatsApp, el enlace al PDF usa esa misma URL. La configuración (protocolo + credenciales) se guarda cifrada por base de datos, igual que antes. **Requiere reiniciar el servidor.**

---


## Versión 1.0.247 - 04 de Junio de 2026

- **Comisiones: % global del vendedor 2 aplica a todas las familias**: Cuando un vendedor tiene definido un porcentaje único en `geitems_fam_vend` (ej. vendedor 34 → 3% en familia 01), ese porcentaje se trata como su **tasa global** y aplica a **todas las familias** donde no exista una excepción específica. Antes, familias sin entrada explícita (como familia 10) caían al % de la familia (6%) aunque el vendedor tuviera 3% definido. El backend devuelve `com_vend_global` y el frontend lo usa como segundo nivel de fallback: excepción familia→vendedor → tasa global del vendedor → % de la familia. Vendedores con tasas distintas por familia mantienen el comportamiento específico por familia. También se corrigió que al filtrar por vendedor 0019 se incluyen las ventas del código 34 asociado.
- **PDF de comisiones imprimible** (`GET /api/informes/comisiones/pdf`): botón **"PDF comisiones"** en el informe. El PDF incluye **dos secciones**: primero "Por persona" (vendedores agrupados, si tienen vendedor 2 ambos códigos aparecen juntos con comisión correcta por FAVEN y desglose por código al expandir) y luego "Por código de vendedor" (cada código por separado). Respeta los mismos filtros del informe (vendedor, período, con/sin descuentos, heredar %). ⭐ indica comisión especial.
- **Toggle "Por código / Por persona"** en el informe de comisiones, vista "Por vendedor": **Por código** = cada código de vendedor separado (comportamiento anterior); **Por persona** = agrupa los códigos del mismo usuario (ej. 0019+34 = "Patricio Vargas") con la comisión correcta por factura (0019→6%, 34→3%) y desglose por código al expandir. Útil para que el administrador vea el total a pagar por persona. **Requiere reiniciar el servidor.**

---


## Versión 1.0.246 - 04 de Junio de 2026

- **FTP: botón "Probar subida"**: En *Parámetros → Mi Empresa → FTP* se agregó el botón **⬆️ Probar subida**, que sube un **PDF de prueba** (`PRUEBA-FTP.pdf`) a la carpeta configurada para comprobar de extremo a extremo la conexión, los permisos de escritura y la carpeta. Si configuraste la URL pública, muestra un enlace para **abrir el archivo en el navegador** y confirmar que la carpeta es accesible por web. El archivo de prueba se puede borrar luego. **Requiere reiniciar el servidor.**

---


## Versión 1.0.245 - 04 de Junio de 2026

- **Logo de la empresa: subir archivo (sin escribir la ruta)**: En *Parámetros → Mi Empresa* el logo ahora se **sube desde el equipo** con un botón ("Subir logo PNG o JPG"); el servidor lo guarda y registra automáticamente, evitando errores al escribir la ruta a mano. La **vista previa** ahora sí muestra el logo (se carga desde el servidor con la sesión, ya no intenta abrir una ruta local del PC, que el navegador bloquea). Máx. 5 MB, PNG o JPG. **Requiere reiniciar el servidor.**

---


## Versión 1.0.244 - 04 de Junio de 2026

- **Proyección de ventas del mes en el Inicio**: Nueva tarjeta en el dashboard que estima cuánto se venderá el mes en curso y lo compara con el año anterior. **Cálculo**: proyección = (venta neta acumulada del mes ÷ días transcurridos) × días del mes. Si es el **primer día del mes** (sin datos para extrapolar), usa el **promedio del mismo mes de los 2 años anteriores**. Muestra: venta a la fecha, comparativo con el mismo mes del año anterior **a igual fecha** y la proyección frente al **mes completo** del año anterior (con % de variación). Ventas **netas** (facturas + boletas − notas de crédito, por fecha de emisión); cada vendedor ve lo suyo y admin/superadmin el total. Incluye botón "¿Cómo se calcula?".
- **Modo sin conexión (PWA) activable en Conexiones**: En *Parámetros → Conexiones → Bases de datos* se agregó el interruptor **"Modo sin conexión (app instalable / PWA)"** (solo superadmin). Cuando está activo, el sistema se puede instalar y abre sin internet (carga la última versión guardada). **Requiere reiniciar el servidor.**

---


## Versión 1.0.243 - 04 de Junio de 2026

- **Enviar cotizaciones del sistema antiguo por Email y WhatsApp desde el historial**: Las cotizaciones del **sistema legado** (ERP) ahora tienen los botones **Email** y **WhatsApp** en el historial (antes solo "Ver" y "PDF"). También se habilitaron esos botones en la ventana "Ver" de una cotización legada. El email se envía con el PDF adjunto y WhatsApp usa el mismo flujo (enlace público/FTP y clave si están configurados). **Requiere reiniciar el servidor.**

---


## Versión 1.0.242 - 04 de Junio de 2026

- **WhatsApp ya no obliga a instalar la app**: En escritorio ahora abre **WhatsApp Web** directamente (antes intentaba la app de escritorio y aparecía el cuadro para descargarla). En móvil sigue abriendo la app si está instalada y, si no, la web.
- **Enlace del PDF también para el sistema nuevo**: El enlace público (URL del hosting/FTP) en el mensaje de WhatsApp ahora funciona tanto para cotizaciones del **sistema nuevo** como del legado. Al enviar, el PDF se **sube al FTP** en ese momento (con clave si está activada) para que el enlace abra correctamente. Antes solo aplicaba a las legadas y mostraba una dirección interna (localhost).

---


## Versión 1.0.241 - 04 de Junio de 2026

- **WhatsApp: enlace al PDF en el hosting**: El mensaje de WhatsApp ahora enlaza al PDF en su **URL pública** (la del hosting donde se sube por FTP), p. ej. `https://www.gamspa.cl/cotclientes/C-2026-00001.pdf`, en vez de una dirección interna del servidor. Se configura en *Parámetros → Mi Empresa → FTP* con el nuevo campo **URL pública del PDF** (por base de datos).
- **PDF protegido con clave (opcional)**: Nuevo interruptor en la config FTP para **proteger el PDF subido con una clave = los últimos 4 dígitos del RUT del cliente** (sin dígito verificador). Cuando está activo, el mensaje de WhatsApp incluye automáticamente la indicación de la clave. **Requiere reiniciar el servidor.**

---


## Versión 1.0.240 - 04 de Junio de 2026

- **PDF de la cotización renovado**: (1) Los **datos de la empresa** ahora salen del ERP (`geparam`) de la base activa, por lo que cada empresa muestra los suyos (antes usaba datos fijos). (2) El **descuento 2** se muestra en su propia columna (**Dto.1% / Dto.2%**) cuando existe. (3) La **validez** del documento ya no está fija en 30 días: usa la validez real de la cotización y, si no está disponible, el valor configurado en *Parámetros → Configuración*. (4) Se reemplazaron los **grises por los colores de la paleta del sistema** (azul corporativo en encabezados y total final, azul claro en filas, rojo/naranja para descuentos y recargos). Aplica al PDF que se descarga, se envía por email y se sube por FTP.

---


## Versión 1.0.239 - 04 de Junio de 2026

- **Nota de venta offline (sin conexión) + app instalable (PWA)**: Nuevo botón **"Nota de venta (local)"** (parametrizable por usuario en *Parámetros → Usuarios → permiso "Nota de venta (local)"*; admin/superadmin siempre lo tienen). Permite **emitir una nota de venta sin internet**: se guarda en este equipo y queda en una **bandeja "Notas locales"** (botón flotante abajo a la derecha). Cuando vuelve la conexión se **sincroniza automáticamente al ERP** (o manualmente con "Sincronizar ahora"). Cada nota lleva un **identificador único**, por lo que **no se duplica** aunque se reintente. En la base gamspa nace **PENDIENTE** como el resto. Tras sincronizar, se puede descargar su PDF.
- **App instalable**: el sistema ahora es una **PWA** — se puede "Instalar" desde el navegador y **abre sin conexión** (Service Worker que cachea la app). Las llamadas a datos siguen yendo a la red.
- **Requiere reiniciar el servidor** (nuevos endpoints `/manifest.webmanifest`, `/sw.js`, íconos y la idempotencia de sincronización).

---


## Versión 1.0.238 - 04 de Junio de 2026

- **FTP: subida automática del PDF al hosting**: Al guardar una cotización en el ERP, su PDF se sube automáticamente por **FTP/FTPS** a una carpeta del hosting (por defecto `cotclientes`), con el N° de cotización como nombre de archivo. Se configura en *Parámetros → Mi Empresa → FTP* (**solo superadmin**), por base de datos: servidor, puerto, usuario, clave (cifrada), carpeta, FTPS (TLS) y un interruptor de **subida automática activa**. Incluye botones **Probar conexión** y **Crear carpeta**. La subida nunca interrumpe el guardado: si el FTP falla, la cotización igual queda grabada. **Requiere reiniciar el servidor.**

---


## Versión 1.0.237 - 04 de Junio de 2026

- **WhatsApp: usar la app instalada si existe**: Al enviar por WhatsApp, el sistema intenta abrir primero la **aplicación de escritorio** de WhatsApp (`whatsapp://`); si no está instalada, cae automáticamente a **WhatsApp Web** (`wa.me`). Antes siempre abría la web.

---


## Versión 1.0.236 - 04 de Junio de 2026

- **Fix: PDF del historial daba "Autenticación requerida"**: Al abrir el PDF de una cotización desde el historial salía error 401, porque se abría con `window.open` (que no envía el token de sesión). Ahora el PDF se descarga autenticado (con el token) y se abre como blob. Aplica a cotizaciones del sistema nuevo y legado.

---


## Versión 1.0.235 - 03 de Junio de 2026

- **Mi Empresa desde el ERP (geparam)**: Los datos de la empresa en *Parámetros → Mi Empresa* (nombre, RUT, dirección, teléfono, email) ahora se cargan automáticamente desde la tabla `geparam` de la **base de datos activa**, por lo que cada empresa muestra los suyos (gamspa, Allen, etc.). Estos campos quedan en **solo lectura** (se administran en el ERP); el **logo** sigue siendo de carga manual. Los **PDF y correos** usan estos datos según la BD. Endpoint `GET /api/config/empresa` actualizado.
- **Catálogo: cantidad al agregar**: Al buscar productos en el catálogo de la cotización, cada fila tiene un campo de **cantidad** junto al botón Agregar; si se deja vacío, se agrega **1** por defecto (Enter también agrega).

---


## Versión 1.0.234 - 03 de Junio de 2026

- **Últimas compras: botón rápido "6 meses"**: En el listado de compras del cliente se agregó un botón **6 meses** (además del de 12 meses) para filtrar rápidamente el período sin escribir fechas. El default sigue siendo 12 meses.

---


## Versión 1.0.233 - 03 de Junio de 2026

- **Últimas compras: por defecto últimos 12 meses**: El listado de compras del cliente ahora carga por defecto los **últimos 12 meses** (hoy y 365 días atrás) en vez de solo los últimos 10 documentos. Así aparecen todos los productos comprados en el año (antes faltaban los de documentos más antiguos). Las fechas Desde/Hasta vienen pre-cargadas con ese rango y se pueden ajustar; botón "Últimos 12 meses" para volver al rango por defecto.
- **Rendimiento**: La consulta de líneas pasó de una por documento (lenta) a **consultas por lote** (una por fuente con `IN`), por lo que cargar un año de compras es rápido. **Requiere reiniciar el servidor** para tomar el cambio del backend.

---


## Versión 1.0.232 - 03 de Junio de 2026

- **Transportista con búsqueda**: En la cotización, el campo Transportista pasó de un desplegable largo a un **campo con búsqueda** (se escribe y filtra entre los transportistas). Internamente guarda el código del transportista (`COENVIO`); muestra un borde rojo si lo escrito no coincide con ninguno.

---


## Versión 1.0.231 - 03 de Junio de 2026

- **Últimas compras: filtro por rango de fechas**: El listado de compras del cliente ahora tiene filtros **Desde / Hasta**. Al abrir muestra los últimos 10 documentos; al indicar un rango de fechas y pulsar "Filtrar", muestra **todos** los documentos de ese período (hasta 300), por fecha del documento. Botón "Últimos 10" para volver al modo inicial. El endpoint `GET /api/clientes/{rut}/ultimas-compras` acepta `desde` y `hasta`.

---


## Versión 1.0.230 - 03 de Junio de 2026

- **Últimas compras por pestañas**: El listado de últimas compras del cliente ahora separa la información en pestañas por tipo de documento — **Todas · Facturas · Boletas · Cotizaciones** — con el conteo de cada una. Se muestran solo las pestañas que tienen documentos. El buscador y el botón "+ agregar" funcionan dentro de la pestaña activa.

---


## Versión 1.0.229 - 03 de Junio de 2026

- **gamspa: cotizaciones/notas nacen PENDIENTE**: Al guardar en el ERP desde la base **gamspa**, las cotizaciones y notas de venta quedan en estado **PENDIENTE** (requieren aprobación de admin), en vez de ACTIVA. En el resto de las bases siguen naciendo ACTIVA. Configurable en `app_config.json` → `cotizacion_pendiente_dbs` (por defecto `["gamspa"]`). El aviso al guardar indica que quedó pendiente de aprobación.
- **Últimas compras: columna "P.Unit c/Dto"**: En el listado de últimas compras del cliente se agregó la columna **precio unitario con descuento** aplicado (precio × (1−Dto1) × (1−Dto2)).

---


## Versión 1.0.228 - 03 de Junio de 2026

- **Cotización — "🛒 Últimas compras" del cliente**: Al cargar un cliente en Nueva Cotización aparece un botón que abre un listado con sus **últimos 10 documentos** (facturas, boletas y cotizaciones), en formato de líneas como el ERP: Tipo · N° · Fecha · Código · Artículo · Cantidad · **Dto1** · **Dto2** · P.Unitario · Monto. Cada línea tiene un botón **"+ agregar"** que carga ese producto en la cotización con su cantidad, precio y descuentos (recompra rápida). Incluye buscador por código/artículo. Fuentes: `gefac_enc/det`, `gebol_enc/det` (boletas tienen solo Dto1) y `gecot_enc/det`. Nuevo endpoint `GET /api/clientes/{rut}/ultimas-compras?limit=10`.

---


## Versión 1.0.227 - 03 de Junio de 2026

- **Superadmin — Cambiar estado de cotización con auditoría**: Nueva pestaña **🔁 Estados** en Parámetros (visible solo para superadmin). Permite buscar una cotización por número (sistema nuevo o legado), ver su estado actual y **cambiarlo a cualquier estado válido** (ej. revertir ACTIVA→PENDIENTE), con **motivo obligatorio**. Cada cambio queda registrado en la nueva tabla `cot_estado_log`: **quién** (usuario), **cuándo** (fecha/hora), **desde dónde** (IP + navegador/SO) y el motivo. Incluye historial de cambios en pantalla.
- **Auditoría de todos los cambios de estado**: además del cambio del superadmin, ahora se registran también los cambios vía autorizar/rechazar pendiente y el cambio de estado del sistema nuevo. (Nota técnica: el nombre real del equipo no lo expone el navegador; se registra IP + navegador + sistema operativo, que identifican el equipo.) El endpoint de cambio valida el rol superadmin en el servidor (no solo oculta el botón). Se limpiaron además definiciones duplicadas del endpoint de rechazo.

---


## Versión 1.0.226 - 03 de Junio de 2026

- **Inventario — Códigos alternativos (listado + exportación)**: Nuevo botón **"🔀 Códigos alternativos"** en Inventario que abre un listado de los productos que tienen códigos alternativos (tabla `geitems_cod`, cruzando `CCODORI` con `geitems_mae.ITCOD`), mostrando para cada producto sus códigos alternativos. Incluye buscador, opción "Incluir inactivos" (por defecto solo activos) y **exportación a PDF** (agrupado por producto) y **Excel** (dos hojas: "Por producto" y "Por código"). Nuevos endpoints `GET /api/inventario/codigos-alternativos`, `/pdf`, `/excel`. Se agregó `openpyxl` a las dependencias.
- **Más textos siguen el nombre del documento configurable**: Se conectaron a *Parámetros → Documentos* varios textos que quedaban fijos como "cotización": permisos de usuario (cambiar vendedor, ocultar utilidad), ayudas de vendedor asociado, "Correo para envío de…", "Mis … activas", modal de autorización, modal de búsqueda por número y el campo del modal de email.

---


## Versión 1.0.225 - 03 de Junio de 2026

- **Inicio — columna "Tipo" en el listado**: El listado de la pantalla de inicio (panel de cotizaciones por aprobar, que ven vendedores y administradores) ahora muestra una columna **Tipo** con el tipo de documento (Cotización, Nota de Venta, Ticket, etc.). El tipo viene de `gecot_enc.COTIPO` (legado) o de `tipo_cotizacion_des/cod` (sistema nuevo), y se traduce a una etiqueta legible: `CO`→Cotización, `NV`→Nota de Venta, `TI`→Ticket, `D/T`→Despacho/Transp., `EMAIL`→E-mail, `TWEB`→Cotización Web, `FELEC`→Factura Electrónica.

---


## Versión 1.0.224 - 03 de Junio de 2026

- **Solicitudes de acceso al sitio — correcciones**:
  - **Compatibilidad MySQL 5.5 (gamspa)**: la tabla `cot_solicitudes_login` no se creaba en la base gamspa (MySQL 5.5) porque el `CREATE TABLE` usaba `DATETIME DEFAULT CURRENT_TIMESTAMP` (no soportado en esa versión). Se cambió a `TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP` (compatible y sin auto-actualización). Ahora las solicitudes se registran y aparecen en el panel también en gamspa.
  - **Todos piden autorización**: se desactivó la auto-aprobación automática de las IP de la red local (LAN). Ahora cada acceso de un dispositivo nuevo genera una solicitud que el administrador debe aprobar. Configurable con `app_config.json` → `sitio_auto_aprobar_lan` (por defecto `false`). **Excepción de seguridad:** `localhost` (la propia máquina del servidor) siempre entra, para que el administrador nunca quede bloqueado. Los dispositivos ya aprobados mantienen su acceso (token vigente 30 días).
  - Las solicitudes siguen expirando a los 15 minutos (sin cambios).

---


## Versión 1.0.223 - 02 de Junio de 2026

- **Nombre del sistema → "GESTION WEB"**: Se cambió el nombre/branding del sistema de "Sistema de Cotizaciones" a **GESTION WEB** en el título de la pestaña del navegador, la pantalla de login, el subtítulo del dashboard y el valor por defecto del topbar (cuando no hay nombre de empresa configurado), además del título de la API y el asunto del correo de prueba SMTP. (No afecta el nombre del documento, que sigue siendo configurable en Parámetros → Documentos, ni el nombre de la empresa de Mi Empresa.)

---


## Versión 1.0.222 - 02 de Junio de 2026

- **Comisiones — botón "Actualizar" con estado de progreso**: Al actualizar el informe de comisiones, el botón ahora muestra que está **procesando** (spinner + cronómetro en vivo) y una **estimación del tiempo restante** basada en cuánto demoró la última carga (ej. "Procesando… 45% · ~2.3s"). El botón se deshabilita mientras carga y se restaura al terminar. La duración se recuerda en `localStorage` para mejorar la estimación.

---


## Versión 1.0.221 - 02 de Junio de 2026

- **Permisos — el vendedor no puede autorizar cotizaciones**: La acción de autorizar (cambiar una cotización de PENDIENTE a ACTIVA, "🔐 Autorizar") quedó restringida a **admin/superadmin** en dos niveles: el botón solo se muestra a admin, y la acción `abrirAutorizacion()` se bloquea si el usuario no es admin (muestra aviso). Antes el botón aparecía para cualquier usuario con una cotización pendiente. (El backend ya exigía la clave de un administrador.) **Nota:** recargar la página con Ctrl+F5 para tomar el cambio si quedó una pestaña abierta.

---


## Versión 1.0.220 - 02 de Junio de 2026

- **Comisiones — fecha del documento en el detalle**: En la vista *Por familia*, al expandir un vendedor, la tabla de movimientos ahora muestra la columna **Fecha** del documento (factura/boleta), además de N° Doc, descripción, cantidad, subtotal y comisión. La fecha corresponde a la base configurada en *Parámetros → Documentos* (emisión por defecto). Confirmado: el detalle filtra por el período Desde/Hasta seleccionado.

---


## Versión 1.0.219 - 02 de Junio de 2026

- **Más textos siguen el nombre configurable del documento**: El botón grande del inicio ("Nueva Cotización" + "Crear una cotización para un cliente"), el KPI "Cotizaciones del mes" del dashboard y el subtítulo de vendedor ahora respetan el nombre definido en *Parámetros → Documentos* (igual que el menú y el historial).
- **Fix Comisiones (Por familia)**: Las familias cuya única subfamilia coincide con la raíz (ej. "04 FOSSE CAR CARE") ahora son **expandibles** para ver el detalle por vendedor, igual que el resto. Antes no mostraban la flecha y no se podía ver el vendedor.

---


## Versión 1.0.218 - 02 de Junio de 2026

- **Informe de Comisiones — filtro "Con vendedor"**: Nuevo tercer botón en la vista *Por familia* (junto a "Todas las familias" y "Solo con comisión"). Muestra únicamente las familias que tienen **al menos un vendedor (con código) que registró ventas** en el período. Así, aunque una familia tenga porcentaje de comisión configurado, si sus ventas no tienen vendedor asignado (o no tuvo ventas), no se muestra. Las ventas sin vendedor (`SIN_VEN`) no cuentan. En la vista *Por vendedor*, este filtro excluye el grupo de ventas sin vendedor asignado.

---


## Versión 1.0.217 - 02 de Junio de 2026

- **Base de fecha de los informes configurable (emisión vs creación)**: Nuevo parámetro en *Parámetros → Documentos* que define qué fecha se usa para clasificar **facturas, boletas y notas de crédito** en todos los informes. Antes todos los informes filtraban por la **fecha de creación/digitación** (`FAFECHAHORA`); ahora, por defecto, usan la **fecha de emisión del documento** (`FAFEC`/`BOLFEC`/`NCFEC`), que es la fecha legal/contable. Esto corrige el caso en que una factura se crea en el mes en curso pero su fecha de documento es del mes anterior: ahora cuenta en el mes correcto. Aplica a Ventas (análisis, detalle, geografía, despachos, PDF), Comisiones, Boletas, Notas de Crédito, Estadísticas Anuales, Facturas Emitidas y el dashboard. El **mapa de calor por hora del día** sigue usando la hora de creación (la fecha de emisión no tiene hora). Nuevos endpoints `GET/POST /api/config/base-fecha`.

---


## Versión 1.0.216 - 01 de Junio de 2026

- **Guardar cotización en el ERP (gecot_enc / gecot_det)**: Nuevo botón **"Guardar en ERP"** en el formulario de cotización, junto al botón "Guardar Cotización" original (que se mantiene sin cambios). Graba la cotización directamente en las tablas del ERP legado. La numeración (`CONRO`) se obtiene del último número real existente en `gecot_enc` (`MAX(CONRO)+1`) con bloqueo de fila y reintento anti-duplicado, blindado contra el contador de `gedescriptores`, de modo que no genera conflictos con cotizaciones creadas desde el ERP en marcha. Replica la aritmética exacta del ERP (subtotal de línea = precio unitario neto redondeado × cantidad, IVA 19%, montos enteros). Nuevo endpoint `POST /api/cotizaciones/legado`.
- **Modo de entrega y transportista**: Se agregaron al formulario los campos **Modo de Entrega** (Despacho a domicilio / Retira en local / Vía transportista) y **Transportista**. Llenan los campos `CODESPACHO`, `CORETIRA`, `COTRANSPORTE` y `COENVIO` de `gecot_enc`. El **tipo de documento** (`COTIPO`) ahora toma el valor del select "Tipo Cotización". Nuevo endpoint `GET /api/transportistas` (lee `getipos tipo=4`).
- **PDF, Email y WhatsApp para cotizaciones del ERP**: Tras guardar en ERP, los botones de acción apuntan a los endpoints legados. Se agregó el envío por **email con PDF adjunto** para cotizaciones del ERP (`POST /api/cotizacion-legado/{conro}/email`), reutilizando la configuración SMTP existente (global o personal del usuario).
- **Botones de guardado con nombre configurable y explicación**: Los dos botones respetan el nombre del documento definido en *Parámetros → Documentos* (ej. "Guardar Presupuesto" / "Guardar Presupuesto en ERP") y muestran una breve explicación de cada uno: **Guardar [doc]** = se guarda en el sistema web; **Guardar [doc] en ERP** = se graba directamente en el ERP/sistema antiguo con numeración correlativa, modo de entrega y transportista.

---


## Versión 1.0.201 - 01 de Junio de 2026

- **Dashboard: Cotizaciones por Aprobar**: Se agregó un nuevo panel en la pantalla de inicio (Dashboard) que muestra un listado de las cotizaciones en estado `PENDIENTE` (que requieren autorización de descuento). Los administradores ven todas las pendientes; los vendedores ven únicamente las suyas. **Nota:** Este listado no filtra por mes, por lo que las cotizaciones pendientes de meses anteriores seguirán apareciendo hasta que sean aprobadas, rechazadas o venzan.
- **Cierre de cotizaciones**: Nuevo flujo completo. El vendedor ve sus cotizaciones activas en el dashboard y en el historial, y puede solicitar el cierre. El administrador ve un nuevo panel con las solicitudes pendientes y puede aprobarlas (estado pasa a `CERRADA`) o rechazarlas. Las cotizaciones cuya validez expire se cierran automáticamente.
- **Nuevos permisos de restricción**: Se agregaron opciones granulares en "Restricciones de datos sensibles" (Administración de usuarios):
  - **Ocultar pestaña reposición**: Permite ocultar completamente la pestaña "Reposición" en el módulo de Inventario para los vendedores indicados.
  - **Ocultar Estadísticas y Proyección**: Permite ocultar el panel principal de Estadísticas Anuales y Proyecciones en la pestaña de Análisis (Ventas) para los vendedores indicados.

---


## Versión 1.0.185 - 30 de Mayo de 2026

- **Ventas — NC solo en vista combinada**: En el informe de Ventas, las Notas de Crédito ahora solo se descuentan cuando se muestran **Facturas + Boletas juntas**. Al filtrar por un solo tipo (solo Facturas o solo Boletas), el Neto/IVA/Total Real ya **no descuenta** las NC (porque las NC aplican a ambos tipos y restarlas en una vista parcial distorsiona). Aplica tanto en pantalla como en el PDF.
- **Nuevo tab Notas de Crédito** en Informes (📑): Dashboard de `genc_enc` con KPIs (N° de NC, Neto, IVA, Total) y desglose por origen — **De Facturas / De Boletas / Otro**. La clasificación se hace cruzando el documento referenciado (`NCDOC`) contra las facturas (`gefac_enc`) y boletas (`gebol_enc`) emitidas. Incluye tabla detallada con N° NC, fecha, origen, doc referenciado, cliente, vendedor y montos. Nuevo endpoint `GET /api/informes/notas-credito`.

---


## Versión 1.0.178 - 30 de Mayo de 2026

- **Facturas movido dentro de Informes**: El módulo de Facturas Emitidas ya no es un ítem del menú superior — ahora es un tab dentro de **Informes** (🧾 Facturas). Se mantiene toda su funcionalidad (filtros, KPIs, tabla paginada, detalle de productos). El acceso respeta el permiso `facturas`: un usuario con ese permiso entra a Informes y ve solo el tab de Facturas.
- **Nuevo tab Boletas (dashboard)** en Informes: Presenta las boletas del período (`gebol_enc`) tipo dashboard con 6 KPIs — Boletas emitidas, IVA de boletas, Clientes con boleta, Neto total, Total c/IVA y Ticket promedio. Incluye un gráfico de barras de boletas emitidas por día y un ranking de top vendedores por cantidad de boletas. Filtros por período y vendedor. Nuevo endpoint `GET /api/informes/boletas?fecha_desde&fecha_hasta&faven` (detecta la columna de cliente defensivamente).

---


## Versión 1.0.165 - 29 de Mayo de 2026

- **Dashboard de evolución de comisiones (tab 📈 Evolución)**: Nueva vista en el informe de comisiones que muestra el comportamiento de las comisiones en el tiempo. Incluye 4 KPIs (comisión total del período, promedio mensual, mes peak, familia top), un gráfico de barras de la comisión total pagada por mes, y una tabla detallada familia × mes con totales. Respeta la cascada completa (excepción de vendedor → comisión de familia → raíz). Nuevo endpoint `GET /api/informes/comisiones/evolucion`.
- **Fix — Comisiones especiales no se guardaban**: El guardado usaba el código en mayúsculas en vez del código real de la familia, causando que al reabrir no aparecieran los vendedores. Ahora usa el código real (`famEditCod`) y muestra en pantalla cualquier error del guardado en vez de silenciarlo.
- **Fix — Error al cambiar de base de datos**: La tabla `cot_solicitudes_login` se crea/verifica automáticamente en cada endpoint relacionado, evitando el error "Table doesn't exist" al usar una conexión que no la tenía. Los endpoints de conteo/listado devuelven vacío en vez de error 500 si la tabla no está disponible.

---


## Versión 1.0.163 - 29 de Mayo de 2026

- **Comisiones especiales por vendedor**: Ahora una familia puede pagar comisiones distintas según el vendedor. La comisión de la familia sigue siendo el valor por defecto; las excepciones se guardan en la nueva tabla `geitems_fam_vend` (familia + vendedor + % o $ por unidad).
- **Modal de familia — sección "⭐ Comisiones especiales por vendedor"**: Tabla editable donde se agregan vendedores con su comisión propia (% o $/unidad). Los vendedores no listados usan el valor por defecto de la familia. Endpoints `GET/POST /api/mantenedor/familias/{cod}/comisiones-vendedor`.
- **Informe de comisiones — cálculo en cascada**: Al calcular la comisión de cada vendedor se resuelve en orden: (1) excepción del vendedor para esa familia ⭐, (2) comisión por defecto de la familia, (3) comisión de la raíz si hereda. La comisión de cada subfamilia es la suma de las comisiones de sus vendedores. Las filas con comisión especial se marcan con ⭐ y fondo ámbar.
- **Panel "¿Cómo se calculan?" ampliado**: Explica paso a paso de dónde viene la Comisión $ de cada vendedor (excepción → familia → raíz) y la fórmula según el tipo (% sobre neto o $ por unidad).

---


## Versión 1.0.159 - 29 de Mayo de 2026

- **Pantalla de inicio / bienvenida**: Al ingresar al sistema, en vez de ir directo a "Nueva Cotización" se muestra una pantalla de bienvenida con: saludo personalizado según la hora (Buenos días/tardes/noches + nombre), fecha actual, 4 KPIs del mes (cotizaciones, ventas netas, pendientes de facturar, clientes registrados) y tarjetas de acceso rápido a cada módulo según los permisos del usuario.
- **Nuevo botón "Inicio"** en la barra de navegación (primer botón). Nuevo endpoint `GET /api/dashboard/resumen` que entrega los KPIs de forma defensiva (cada métrica retorna 0 si su consulta falla, sin romper la pantalla).

---


## Versión 1.0.156 - 29 de Mayo de 2026

- **Corrección error al cambiar contraseña (1406 Data too long)**: El hash PBKDF2 anterior generaba 101 caracteres y no cabía en la columna `cot_usuarios.clave` (típicamente `VARCHAR(50)`), provocando HTTP 500 al crear usuarios o cambiar claves. Ahora se usa un formato compacto `p2$` + base64(8 bytes salt + 20 bytes hash) = **43 caracteres**, que cabe en `VARCHAR(50)` sin requerir `ALTER TABLE`.
- **Migración transparente corregida**: La detección de clave a re-hashear ahora usa el prefijo actual `p2$` (antes verificaba el prefijo legacy, lo que re-hasheaba en cada login). Las claves en texto plano se migran al primer login exitoso.
- **Fallback automático de conexión**: Si la conexión activa de BD falla, `get_db()` prueba automáticamente las demás conexiones de `conexiones.json` (primero la marcada como `es_defecto`). Evita quedar sin acceso si el host remoto/DDNS no responde.

---


## Versión 1.0.154 - 29 de Mayo de 2026

- **Sistema de aprobación de acceso**: Los usuarios con rol vendedor/supervisor ya no ingresan automáticamente — su login queda en estado "pendiente" hasta que el administrador lo apruebe o rechace. Los admin y superadmin siguen ingresando directamente.
- **Datos recopilados por solicitud**: IP, geolocalización (país, región, ciudad, ISP, coordenadas vía ip-api.com), hostname, browser, sistema operativo, tipo de dispositivo (escritorio/móvil/tablet), resolución de pantalla, zona horaria, idioma. Todos los datos se guardan en `cot_solicitudes_login`.
- **Pantalla de espera**: El usuario ve un overlay con spinner, sus datos de dispositivo, un contador regresivo de 10 minutos y botón de cancelar. Hace polling al backend cada 3 segundos.
- **Panel de aprobaciones (admin)**: Badge rojo en el topbar con el número de solicitudes pendientes (animación de pulso). Al hacer clic abre un panel con tabs "Pendientes" e "Historial". Cada solicitud muestra toda la info del dispositivo, enlace a Google Maps con las coordenadas y botones Aprobar/Rechazar. El badge se actualiza automáticamente cada 6 segundos.
- **Flujo completo**: Login → solicitud pendiente → admin aprueba → usuario entra / admin rechaza → usuario ve "Acceso denegado". Expiración automática a los 10 minutos.
- **Nuevos endpoints**: `GET /api/login/solicitud/{sid}` (público, polling cliente), `GET /api/solicitudes-login/pendientes`, `GET /api/solicitudes-login/conteo`, `GET /api/solicitudes-login/historial`, `POST /api/solicitudes-login/{sid}/aprobar`, `POST /api/solicitudes-login/{sid}/rechazar`.

---


## Versión 1.0.152 - 28 de Mayo de 2026

- **Autenticación JWT en todas las APIs**: El login retorna un token HMAC-SHA256 (firmado con clave en `.jwt_secret`, 7 días de vigencia). Un middleware intercepta todas las rutas `/api/` y exige `Authorization: Bearer <token>`, excepto `/api/login`, `/api/usuarios-login`, `/api/config/titulos` y `/api/db-status`. El frontend sobrescribe `window.fetch` para inyectar el token automáticamente en todas las llamadas y redirige al login en respuestas 401.
- **Contraseñas hasheadas con PBKDF2-SHA256**: Las contraseñas nuevas y los cambios de clave se guardan como `pbk$<salt>$<hash>` (200.000 iteraciones, stdlib Python). Migración transparente: al primer login exitoso con texto plano, la clave se hashea automáticamente en la BD sin interrumpir al usuario.
- **Rate limiting en login**: Máximo 10 intentos por IP en ventana de 5 minutos. Devuelve HTTP 429 si se supera el límite.
- **CORS restringido**: `allow_origins` ya no es `["*"]`; por defecto solo acepta `localhost:8000` y `127.0.0.1:8000`. Configurable vía variable de entorno `ALLOWED_ORIGINS` en `.env`.
- **Headers de seguridad HTTP**: Middleware agrega `X-Content-Type-Options: nosniff`, `X-Frame-Options: SAMEORIGIN`, `Referrer-Policy`, `X-XSS-Protection` en todas las respuestas.
- **Errores 500 sin detalle interno**: Manejador global de excepciones loggea el error real en `errors.log` y devuelve mensaje genérico `"Error interno del servidor"` al cliente.
- **Soporte `.env`**: Credenciales de BD se leen de variables de entorno; se incluye `.env.example` como plantilla. `python-dotenv` agregado a `requirements.txt`.
- **Detección de PIN por defecto**: El login incluye `pin_es_default: true/false`. Si el superadmin aún usa `123456`, aparece un toast de advertencia al entrar al sistema.
- **`toast()` acepta duración**: Tercer parámetro `duration` (ms) para controlar cuánto dura el toast; por defecto 4000 ms.

---


## Versión 1.0.146 - 28 de Mayo de 2026

- **Despachos — Filtro facturadas corregido**: El filtro "Solo facturadas" ahora usa `gecot_det.CODFACT` como fuente autoritativa (vacío/0 = pendiente, con valor = facturado), en vez de asumir valores de `COESTADO`. Si `gecot_det` no tiene la columna `CODFACT`, cae a `COESTADO` como respaldo. Esto garantiza que el listado de clientes por transporte solo incluya pedidos efectivamente facturados.
- **Despachos — Explicación "Pedidos con envío"**: Se agrega un panel informativo al inicio del tab que explica que los "pedidos con envío" son cotizaciones de `gecot_enc` con campo `COENVIO` no vacío (transportista asignado). También indica el modo activo (Solo facturadas / Activas / Todas) y el mecanismo de filtro aplicado (CODFACT o COESTADO).

---


## Versión 1.0.144 - 28 de Mayo de 2026

- **Despachos — Filtro por estado de documento**: El tab Despachos ahora incluye un toggle de 4 opciones — **Solo facturadas** (default, excluye activas y modificadas por COESTADO), **Act.+Fact.** (excluye solo modificadas/anuladas), **Solo activas** y **Todas**. Endpoint `GET /api/ventas-gefac/despachos` acepta el nuevo parámetro `modo_doc`.
- **Ventas — Heatmap y barras día: neto real s/NC**: El mapa de calor ahora muestra neto (sin IVA) en tooltip en vez de total. Las barras "Por día de semana" muestran **neto bruto − NC proporcional del día**, con nota explicativa. El backend retorna `nc_por_dia[]` (array 6 elementos, NC neto agrupado por día de semana).
- **Ventas — Semana actual sobre heatmap**: El heatmap agrega una columna derecha con la venta de cada día de la **semana en curso** (cantidad · neto real). El backend retorna `semana_actual[]` con datos desde el lunes hasta hoy. Incluye nota con el rango de fechas.
- **Ventas — KPIs con fórmula explícita**: Los KPIs "Neto Real" y "Total Real" muestran ahora la fórmula `(FAC+BOL−NC)` y `(c/IVA−NC)` en el encabezado de la tarjeta para dejar claro que siempre descuentan las notas de crédito.

---


## Versión 1.0.141 - 28 de Mayo de 2026

- **Familias — Tipo de comisión "$ fijo por unidad"**: El modal de edición de familia ahora permite elegir entre **% sobre venta** (comportamiento anterior) y **$ fijo por unidad vendida**. La elección se guarda en las nuevas columnas `ITFA_COM_TIPO` (pct/fijo) e `ITFA_COM_FIJO` en `geitems_fam`. El helper `_asegurar_cols_com()` crea las tres columnas automáticamente si no existen.
- **Familias — Asignación masiva de comisión**: Panel colapsable "Selección masiva" en el árbol de familias. Permite elegir tipo (% / $ por unidad) y valor, luego aplicar a **todas** las familias o a las **seleccionadas** (checkboxes que aparecen en cada fila al activar el modo). Endpoint `POST /api/mantenedor/familias/comision-masiva`.
- **Informe Comisiones — Cálculo por tipo**: La comisión se calcula según el tipo configurado en la familia: `neto_final × %` para tipo `pct`; `cantidad × $ fijo` para tipo `fijo`. El cambio afecta KPIs, totales de tabla, filas de subfamilia, filas de vendedor y detalle de líneas expandible. Los badges en el informe muestran `X.X%` (verde) o `$Y/u` (azul) según el tipo.
- **Backend `GET /api/informes/comisiones`**: Ahora incluye `fam_com_tipo`, `fam_com_fijo`, `cant` en subfamilias y vendedores; `root_com_tipo`, `root_com_fijo` en grupos raíz. Las queries de facturas y boletas incluyen `FADCANT`/`BOLDCANT` para totalizar cantidades.

---


## Versión 1.0.139 - 28 de Mayo de 2026

- **Informes Comisiones — Detalle de movimientos por documento**: El detalle expandible dentro de cada vendedor ahora muestra una fila por línea de documento (FAC-XXXXXX / BOL-XXXXXX) en lugar de agregado por ítem. Columnas: N° Doc, Descripción (+ código), Cant., Subtotal, Comisión. La fila de totales al pie cuadra exactamente con el neto del vendedor en la fila padre, ya que se usa el mismo cálculo de descuentos (descuento de línea + factor proporcional FANETO/BOLNETO). Los documentos se ordenan por número.

---


## Versión 1.0.137 - 28 de Mayo de 2026

- **Topbar — Indicador de base de datos conectada**: Después del número de versión aparece un indicador con punto verde/rojo y el nombre amigable de la conexión activa (tomado de `conexiones.json`). Al pasar el mouse muestra tooltip con `host`, `database` y `usuario DB`. El indicador se oculta al cerrar sesión y se actualiza automáticamente al cambiar de BD desde Parámetros → Conexiones.
- **Backend — `GET /api/db-status` mejorado**: Ahora incluye el campo `nombre` (nombre amigable de la conexión activa en `conexiones.json`). Si no hay conexión configurada usa `"Conexión por defecto"`.

---


## Versión 1.0.135 - 28 de Mayo de 2026

- **Informes Comisiones — Detalle de productos por vendedor (carga bajo demanda)**: En la vista "Por familia", cada fila de vendedor dentro de una subfamilia es ahora expandible (▶/▼). Al hacer click por primera vez se realiza un fetch a `GET /api/informes/comisiones/lineas?fecha_desde&fecha_hasta&fam_cod&ven_cod` que retorna los productos agregados por código (suma de cantidades y montos del período). La tabla de productos muestra: Código, Nombre, Cantidad, Precio unit., Neto Final/Bruto y Comisión $. Los datos se cargan una sola vez y se cachean en el DOM mientras el reporte esté abierto.
- **Nuevo endpoint `GET /api/informes/comisiones/lineas`**: Filtra `gefac_det`/`gebol_det` por `ITFAM = fam_cod` y `FAVEN/BOLVEN = ven_cod`. Aplica el mismo cascade de descuentos (línea + factor proporcional FANETO). Agrega por código de ítem: cant, neto_bruto, neto_final, precio_unit calculado. Detecta defensivamente columnas `FADCANT`, `FADDESC`, `FADDESC2` (y equivalentes en boletas).

---


## Versión 1.0.132 - 28 de Mayo de 2026

- **Informes Comisiones — KPI "Neto s/Comisión"**: 5° tarjeta KPI que muestra `Neto Final − Comisión Total`, representando el ingreso neto del período una vez descontadas las comisiones a pagar. Grid de KPIs ampliado a 5 columnas.
- **Informes Comisiones — Explicación del origen de datos**: Botón "ℹ ¿Cómo se calculan estos valores?" colapsable bajo los KPIs. Explica: Neto Bruto (`FADSUBTOT`/`BOLDSUBT` sin descuentos), Descuento (línea + ajuste proporcional por `FANETO`/`BOLNETO` de cabecera), Neto Final (proporcional al neto real del documento) y Neto s/Comisión.
- **Informes Comisiones — Badge COM% en vendedores**: Las filas de vendedor dentro de cada subfamilia (vista Por familia expandida) muestran el badge con el % de comisión efectivo (directo o heredado). Los vendedores de subfamilias sin comisión (`sfPct = 0`) no aparecen como sub-filas.

---


## Versión 1.0.130 - 28 de Mayo de 2026

- **Informes Comisiones — Desglose de vendedores por subfamilia**: En la vista "Por familia", al expandir un grupo, cada subfamilia muestra debajo el detalle de qué vendedor aportó cuánto (neto bruto, descuento, neto final y comisión $). El backend ahora incluye `vendedores[]` dentro de cada subfamilia del array `grupos`.

---


## Versión 1.0.128 - 28 de Mayo de 2026

- **Informes Comisiones — Filtro "Todas / Solo con comisión"**: En el tab 💰 Comisiones se agregaron botones de toggle para mostrar **Todas las familias** o **Solo con comisión** (familias cuya raíz o alguna subfamilia tenga `ITFA_COM > 0`). La fila TOTAL de la tabla refleja únicamente las familias visibles según el filtro activo, mostrando la leyenda "(solo c/comisión)" cuando corresponde. La vista Por Vendedor aplica el mismo filtro.
- **Parámetros Familias — Filtro "Todas / Solo con comisión"**: En el árbol de familias se agregaron botones toggle para mostrar todas las familias o solo las que tienen comisión configurada (incluyendo familias padre cuya descendencia tenga comisión).

---


## Versión 1.0.122 - 28 de Mayo de 2026

- **Informes — Nuevo tab "💰 Comisiones"**: Informe de pago de comisiones por familia de productos. Combina facturas (`gefac_enc/det`) y boletas (`gebol_enc/det`). Filtros: período, vendedor. Toggles: **Con descuentos aplicados** (aplica FADDESC, FADDESC2 y ajuste proporcional de descuento de cabecera vs. FANETO/BOLNETO) / **Sin descuentos** (usa subtotales brutos). Toggle **Heredar % comisión de familia raíz cuando directa = 0%**: cuando la subfamilia tiene 0% en `geitems_fam.ITFA_COM`, aplica el % de la familia raíz (nivel 1). Tabla agrupada por familia raíz con expansión a subfamilias; muestra: COM%, Neto Bruto, Descuento, Neto Final y Comisión $. KPIs en la parte superior: Neto Bruto, Neto Final, Descuento Total y Comisión Total. Nuevo endpoint `GET /api/informes/comisiones?fecha_desde&fecha_hasta&vendedor`.

---


## Versión 1.0.118 - 28 de Mayo de 2026

- **Ventas Despachos — Gráfico horario mejorado**: La distribución horaria (requiere `COCREAFEC`) cambió de gráfico de barras a **gráfico de líneas con marcadores** SVG puro. Marcadores coloreados por zona (verde = ventana óptima 00–10h y 15–23h, amarillo = marginal, rojo = fuera de ventana 11–14h). Tooltip nativo en cada marcador. La sección horaria se reubicó **encima** de "Transportes utilizados" para mejor jerarquía visual.
- **Ventas Despachos — Corrección error 500**: El endpoint `/api/ventas-gefac/despachos` fallaba por: (1) `GROUP BY region` (alias inválido en MySQL ONLY_FULL_GROUP_BY) → corregido a `GROUP BY 1`; (2) columnas opcionales (`CONETO`, `COFEC`, `COVEN`) detectadas via `DESCRIBE` y construidas dinámicamente; (3) nombres de cliente via subconsulta `(SELECT MIN(CLINOM) FROM gecli WHERE CLIRUT = e.COCLI)` para evitar JOIN con duplicados.
- **Ventas Despachos — Corrección ID duplicado**: Los paneles Diagnóstico y Despachos compartían IDs `vgd-spin` y `vgd-contenido`. `getElementById` retornaba el primero (Diagnóstico), dejando el panel Despachos siempre vacío. Renombrados a `vgds-spin` y `vgds-contenido`.
- **Ventas Despachos — Invalidación de caché**: Al cambiar el filtro de vendedor/fecha en la barra principal de Ventas, `_vgDespachoData` ahora se resetea a `null` para forzar recarga cuando se vuelva al tab Despachos.
- **Nueva cotización — Corrección label "Condiciones"**: El campo `Condiciones de la [Cotización]` no actualizaba su etiqueta al cambiar el título en Parámetros → Documentos. Corregido agregando `id="lbl-condiciones-doc"` al span y añadiéndolo a `_applyDocTitles()`.
- **Facturas — Ajustes de UI**: (1) columna N° Factura con `white-space:nowrap` para evitar quiebre en dos líneas; (2) filtro de vendedor muestra solo vendedores activos (`VENEST IS NULL OR VENEST = 1`); (3) paginación duplicada arriba y abajo de la tabla para navegación más cómoda.

---


## Versión 1.0.113 - 28 de Mayo de 2026

- **Parámetros — Documentos: títulos configurables**: Nuevo tab "📝 Documentos" en Parámetros. Permite cambiar la denominación del documento comercial en todo el sistema (singular + plural). Vista previa en tiempo real. Al guardar, actualiza: menú "Nueva [Título]", encabezado historial, título del PDF, asunto y cuerpo del email. Configuración persistida en `files/app_config.json`. Nuevo endpoint `GET /api/config/titulos` y `POST /api/config/titulos`.
- **Facturas — Corrección duplicados por cliente**: El listado de facturas mostraba la misma factura duplicada cuando el cliente tenía más de un registro en `gecli` con el mismo RUT. Corregido usando `LEFT JOIN (SELECT CLIRUT, MIN(CLINOM) AS CLINOM FROM gecli GROUP BY CLIRUT)` tanto en `gefac_enc` como en `gebol_enc`.
- **Ventas Despachos — Corrección filtro vendedor**: La función `cargarDespachoVG()` usaba un ID de elemento inexistente (`vg-filtro-vendedor`). Corregido a `vg-vendedor` con soporte de `_vgFavenOverride` para usuarios no-admin.

---


## Versión 1.0.111 - 28 de Mayo de 2026

- **Ventas — Nuevo tab "Despachos"**: análisis del comportamiento logístico de los pedidos con envío asignado (`gecot_enc.COENVIO`). Muestra: ① **KPIs**: pedidos con envío, neto total, documentos en ventana óptima y fuera de ventana. ② **Transportes**: ranking de transportistas por docs y neto con barras proporcionales, acordeón de clientes por transportista (top 15). Nombres desde `getipos WHERE tipo=4`. ③ **Distribución por región**: tabla de destinos con barras, usando `gecli.CLIREG → gereg` cuando existe. ④ **Distribución horaria** (requiere `COCREAFEC`): gráfico de barras por hora 00–23 con código de color por zona: verde (00–10h y 15–23h = ventana óptima), amarillo (10h = marginal), rojo (11–14h = fuera de ventana). Nuevo endpoint `GET /api/ventas-gefac/despachos?fecha_desde&fecha_hasta&faven`. Respeta el filtro de vendedor existente. Si `COENVIO` no existe en BD, el panel muestra aviso en lugar de errores.

---


## Versión 1.0.109 - 28 de Mayo de 2026

- **Ventas — Utilidad en Análisis de Clientes y Detalle**: Se agrega la columna **Utilidad** (Neto − Costo) en dos lugares del tab Detalle. ① Panel "Análisis de Clientes": nueva columna por cliente (monto + %) coloreada verde/amarillo/naranja/rojo según margen, y nuevo KPI global "Utilidad total" con su porcentaje. ② Tabla de ventas por factura/boleta: columna "Utilidad" entre Total y Productos, coloreada por nivel de margen. Costo calculado desde `geitems_mae.ITCOSTO × cantidad` via LEFT JOIN en `gefac_det`/`gebol_det`. Ítems sin entrada en el maestro se valorizan con costo 0. Endopoints modificados: `GET /api/ventas-gefac/clientes-top` (agrega `costo_total`, `utilidad`, `pct_util` por cliente y KPIs globales) y `GET /api/ventas-gefac/detalle` (agrega `costo_total`, `utilidad`, `pct_util` por documento).

---


## Versión 1.0.107 - 28 de Mayo de 2026

- **Ventas — Panel "Análisis de Clientes" en tab Detalle**: Se agrega un dashboard colapsable encima de la tabla de detalle. Muestra KPIs globales (clientes únicos, documentos, neto total, ticket por cliente) y un ranking de top 10/20 clientes por neto con barras proporcionales, columnas Docs, Ticket promedio y % sobre el total. Carga en paralelo con la tabla de detalle al aplicar filtros. Disponible para admin (usa el vendedor del dropdown) y no-admin (usa el override de vendedor asignado). Nuevo endpoint `GET /api/ventas-gefac/clientes-top?fecha_desde&fecha_hasta&fatipo&faven&limit=20`.

---


## Versión 1.0.105 - 28 de Mayo de 2026

- **Ventas — Geografía: filtro multi-vendedor con modo Combinado / Por vendedor**: El panel Geografía de Ventas ahora incluye un selector de checkboxes con todos los vendedores activos (cargados desde `/api/ventas-gefac/vendedores`). En modo **Combinado** (predeterminado) se agregan todos los seleccionados en una sola consulta. En modo **Por vendedor** se realizan consultas paralelas (`Promise.all`) y se muestra una tarjeta independiente por vendedor con sus propios KPIs, top regiones, top 10 comunas y acordeón expandible. Los no-admin con vendedor asignado ven un badge bloqueado y usan el override existente. Usuarios sin override y sin selección reciben aviso.

---


## Versión 1.0.103 - 28 de Mayo de 2026

- **Ventas — Nuevo tab "Geografía de Ventas"**: análisis de ventas por región y comuna. JOIN `gefac_enc.FACLI` / `gebol_enc.BOLCLI` → `gecli` → `gereg.REGDESLARG` / `gecom.COMDES`. Retorna KPIs (regiones/comunas activas, docs sin georeferencia), ranking top regiones con barras proporcionales, top 15 comunas (con región de origen), y acordeón expandible región → comunas con neto, docs, % sobre región, % sobre total y ticket promedio. Neto bruto (sin descuento de NC, ya que `genc_enc` no tiene georeferencia de destino). Fallback automático a `geciu` si `gereg` o `gecom` no existen. Nuevo endpoint `GET /api/ventas-gefac/geografia?fecha_desde&fecha_hasta&fatipo&faven`. Usa los filtros de fecha, tipo y vendedor del panel superior de la página.
- **Ventas — Corrección descripciones en top precios (Diagnóstico)**: productos que no figuraban en el top-100 de mayor baja de neto mostraban el código en lugar del nombre en la sección de variación de PPP. Corregido construyendo el mapa de descripciones desde `prod_a`/`prod_c` completos en lugar de desde `lista_prod[:100]`.

---


## Versión 1.0.101 - 27 de Mayo de 2026

- **Ventas — Nuevo tab "Diagnóstico de Ventas"**: Se agrega un tercer tab en la página Ventas GEFAC con análisis comparativo entre dos años. Incluye 5 secciones: ① variación mensual con barras lado a lado, ② análisis de clientes (activos/perdidos/nuevos con neto real), ③ productos que bajaron o desaparecieron (desde `gefac_det`+`gebol_det`+`geitems_mae`+`geitems_fam`), ④ ventas por vendedor con NC desglosadas, ⑤ análisis de precios (PPP ponderado, descuento efectivo, índice Laspeyres canasta top-30, descomposición Precio-Volumen-Descuento). Todos los netos reales descuentan las Notas de Crédito del período (`genc_enc`: `NCNETO − NCDESC`), filtradas por `NCFEC` y `NCVEN`. La NC no se imputa por producto (no existe `genc_det`). Nuevo endpoint `GET /api/ventas-gefac/diagnostico?anio_actual&anio_ant&faven`.

---


## Versión 1.0.99 - 27 de Mayo de 2026

- **Informes — Productos más cotizados incluye sistema legado**: El ranking de productos cotizados ahora combina `cot_detalle` (sistema nuevo) con `gecot_det` + `gecot_enc` (sistema legado) mediante UNION ALL. Los resultados se agrupan por código de producto, tomando el nombre desde `geitems_mae` para el legado. El filtro de período (`fecha_desde`/`fecha_hasta`) aplica a ambos sistemas (`cot_cabecera.fecha` y `gecot_enc.COFEC`).
- **Ventas — Carga de vendedores robusta**: El endpoint `/api/ventas-gefac/vendedores` fue reescrito con dos consultas separadas (códigos primero, nombres después) eliminando el `JOIN` problemático con `geven` (tabla inexistente). El frontend solo carga el dropdown cuando está vacío para evitar loops con el `onchange`.

---


## Versión 1.0.95 - 27 de Mayo de 2026

- **Inventario — Vendedor en panel "Compradores del producto"**: La tabla de documentos por cliente ahora incluye la columna **Vendedor** (entre Fecha y Cant.). El backend resuelve el nombre del vendedor desde `gefac_enc.FAVEN` (facturas) o `gebol_enc.BOLVEN` (boletas), luego cruza con `gevend` para obtener el nombre completo. La columna aparece solo cuando hay al menos un documento con vendedor identificado; si `gevend` no existe, muestra el código de vendedor directamente.

---


## Versión 1.0.93 - 27 de Mayo de 2026

- **Ventas — Filtro unificado por vendedor (mapa de calor, franjas, estadísticas)**: El dropdown de vendedor en la barra de herramientas controla ahora **todas** las secciones del módulo ventas: KPIs, mapa de calor, ventas por día de la semana, franjas horarias, detalle paginado y estadísticas anuales con proyección. El cambio de vendedor recarga todo al instante (sin necesidad de pulsar "Actualizar"). El panel de Estadísticas Anuales muestra un badge indicando el vendedor activo (`🔍 V001` para admin, `🔒 V001` para no-admin). Los valores son siempre **neto bruto menos notas de crédito**.

---


## Versión 1.0.92 - 27 de Mayo de 2026

- **Ventas/Estadísticas — Filtro por vendedor para admin y no-admin**: Los usuarios no-admin con `cod_vendedor` ven las **estadísticas anuales** filtradas automáticamente por sus códigos (uno o varios). Admin/superadmin puede filtrar usando el dropdown de vendedor de la barra de herramientas. Para no-admin aparece un badge `🔒 V001`. Los valores son siempre neto bruto menos notas de crédito. *(Nota: el dropdown independiente en estadísticas fue unificado en v1.0.93.)*

---


## Versión 1.0.90 - 27 de Mayo de 2026

- **Ventas — Soporte multi-código de vendedor**: Los usuarios con más de un código de vendedor asignado (ej: "V001,V002") ahora ven las ventas, estadísticas anuales, detalle, PDF y email filtrados por **todos** sus códigos. Se añadió la función auxiliar `_faven_clause(faven, col)` en el backend que genera `col = %s` para un código o `col IN (%s,%s,...)` para varios. Aplicada a `ventas_gefac_resumen`, `ventas_gefac_detalle`, `_generar_pdf_ventas_bytes` y `ventas_gefac_estadisticas_anuales`. En el frontend, `cargarVentasGefac()` y `cargarEstadisticasAnuales()` usan `window._vgFavenOverride` con todos los códigos y el badge muestra "V001 / V002".

---


## Versión 1.0.79 - 27 de Mayo de 2026

- **Historial — Filtro por vendedor funcional para administradores**: El dropdown "Vendedor" en el historial ahora usa el **código de vendedor** (`VENCOD`) como valor en lugar del nombre. Al filtrar, el backend resuelve los usuarios de `cot_usuarios` que tienen ese código asignado en `cod_vendedor` y los aplica al sistema nuevo (`cot_cabecera.vendedor`). Para el sistema legado (`gecot_enc`) filtra directamente por `COVEN`. El desplegable muestra el formato `COD — Nombre` para facilitar la identificación.

---


## Versión 1.0.74 - 27 de Mayo de 2026

- **Cotización — Selector de sucursal al cargar cliente**: Al buscar un cliente que tiene sucursales (`gecli.CLISUC = 1`), aparece automáticamente un selector "🏢 Sucursal" sobre los campos de dirección. Las opciones incluyen "Casa matriz" y cada sucursal con número, nombre y ciudad. Al seleccionar una sucursal, los campos Dirección, Ciudad, Contacto, Email y Teléfonos se rellenan con los datos de esa sucursal. Al volver a "Casa matriz", los datos del cliente principal se restauran.

---


## Versión 1.0.73 - 27 de Mayo de 2026

- **Historial — Corrección filtro de vendedor para usuarios no-admin**: El historial no filtraba las cotizaciones del sistema nuevo (`cot_cabecera`) al ingresar con un usuario que tiene `cod_vendedor` asignado. El problema era una incompatibilidad: `cot_cabecera.vendedor` guarda el nombre del usuario (ej: "Juan Pérez"), pero el filtro enviaba el código de vendedor gefac (ej: "V001"). Corregido: el frontend ahora envía dos parámetros separados: `vendedor` (código gefac para `gecot_enc.COVEN`) y `usuario` (nombre del usuario para `cot_cabecera.vendedor`). El badge en el historial muestra `"Nombre (cód: XXXX)"`.

---


## Versión 1.0.72 - 27 de Mayo de 2026

- **Clientes — Sucursales**: En la tabla de clientes del mantenedor, los clientes que tienen sucursales (`gecli.CLISUC = 1`) ahora muestran un botón 🏢 en la columna Acciones. Al hacer clic se expande una fila inline con la tabla completa de sucursales (desde `clisuc`): número, nombre, dirección, ciudad, contacto, teléfonos y email. Los datos se cargan en demanda (lazy) y quedan cacheados para la sesión.

---


## Versión 1.0.71 - 27 de Mayo de 2026

- **Facturas — Corrección HTTP 500**: El endpoint `/api/facturas` producía error 500 porque la consulta intentaba hacer JOIN con la tabla `geven` (que no existe). Corregido: el JOIN se elimina del query principal y los nombres de vendedores se resuelven con una consulta separada y segura contra `gevend` (tabla correcta, la misma que usa el mantenedor). Si `gevend` no existe, se usa el código de vendedor directamente. Igualmente corregido el endpoint `/api/facturas/vendedores`.

---


## Versión 1.0.70 - 27 de Mayo de 2026

- **Usuarios — Vendedor(es) asociado(s)**: Al crear o editar un usuario se puede asociar uno o dos códigos de vendedor (`cod_vendedor`). Cuando el usuario no es administrador, el historial de cotizaciones se filtra automáticamente para mostrar solo los documentos del/los vendedor(es) asignados. Se muestra un badge "Filtro activo: Vendedor: XXX" en el encabezado del historial. Los administradores mantienen acceso completo y pueden filtrar manualmente.

---


## Versión 1.0.69 - 27 de Mayo de 2026

- **Permisos de usuario — Corrección visualización**: Los permisos configurados (Ventas, Facturas, Inventario, Informes, Mi Empresa, etc.) no aparecían en la interfaz al iniciar sesión por un error en la detección de la columna `permisos` en la tabla `cot_usuarios`. Corregido el flujo de login y `listar_usuarios` para detectar columnas opcionales vía `information_schema`.
- **Usuarios — Eliminar usuario**: Se agrega botón 🗑 en la tabla de administración de usuarios para eliminar permanentemente un usuario. Requiere confirmación antes de ejecutar el borrado.

---


## Versión 1.0.68 - 27 de Mayo de 2026

- **Facturas Emitidas — Nueva página independiente**: Se agrega la sección "Facturas" accesible desde la barra de navegación. Muestra el listado paginado de facturas emitidas (desde `gefac_enc`), con filtros por período, vendedor y búsqueda libre (RUT / nombre / N°). Incluye 4 KPIs del período (N° facturas, Neto, IVA, Total). Al hacer clic en cualquier fila se expande inline mostrando los productos facturados (`gefac_det`) con código, descripción, cantidad, precio unitario y subtotal, además de la condición de pago.
- **Facturas — Acceso parametrizable por usuario**: Se agrega el permiso `🧾 Facturas Emitidas` en la administración de usuarios (junto a Inventario, Informes, etc.). Vendedores y supervisores pueden tener este acceso habilitado de forma individual; administradores siempre tienen acceso completo.
- **Estadísticas Anuales — Corrección valores neto**: Los valores neto en la tabla histórica, gráfico mensual y proyecciones ahora descuentan las **Notas de Crédito** del período (`genc_enc`). El cálculo es `fac_neto + bol_neto − SUM(NCNETO − NCDESC)`, igual al "Neto Real" que ya existía en el informe de ventas GEFAC. Aplica al neto anual, al desglose mensual y a la comparación YTD del año anterior. Caché invalidada automáticamente.

---


## Versión 1.0.67 - 27 de Mayo de 2026

- **Historial — Corrección cotizaciones PARCIALES**: En el modal de detalle de cotizaciones legado con estado PARCIAL, se mostraban **todos** los productos como pendientes porque el campo `CODFACT` de `gecot_det` no se incluía en la respuesta del endpoint. Corregido: ahora se retorna `codfact` y solo los ítems con `codfact = 0` (o vacío) se marcan como PENDIENTE; los ya facturados se muestran atenuados.
- **Historial — Orden por N° de cotización**: El orden por defecto del listado de historial cambia de Fecha a **N° de cotización descendente** (mayor primero). El sort es numérico (extrae el número final del código, ej. `COT-2026-00123` → 123) para que el orden sea correcto entre cotizaciones del sistema nuevo y legado. El indicador ▼ se mueve a la columna N° Cotización.

---


## Versión 1.0.66 - 27 de Mayo de 2026

- **Estadísticas Anuales — Correcciones y mejoras**:
  - Todos los valores (tabla histórica, proyección, gráfico mensual) ahora usan **Neto (sin IVA)**. Se eliminaron las columnas IVA y Total de la tabla histórica.
  - La variación **% vs Anterior** del año en curso compara el neto YTD con el **mismo período del año anterior** (Ene–mes actual), no el año completo. Se marca con `*` y se explica en nota al pie.
  - El gráfico de barras mensuales usa neto; las barras proyectadas (meses futuros) se distinguen con trama diagonal; se añade ítem de leyenda explicativo.
  - Botón **Imprimir / PDF** en el encabezado del panel: imprime únicamente las estadísticas usando `@media print` dedicado (oculta topbar, otras páginas y controles interactivos).

---


## Versión 1.0.65 - 27 de Mayo de 2026

- **Ventas — Tabs Análisis / Detalle**: La página de Ventas ahora tiene dos pestañas bajo los KPIs: **Análisis** (Heatmap, Analizador Horario, Barras día/franja, Estadísticas Anuales) y **Detalle** (tabla paginada de documentos con buscador). La pestaña "Detalle" carga los datos la primera vez que se abre; "Actualizar" sigue recargando ambos en segundo plano. La vista queda más limpia y organizada.

---


## Versión 1.0.64 - 27 de Mayo de 2026

- **Ventas — Toggle formato numérico en Estadísticas**: Se agregó botón "# Real / MM" en el panel de Estadísticas Anuales. Por defecto muestra cifras en millones (MM). Al hacer clic cambia a números reales completos (con separadores de miles). El cambio se aplica instantáneamente a toda la tabla, proyección y gráfico sin recargar datos.

---


## Versión 1.0.63 - 27 de Mayo de 2026

- **Ventas — Proyección base 1 año**: Se agregó la opción "1 año" al selector de base de proyección (ahora: 1, 2, 3, 4, 5 años). El cálculo en el endpoint también fue actualizado para incluir `n=1`.

---


## Versión 1.0.62 - 27 de Mayo de 2026

- **Ventas — Estadísticas Anuales y Proyección**: Nuevo panel colapsable en la página de Ventas con tabla histórica de los últimos 6 años (neto, IVA, total, docs, variación % vs año anterior), proyección del año en curso con 3 escenarios (base, mejor +5%, peor −6%) y gráfico de barras CSS mensual comparado. Selector de base 2/3/4/5 años. Caché automático de 24h en `estadisticas_anuales_cache.json` con botón de recarga manual.
- **Corrección endpoint `/api/producto/{itcod}`**: El decorador `@app.get` y la firma `def get_producto` estaban ausentes, causando que el endpoint no existiera. Restaurados. El endpoint es usado para obtener precio por lista al abrir cotizaciones.

---


## Versión 1.0.60 - 27 de Mayo de 2026

- **Corrección crítica — Login**: Se eliminó una llave `}` sobrante al final de `cargarInformes()` que generaba un `SyntaxError` de JavaScript, impidiendo que todo el script se ejecutara. El síntoma era la pantalla de login bloqueada en "Verificando conexión…" sin avanzar.
- **Informes — Botón Actualizar con estado de carga**: El botón "Actualizar" ahora se deshabilita mientras se procesan los datos, muestra spinner + texto "Procesando…" y se restaura al terminar (con `try/finally`). Se agrega un flag `_informesCargando` para evitar llamadas simultáneas.

---


## Versión 1.0.57 - 27 de Mayo de 2026

- **Corrección Informes — Actualizar y PDF Clientes**: Las funciones `cargarInformes()` y `exportarInformesPDF()` estaban declaradas dentro de `showPage()` (scope local), por lo que los botones del HTML no las encontraban al llamarlas con `onclick`. Se movieron al scope global y se mantuvo la llamada en `showPage()`.
- **WhatsApp — PDF adjunto automático**: Al hacer clic en "Abrir en WhatsApp" ahora se descarga el PDF de la cotización automáticamente antes de abrir WhatsApp. En dispositivos móviles con soporte de Web Share API, el PDF se comparte directamente como archivo adjunto (el usuario elige WhatsApp desde el selector nativo). En escritorio, el PDF se descarga y se muestra un aviso para adjuntarlo manualmente en la conversación.

---


## Versión 1.0.56 - 27 de Mayo de 2026

- **Kardex — Lista de productos**: Se agregó un botón "Lista" junto al campo de búsqueda del Kardex que abre un panel deslizante lateral con la lista completa de productos (paginada, 20 por página). El panel incluye buscador propio por código o descripción, muestra código, descripción, familia y stock de cada producto. Al hacer clic en un producto se selecciona directamente en el Kardex y se carga su movimiento. El panel se cierra con el botón ×, haciendo clic fuera, o presionando Escape.
- **Corrección selección de productos**: Se reemplazó el `onclick` inline (que fallaba con códigos que contienen comillas, barras u otros caracteres especiales, ej: `ACL-1 1/2"304`) por `data-idx` + `addEventListener('click')` con cache en memoria (`_kdxListaCache`), garantizando que cualquier producto pueda seleccionarse correctamente.

---


## Versión 1.0.55 - 27 de Mayo de 2026

- **Corrección SSL/TLS en envío de email (WRONG_VERSION_NUMBER)**: El servidor `mail.allen.cl:587` usa SSL implícito en lugar de STARTTLS. Se refactorizaron los 3 bloques de envío SMTP del sistema (cotizaciones, ventas, prueba SMTP) para: (1) crear un contexto SSL permisivo sin verificación de certificado, (2) intentar STARTTLS con ese contexto, y (3) si falla, hacer fallback automático a `SMTP_SSL` directo. Esto resuelve el error `[SSL: WRONG_VERSION_NUMBER]` en todos los endpoints de email.

---


## Versión 1.0.54 - 27 de Mayo de 2026

- **Corrección SMTP Reporte de Ventas (422)**: La lectura de configuración SMTP en `ventas_gefac_email()` buscaba en tablas de base de datos inexistentes (`ge_usuarios`, `config_smtp`, `ge_config_smtp`, `ge_empresa`). Se reescribió para usar exactamente el mismo patrón que el email de cotizaciones: toma `SMTP_CONFIG` global (cargado desde `smtp_config.json`) y sobreescribe con SMTP personal del usuario si tiene `smtp_modo = 'personal'` en `cot_usuarios`. También se eliminaron imports locales innecesarios (ya están al nivel global del módulo).

---


## Versión 1.0.53 - 27 de Mayo de 2026

- **Corrección definitiva envío de email — Reporte de Ventas**: Se eliminaron dos imports innecesarios (`httpx` y `Request`) dentro de `ventas_gefac_email()` que causaban "Internal Server Error" si `httpx` no estaba instalado en el entorno. También se agregó `usuario_codigo` al body del fetch en el JS del modal de ventas (igual que en los otros modales del sistema), permitiendo que el endpoint use el SMTP personal del usuario si está configurado, y el global como fallback.

---


## Versión 1.0.52 - 27 de Mayo de 2026

- **Corrección envío de email — Reporte de Ventas**: Se refactorizó la generación del PDF separando la lógica en una función interna `_generar_pdf_ventas_bytes()` que retorna `bytes` directamente. Tanto el endpoint HTTP (`/api/ventas-gefac/pdf`) como el endpoint de email (`/api/ventas-gefac/email`) usan esta función, eliminando el uso frágil de `body_iterator` async que causaba el error "Internal Server Error" al enviar. También se mejoró el manejo de errores en el JS del modal de email para mostrar el mensaje específico del servidor (ej. "SMTP no configurado", "Error SMTP: ...") en lugar del texto crudo de la respuesta.

---


## Versión 1.0.51 - 27 de Mayo de 2026

- **PDF Reporte de Ventas — Resumen analítico**: El PDF ahora incluye toda la información analítica antes del detalle de documentos, replicando lo que se ve en pantalla:
  - **5 KPI cards**: Documentos, Neto Real (ajustado por NC), IVA, Total Real, Ticket Promedio, con nota de notas de crédito descontadas.
  - **Ventas por día de la semana**: tabla con Docs, % y Total por cada día Lun–Sáb.
  - **Ventas por franja horaria**: tabla con Docs, % y Total por franja (08–10h, 10–13h, 13–15h, 15–18h, 18–20h).
  - **Mapa de calor**: tabla 6×17 (Lun–Sáb × 06h–22h) con celdas coloreadas en tonos pastel (verde→amarillo→naranja→rojo) según intensidad de ventas, más leyenda de colores.
  - El detalle de documentos (hasta 500 filas) continúa al final, separado por una línea horizontal.

---


## Versión 1.0.50 - 27 de Mayo de 2026

- **Nuevo módulo: Reporte de Ventas (Ventas)**: Se añadió una sección separada en el área de Informes para el análisis de ventas a partir de `gefac_enc` (facturas) y `gebol_enc` (boletas). Requiere permiso `perms.informes`. Incluye:
  - **5 KPI cards**: Documentos, Neto Real (con deducción de NC), IVA, Total Real y Ticket Promedio con hora peak.
  - **Mapa de calor** día × hora (Lun–Sáb × 06h–22h) en tonos pastel (verde→amarillo→naranja→rojo).
  - **Analizador de Horario** con dos tabs: *Lun–Sáb 40h* (Opción A: Lun-Vie 7h + Sáb 5h / Opción B: uniforme) y *Lun–Vie 40h* (8h/día), con advertencia dinámica del impacto del sábado.
  - **Ventas por día** y **Ventas por franja horaria** (barras de progreso comparativas).
  - **Tabla paginada de detalle**: Fecha, Hora, Tipo (FAC/BOL), N°, Cliente, RUT, Vendedor, Neto, Total, con botón de productos que abre un modal con el detalle de ítems vendidos.
  - **Filtros**: rango de fechas, tipo de documento (FAC/BOL/ambos), vendedor.
  - **Exportación a PDF** y **envío por email con PDF adjunto**.
  - Botón de navegación "Ventas" visible solo para usuarios con permiso de Informes.

---


## Versión 1.0.49 - 26 de Mayo de 2026

- **Corrección en tabla Inventario (pestaña 1)**: El enlace "X u." de unidades vendidas en la primera tabla de inventario ahora también almacena las fechas del período en atributos `data-desde` / `data-hasta`, y escapa correctamente las comillas en el código del producto (`&quot;`). Esto alineó ambas tablas de inventario con el mismo comportamiento correcto.
- **Corrección en Kardex — detección de campos de cliente**: Las funciones `kardex_campos` y `kardex_producto` tenían `ITMCLI` clasificado erróneamente como campo de nombre. Ahora `ITMCLI` se reconoce como campo de RUT (igual que en el panel de compradores), permitiendo que el Kardex también resuelva el nombre del cliente desde `gecli`.
- **Endpoint de diagnóstico `debug-mov`**: Se añadió `/api/inventario/debug-mov` que expone la estructura de `geitems_mov` y estadísticas de un producto (total filas, filas con fecha, filas con salida) para facilitar depuración en campo.

---


## Versión 1.0.48 - 26 de Mayo de 2026

- **Corrección de fechas en Panel de Compradores**: Al renderizar la tabla de inventario, cada enlace de unidades vendidas ahora guarda las fechas del período (`data-desde`, `data-hasta`) como atributos HTML. El panel de compradores lee esas fechas directamente del enlace, evitando que un cambio posterior en los filtros de fecha afecte la consulta.
- **Corrección de códigos con comillas en HTML**: Productos cuyo código contiene comillas dobles (ej. `ACL-1 1/2"304`, `3/4"304`) generaban atributos HTML rotos (`data-itcod="ACL-1 1/2"304"`), haciendo que el panel recibiera el código truncado y no encontrara resultados. Se aplica `.replace(/"/g, '&quot;')` al escribir `data-itcod` en ambas tablas de inventario.

---


## Versión 1.0.47 - 26 de Mayo de 2026

- **Corrección de detección de campo cliente (ITMCLI = RUT)**: En `geitems_mov`, el campo `ITMCLI` almacena el RUT del cliente como entero (ej. `78897320`), no el nombre. El código anterior lo clasificaba como campo de nombre, dejando `campo_rut` en `None` y rompiendo el JOIN con `gecli`. Ahora `ITMCLI` se agrega a la lista de detección de RUT y se retira de la lista de nombre, permitiendo que el panel obtenga correctamente el nombre, mail, teléfono y contacto del cliente desde la tabla `gecli`.

---


## Versión 1.0.46 - 26 de Mayo de 2026

- **Corrección de fuente de datos del Panel de Compradores**: El endpoint `/api/inventario/compradores-producto` consultaba `gefac_det` / `gebol_det` como fuente principal, tablas que no siempre tienen todos los movimientos. Se reescribió para usar `geitems_mov` (la misma tabla que alimenta el contador de "vendidos" en el inventario), garantizando consistencia entre el número mostrado en la tabla y los clientes desplegados en el panel.
- **TRIM en comparación de código de producto**: Se agregó `TRIM(m.ITMCOD) = TRIM(%s)` en todas las consultas a `geitems_mov` para tolerar espacios en blanco al inicio o final del código almacenado en la base de datos.

---


## Versión 1.0.45 - 26 de Mayo de 2026

- **Panel "Detalle de Clientes que Compraron un Producto"**: Se implementó un panel deslizante lateral en Inventario → Productos. Al hacer clic en el número de unidades vendidas de un producto, se abre un panel con:
  - **KPIs**: total de compradores únicos, unidades totales vendidas, cantidad de documentos y precio promedio del período.
  - **Tabla de compradores**: nombre del cliente, RUT, contacto, email, teléfono, unidades compradas, último documento y fecha de última compra.
  - **Filtro de período**: usa las mismas fechas seleccionadas en la tabla de inventario.
  - El panel funciona en ambas pestañas de inventario y se cierra con el botón ✕ o haciendo clic fuera.

---


## Versión 1.0.44 - 25 de Mayo de 2026

- **Corrección en Cambio de Vendedor**: Se solucionó un problema que ocultaba el botón ✏️ para los usuarios autorizados debido a un conflicto de sesión, y se garantizó que la lista de vendedores siempre se recargue completamente.

---



## Versión 1.0.43 - 25 de Mayo de 2026

- **Cambio de Vendedor en Cotización**: Se añadió un botón en la pantalla de Nueva/Edición de Cotización que permite cambiar al vendedor comisionista para una venta específica, sin alterar el vendedor por defecto del cliente.
- **Permisos de Usuario**: Se agregó una nueva opción de autorización en Parámetros -> Usuarios. Los administradores y superadministradores tienen este permiso de forma predeterminada.

---



## Versión 1.0.42 - 25 de Mayo de 2026

- **Filtro de Vendedores**: Se añadió un filtro por vendedor activo en el mantenedor de clientes (Parámetros / Clientes).
- **Exportación PDF**: La tabla de productos exportada a PDF ahora tiene una nueva columna explícita Desc.% y el P. Neto con los descuentos aplicados de forma transparente, ajustando correctamente el ancho de las columnas.
- **Visualización de Cotizaciones (Modal y PDF)**: Se ajustó el motor para garantizar que los cálculos de P. Unit (bruto) y P. Neto cuadren a la perfección con la información extraída de bases de datos nuevas y heredadas (legado).

---

## Versión 1.0.41 - 25 de Mayo de 2026

- **Recálculo de Totales de Cotización**: Se reestructuró la lógica matemática en el backend para calcular la Venta Neta, Costo Total y Utilidad sumando de forma rigurosa los subtotales reales (con descuentos aplicados) de cada producto, solucionando un desfase heredado del sistema antiguo que generaba inconsistencias al incluir o excluir ítems de la cabecera.

---


## Versión 1.0.40 - 25 de Mayo de 2026

- **Columnas de Descuento y Precio Neto en Visualización**: 
  - Al expandir una cotización (nueva o legado) en la tabla del historial, ahora se muestran las columnas de **Dto.1%**, **Dto.2%** y **P. Neto**.
  - Al buscar una cotización por número (lupa superior), la tabla de utilidades de los productos también fue actualizada para desplegar el Precio Unitario, los dos descuentos aplicados, el Precio Neto resultante, y luego Costo, Subtotal y Utilidad de forma clara.

---

## Versión 1.0.39 - 25 de Mayo de 2026

- **Utilidad con Descuentos y Recargos**: Se confirmó que el cálculo de utilidad siempre descuenta los descuentos por ítem y global, operando sobre el total neto de la venta. Además, ahora si la cotización tiene un recargo, al consultar la utilidad (ícono de lupa en Historial), el sistema pregunta mediante una casilla dinámica si deseas incluir ese recargo (valor neto) en la utilidad total o no, recalculando todo en tiempo real.

---

## Versión 1.0.38 - 25 de Mayo de 2026

- **Cotizaciones Parciales Legado**: Se integró el soporte para visualizar cotizaciones en estado "PARCIAL" heredadas del sistema antiguo.
- **Identificación Automática de Pendientes**: El sistema ahora lee la columna `CODFACT` del ERP. Los productos que no hayan sido facturados se marcan automáticamente como pendientes.
- **Visibilidad en el Historial**: En la tabla del historial, debajo del estado "PARCIAL", ahora aparece una flecha indicadora ("▼ Pendiente").
- **Tooltip de Pendientes Rápido**: Al pasar el ratón sobre "▼ Pendiente", se abre una pequeña ventana flotante mostrando la lista exacta de productos y cantidades pendientes sin necesidad de abrir el detalle de la cotización.

---
## Versión 1.0.34 - 25 de Mayo de 2026
- **Estado de Vendedores**: Se corrigió el listado en "Parámetros > Vendedores" donde los vendedores desactivados (estado 0 en base de datos) seguían apareciendo como activos. El error se debía a una validación interna que forzaba a "1" los valores nulos pero también afectaba por error a los ceros.
- **Filtro de Inventario (Solo Vendidos)**: Se agregó una casilla "Solo c/ventas" junto a las fechas de venta en el inventario. Ahora, al estar marcada (opción por defecto), el listado se filtrará directamente desde el backend para ocultar todos los productos que no tengan ventas en ese periodo, mejorando la navegación y enfocando la tabla solo en lo que tuvo movimiento.
---

## Versión 1.0.33 - 25 de Mayo de 2026

- **Parámetros — Árbol familias: Productos incluye subfamilias**: al clickear 📦 en una familia padre, ahora se buscan los productos de esa familia y todos sus descendientes. El backend filtra con `ITFAM IN (cod, subcod1, subcod2...)`. La tabla muestra la columna Familia para identificar a qué subfamilia pertenece cada producto. El pie indica cuántas subfamilias se incluyeron.

---

## Versión 1.0.32 - 25 de Mayo de 2026

**Diagnóstico con app.py — correcciones definitivas**

- **app.py — campo `itfam` agregado**: `/api/mantenedor/inventario` ahora incluye `"itfam"` en cada producto (código `geitems_mae.ITFAM`). Antes solo existía `"familia"` con el nombre descriptivo.

- **Árbol familias — bug crítico corregido**: el frontend hacía `filter(p => p.itfam === famCod)` sobre el resultado, pero `p.itfam` no existía en el response → siempre devolvía 0 productos aunque el API filtraba correctamente. Se eliminó el filter redundante y se usa `data.productos` directamente.

- **Toggle vendedor — código limpio**: confirmado con `app.py` que el backend devuelve `activo: int(VENEST)` y el PUT espera solo `activo`. Eliminado el campo `venest` del frontend que era incorrecto.

---

## Versión 1.0.31 - 25 de Mayo de 2026

- **Árbol familias — carga bajo demanda**: árbol carga solo familias. Botón 📦 Productos hace fetch on-demand por familia.
- **Estado vendedor desde VENEST**: lectura con fallback. *(Limpiado en v1.0.32)*

---

## Versión 1.0.30 - 25 de Mayo de 2026

- **Toggle vendedor**: normalización con `parseInt()`. *(Limpiado en v1.0.32)*
- **Árbol familias — campos corregidos**: `p.precio1` → `p.precios['1']` y `p.estado` → `p.activo`.

---

## Versión 1.0.29 - 25 de Mayo de 2026

- **`limpiarFormulario()`**: implementada — resetea cliente, ítems, borrador localStorage, número.
- **Decimales por UM**: `UM_ENTERAS`, `esUMEntera()`, `validarCantidadUM()`.
- **Índices columnas `renderItemRow`**: corregidos — `tds[5]`=Stock, `tds[6]`=P.Unitario, `tds[7]`=Dto1, `tds[8]`=Dto2, `tds[9]`=Subtotal.
- **Autocompletado**: eliminado `JSON.stringify` en onclick — usa `_acCache{}` + `data-*` + event delegation.

---

## Versión 1.0.28 - 25 de Mayo de 2026

- **Días de validez → 7 días**: valor por defecto cambiado. Implementadas `cargarValidez()` y `guardarValidez()`.
- **Tab Versión con historial**: panel de estado + historial de actualizaciones.

---

## Versión 1.0.27 - 24 de Mayo de 2026

- **Búsqueda multi-palabra** (backend): `/api/mantenedor/inventario` y `/api/productos`.
- Decimales en campos Descuento: confirmado funcionando.
- Resto de puntos corregidos en v1.0.29.

---
