Files
rips_manager/app/templates/docs.html
T
Lizandro GuarnizoandClaude Sonnet 4.6 400e6ff60b feat(docs): sección de documentación completa en /docs
- Nueva ruta /docs con manual de usuario, arquitectura y referencia técnica
- Sidebar con navegación sticky y resaltado de sección activa
- 23 secciones: objetivo, arquitectura, todos los módulos, JSONs de referencia,
  lógica de formas de pago, exclusiones y soporte
- Link "Documentación" en el sidebar de navegación principal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-04 15:45:25 -05:00

636 lines
54 KiB
HTML

{% extends "base.html" %}
{% block title %}Documentación{% endblock %}
{% block header %}Documentación del Sistema{% endblock %}
{% block content %}
<div class="flex gap-6 max-w-full">
<!-- Sidebar de navegación -->
<aside class="w-64 flex-shrink-0">
<div class="sticky top-4 bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden">
<div class="px-4 py-3 bg-blue-700 text-white">
<p class="text-xs font-semibold uppercase tracking-wider">Contenido</p>
</div>
<nav class="p-3 space-y-0.5 text-sm max-h-[80vh] overflow-y-auto">
<p class="px-2 pt-2 pb-1 text-xs font-bold text-gray-400 uppercase tracking-wider">General</p>
<a href="#objetivo" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-bullseye w-4 mr-2 text-xs"></i>Objetivo</a>
<a href="#arquitectura" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-sitemap w-4 mr-2 text-xs"></i>Arquitectura</a>
<a href="#acceso" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-key w-4 mr-2 text-xs"></i>Acceso y credenciales</a>
<p class="px-2 pt-3 pb-1 text-xs font-bold text-gray-400 uppercase tracking-wider">Módulos</p>
<a href="#dashboard" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-chart-pie w-4 mr-2 text-xs"></i>Dashboard</a>
<a href="#configuracion" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-cog w-4 mr-2 text-xs"></i>Configuración</a>
<a href="#contratos" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-file-contract w-4 mr-2 text-xs"></i>Contratos</a>
<a href="#ventas" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-shopping-cart w-4 mr-2 text-xs"></i>Ventas CMXC</a>
<a href="#automation" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-robot w-4 mr-2 text-xs"></i>Automatización RDA</a>
<a href="#terceros" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-user-plus w-4 mr-2 text-xs"></i>Terceros</a>
<a href="#transaccion" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-exchange-alt w-4 mr-2 text-xs"></i>Transacción RDA</a>
<a href="#pacientes" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-users w-4 mr-2 text-xs"></i>Pacientes / Sync</a>
<a href="#queries" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-database w-4 mr-2 text-xs"></i>Consultas SQL</a>
<a href="#test-rda" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-vial w-4 mr-2 text-xs"></i>Prueba RDA</a>
<p class="px-2 pt-3 pb-1 text-xs font-bold text-gray-400 uppercase tracking-wider">Historial</p>
<a href="#logs" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-history w-4 mr-2 text-xs"></i>Historial envíos</a>
<a href="#resumen" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-calendar-check w-4 mr-2 text-xs"></i>Resumen diario</a>
<a href="#actividad" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-user-clock w-4 mr-2 text-xs"></i>Actividad</a>
<a href="#erp" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-flask w-4 mr-2 text-xs"></i>ERP / WhatsApp</a>
<p class="px-2 pt-3 pb-1 text-xs font-bold text-gray-400 uppercase tracking-wider">Referencia técnica</p>
<a href="#json-venta" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-code w-4 mr-2 text-xs"></i>JSON Venta</a>
<a href="#json-rda" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-code w-4 mr-2 text-xs"></i>JSON RDA</a>
<a href="#logica-pago" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-credit-card w-4 mr-2 text-xs"></i>Formas de pago</a>
<a href="#logica-contratos" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-sliders-h w-4 mr-2 text-xs"></i>Exclusiones</a>
<a href="#soporte" class="doc-link flex items-center px-2 py-1.5 rounded text-gray-600 hover:bg-blue-50 hover:text-blue-700 transition-colors"><i class="fas fa-headset w-4 mr-2 text-xs"></i>Soporte</a>
</nav>
</div>
</aside>
<!-- Contenido principal -->
<div class="flex-1 space-y-8 min-w-0">
<!-- ── OBJETIVO ── -->
<section id="objetivo" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-bullseye text-blue-500"></i> Objetivo del sistema</h2>
<hr class="border-blue-100 mb-4">
<p class="text-gray-700 leading-relaxed">
Sistema web de integración de datos clínicos para el <strong>Laboratorio Clínico Ximena Caicedo</strong>, que permite el intercambio de información de ventas y recepciones (RDA) con el sistema <strong>TNS (Tecnología de Negocios en Salud)</strong>, de manera estructurada, segura y trazable.
</p>
<p class="text-gray-700 leading-relaxed mt-3">
Centraliza la gestión de contratos, el envío de facturas de venta, la generación de RDA de pacientes, la sincronización con WhatsApp ERP y el registro completo de toda la actividad del sistema.
</p>
<div class="mt-4 grid grid-cols-3 gap-3">
<div class="bg-blue-50 rounded-lg p-3 text-center"><i class="fas fa-paper-plane text-blue-500 text-lg mb-1"></i><p class="text-xs font-semibold text-blue-700">Envío TNS</p><p class="text-xs text-gray-500">Ventas y RDA</p></div>
<div class="bg-green-50 rounded-lg p-3 text-center"><i class="fas fa-database text-green-500 text-lg mb-1"></i><p class="text-xs font-semibold text-green-700">Firebird</p><p class="text-xs text-gray-500">Base de datos clínica</p></div>
<div class="bg-purple-50 rounded-lg p-3 text-center"><i class="fas fa-shield-alt text-purple-500 text-lg mb-1"></i><p class="text-xs font-semibold text-purple-700">Trazabilidad</p><p class="text-xs text-gray-500">Log completo</p></div>
</div>
</section>
<!-- ── ARQUITECTURA ── -->
<section id="arquitectura" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-sitemap text-blue-500"></i> Arquitectura técnica</h2>
<hr class="border-blue-100 mb-4">
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<p class="text-sm font-semibold text-gray-700 mb-2">Stack tecnológico</p>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Componente</th><th class="px-3 py-2 text-left">Tecnología</th></tr></thead>
<tbody class="divide-y divide-gray-100">
<tr class="hover:bg-gray-50"><td class="px-3 py-2 font-medium">Backend</td><td class="px-3 py-2">Python 3 + FastAPI (async)</td></tr>
<tr class="bg-blue-50 hover:bg-blue-100"><td class="px-3 py-2 font-medium">Frontend</td><td class="px-3 py-2">Jinja2 + TailwindCSS + Font Awesome</td></tr>
<tr class="hover:bg-gray-50"><td class="px-3 py-2 font-medium">BD local</td><td class="px-3 py-2">SQLite 3 (WAL mode)</td></tr>
<tr class="bg-blue-50 hover:bg-blue-100"><td class="px-3 py-2 font-medium">BD clínica</td><td class="px-3 py-2">Firebird 2.5 — 192.168.0.125:3025</td></tr>
<tr class="hover:bg-gray-50"><td class="px-3 py-2 font-medium">API externa</td><td class="px-3 py-2">TNS — REST JSON + Bearer Token</td></tr>
<tr class="bg-blue-50 hover:bg-blue-100"><td class="px-3 py-2 font-medium">Servidor</td><td class="px-3 py-2">Windows — uvicorn :8080</td></tr>
<tr class="hover:bg-gray-50"><td class="px-3 py-2 font-medium">Auth</td><td class="px-3 py-2">JWT + bcrypt</td></tr>
</tbody>
</table>
</div>
<div>
<p class="text-sm font-semibold text-gray-700 mb-2">Flujo de datos</p>
<ol class="space-y-2">
{% for step in [
('1','Navegador','Usuario accede y se autentica con JWT.','blue'),
('2','Firebird','Sistema consulta recepciones/facturas.','green'),
('3','Generador','Se construye el JSON según spec TNS.','purple'),
('4','TNS API','POST con Bearer Token al endpoint.','orange'),
('5','SQLite','Respuesta guardada (success/error).','gray'),
('6','Historial','Registro disponible para reenvío.','blue'),
] %}
<li class="flex items-start gap-2">
<span class="w-5 h-5 rounded-full bg-blue-600 text-white flex items-center justify-center text-xs font-bold flex-shrink-0 mt-0.5">{{ step[0] }}</span>
<div><span class="text-xs font-semibold text-gray-700">{{ step[1] }}: </span><span class="text-xs text-gray-600">{{ step[2] }}</span></div>
</li>
{% endfor %}
</ol>
</div>
</div>
</section>
<!-- ── ACCESO ── -->
<section id="acceso" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-key text-blue-500"></i> Acceso y credenciales</h2>
<hr class="border-blue-100 mb-4">
<div class="flex items-center gap-3 mb-4 bg-blue-50 rounded-lg px-4 py-3">
<i class="fas fa-globe text-blue-500 text-lg"></i>
<div>
<p class="text-xs text-gray-500">URL del sistema (red local)</p>
<p class="font-mono font-bold text-blue-700 text-sm">http://192.168.0.125:8080</p>
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-sm font-semibold text-gray-700 mb-2">Credenciales iniciales</p>
<table class="w-full text-sm border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Campo</th><th class="px-3 py-2 text-left">Valor</th></tr></thead>
<tbody>
<tr class="border-t border-gray-100"><td class="px-3 py-2 font-medium">Usuario</td><td class="px-3 py-2 font-mono">admin</td></tr>
<tr class="bg-blue-50 border-t border-gray-100"><td class="px-3 py-2 font-medium">Contraseña</td><td class="px-3 py-2 font-mono">admin123</td></tr>
</tbody>
</table>
</div>
<div class="bg-amber-50 border border-amber-200 rounded-lg p-3">
<p class="text-sm font-semibold text-amber-700 mb-1"><i class="fas fa-exclamation-triangle mr-1"></i> Importante</p>
<p class="text-xs text-amber-700">Cambiar la contraseña al primer ingreso. Menú usuario → Cambiar contraseña.</p>
<p class="text-xs text-amber-600 mt-2">Nuevos usuarios: acceder a <span class="font-mono">/register</span> con sesión activa.</p>
</div>
</div>
</section>
<!-- ── DASHBOARD ── -->
<section id="dashboard" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-chart-pie text-blue-500"></i> Dashboard — Panel principal</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/dashboard</span> — Pantalla de inicio. Resumen en tiempo real del estado del sistema.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Total de envíos exitosos acumulados (todos los tipos).</li>
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Total de envíos con error.</li>
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Conteo de terceros registrados en TNS.</li>
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Conteo de transacciones RDA enviadas.</li>
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Número de facturas únicas procesadas.</li>
<li class="flex items-start gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Últimos 10 envíos con usuario, tipo, factura y estado.</li>
</ul>
</section>
<!-- ── CONFIGURACIÓN ── -->
<section id="configuracion" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-cog text-blue-500"></i> Configuración</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/config</span> — Parámetros de conexión y credenciales del sistema.</p>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Parámetro</th><th class="px-3 py-2 text-left">Descripción</th></tr></thead>
<tbody class="divide-y divide-gray-100">
{% for row in [
('firebird_host','IP del servidor Firebird (ej: 192.168.0.125)'),
('firebird_port','Puerto Firebird (ej: 3025)'),
('firebird_database','Ruta completa del archivo .FDB en el servidor'),
('firebird_user / password','Credenciales de acceso a Firebird (SYSDBA / masterkey)'),
('tns_empresa','NIT de la empresa en TNS'),
('tns_usuario / password','Credenciales de acceso a la API TNS'),
('api_sucursal','Código de sucursal para los endpoints TNS (ej: 81080)'),
('prefijo_tns_default','Prefijo por defecto para facturas (ej: 00)'),
('num_documento_obligado','NIT del obligado para RIPS'),
('profesional_default','Código del profesional por defecto en RDA'),
('api_timeout','Tiempo máximo de espera para llamadas TNS (segundos)'),
('whatsapp_url / api_key','URL y clave para integración con WhatsApp ERP'),
] %}
<tr class="{% if loop.index is odd %}bg-blue-50{% endif %} hover:bg-blue-100">
<td class="px-3 py-2 font-mono text-blue-800 font-medium">{{ row[0] }}</td>
<td class="px-3 py-2 text-gray-600">{{ row[1] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="mt-3 flex gap-3">
<div class="flex-1 bg-gray-50 rounded-lg p-3 text-xs"><i class="fas fa-plug text-blue-500 mr-1"></i> <strong>Probar conexión TNS</strong> — verifica credenciales y obtiene token JWT.</div>
<div class="flex-1 bg-gray-50 rounded-lg p-3 text-xs"><i class="fas fa-server text-green-500 mr-1"></i> <strong>Probar Firebird</strong> — verifica conectividad con la base de datos clínica.</div>
</div>
</section>
<!-- ── CONTRATOS ── -->
<section id="contratos" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-file-contract text-blue-500"></i> Contratos</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/contratos</span> — Gestión de convenios. Define cómo se procesa la información de cada aseguradora.</p>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden mb-4">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Campo</th><th class="px-3 py-2 text-left">Descripción</th></tr></thead>
<tbody class="divide-y divide-gray-100">
{% for row in [
('N° Contrato','Código del convenio. Referenciado por CODCONTRATO en Firebird.'),
('NIT Empresa','NIT de la aseguradora o empresa del convenio.'),
('Tipo Usuario','Código RIPS: 11=Contributivo, 12=Particular, 07=Póliza, 01=Subsidiado.'),
('Descripción','Nombre descriptivo del convenio.'),
('Excluir RDA','Si activo, las recepciones de este contrato NO se envían en RDA.'),
('Excluir Ventas','Si activo, las facturas de este contrato NO aparecen en Ventas.'),
('Sin Contrato','JSON RDA se envía con numeroContrato: null.'),
('Forma de Pago','Código CIAC / CR / MU. Vacío = determinado automáticamente.'),
] %}
<tr class="{% if loop.index is odd %}bg-blue-50{% endif %}">
<td class="px-3 py-2 font-semibold text-gray-700">{{ row[0] }}</td>
<td class="px-3 py-2 text-gray-600">{{ row[1] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="bg-indigo-50 border border-indigo-200 rounded-lg p-3">
<p class="text-xs font-semibold text-indigo-700 mb-1"><i class="fas fa-tags mr-1"></i> Códigos de Pago</p>
<p class="text-xs text-indigo-700">Sección en la misma página para agregar/eliminar códigos (CIAC, CR, MU ya vienen por defecto). El select inline de cada fila asigna la forma de pago al contrato sin recargar la página.</p>
</div>
</section>
<!-- ── VENTAS ── -->
<section id="ventas" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-shopping-cart text-blue-500"></i> Ventas — Facturación CMXC</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/ventas</span> — Consulta y envío de facturas de venta al endpoint TNS <span class="font-mono bg-gray-100 px-1 rounded">/v2/facturacion/Ventas/Crear</span>. Solo procesa facturas con <strong>PREFIJO = CMXC</strong>.</p>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Flujo de uso</p>
<ol class="space-y-1.5 text-xs text-gray-700">
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">1</span> Seleccionar rango de fechas (FECHAFACT).</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">2</span> Clic en "Cargar" → consulta Firebird y agrupa por factura.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">3</span> Tabla muestra: clave, paciente, contrato, exámenes, valor, estado.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">4</span> Botón "Enviar" individual o "Ver JSON" para inspeccionar.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">5</span> Botón "Enviar Todo" procesa todos los pendientes en lote.</li>
</ol>
</div>
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Filtros automáticos</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Solo facturas con PREFIJO = CMXC.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Excluye facturas anuladas (ANULADA = T).</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Excluye contratos marcados "Excluir Ventas".</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Fecha aplicada sobre FECHAFACT, no FECHA_RECEPCION.</li>
</ul>
<p class="text-xs font-semibold text-gray-600 mt-3 mb-1">Agrupación</p>
<p class="text-xs text-gray-600">Una factura puede tener múltiples recepciones. Se agrupan por CMXC-{NUM} y se envían como un único JSON con todos los ítems en <span class="font-mono bg-gray-100 px-0.5">detallePedido</span>.</p>
</div>
</div>
</section>
<!-- ── AUTOMATIZACIÓN RDA ── -->
<section id="automation" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-robot text-blue-500"></i> Automatización RDA</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/automation</span> — Envío masivo de recepciones RDA al endpoint <span class="font-mono bg-gray-100 px-1 rounded">/v2/rda/RdaPaciente/Insertar</span>. Procesa PREFIJO = LHXC, RCXC, SC.</p>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Flujo de uso</p>
<ol class="space-y-1.5 text-xs text-gray-700">
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">1</span> Seleccionar rango de fechas y (opcional) contrato específico.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">2</span> "Cargar" → consulta Firebird con join a PACIENTE, RELACION, EXAMEN, MEDICO.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">3</span> Tabla muestra estado de cada recepción.</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">4</span> Envío individual o masivo "Enviar Todo Pendiente".</li>
<li class="flex gap-2"><span class="w-4 h-4 rounded-full bg-blue-600 text-white flex items-center justify-center text-[10px] font-bold flex-shrink-0 mt-0.5">5</span> "Solo pendientes" omite las ya enviadas exitosamente.</li>
</ol>
</div>
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Comportamiento automático</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-user-check text-blue-400 mt-0.5"></i> Si el paciente no existe en TNS, lo registra automáticamente antes del RDA.</li>
<li class="flex gap-2"><i class="fas fa-ban text-red-400 mt-0.5"></i> Excluye recepciones con PS_NUM (muestras especiales).</li>
<li class="flex gap-2"><i class="fas fa-ban text-red-400 mt-0.5"></i> Excluye contratos marcados "Excluir RDA".</li>
<li class="flex gap-2"><i class="fas fa-unlink text-yellow-500 mt-0.5"></i> Contratos "Sin Contrato" → numeroContrato: null en JSON.</li>
<li class="flex gap-2"><i class="fas fa-id-card text-purple-400 mt-0.5"></i> Tipo de usuario (tipousuario) tomado del mapa de contratos.</li>
<li class="flex gap-2"><i class="fas fa-comment text-green-500 mt-0.5"></i> Sincroniza el paciente en WhatsApp ERP (opcional).</li>
</ul>
</div>
</div>
</section>
<!-- ── TERCEROS ── -->
<section id="terceros" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-user-plus text-blue-500"></i> Terceros</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/terceros</span> — Registro manual de pacientes en TNS via <span class="font-mono bg-gray-100 px-1 rounded">/v2/tablas/Tercero/Crear</span>.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Búsqueda de paciente en Firebird por número de documento.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Vista previa del JSON antes de enviar a TNS.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Envío individual con respuesta inmediata.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Listado de los últimos 20 terceros registrados.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Acceso a consultas SQL guardadas de tipo "terceros".</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Sincronización opcional del paciente en WhatsApp ERP.</li>
</ul>
</section>
<!-- ── TRANSACCIÓN ── -->
<section id="transaccion" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-exchange-alt text-blue-500"></i> Transacción — RDA Manual</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/transaccion</span> — Envío manual de RDA para una factura o recepción específica usando una consulta SQL guardada.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Selector de consulta SQL (tipo "transaccion") guardada.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Campos de filtro: número de factura, rango de fechas.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Vista previa del JSON RDA generado antes de enviar.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Manejo de contratos: excluidos, sin contrato, tipo de usuario.</li>
</ul>
</section>
<!-- ── PACIENTES ── -->
<section id="pacientes" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-users text-blue-500"></i> Pacientes / Sincronización</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/pacientes</span> — Sincronización masiva de pacientes con el sistema WhatsApp ERP del laboratorio.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Consulta todos los pacientes en Firebird por rango de fechas.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Sincronización masiva al WhatsApp ERP (insertar o actualizar).</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Migración de diagnósticos CIE-10 (12.000+ registros en lotes de 200).</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Vista de exámenes por cédula de paciente.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Log de cada sincronización: creados, actualizados, omitidos, errores.</li>
</ul>
</section>
<!-- ── QUERIES ── -->
<section id="queries" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-database text-blue-500"></i> Consultas SQL (Queries)</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/queries</span> — Gestión de consultas SQL reutilizables que se ejecutan contra Firebird.</p>
<div class="grid grid-cols-3 gap-3 mb-4">
<div class="border border-blue-200 rounded-lg p-3 bg-blue-50"><p class="text-xs font-bold text-blue-700 mb-1">terceros</p><p class="text-xs text-gray-600">Consultas para datos de pacientes (Tercero/Crear en TNS).</p></div>
<div class="border border-green-200 rounded-lg p-3 bg-green-50"><p class="text-xs font-bold text-green-700 mb-1">transaccion</p><p class="text-xs text-gray-600">Consultas para recepciones RDA (RdaPaciente/Insertar).</p></div>
<div class="border border-purple-200 rounded-lg p-3 bg-purple-50"><p class="text-xs font-bold text-purple-700 mb-1">ventas</p><p class="text-xs text-gray-600">Consultas históricas para facturas de venta.</p></div>
</div>
<p class="text-xs text-gray-600">Las consultas se pueden crear, editar y eliminar. Se cargan como selector en los módulos Terceros y Transacción. Soportan parámetros <span class="font-mono bg-gray-100 px-0.5">:fecha_ini</span>, <span class="font-mono bg-gray-100 px-0.5">:fecha_fin</span>, <span class="font-mono bg-gray-100 px-0.5">:num_factura</span>, <span class="font-mono bg-gray-100 px-0.5">:doc_num</span>.</p>
</section>
<!-- ── PRUEBA RDA ── -->
<section id="test-rda" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-vial text-blue-500"></i> Prueba RDA</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/test-rda</span> — Herramienta de diagnóstico para probar el envío de RDA por recepción o factura específica.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Búsqueda por IDRECEPCION o NUM_FACTURA específico.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Genera y muestra el JSON RDA completo antes de enviar.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Opción: enviar solo tercero, solo RDA, o ambos.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Muestra respuesta completa de TNS incluyendo mensajes de error detallados.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Ideal para diagnóstico de registros individuales con problemas.</li>
</ul>
</section>
<!-- ── HISTORIAL ── -->
<section id="logs" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-history text-blue-500"></i> Historial de Envíos</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/logs</span> — Registro completo de todos los envíos al sistema TNS con filtros avanzados y reenvío.</p>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Filtros disponibles</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Tipo: terceros / transaccion / ventas.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Estado: success / error / warning.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Número de factura o cédula.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Rango de fechas. Paginación 50/pág.</li>
</ul>
</div>
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Por cada registro</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-info-circle text-blue-400 mt-0.5"></i> Tipo, factura, contrato, usuario, estado.</li>
<li class="flex gap-2"><i class="fas fa-code text-blue-400 mt-0.5"></i> JSON completo enviado (formateado).</li>
<li class="flex gap-2"><i class="fas fa-server text-blue-400 mt-0.5"></i> Respuesta completa de TNS.</li>
<li class="flex gap-2"><i class="fas fa-redo text-green-500 mt-0.5"></i> Botón "Reenviar" para registros con error.</li>
</ul>
</div>
</div>
<div class="mt-3 bg-green-50 border border-green-200 rounded-lg p-3 text-xs text-green-800">
<i class="fas fa-redo mr-1"></i> <strong>Reenvío:</strong> obtiene el JSON guardado, hace nueva autenticación TNS y reenvía al endpoint correcto según el tipo. El registro se actualiza con el nuevo resultado.
</div>
</section>
<!-- ── RESUMEN ── -->
<section id="resumen" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-calendar-check text-blue-500"></i> Resumen Diario</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/logs/resumen</span> — Vista consolidada de todos los envíos de un día, agrupados por factura/paciente.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Total del día, exitosos y con error.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Estado final por registro (éxito si algún intento fue exitoso).</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Número de intentos y hora del primer/último envío.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Filtro por tipo de envío.</li>
</ul>
</section>
<!-- ── ACTIVIDAD ── -->
<section id="actividad" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-user-clock text-blue-500"></i> Registro de Actividad</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/logs/actividad</span> — Log de auditoría de todas las acciones de los usuarios del sistema.</p>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Acciones registradas</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Creación, edición y eliminación de contratos.</li>
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Cambios en configuración del sistema.</li>
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Envíos individuales y masivos (terceros, RDA, ventas).</li>
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Reenvíos desde historial.</li>
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Cambios de forma de pago en contratos.</li>
<li class="flex gap-2"><i class="fas fa-dot-circle text-gray-400 mt-1"></i> Sincronizaciones con WhatsApp ERP.</li>
</ul>
</div>
<div>
<p class="text-xs font-semibold text-gray-600 mb-2">Filtros</p>
<ul class="space-y-1 text-xs text-gray-700">
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Por usuario.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Por tipo de acción.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Por rango de fechas.</li>
<li class="flex gap-2"><i class="fas fa-filter text-blue-400 mt-0.5"></i> Paginación 50/pág.</li>
</ul>
</div>
</div>
</section>
<!-- ── ERP ── -->
<section id="erp" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-flask text-blue-500"></i> ERP Lab / WhatsApp</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-3"><span class="font-mono bg-gray-100 px-1 rounded">/envios/erp</span> — Integración con el sistema WhatsApp ERP del laboratorio.</p>
<ul class="space-y-1 text-sm text-gray-700">
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Sincronización de pacientes recientes (ventana configurable de minutos).</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Migración masiva de diagnósticos CIE-10 (12.000+) en lotes de 200.</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Indicador de estado de configuración (URL y API Key).</li>
<li class="flex gap-2"><i class="fas fa-check-circle text-green-500 mt-0.5 text-xs"></i> Log por sincronización: total, creados, actualizados, omitidos, errores.</li>
</ul>
<p class="text-sm text-gray-600 mt-3"><span class="font-mono bg-gray-100 px-1 rounded">/envios/tns</span> — Vista de envíos recientes al sistema TNS con estado consolidado.</p>
</section>
<!-- ── JSON VENTA ── -->
<section id="json-venta" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-code text-blue-500"></i> Referencia JSON — Factura de Venta</h2>
<hr class="border-blue-100 mb-4">
<p class="text-xs text-gray-500 mb-3 font-mono">POST {TNS_BASE}/v2/facturacion/Ventas/Crear?codigosucursal={api_sucursal}</p>
<pre class="bg-gray-900 text-green-300 rounded-lg p-4 text-xs overflow-x-auto leading-relaxed">{
"codigoPrefijo": "CMXC",
"numero": "00309",
"numeroFactura": "00309",
"sucursal": "00",
"fecha": "15/07/2026",
"kardexId": 0,
"codigoPedido": "",
"nombreCliente": "",
"codTercero": "900123456-7", <span class="text-yellow-300">// NIT con dígito de verificación</span>
"codVendedor": "00",
"codDespachar": "00",
"codFormaPago": "CR", <span class="text-yellow-300">// CIAC | CR | MU</span>
"codBanco": "", <span class="text-yellow-300">// siempre vacío</span>
"fechaVence": "14/08/2026", <span class="text-yellow-300">// FECHAFACT + DIASVENC días</span>
"fechaEntrega": "15/07/2026",
"plazoDias": 30, <span class="text-yellow-300">// 0 si CIAC, DIASVENC si CR/MU</span>
"observacion": "",
"sucursal": "00",
"codigoCentroCosto": "00",
"codigoArea": "00",
"terminal": "00",
"detallePedido": [
{
"codMat": "90600", <span class="text-yellow-300">// CUPS del examen</span>
"codBodega": "00",
"cantidad": 1,
"tipoUnidad": "M",
"descuento": 0,
"descuentoValor": 0,
"centrosCostos": "00",
"porcIva": 0,
"valor": 7000,
"impConsumo": 0,
"observacion": "",
"lote": "",
"fechaVenceLote": "",
"nroDocumento": "",
"itemsSerial": [],
"tipoSerial": ""
}
],
"detalleFormaPago": [],
"asentar": 0,
"detalleDescuentos": []
}</pre>
</section>
<!-- ── JSON RDA ── -->
<section id="json-rda" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-code text-blue-500"></i> Referencia JSON — RDA Paciente</h2>
<hr class="border-blue-100 mb-4">
<p class="text-xs text-gray-500 mb-3 font-mono">POST {TNS_BASE}/v2/rda/RdaPaciente/Insertar?codigosucursal={api_sucursal}</p>
<pre class="bg-gray-900 text-green-300 rounded-lg p-4 text-xs overflow-x-auto leading-relaxed">{
"codigoPrefijo": "LHXC",
"numero": "05103",
"fecha": "15/07/2026",
"codTercero": "1090512345", <span class="text-yellow-300">// código paciente en Firebird</span>
"codVendedor": "00",
"codigoCentroCosto": "00",
"tipoIngreso": "1",
"fechaHoraIngreso": "15/07/2026 08:30:00",
"fechaHoraEgreso": "15/07/2026 08:35:00",
"modalidadAtencion": "01",
"numeroContrato": "040", <span class="text-yellow-300">// null si sin_contrato=1</span>
"descuento": 0,
"diagnosticoprincipal": "Z017",
"discapacidad": "08",
"tipousuario": "11", <span class="text-yellow-300">// del mapa de contratos</span>
"viaIngreso": "01",
"esTerapia": false,
"esProcedimiento": false,
"numeroAutorizacion": null,
"detallePedido": [
{
"codigoMaterial": "90600", <span class="text-yellow-300">// CUPS del examen</span>
"codigoBodega": "00",
"cantidad": 1,
"observacion": "",
"profesional": "12345678",
"especialidad": "01",
"profesionalRemisionante": "00",
"diagnosticoprincipal": "Z017",
"fechaHoraRealizacion": "15/07/2026 08:30:00"
}
]
}</pre>
</section>
<!-- ── LÓGICA FORMAS DE PAGO ── -->
<section id="logica-pago" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-credit-card text-blue-500"></i> Lógica de negocio — Formas de Pago</h2>
<hr class="border-blue-100 mb-4">
<p class="text-sm text-gray-600 mb-4">El sistema determina <code class="bg-gray-100 px-1 rounded text-xs">codFormaPago</code> con la siguiente prioridad:</p>
<div class="bg-blue-50 rounded-lg p-3 mb-4 text-sm">
<strong class="text-blue-800">Prioridad 1:</strong> Si el contrato tiene "Forma de Pago" asignada → se usa esa, ignorando el total.<br>
<strong class="text-blue-800">Prioridad 2:</strong> Si no tiene asignación → automático: <code class="bg-white px-1 rounded text-xs">CIAC</code> si total=$0, <code class="bg-white px-1 rounded text-xs">CR</code> si total&gt;$0.
</div>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Código</th><th class="px-3 py-2 text-left">Nombre</th><th class="px-3 py-2 text-left">plazoDias</th><th class="px-3 py-2 text-left">fechaVence</th></tr></thead>
<tbody class="divide-y divide-gray-100">
<tr class="bg-blue-50"><td class="px-3 py-2 font-bold text-blue-700 font-mono">CIAC</td><td class="px-3 py-2">Contado inmediato</td><td class="px-3 py-2 font-mono">0</td><td class="px-3 py-2">= fecha de la factura</td></tr>
<tr><td class="px-3 py-2 font-bold text-blue-700 font-mono">CR</td><td class="px-3 py-2">Crédito</td><td class="px-3 py-2 font-mono">DIASVENC (30)</td><td class="px-3 py-2">FECHAFACT + 30 días</td></tr>
<tr class="bg-blue-50"><td class="px-3 py-2 font-bold text-blue-700 font-mono">MU</td><td class="px-3 py-2">Mixto</td><td class="px-3 py-2 font-mono">DIASVENC (30)</td><td class="px-3 py-2">FECHAFACT + 30 días</td></tr>
</tbody>
</table>
<p class="text-xs text-gray-500 mt-2"><code class="bg-gray-100 px-1 rounded">codBanco</code> siempre se envía como cadena vacía <code class="bg-gray-100 px-1 rounded">""</code>. DIASVENC se lee de <code class="bg-gray-100 px-1 rounded">FACTURA_DIAN.DIASVENC</code> en Firebird.</p>
</section>
<!-- ── LÓGICA EXCLUSIONES ── -->
<section id="logica-contratos" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-sliders-h text-blue-500"></i> Lógica de negocio — Exclusiones y Prefijos</h2>
<hr class="border-blue-100 mb-4">
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-sm font-semibold text-gray-700 mb-2">Banderas de contrato</p>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Bandera</th><th class="px-3 py-2 text-left">Efecto</th></tr></thead>
<tbody class="divide-y divide-gray-100">
<tr class="bg-blue-50"><td class="px-3 py-2 font-mono">excluir_rda=1</td><td class="px-3 py-2">NO aparece en RDA / Automatización.</td></tr>
<tr><td class="px-3 py-2 font-mono">excluir_ventas=1</td><td class="px-3 py-2">NO aparece en Ventas.</td></tr>
<tr class="bg-blue-50"><td class="px-3 py-2 font-mono">sin_contrato=1</td><td class="px-3 py-2">JSON RDA con numeroContrato: null.</td></tr>
<tr><td class="px-3 py-2 font-mono">cod_forma_pago</td><td class="px-3 py-2">Override de forma de pago en venta.</td></tr>
</tbody>
</table>
</div>
<div>
<p class="text-sm font-semibold text-gray-700 mb-2">Prefijos de factura</p>
<table class="w-full text-xs border border-gray-200 rounded-lg overflow-hidden">
<thead class="bg-blue-700 text-white"><tr><th class="px-3 py-2 text-left">Prefijo</th><th class="px-3 py-2 text-left">Módulo</th></tr></thead>
<tbody class="divide-y divide-gray-100">
<tr class="bg-blue-50"><td class="px-3 py-2 font-bold font-mono text-blue-700">CMXC</td><td class="px-3 py-2">Ventas — remisiones externas.</td></tr>
<tr><td class="px-3 py-2 font-bold font-mono text-green-700">LHXC</td><td class="px-3 py-2">Automatización RDA.</td></tr>
<tr class="bg-blue-50"><td class="px-3 py-2 font-bold font-mono text-green-700">RCXC</td><td class="px-3 py-2">Automatización RDA.</td></tr>
<tr><td class="px-3 py-2 font-bold font-mono text-green-700">SC</td><td class="px-3 py-2">Automatización RDA.</td></tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ── SOPORTE ── -->
<section id="soporte" class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h2 class="text-xl font-bold text-blue-800 mb-1 flex items-center gap-2"><i class="fas fa-headset text-blue-500"></i> Soporte técnico</h2>
<hr class="border-blue-100 mb-4">
<div class="grid grid-cols-2 gap-4 mb-4">
<div class="bg-blue-50 rounded-lg p-4">
<p class="text-sm font-bold text-blue-800 mb-2">U-SITE S.A.S. BIC</p>
<p class="text-xs text-gray-600 mb-1"><i class="fas fa-envelope mr-1 text-blue-400"></i> contacto@u-s.app</p>
<p class="text-xs text-gray-600 mb-1"><i class="fas fa-globe mr-1 text-blue-400"></i> https://u-s.app</p>
<p class="text-xs text-gray-600"><i class="fas fa-clock mr-1 text-blue-400"></i> Lunes a viernes — días hábiles</p>
</div>
<div class="bg-amber-50 border border-amber-200 rounded-lg p-4">
<p class="text-sm font-bold text-amber-800 mb-2"><i class="fas fa-search mr-1"></i> Antes de contactar soporte</p>
<ul class="space-y-1 text-xs text-amber-800">
<li>• Verificar red entre servidor y 192.168.0.125 (Firebird).</li>
<li>• Confirmar que uvicorn está corriendo en el puerto 8080.</li>
<li>• Probar credenciales TNS en <span class="font-mono">/config</span>.</li>
<li>• Revisar error específico en <span class="font-mono">/logs</span>.</li>
<li>• Consultar <span class="font-mono">/logs/actividad</span> para rastrear la operación.</li>
</ul>
</div>
</div>
<div class="bg-gray-50 rounded-lg p-3 text-xs text-gray-600 text-center border border-gray-200">
<strong>RIPS Manager v1.0</strong> — Desarrollado por U-SITE S.A.S. BIC para Laboratorio Clínico Ximena Caicedo
</div>
</section>
</div><!-- /contenido -->
</div>
<script>
// Resaltar sección activa en sidebar al hacer scroll
const sections = document.querySelectorAll('section[id]');
const navLinks = document.querySelectorAll('.doc-link');
window.addEventListener('scroll', () => {
let current = '';
sections.forEach(s => {
if (window.scrollY >= s.offsetTop - 120) current = s.id;
});
navLinks.forEach(a => {
a.classList.remove('bg-blue-100', 'text-blue-800', 'font-semibold');
if (a.getAttribute('href') === '#' + current) {
a.classList.add('bg-blue-100', 'text-blue-800', 'font-semibold');
}
});
});
// Smooth scroll
navLinks.forEach(a => {
a.addEventListener('click', e => {
e.preventDefault();
const target = document.querySelector(a.getAttribute('href'));
if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
});
});
</script>
{% endblock %}