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>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
cfba7a657f
commit
400e6ff60b
@@ -0,0 +1,11 @@
|
||||
from fastapi import APIRouter, Request, Depends
|
||||
from app.auth import get_current_user
|
||||
|
||||
router = APIRouter(prefix="/docs", tags=["docs"])
|
||||
|
||||
|
||||
@router.get("")
|
||||
async def docs_page(request: Request, user: dict = Depends(get_current_user)):
|
||||
return request.app.state.templates.TemplateResponse("docs.html", {
|
||||
"request": request, "user": user,
|
||||
})
|
||||
@@ -93,6 +93,10 @@
|
||||
<a href="/logs/actividad" class="flex items-center px-3 py-2.5 rounded-lg text-sm font-medium {% if cur == '/logs/actividad' %}bg-blue-600 text-white{% else %}text-gray-300 hover:bg-gray-700{% endif %}">
|
||||
<i class="fas fa-user-clock w-5 mr-2"></i> Actividad
|
||||
</a>
|
||||
<hr class="my-3 border-gray-700">
|
||||
<a href="/docs" class="flex items-center px-3 py-2.5 rounded-lg text-sm font-medium {% if cur == '/docs' %}bg-blue-600 text-white{% else %}text-gray-300 hover:bg-gray-700{% endif %}">
|
||||
<i class="fas fa-book w-5 mr-2"></i> Documentación
|
||||
</a>
|
||||
<a href="/auth/logout" class="flex items-center px-3 py-2.5 rounded-lg text-sm font-medium text-gray-300 hover:bg-gray-700">
|
||||
<i class="fas fa-sign-out-alt w-5 mr-2"></i> Salir
|
||||
</a>
|
||||
|
||||
@@ -0,0 +1,635 @@
|
||||
{% 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>$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 %}
|
||||
@@ -135,7 +135,7 @@ async def root():
|
||||
return RedirectResponse(url="/dashboard")
|
||||
|
||||
|
||||
from app.routes import auth, dashboard, config, queries, terceros, transaccion, logs, automation, test_rda, debug_fb, pacientes, contratos, ventas, envios
|
||||
from app.routes import auth, dashboard, config, queries, terceros, transaccion, logs, automation, test_rda, debug_fb, pacientes, contratos, ventas, envios, docs
|
||||
|
||||
app.include_router(auth.router)
|
||||
app.include_router(dashboard.router)
|
||||
@@ -151,6 +151,7 @@ app.include_router(debug_fb.router)
|
||||
app.include_router(pacientes.router)
|
||||
app.include_router(contratos.router)
|
||||
app.include_router(ventas.router)
|
||||
app.include_router(docs.router)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user