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.
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 | Veces | Unidades | Monto |
|---|---|---|---|
|
Cargando... |
|||
| Cliente | Total | Fact. | Monto |
|---|---|---|---|
|
Cargando... |
|||
| Cliente | Cot. | Monto | Última |
|---|---|---|---|
|
Cargando... |
|||
| Vendedor | Cot. | Fact. | % Fact. | Monto facturado | Monto 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 |
||||||||
| 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 productos...
Cargando...
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).
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.
Configura el texto de la política de privacidad y uso de datos de conexión que los usuarios deberán aceptar.
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).
| 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 | Estado | Creado | Acciones | ||
|---|---|---|---|---|---|---|---|---|---|
|
Cargando... |
|||||||||
/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.
Para activar la cotización se requiere clave de administrador.
Ingresa un número de cotización
{
"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 | 190.22.158.228 (pública real, sí permite abrir puertos) |
| IP local del PC | 192.168.0.160 (Wi-Fi) |
| Router | 192.168.0.1 |
| Puerto de Kognit | 8000 (interno, NO se abre a internet) |
| Subdominio objetivo | app.graficanet.cl |
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:8000Cargando conexiones...
| 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...
| 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.