De acuerdo a la Ley N° 21.719 puede solicitar acceso, rectificación, supresión, oposición, portabilidad o bloqueo de sus datos personales.
Ingrese sus credenciales para continuar
| Código | Nombre | Rol | Permisos | Vendedor | Correo | Estado | Creado | Acciones | |
|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
|||||||||
Marcar = restringir. 🙈 ocultan el
dato al vendedor. 🔒 limitan las cifras a su vendedor asignado. Sin marcar nada, el vendedor ve todo.
🤖 El asistente está desactivado por defecto — actívalo por usuario.
🌐 Leads Web: permite ver el menú y solo los leads asignados al email del vendedor.
🏛️ Licitaciones MP: permite ver el módulo (admin siempre lo ve; vendedor solo si está marcado).
📜 Certificados: permite buscar y enviar certificados de calidad (admin siempre lo ve).
Si se asigna un vendedor, el usuario solo verá cotizaciones y facturas de ese código al ingresar.
| N° | Fecha | Cliente | Total | Vence | |
|---|---|---|---|---|---|
| Cargando… | |||||
| # | Código | Descripción | U.M. | Cantidad | Stock | P. Unitario | Dto.1% | Dto.2% | Subtotal | 📍 | ✕ |
|---|---|---|---|---|---|---|---|---|---|---|---|
|
Busque y agregue productos a la cotización |
|||||||||||
| Subtotal Neto: | $0 | ||||||||||
| N° Cotización ▼ | Fecha | Hora | RUT | Cliente | Ciudad | Vendedor | Total | Estado | Despacho | Origen | Admin-V | Acciones |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
||||||||||||
| Descripción / Código | Veces | Unidades | Monto |
|---|---|---|---|
|
Cargando... |
|||
| Cliente | Total | Fact. | Monto |
|---|---|---|---|
|
Cargando... |
|||
Sin facturar: cotizaciones donde ningún ítem ha sido facturado aún. Parciales: cotizaciones donde se facturaron algunos ítems pero quedan productos pendientes.
| Cliente | Vendedor | Monto | Cot. | Última |
|---|---|---|---|---|
Cargando... | ||||
| Cliente | Vendedor | Monto pendiente | Ítems pend. | Última |
|---|---|---|---|---|
Cargando... | ||||
| Vendedor | Cot. | Fact. | % Fact. | Neto fact. | Total fact. | Pendiente x facturar |
|---|---|---|---|---|---|---|
|
Cargando... |
||||||
FADSUBTOT facturas + BOLDSUBT
boletas) sin aplicar ningún descuento.FADDESC, FADDESC2) y luego un
ajuste proporcional por el descuento de cabecera: cada línea se escala por FANETO / suma_netos
para que el total cuadre con el neto real del documento.FANETO/BOLNETO del documento distribuido proporcionalmente por línea.Neto Final × %; si es $ fijo por unidad →
Cantidad vendida × $/u.| N° Factura | Fecha | RUT | Nombre | Vendedor | Neto | IVA | Total | |
|---|---|---|---|---|---|---|---|---|
| Seleccione un período y haga clic en Actualizar | ||||||||
| Código | Descripción ▲ | U.M. | Precio 1 | Precio 2 | Costo | Stock | Bod.1 | Bod.2 | Bod.3 | Estado | Vend.hasta hoy |
|---|---|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
|||||||||||
| Código | Descripción ▲ | Stock | Vta/mes | Cobertura | A comprar | Estado | Último mov. | |
|---|---|---|---|---|---|---|---|---|
|
Presiona "Calcular" para generar el informe de reposición |
||||||||
Presiona "Analizar" para generar el análisis
| Fecha | Tipo | N° Doc. | Cliente | Cantidad | Costo | Stock tras mov. | Bod.1 | Bod.2 |
|---|---|---|---|---|---|---|---|---|
|
Busca un producto para ver su kardex |
||||||||
Sin movimientos en el período
Cargando importaciones…
| Código ERP | Descripción Español | Descripción Inglés | Cantidad | Costo Unit. | Total |
|---|
Cargando productos...
Cargando...
Busca, previsualiza y envía certificados PDF a tus clientes
Cargando…
Selecciona un certificado para previsualizarlo aquí
En vivo desde buscador.mercadopublico.cl — COTs ordenadas por cierre próximo, igual que el portal.
Descarga el Excel desde mercadopublico.cl → "Ver listado completo" → "Descargar resultado en Excel" y súbelo aquí para ver todas las licitaciones sin filtro por rubros.
| Nombre / Organismo | Tipo | Presupuesto | Publicación | Cierre | Estado | Ofertas | Participar | ⭐ |
|---|---|---|---|---|---|---|---|---|
Cargando… | ||||||||
| ID ↕ | Nombre ↕ | Organismo ↕ | Fecha Cierre ↕ | Monto ↕ | Estado | Tipo | ⭐ |
|---|---|---|---|---|---|---|---|
| Cargando… | |||||||
Cotizaciones recibidas desde el portal web. Revísalas y conviértelas a cotización formal.
Reconstruye los pasos que siguió un usuario al crear una cotización o nota de venta. Sirve para diagnosticar un problema cuando no se sabe cómo ocurrió.
Usa los filtros y pulsa Buscar
Texto de la política que el usuario debe aceptar al ingresar al sistema. Al cambiar la versión, todos los usuarios deberán volver a aceptarla.
La Ley 21.719 exige no conservar datos más tiempo del necesario. Configura cuántos días se guardan los registros y ejecuta la limpieza cuando quieras.
Solicitudes recibidas de titulares que ejercen sus derechos de acceso, rectificación, cancelación/supresión, oposición, portabilidad o bloqueo de datos.
Cargando solicitudes...
Clasifica los productos para filtrar la reposición por Tipo (según la familia) y por Calidad / Espesor / Largo (detectados en la descripción). No modifica el ERP.
| Código | Descripción ▲ | U.M. | Precio 1 | Precio 2 | Costo | Stock | Vendidos | Bod.1 | Bod.2 | Bod.3 | Familia | Estado |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
||||||||||||
Si una cotización supera este plazo sin cambio de estado, recibirás un aviso para cerrarla.
Texto que los usuarios deberán aceptar al conectarse.
Cuando está activo, al recibir un lead desde allen.cl se crea automáticamente la cotización en el ERP y se envía el PDF al cliente por email.
Cambia cómo se denomina el documento en el menú, historial, PDF y correos.
Define qué fecha se usa para clasificar facturas, boletas y notas de crédito en todos los informes (Ventas, Comisiones, Estadísticas, Facturas, Despachos).
Define de dónde se toman las notas de crédito del cliente al Registrar un pago en el Libro de Ventas.
genc_enc; se ocultan los saldos NCR de gepagos_ant. Úsalo si ya no trabajas con gepagos_ant.| RUT | Nombre | Ciudad | Lista P. | Vendedor | Acciones | |
|---|---|---|---|---|---|---|
|
Cargando... |
||||||
| Código | Nombre | Celular | Teléfono | Estado | Acciones |
|---|---|---|---|---|---|
|
Cargando... |
|||||
Árbol jerárquico — 5 niveles según código. La columna Comisión se usa para calcular el sueldo de vendedores.
Los datos de la empresa se leen del ERP
(tabla geparam) según la base activa. Aquí solo se administra el logo.
Al guardar una cotización en el ERP, su PDF se sube automáticamente al hosting (por base de datos). El nombre del archivo es el N° de la cotización.
cotclientes de tu hosting (vía cPanel → Administrador de archivos).| Código | Nombre | Rol | Permisos | Vendedor | Correo | 🔒 Política | Estado | Creado | Acciones | |
|---|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
||||||||||
Descarga el Registro de Compras y Ventas del SII (año completo) a Excel.
Usa login automático con la clave guardada, o ingresa la cookie manualmente.
El Registro de Compras y Ventas (RCV) es el libro tributario electrónico que el SII mantiene con todos los documentos tributarios emitidos y recibidos por la empresa durante el año.
Al descargar el RCV obtienes un Excel con las compras (facturas de proveedores) y ventas (facturas emitidas) del año seleccionado, directamente desde el portal del SII.
Los datos descargados quedan guardados localmente para el Libro de Compras (módulo Documentos).
💡 Tip: guarda la clave del SII en ⚙ Configurar para que el login sea automático.
cot_arco_solicitudes). Nuevos endpoints: /api/privacidad/config, /api/privacidad/aceptar, /api/privacidad/admin-config, /api/privacidad/guardar-config, /api/privacidad/purgar, /api/privacidad/solicitudes-arco./api/privacidad/aceptar-link?token=XXX).GET /api/mp/buscar-live.textoBusqueda a la API de MP, filtrando sobre todas las COTs del portal. Debounce de 500ms.Z (UTC) para que el browser las convierta a hora local Chile correctamente.estado=2 — la API devuelve el mismo universo que el portal./api/admin/tipos-doc (tipos reales de getipos). Endpoint ahora acepta permiso cambiar_tipo_doc, no solo admin.CodigoOC no está vacío y RUTProveedor coincide con el RUT propio) y la suma de MontoTotal de esas adjudicaciones. Se recalcula automáticamente al aplicar filtros de mes/región/texto.cambiar_tipo_doc en Parámetros → Usuarios. Cuando está activado, el vendedor ve la sección "Cambiar tipo de documento" dentro de su modal de perfil (clic en avatar). Permite buscar una cotización por número, ver el tipo actual y cambiarlo con un motivo obligatorio — igual que la herramienta de admin pero accesible desde el avatar. El historial de cambios queda registrado en cot_estado_log con usuario, IP y equipo. Los admins siempre ven la sección.GET /api/mp/config regenera la mp_api_key automáticamente si no existe, evitando que el bookmarklet quede en "Cargando…". Banner de expiración mejorado: muestra botón "🌐 Abrir MP" directo y cambia a polling cada 30s cuando hay token expirado para detectar la renovación automáticamente tras usar el bookmarklet.desde/hasta en GET /api/mp/licitaciones.orderBy=1, estado=2 (sin filtro de fecha) — idéntico al buscador.mercadopublico.cl — descargando hasta 2 000 COTs ordenadas por cierre próximo. Siempre arranca desde la página 1 para no saltarse novedades. Las 3 tarjetas explicativas se reemplazaron por un banner único descriptivo.es_invitacion TINYINT en cot_mp_licitaciones. Las COTs descargadas desde el endpoint autenticado (donde el proveedor fue invitado directamente) se marcan con es_invitacion=1 y muestran el badge azul 🔔 INVITADO en la tabla. El campo es sticky (si una COT ya está marcada como invitada, un re-sync no la desmarca).GET /api/mp/oc-pendientes (servicios-escritorio.mercadopublico.cl). Clic abre panel con lista de OC: número, organismo, fecha y link "Ver en MP →". Nuevo JWT Escritorio en ⚙️ Configuración MP (token Keycloak/heimdall, distinto del COT). Endpoints: POST /api/mp/escritorio-jwt, GET /api/mp/oc-pendientes.ver_certificados por usuario (admin siempre lo ve). Endpoints: GET /api/certificados, /api/certificados/archivo, POST /api/certificados/enviar. Carpeta: GW_DATA_DIR/certificados/.mp_activo). Los vendedores lo ven si tienen el nuevo permiso 🏛️ Ver Licitaciones MP activado en Parámetros → Usuarios (igual que ver_leads).origen en cot_cabecera (migración automática). El badge muestra: Web para cotizaciones del formulario Kognit; 📱 Offline para notas de venta sin red (detectado por cot_notas_offline); 🌐 Lead para conversiones de lead web (detectado por cot_web_leads.erp_conro); Leg para entradas directas del ERP.mpPollSyncStatus ahora llama cargarLicitacionesMP() fuera del bloque if/else — tanto si el sync termina con éxito como si falla, la tabla y todos los KPIs se recargan siempre.mp-filtro-cierre (ya oculto y sin opciones). Ahora llaman mpSortBy('cierre') / mpSortBy('publicacion') para ordenar la tabla directamente.mpRenderDashboard() ahora se invoca desde mpRenderTabla() con la lista ya filtrada — al filtrar por región, estado, tipo o texto, todos los contadores (Total, Publicadas hoy, Cierran hoy/mañana/semana, En seguimiento) se recalculan sobre el subconjunto visible.opacity: 0.55 y fondo gris — indicando visualmente que ya fueron revisadas sin sacarlas del flujo. El botón 👁 sigue funcionando para marcar/desmarcar.PATCH /api/mp/licitaciones/{codigo}/revisada ahora verifica con SHOW COLUMNS si existe la columna revisada y la crea con ALTER TABLE si no — en lugar de asumir que la migración ya corrió.cot_api_id en SELECT: mp_ofertas_refresh ahora verifica con SHOW COLUMNS antes de incluir cot_api_id en el SELECT; si no existe usa NULL AS cot_api_id.cot_api_id en INSERT: _mp_guardar_licitaciones construye dinámicamente _cols/_vals/_upd con SHOW COLUMNS, incluyendo solo las columnas que existen. El CREATE TABLE ya incluye todas las columnas nuevas para instalaciones limpias.GET /api/mp/licitaciones/{codigo}/ofertas ahora usa la API COT JWT como fuente primaria (escanea ventana ±45 días por publicación, extrae ofertasRecibidas); el scraping HTML era el fallback pero buscador.mercadopublico.cl es una SPA renderizada por JS. El toast indica la fuente: "(API MP)" o "(portal)".revisada se persiste en BD (TINYINT DEFAULT 0) y sobrevive re-sync. Endpoint PATCH /api/mp/licitaciones/{codigo}/revisada.ofertas_recibidas y mis_ofertas en BD con migración automática.organismo.compra-agil.mercadopublico.cl/resumen-cotizacion/{codigo} directamente (URL descubierta en portal). Fix modal "Ir a Licitar" también actualizado. Fix onclick roto por comillas dobles en template literal.pin_warning_ok en localStorage para silenciar permanentemente. Login devuelve pin_archivo para diagnóstico.GET /api/admin/usuarios ahora requiere token y filtra usuarios con rol=superadmin si el caller no es superadmin. PUT y DELETE bloquean con 403 si el target es superadmin y el caller no lo es. Todos los fetches del panel de usuarios pasan Authorization: Bearer.ultima_sync en timer: el auto-sync ahora espera al worker COT antes de actualizar la hora mostrada.adjudicacion_json coincide con el RUT proveedor configurado en Parámetros → MP Config, se muestra un badge dorado 🏆 ADJUDICADO A MÍ en la vista lista, fichas y Excel del módulo Mercado Público. El cálculo se realiza en el backend al listar, también aparece en el CSV exportado.GET /api/mp/licitaciones ahora devuelve fecha_publicacion y el nuevo campo booleano adjudicado_a_mi.fecha_adj; para el resto, sobre fecha_cierre. Permite buscar historial de adjudicaciones pasadas.adjudicado_a_mi=true, útil para ver el historial completo de adjudicaciones propias.POST /api/mp/guardar-cot). Filtros: texto, estado, monto mínimo, "solo no guardadas". Endpoints: POST /api/mp/preview-excel (parsea y devuelve JSON sin guardar, incluye flag ya_guardada) y POST /api/mp/guardar-cot (upsert individual en cot_mp_licitaciones con en_seguimiento=1)./v1/compra-agil-busqueda/buscar con parámetros desde/hasta/orderBy/size/page. Pagina automáticamente hasta 100 páginas (hasta 2000 registros), mapea los nuevos campos (idEstado, estadoConvocatoria, misOfertas, ofertasRecibidas, montoDisponible, organismo/unidad concatenados). El toast muestra cuántas se trajeron, páginas recorridas y nuevas vs actualizadas. Rango configurable: dias_atras=180, max_paginas=100.Z para que el navegador las convierta a hora local (Chile) automáticamente.page_inicio=1 fuerza desde el principio.#inp-rut), llama buscarCliente() para autocompletar datos del cliente, descuento y condición de pago desde el perfil ERP, mapea forma de pago y modo de entrega/api/publico/vendedorescot_web_leads y traspasada al formulario al crear cotizaciónGET/POST /api/config/leads, GET /api/publico/vendedores/api/cliente/{rut}: fallback sin JOINs cuando las tablas gereg/gecom/geciu no existen (ERP MySQL antiguo); columnas CLICIU/CLICOM/CLIREG toleran int o varchar/, ,, %, |): backend usa {itcod:path}, frontend _encProd() deja la barra literal y codifica el restoinp-obs); l.items con fallback JSON.parse si viene como stringinp-observaciones en lugar de inp-obs) y no se vaciaba al crear nueva cotización; además el badge de vendedor del lead tampoco se ocultaba al limpiarshowPage('nueva') antes de limpiar, garantizando que el formulario de cotización quede visible y activonavigator.geolocation) guarda lat/lng en cot_cabecera. Para el historial sin GPS, geocodifica con Nominatim (OpenStreetMap, gratis, sin API key) y cachea en cot_geocache. Mapa interactivo Leaflet: pins numerados (azul=GPS exacto / naranja=geocodificado), línea de ruta, popup con datos de cotización y lista de visitas. Admin ve cualquier vendedor; el vendedor solo la suya.gefac_enc (facturas) o gebol_enc (boletas), independientemente del estado de sus cotizaciones. Además se excluyen cotizaciones ANULADAS del conteo.lat/lng aún no existen en la BD (servidor recién instalado); la ruta funciona aunque el servidor no se haya reiniciado después de la actualización.isolation:isolate para confinar los z-indexes internos de Leaflet (markers/popups) — al abrir cualquier modal estando en la pestaña Ruta, el backdrop oscuro cubre el mapa correctamente.cliente_email al endpoint del historial (GET /api/cotizaciones) y se actualiza el onclick del botón Email tanto en la vista de detalle como en la lista del historial.guardarCotizacion() nunca reseteaba el botón "Guardar" en el path de éxito — quedaba deshabilitado si el usuario cerraba el modal sin hacer clic en "Nueva". (2) Ambos botones (web y ERP) ahora llaman a limpiarFormulario() automáticamente tras guardar con éxito, antes de mostrar el modal de acciones (el modal no depende del formulario sino de parámetros propios).gecot_enc + gecot_det (ERP) en vez de cot_cabecera. Dos secciones: Sin facturar (cotizaciones donde ningún ítem tiene CODFACT asignado) y Parcialmente facturadas (algunos ítems facturados, otros pendientes) con cantidad de ítems pendientes y monto; filtra el año en curso; si no hay parciales muestra "No hay facturas parciales pendientes".cot_mp_licitaciones. Filtros por texto/estado/monto mínimo, tab Listado / En seguimiento, tabla con código/nombre/organismo/monto/cierre/días restantes, modal de detalle con ítems y link a mercadopublico.cl, botón seguimiento por licitación. Config por empresa (token, RUT proveedor, monto mínimo, activar/desactivar). Configurado para empresa Alas.↩ 3 NC · -$245.000) con el neto real de facturas. KPI "Notas de Crédito" en rojo aparece en el encabezado cuando hay NC en el período. En la tabla comparativa, sub-fila roja por año con el detalle de NC. Endpoints devuelven ahora nc_cant, nc_neto, nc_total, v_cant_bruto como campos separados.GET /api/documentos/ventas-boletas/resumen-mensual-erp.geparam) de la base activa. Solo para administrador o superadmin; para el resto siguen siendo de solo lectura. Botón "Guardar datos del ERP" separado del de logo.window.print()./api/version/* como ruta pública (sin autenticación), impidiendo
que el token llegara al endpoint de guardado. Corregido a solo /api/version (exacto).Kognit_*, clave de BD cifrada al vuelo, accesos directos por empresa).CODFACT=1).gecot_enc.COFECDESP.crear_empresas.bat crea de una vez las carpetas de
datos de varias empresas y copia en cada una .secret.key y conexiones.json.
Luego solo se instala el servicio de cada empresa.GW_DATA_DIR
(conexiones, claves, configs y logos separados). Incluye servicio_instalar_empresa.bat y
ejemplo de Caddy para una URL por empresa. Sin cambios si se usa una sola empresa.tzdata) y reiniciar el servidor.geparam.cf_tipo_bodega: Si vale 0, el stock mostrado es
geitems_mae.ITSTOCK; si vale 1, es la suma de las bodegas (como antes). Si la
columna no existe, se mantiene la detección automática. Se aplica por base de datos.gecot_det.CODTIPO) se ajusta junto a la cabecera para no romper el ERP. Cada cambio queda
auditado (usuario, fecha/hora, IP y equipo).upload.php con el token secreto ya incluido, se sube al hosting una vez y listo. Token guardado cifrado.https://www.gamspa.cl/cotclientes/C-2026-00001.pdf, en vez de una dirección interna. Se
configura en Parámetros → Mi Empresa → FTP (campo "URL pública del PDF", por base).cotclientes por defecto). Se configura en Parámetros → Mi Empresa →
FTP (solo superadmin), por base de datos, con botones Probar conexión y Crear carpeta. Si el FTP
falla, la cotización igual se graba. Requiere reiniciar el servidor.geparam de la BD activa
(solo lectura); el logo sigue de carga manual. Los PDF y correos usan la empresa de cada BD.app_config.json).cot_estado_log. Se auditan también
autorizar/rechazar y los cambios del sistema nuevo.geitems_cod), con buscador y exportación a PDF y
Excel (hojas "Por producto" y "Por código").COTIPO.CREATE TABLE) y ahora todos los dispositivos nuevos piden
autorización (se desactivó la auto-aprobación de la red local; localhost sigue como
salida de seguridad). Configurable en app_config.json (sitio_auto_aprobar_lan).gecot_enc / gecot_det). La numeración usa
el último CONRO real con bloqueo y reintento anti-duplicado, para no chocar con el ERP en
marcha. El botón "Guardar Cotización" original sigue funcionando igual.getipos), que llenan
CODESPACHO/CORETIRA/COTRANSPORTE y COENVIO. El tipo de
documento (COTIPO) toma el valor del select "Tipo Cotización".gecot).PENDIENTE. Los administradores ven todas; los vendedores solo las suyas.gebol_enc.Bearer token en todas las APIs. Frontend inyecta token automáticamente en cada
fetch. Logout en 401.localhost por defecto; configurable con
ALLOWED_ORIGINS en .env.gecot_det.CODFACT como fuente
autoritativa (vacío/0 = pendiente; con valor = facturado). Fallback a COESTADO si no existe
la columna.COESTADO. Default = solo facturadas.nc_por_dia[].ITFA_COM_TIPO e
ITFA_COM_FIJO.POST /api/mantenedor/familias/comision-masiva.neto × % (tipo pct)
o cant × $fijo (tipo fijo). Afecta KPIs, totales, subfamilias, vendedores y detalle de
líneas. Badges muestran X.X% (verde) o $Y/u (azul).vgd-spin/vgd-contenido. Renombrados a
vgds-spin/vgds-contenido para Despachos._vgDespachoData para forzar recarga.
id="lbl-condiciones-doc".geitems_mae.ITCOSTO × cant.; ítems sin maestro se valorizan con costo 0.gecli.CLIREG → gereg y
gecli.CLICOM → gecom. Incluye KPIs (regiones/comunas activas, % sin georeferencia),
ranking top regiones y top 15 comunas, y acordeón expandible región → comunas con barra proporcional,
neto, docs, ticket promedio y % sobre región y total. Neto bruto (sin NC). Fallback automático a
geciu si gereg/gecom no existen.cot_detalle con
gecot_det + gecot_enc via UNION ALL, con nombres desde
geitems_mae. El filtro de período aplica a ambos sistemas./api/ventas-gefac/vendedores reescrito con dos
consultas separadas (códigos primero, nombres después), eliminando el JOIN problemático. El frontend
solo carga el dropdown cuando está vacío.gefac_enc.FAVEN / gebol_enc.BOLVEN → gevend. Aparece solo
cuando hay datos de vendedor.cot_usuarios.cod_vendedor para filtrar el sistema nuevo, y filtra
gecot_enc.COVEN para el sistema legado.CLISUC=1), aparece un selector 🏢 con todas sus sucursales. Al elegir una, se
rellenan automáticamente Dirección, Ciudad, Contacto, Email y Teléfonos con los datos de esa
sucursal.cot_cabecera.vendedor guarda el nombre del usuario, no el código gefac. Ahora se envían
dos parámetros separados: usuario (nombre del usuario → sistema nuevo) y
vendedor (código gefac → sistema legado). El badge muestra "Nombre (cód:
XXX)".geven fue reemplazado por consulta separada y segura contra gevend (tabla
correcta de vendedores).genc_enc), igual que el "Neto Real" del informe de ventas.codfact = 0 se marcan PENDIENTE; los ya facturados se muestran atenuados.GET /api/producto/{itcod} que estaba
ausente.cargarInformes() que causaba
SyntaxError y dejaba el login atascado en "Verificando conexión…".showPage()) y los botones no las encontraban. Movidas al scope global.mail.allen.cl:587 que usan SSL implícito en lugar de STARTTLS.SMTP_CONFIG global (desde smtp_config.json) con fallback
a configuración personal del usuario en cot_usuarios. El código anterior buscaba en
tablas de base de datos que no existen.httpx, Request) dentro
del endpoint de email que causaban "Internal Server Error". Se agregó usuario_codigo al
fetch del modal para usar SMTP personal del usuario si está configurado._generar_pdf_ventas_bytes()
retornando bytes directamente, eliminando el uso frágil de body_iterator async. El JS del
modal ahora muestra el mensaje específico del error (SMTP, autenticación, etc.) en lugar del texto
crudo.data-desde/data-hasta y escapa correctamente comillas en el código del
producto.ITMCLI ahora se reconoce como campo de RUT (no
nombre), permitiendo que el Kardex resuelva el nombre del cliente desde gecli.
ACL-1 1/2"304) ya no
generan atributos HTML rotos.ITMCLI almacena el RUT como entero, no el nombre. Corregida
la clasificación para permitir el JOIN con gecli y obtener nombre, email, teléfono y
contacto del cliente.geitems_mov (misma fuente que el contador
de vendidos), garantizando consistencia con el número mostrado en la tabla.TRIM() en todas las consultas a geitems_mov para
tolerar espacios en el código almacenado.Desc.% y
muestra el P. Neto real.1.5,
el oninput
llamaba renderItemRow
que destruía y recreaba el input con parseFloat("1.") = 1,
borrando el punto. Corregido: renderItemRow
ya no destruye los inputs dto1/dto2 si tienen el foco — solo actualiza el monto.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./api/mantenedor/inventario
ahora incluye "itfam"
en cada producto (código de familia de geitems_mae.ITFAM).
Antes solo existía "familia" con el nombre descriptivo.filter(p => p.itfam === famCod)
sobre el resultado, pero p.itfam
no existía en el response → siempre devolvía 0 productos. El API ya filtra con ITFAM IN (...),
se usa directamente data.productos.
activo: int(VENEST)
y el PUT espera activo.
Eliminado el campo venest
del frontend que era incorrecto y confundía el flujo.v.venest
(campo real de gevend.VENEST)
con fallback a v.activo.
El PUT envía ambos campos para compatibilidad.geitems_mae.ITFAM.
El botón muestra el conteo al cargar y actúa como toggle para ocultar/mostrar.activo
como parseInt
para evitar que llegue como string. La comparación de cod
ahora usa String()
en ambos lados. Se usa encodeURIComponent
en la URL del PUT.p.precio1
y p.estado
que no existen en el API. Corregido a p.precios['1']
y p.activo,
que son los nombres reales que devuelve /api/mantenedor/inventario.
JSON.stringify
en onclick. Ahora usa caché _acCache
+ data-*.
Funciona con cualquier descripción sin importar comillas o caracteres especiales.cargarValidez()
y guardarValidez()
que faltaban.limpiarFormulario()
que reinicia cliente, ítems y caché (localStorage)./api/productos
y /api/mantenedor/inventario.
Búsqueda desordenada: "CABLE BLANCO" encuentra "CABLE 2MM BLANCO".kognit.html) y backend (app.py).
Solo para vendedores que cobran distinto al valor por defecto de la familia. Los no listados usan el valor de arriba.
Marca los vendedores y define la comisión a aplicarles. Luego podrás editar cada uno.
CODIGO, Code, SKU).Item, Description).Item, Description).| Código ERP | Descripción Inglés | Descripción Español | Stock | Vta/Mes | A Pedir |
|---|---|---|---|---|---|
| Cargando datos… | |||||
| Código | Descripción inglés | Descripción español (ERP) |
|---|
Para activar la cotización se requiere clave de administrador.
Ingresa un número de cotización
Datos que usa el descargador: acceso a facturación.cl y cómo subir al hosting (FTP o PHP). Se guardan en empresas_facturacion.json en el servidor — no hace falta editar el archivo a mano.
Cargando descargas…
{
"version": "1.0.540",
"url": "https://tudominio.cl/updates/kognit_1.0.540.zip",
"sha256": "<hash sha256 del zip>",
"notas": "Que cambió",
"obligatoria": false
}
Por seguridad: la descarga se verifica con el SHA256 antes de aplicar. Solo el superadmin puede actualizar.
Tú administras y vas cambiando la empresa activa. Cada empresa trae sus datos desde su base (geparam) y su logo por base de datos.
logo_<base>).Mismo código, pero cada empresa corre en su propio puerto con su carpeta de datos (logo, conexiones, SMTP, todo separado) y su URL.
.secret.key (el mismo, para descifrar) y un conexiones.json apuntando a la base de esa empresa.instalacion\, como administrador). Puedes
pasar los datos o dejar que te pregunte el puerto:
GestionWeb_EmpresaA (puerto que elijas) con su GW_DATA_DIR. Avisa si el puerto ya está en uso.servicio_desinstalar_empresa.bat EmpresaA. Plantillas en
instalacion\Caddyfile.ejemplo y guía completa en instalacion\LEEME_MULTIEMPRESA.txt.
GW_DATA_DIR):
conexiones.json, .secret.key, smtp_config.json,
logos_bd.json / logo_*.*, app_config.json,
ftp_config.json, sii_config.json, etc. Se comparte el código
(kognit.html, íconos). Si no defines GW_DATA_DIR, funciona como siempre
(mono-empresa).
dte_plano con archivos TXT) o
LibreDTE (por API). Al emitir, Kognit usa el motor elegido y actualiza el ERP
(gefac_enc/gefac_det/geitems_mov y el stock).
https://app.graficanet.cl con candado verde,
para que funcione la cámara/foto de seguridad y la PWA desde celulares. El sistema sigue
corriendo en este equipo (puerto 8000); Caddy solo le pone el HTTPS por delante. No se toca tu correo
ni tu hosting actual.
| IP pública | Detectando… |
| IP del cliente | Detectando… |
| Puerto de Kognit | Detectando… |
| Host / Subdominio | Detectando… |
192.168.0.1) → sección DHCP → fija que este PC sea
siempre 192.168.0.160 (DHCP reservation). Si no, el Wi-Fi puede darle otra IP mañana y se rompe el reenvío.
192.168.0.160:
CNAME app.graficanet.cl → tu-ddns-actual.ddns.net
kognit-casa.duckdns.org).CNAME app.graficanet.cl → kognit-casa.duckdns.org
winget install --id CaddyServer.Caddy
caddy version.Caddyfile (sin extensión) con esto:app.graficanet.cl {
reverse_proxy http://localhost:8000
}
caddy run
app.graficanet.cl con candado verde. Para dejarlo siempre activo (servicio):caddy start
https://app.graficanet.clhttp://192.168.0.160:8000| Área | Mecanismo | Estado |
|---|---|---|
| Contraseñas de usuarios | PBKDF2-HMAC-SHA256 con sal aleatoria. Las contraseñas antiguas en texto plano se migran automáticamente al primer login exitoso. | ✅ Activo |
| Autenticación | JWT firmado con HMAC-SHA256. Sin JWT válido, ningún endpoint del API responde con datos. | ✅ Activo |
| Credenciales de BD | Cifradas con Fernet en conexiones.json. La clave de cifrado está en .secret.key separada del archivo de datos. |
✅ Activo |
| Contraseñas SMTP | Cifradas con Fernet en smtp_config.json. Nunca se almacenan en texto plano. |
✅ Activo |
| Rate limiting en login | Máximo 10 intentos por IP en 5 minutos. Al superar el límite, la IP queda bloqueada automáticamente. | ✅ Activo |
| Separación de roles | Todos los endpoints sensibles verifican el rol (vendedor / admin / superadmin) antes de responder. Los endpoints públicos solo exponen datos no sensibles. | ✅ Activo |
| Información de BD oculta | /api/db-status no expone host, usuario ni versión del servidor de base de datos. |
✅ Activo |
| Protección de datos personales | Política de privacidad con aceptación obligatoria (Ley 21.719). Portal ARCO+ para ejercer derechos. Retención configurable de logs y sesiones. | ✅ Activo |
| Auditoría de cambios | Todos los cambios de estado, tipo de documento y accesos quedan registrados en cot_estado_log y cot_actividad_log con usuario, IP, equipo y fecha. |
✅ Activo |
| Riesgo | Detalle | Impacto |
|---|---|---|
| Rate limiting en memoria | El contador de intentos fallidos se reinicia al reiniciar el servidor. Un atacante podría reiniciar el proceso para saltarlo. Mitigado por el acceso físico/red requerido para reiniciar. | BAJO |
| HTTPS depende de Caddy | El sistema confía en que el proxy Caddy maneje el cifrado SSL/TLS. Sin Caddy, la comunicación va en HTTP (solo recomendado en red local cerrada). | MEDIO |
| JWT sin revocación inmediata | Un token válido sigue funcionando hasta que expira, aunque el usuario cambie su contraseña. Los tokens duran pocas horas y las sesiones online se rastrean por latido. | BAJO |
Cargando conexiones...
Busca por número, revisa el estado actual y cámbialo. Todo cambio queda registrado (usuario, fecha/hora, IP y equipo).
Busca por número y cambia el tipo de documento (Nota de Venta, Ticket, Cotización, etc.). El detalle se ajusta automáticamente para no romper el ERP. Todo cambio queda registrado (usuario, fecha/hora, IP y equipo).
Si el servidor de correo rechaza la conexión, ¿qué debe hacer el sistema?
| Estado | Usuario | Equipo / IP | Conexión | Última actividad | Desconexión | Acción |
|---|---|---|---|---|---|---|
Cargando… | ||||||
| Fecha / Hora | Usuario | 🖥️ Equipo origen | IP origen | 🗄️ Servidor BD | Base de datos |
|---|---|---|---|---|---|
|
Cargando sesiones... |
|||||
| Código ↕ | Descripción ↕ | U.M. | Stock ↕ | Precio ↕ | Agregar |
|---|---|---|---|---|---|
|
Cargando productos... |
|||||
Ingrese al menos 2 caracteres para buscar
Cargando...
Cargando…
Cargando…
Cargando...
Nueva versión disponible
Verificando...
| Código ERP | Descripción Inglés (Proveedor) | Descripción Español (ERP) | Stock | Vta/Mes | A Pedir |
|---|
| Año | Neto | Docs | vs Ant. * |
|---|---|---|---|
| Cargando... | |||
| Fecha | Hora | Tipo | N° | Cliente | RUT | Vendedor | Neto | Total | Utilidad | Productos |
|---|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
||||||||||
| Código | Descripción | Cant. | P. Unit. | Subtotal |
|---|
Se perdió el acceso a internet, pero puedes seguir trabajando con los datos descargados en este equipo:
Consejo: antes de salir a terreno, abre la app con wifi y pulsa "⬇️ Actualizar datos" en la bandeja para tener todo al día.
Notas guardadas en este equipo. Al haber conexión se envían al ERP; cada una lleva un identificador único para no duplicarse aunque se reintente.
CODIGO, Code, SKU).Item, Description).Item, Description).| Código ERP | Descripción Inglés | Descripción Español | Stock | Vta/Mes | A Pedir |
|---|---|---|---|---|---|
| Cargando datos… | |||||
| Código | Descripción inglés | Descripción español (ERP) |
|---|