Commit Graph
100 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 f103d536c7 feat: excluir_ventas independiente por contrato
- Nueva columna excluir_ventas en tabla contratos (migración automática)
- load_excluded_ventas_set() para filtrar en /ventas
- Toggle independiente en /contratos para RDA y Ventas por separado
- Modal edición con checkbox excluir_ventas
- 040 marcado excluir_rda=1, excluir_ventas=0 en seed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 11:56:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 af71968c7f fix: TRIM en CODCONTRATO de queries ventas 040
Firebird rellena campos CHAR con espacios, causando que '040' != '040   '.
TRIM(e.CODCONTRATO) = '040' soluciona el filtro.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 11:37:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6fdca61636 fix: ampliar CHECK constraint para soportar tipo ventas
Las tablas queries y envios tenían CHECK constraints que solo permitían
terceros/transaccion. Se agrega ventas al constraint vía migración automática
en _migrate para bases de datos existentes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 11:31:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6b84ecfd90 feat: módulo de facturas venta (Ventas/Crear) para contrato 040
- generar_factura_venta en json_generator.py con mapeo completo del JSON
- Queries default tipo 'ventas' (por fecha y por número) filtradas a contrato 040
- Ruta /ventas con preview, send-one y send masivo
- Template ventas.html con tabla, resumen y modal JSON
- Link en navegación lateral

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 11:16:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6fb18a7af6 revert: especialidad siempre usa el default de config
Revertir el uso de COD_ESPECIALIDAD desde la BD; la especialidad
siempre debe venir del valor configurado (especialidad_default).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 10:23:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3e85e0a3f6 fix: corregir claves de config en preview_automation
preview_automation usaba _defecto en vez de _default, causando que
profesional y especialidad salieran null en la vista previa del automation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 10:20:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3313337672 fix: usar COD_ESPECIALIDAD de la BD en detallePedido
La especialidad ahora toma el valor del campo COD_ESPECIALIDAD de la tabla
MEDICO (ya presente en todos los SELECTs), con fallback al default de config.
El profesional sigue viniendo de configuración en todos los flujos.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 10:19:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 daa50a70cf Add pre-servicios support in /transaccion + letter search fix
- Add 'RDA Pre-servicios por fecha' and 'RDA Pre-servicios por número'
  default queries joining PRESSERV_DIAN (ID_PS, PS_PREFIJO, PS_NUMERO)
- Refactor _query_rows: only pass params the query actually uses;
  prefix filter works for both PREFIJO and PS_PREFIJO columns
- Add _is_preserv(), _agrupar(), _build_rda() helpers that detect
  pre-servicio rows and produce correct prefijo/numero overrides
- All 4 send endpoints (preview, send-one, send, send-direct) now
  group by ID_PS for pre-servicio queries and pass correct RDA fields
- RCXC prefix still maps to '00' in the RDA codigoPrefijo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 10:14:13 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 987959a975 Double json_enviado storage limit from 5000 to 10000 chars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 10:03:32 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 cb3b327938 Add reenviar button in /logs for failed envios
POST /logs/reenviar/{id} re-sends stored JSON to TNS and updates
status to 'success' in-place if it succeeds. Button appears only
on error rows with saved JSON; updates row color and badge without reload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 09:24:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3d848fbf2d Propagate sin_contrato_set to transaccion and test-rda routes
All generar_rda_paciente calls in transaccion.py (4) and test_rda.py (2)
now pass sin_contrato_set so contract 040 sends numeroContrato: null
consistently across all send paths.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 09:22:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c18da17317 Fix pre-servicios preview: clear store once, clean row HTML structure
- Move _rdaJsonStore={} reset to before both sections so ps-json-* keys
  are not wiped when pacientes section renders
- Replace divide-y wrapper divs with explicit border-b on each row,
  eliminating duplicate/misplaced dividers in the pre-servicios list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 09:18:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c4c6a2cd35 Send codigoPrefijo as '00' for RCXC pre-servicios
RCXC is an internal Firebird prefix not recognized by TNS; map it to '00'
in the RDA JSON. SC prefix remains unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 09:13:35 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2a7553267b Fix tipoDocumento PE/PT: map to single char 'E' for TNS API compatibility
TNS API (C#) expects System.Char for tipoDocumento; "PE" and "PT" caused
400 validation errors. Mapped both to "E" (Cédula Extranjería).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-11 08:31:33 -05:00
Lizandro Guarnizo 2794e9f9dd fix: verificar rows_ps en condicion de datos vacios para no saltar paso 3 2026-07-10 21:39:11 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 316205466f fix: tipo 'preserv' invalido en CHECK constraint de envios
- Paso 3 usaba tipo='preserv' que no esta en CHECK(tipo IN ('terceros','transaccion'))
- Cambia a 'transaccion' (factura RCXC-XXXXX distingue el registro)
- _guardar_envio con try/except para que error de DB no detenga el loop de envios

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 21:37:42 -05:00
Lizandro Guarnizo a47e0a843a fix: mismo patron store+textContent para JSON de pre-servicios 2026-07-10 21:35:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e6860a6957 fix: JSON preview recepciones via store (evita innerHTML injection)
feat: paso 1 registra terceros EPS de pre-servicios junto a particulares

- _rdaJsonStore guarda JSON por key, toggleRdaJson usa textContent
- escHtml() para caracteres especiales en diagnostico
- _SQL_PACIENTES_EPS obtiene pacientes de PRESSERV_DIAN
- rows_pac_todos fusiona particulares + EPS deduplicando por CODIGO

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 21:33:00 -05:00
Lizandro Guarnizo ef02303dde feat: mostrar JSON de recepciones paso 2 en preview (expandible) 2026-07-10 21:25:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9f2bd5164e feat: opcion 'sin contrato' para enviar numeroContrato null en TNS
- Agrega columna sin_contrato en tabla contratos (migration automatica)
- Contrato 040 marcado excluir=0, sin_contrato=1 en seed
- load_sin_contrato_set() retorna contratos que deben ir con null
- generar_rda_paciente acepta sin_contrato_set y fuerza numeroContrato=null
- Automation paso 2 y 3 pasan sin_contrato_set al generador
- Pagina contratos: columna y toggle "Sin contrato", checkbox en modal editar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 21:22:09 -05:00
Lizandro Guarnizo eeabb6268e debug: mostrar CODCONTRATO y si esta excluido en debug-cmxc 2026-07-10 21:12:05 -05:00
Lizandro Guarnizo 8d9d2ae89c debug: mostrar envios recientes y total en debug-cmxc 2026-07-10 21:08:13 -05:00
Lizandro Guarnizo 34b112919c debug: ampliar debug-cmxc para mostrar envios del dia 2026-07-10 21:04:55 -05:00
Lizandro Guarnizo fd2a107353 fix: parametros named en query debug-cmxc 2026-07-10 21:02:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3aa07543db debug: endpoint temporal /automation/debug-cmxc para diagnosticar recepciones CMXC
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 20:51:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 648a0a1910 feat: preview muestra lista de pre-servicios con JSON expandible
- Agrega preservicios_preview al endpoint /preview con el JSON generado por cada RCXC/SC
- Muestra sección naranja debajo de pacientes con factura, fecha, paciente y exámenes
- Clic en cada fila despliega el JSON completo que se enviará a TNS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 20:47:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c2a092c0e7 feat: paso 3 pre-servicios RCXC/SC y limpieza de código copago
- Agrega paso 3 en automatización: envía RDA desde PRESSERV_DIAN (prefijos RCXC/SC) para pacientes EPS con PS_NUM IS NOT NULL
- Filtra paso 2 con PS_NUM IS NULL para separar particulares/empresas de EPS
- Elimina parámetro copago y función _calcular_descuento_pct (código muerto)
- Limpia referencia a d.copago en automation.html (UI paso 3)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 20:43:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c20e1a7476 feat: log de actividad por usuario
- Tabla activity_log en SQLite (migración automática)
- Registra: login, login_fallido, rda_enviado, rda_masivo, rda_directo,
  automation_run, contrato_creado, contrato_editado, contrato_toggle
- Endpoint GET /logs/actividad con filtros por usuario, acción y fecha
- UI /logs/actividad con badges de color por tipo de acción
- Enlace "Actividad" en navegación lateral

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 17:11:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8e29e2d04f fix: tipoIngreso siempre "1" (ambulatorio) en todos los flujos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 16:52:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d9a414396f feat: campo descuento en RDA calculado desde VALORDESC/VALORTOTAL
descuento = round(VALORDESC * 100 / VALORTOTAL, 2), 0 si sin descuento

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 16:52:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 eb9c57b324 feat: botón re-enviar en registros ya enviados en /transaccion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 16:12:43 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c5f84aa900 feat: numero de factura con ceros a la izquierda hasta 5 dígitos (zfill 5)
Ejemplo: 355 → 00355, 3726 → 03726
Aplica a todos los flujos: transacción, automation, send-direct, test-rda.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 16:08:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f760d453aa fix: contratos 013 y 014 no estaban en la lista de excluidos del usuario
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:57:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 02d251685e feat: mostrar contrato en vista previa de recepciones en automation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:52:47 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7ec9af84c5 fix: omitir pacientes sin RDAs válidas en preview automation
Pacientes cuyos contratos son todos excluidos quedan fuera del listado.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:50:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c9715e6a7e feat: filtrar contratos excluidos en /test-rda
- candidatos: omite contratos con excluir=1 del listado
- preview: retorna flag excluido y pasa contrato_map (fix bug)
- enviar: bloquea si contrato excluido, pasa contrato_map al generar RDA

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:48:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 200a3f550b feat: excluir contratos del envío TNS
- Columna excluir en tabla contratos (migración automática)
- 25 contratos nuevos sembrados con excluir=1 (laboratorios externos, clínicas, médicos particulares)
- load_excluded_set() en contratos.py para consultar el set en runtime
- preview: marca items excluidos y los reporta en el conteo
- send/send-one/send-direct: bloquea envío si contrato está excluido
- automation preview+run: filtra excluidos antes del loop, reporta count
- UI /contratos: columna Envío TNS con toggle Activo/Excluido, fila en rojo si excluida

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-10 15:44:26 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3baa6e5f75 feat(transaccion): envío RDA directo por prefijo + número de factura
Nuevo endpoint POST /transaccion/send-direct y panel "Enviar RDA directo"
en la UI: ingresa Tipo (prefijo) y Número, busca en Firebird y envía a TNS
sin necesidad de rango de fechas ni pasar por el flujo de preview.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 15:10:41 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d3a6ab7ab6 fix(tipousuario): contrato 012 no debe ser tratado como particular
El check `"012".lstrip("0") == "12"` causaba false positive marcando
contratos EPS como particulares. Ahora la heurística solo aplica si el
contrato no está en la tabla contratos; si está, el tipo_usuario del mapa
tiene precedencia y también controla es_particular.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 15:06:38 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0f3a760de4 feat(contratos): tabla de contratos con tipo_usuario por contrato
Agrega tabla `contratos` en SQLite sembrada con los 17 contratos del
laboratorio. `generar_rda_paciente` consulta el mapa contrato→tipoUsuario
como primera prioridad antes de derivar de TIPOUSU/TIPOUSUSISPRO.
Incluye CRUD en /contratos con UI en sidebar.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 15:00:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 7d2a9df447 feat: GET /pacientes/examenes — exams registered in last 5 min for a cedula
Queries Firebird RECEPCION+RELACION+EXAMEN for today's date,
filters by HORAINICIORECEPCION >= now-5min in Python, returns
list of {recepcion_id, hora, cod_examen, nombre, cups, precio}.
Auth via X-Lab-Key header (whatsapp_api_key config value).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 14:06:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e2a9e7c4d3 fix(whatsapp_sync): enviar origen='lab' en lugar de 'rips'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 11:35:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b0175a2ca5 feat(sync-log): historial de sincronizaciones WhatsApp en sync_wa_log
- Nueva tabla sync_wa_log (total, created, skipped, updated, errores, origen, modo)
- Log guardado en /pacientes/sync-all, /terceros/send y /automation/run
- Ruta GET /pacientes/historial devuelve últimos 100 registros
- UI: tabla de historial con origen, modo, conteos y detalle de errores

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 11:13:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1aab14f705 feat(pacientes): modo insertar en sync-all — solo crea nuevos, omite existentes
sync_todos() ahora acepta modo='insertar'|'upsert'. La ruta /pacientes/sync-all
usa insertar: skippea cédulas que ya están en lab_pacientes. Los hooks
automáticos (terceros/automation) siguen en upsert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 11:06:14 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e7c6bc794a feat(pacientes): sync de pacientes Firebird → WhatsApp Lab
- Nuevo servicio whatsapp_sync.py: mapeo de campos RIPS→lab_pacientes
  y cliente HTTP para /api/lab/ingest_paciente.php
- Nueva ruta /pacientes con sync masiva por rango de fechas o todos
- Hook en /terceros/send y /automation/run: sync silencioso a WhatsApp
  después de cada envío a TNS
- Config: campos whatsapp_url y whatsapp_api_key + botón probar conexión

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 10:49:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b4288ac899 fix: remove undefined facturas_usadas_sesion causing double RDA submission on test-rda
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 12:00:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 a94e2cce9f feat: omit fechaAutorizacion and vigenciaAutorizacion when numeroAutorizacion is null
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 10:23:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b88d727623 feat: add 5 minutes to fechaHoraEgreso in RDA
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 19:44:06 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 235e20e38d feat: remove unused fields from RDA JSON output
Remove codFormaPago, codBanco, descuento from header.
Remove tipoUnidad, descuento, porcentajeIva, impConsumo from detallePedido.
Remove detalleFormaPago entirely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 21:59:02 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 3aa0e09aa6 chore: bump version marker in json_generator
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 09:31:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b3b283a7d0 fix: syntaxHighlight regex adding spaces inside time values
The number regex /:(\s*)(\d+)/ was matching colons inside time strings
like "14:51:26" turning them into "14: 51: 26". Changed to require the
space that JSON.stringify always adds after key-value colons (": \d+")
so colons inside string values are not affected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 17:41:37 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 07038ac431 fix: clean time spaces in logs view without modifying stored data
Applies _clean_times when serving json_enviado in /logs/detalle
so old records with "12: 47: 37" display correctly as "12:47:37".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 17:36:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 72973973d4 feat: calculate real discount % from TARIFA vs RELACION.PRECIO
Joins TARIFA using EMPRESA.TARIFA to get the base price per exam,
then calculates descuento = round((sum(TARIFA) - sum(PRECIO)) / sum(TARIFA) * 100)
and sends it as integer percentage in the RDA header encabezado.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 17:26:49 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 15f6ca65db feat: add descuento from RECEPCION.VALORDESC to RDA header
Pulls r.VALORDESC in all SQL queries (automation, test_rda, queries
defaults) and maps it to the top-level descuento field in the
RdaPaciente JSON encabezado.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 17:13:46 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f35a39bc9b fix: add EXAMEN join to QUERY_DEFAULTS so CUPs codes survive restarts
ensure_defaults() runs on every startup and was overwriting the db
queries with the old versions from QUERY_DEFAULTS — wiping any manual
fixes. Now the source-of-truth in code has the EXAMEN join and CUPS
column, so transaccion page always shows CUPs after any restart.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 14:38:30 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e32214fef7 tmp: add fix_queries.py to update transaccion SQL with EXAMEN join
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 13:11:25 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 eba512720f fix: remove duplicate EXAMEN JOIN in saved transaccion queries
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 13:03:48 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b12e8fcf88 feat: use EXAMEN.NUM_ISS as codigoMaterial (CUPs) via LEFT JOIN EXAMEN
CH4=902210, PO=907106, GRAM=901107, etc. Falls back to COD_EXAMEN if empty.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:53:16 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b22b47a1e1 debug: search 903967 across all candidate tables
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:34:50 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 fb81ddf263 debug: search PROTOCOLO table and all CUP fields system-wide
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:32:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 942d68b75d debug: catch all exceptions and return traceback as JSON
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:31:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bc5fc36a5d debug: explore RELACION_HIMS table for CUPS_REF field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:30:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 68aa5e0355 feat: join ITEM on COD_PROTOCOLO to get CUPS_DETALLE as codigoMaterial
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:29:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d95e2b67ff debug: probe possible ITEM join fields, show first row without join
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:27:44 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 41ee88c1b4 fix: remove rel.DESCUENTO (column does not exist in RELACION table)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:26:09 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 b4748e34d8 debug: minimal endpoint - only ITEM columns and sample row
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:25:20 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d1c1d3205f revert: remove broken ITEM join until correct field name is known
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:24:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e6d0b74992 debug: show ITEM columns and first row to find join key
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:22:35 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ff08c1b3a8 feat: use ITEM.CUPS_DETALLE as codigoMaterial in RDA
LEFT JOIN ITEM on COD_EXAMEN to get CUPS_DETALLE. Falls back to
COD_EXAMEN if CUPS is empty. Applied to automation, test_rda, and
saved queries in SQLite.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:20:22 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ebd45446a4 tmp: add check_cups.py script to query Firebird schema
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:16:15 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9aa04307c6 debug: query ITEM table columns and CUPS_DETALLE samples
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:15:33 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 44af9680f2 fix: add LIKE %CUP% search across all tables in debug endpoint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:14:21 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 0896e14e62 fix: simplify debug cups endpoint to avoid Firebird CONTAINING error
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:13:30 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8b2f8eb3be fix: add rel.DESCUENTO to all SQL queries; update debug endpoint with discount check
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:11:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8732db9c1f fix: use Firebird PREFIJO as codigoPrefijo; add debug endpoint to find CUPs field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:07:43 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ed9fead353 fix: remove valor field from detallePedido; filter by PREFIJO in transaccion
- json_generator: remove valor entirely from detalle items (not even 0)
- transaccion: after fetching rows, filter by prefix if user typed full
  factura like "LHXC03726" and query returns PREFIJO column

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 12:00:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1548aadf3c fix: set valor=0 in detallePedido; parse full factura (prefix+number) in search
- json_generator: send valor:0 per item instead of PRECIO from Firebird
- test_rda + transaccion: accept "LHXC03726" format — extracts numeric part
  for NUM_FACTURA and letter prefix for PREFIJO filter when prefix present

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01 11:54:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4b77f0a0ac fix: quitar rel.DESCUENTO — columna no existe en tabla RELACION de Firebird
json_generator ya usa row.get('DESCUENTO') or 0 como fallback.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 21:15:10 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 02c2f7a17b fix: combinar fecha+hora separados de Firebird en fechaHoraIngreso
HORAINICIORECEPCION es campo TIME en Firebird — fdb lo devuelve como
datetime.time sin fecha. _fmt_datetime recibía '06:08:29' y lo pasaba
tal cual al JSON. TNS rechazaba por formato inválido.

- _fmt_datetime ahora maneja entrada solo-fecha → agrega 00:00:00
- generar_rda_paciente combina HORAINICIORECEPCION + FECHA_RECEPCION
  antes de llamar _fmt_datetime cuando detecta hora sin fecha

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 20:50:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9d80279114 fix: strip spaces around colons in entire RDA JSON before returning
Adds _clean_times() that recursively walks every string in the result
dict and applies re.sub(r'\s*:\s*', ':'), guaranteeing no "12: 47: 37"
spaces survive to the TNS API regardless of Firebird driver behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 20:16:23 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 9d87c3fa1c fix: usar regex en _fmt_datetime para eliminar espacios en horas de Firebird
re.sub('\s*:\s*', ':') captura cualquier tipo de espacio alrededor
de los dos puntos, incluyendo tipos no-ASCII que .replace() no atrapa.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 20:01:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 4aa30c74c1 fix: restaurar codFormaPago en header RDA (campo requerido segun docs)
La documentacion marca CodFormaPago como Requerido=Si. Su ausencia
causaba 'Datos incorrectos' en TNS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 19:23:08 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c7428a196b fix: quitar codFormaPago header, fechaAutorizacion=hoy, descuento de Firebird
- Elimina codFormaPago del header RDA (no va segun JSON de referencia)
- fechaAutorizacion usa fecha de hoy, no la de recepcion
- descuento toma rel.DESCUENTO de Firebird en vez de hardcodeado 0
- Agrega rel.DESCUENTO al SELECT en test_rda y automation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:12:48 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 543af23779 fix: restaurar codFormaPago en header RDA (requerido por TNS)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:26:35 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 20a22e8e5b fix: limpiar espacios en horas desde la fuente en _safe de Firebird
Usa strftime en vez de isoformat y aplica re.sub para eliminar
espacios alrededor de los dos puntos en strings de tiempo de fdb.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:20:57 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 c5d6b9857e fix: eliminar espacios en horas de Firebird en fechaHoraIngreso/Egreso/Realizacion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:16:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 dd4d012a4b fix: fechaHoraEgreso = fechaHoraRealizacion del ultimo examen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:12:59 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 00bfbaee51 fix: vigenciaAutorizacion siempre 30
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:09:43 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2321771c3e fix: quitar codFormaPago del header RDA, añadir fechaAutorizacion y vigenciaAutorizacion
- Elimina codFormaPago del header principal (queda en detalleFormaPago)
- Añade fechaAutorizacion con la fecha de recepcion (dd/MM/yyyy)
- Añade vigenciaAutorizacion: 0 para particular, 30 para EPS/convenio

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 15:00:17 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 be1910b5d8 fix: send numero sin prefijo LHXC en RDA TNS
TNS espera solo el numero numerico (ej: "4001"), no el formato
combinado con prefijo (ej: "LHXC04001"). El codigoPrefijo "00"
ya referencia la serie correcta en la configuracion de TNS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 21:09:58 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 90de09b22c Fix RDA: quitar campos demograficos del RDA (solo van en Tercero); identidadGenero con ceros "01"/"02"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:50:39 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 58bdb4ae55 Agrega campos demograficos paciente en RDA y Tercero (etnia, zona, identidadGenero, divPolitica, antecedentes, fechaNac, direccion)
- SQL RDA join PACIENTE para obtener datos demograficos
- generar_rda_paciente: incluye etnia, identidadGenero, zona, divisionPoliticaAdministrativa, antecedentes, fechaNacimiento, direccion
- generar_tercero_api: agrega identidadGenero, divisionPoliticaAdministrativa, antecedentes; default ciudad Cucuta 54001

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:49:12 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 bdc0e244fc Fix NameError: mover autorizacion después de definir es_particular
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:28:57 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 5c03e58639 Fix contrato particular: usar "012" (como está en TNS y Firebird)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:27:01 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 be272296af Fix particular: numeroContrato siempre "12" y sin numeroAutorizacion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:26:42 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 69372a5673 Agrega filtro convenio en automation/transaccion/test-rda y fix particular (contrato 12)
- automation: filtro contrato en SQL pacientes+RDA, numero LHXC en run()
- transaccion: filtro contrato en preview/send-one/send
- test-rda: filtro tipo_usuario (11/07/12), default contrato "12", acepta "12"/"012"
- json_generator: detecta particular por CODCONTRATO "12"/"012" además de NIT_EMPRESA PART; fuerza tipousuario="12", codFormaPago="CLIP", plazoDias="0"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:23:00 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d7afbe9b7d Numero TNS = formato RIPS limpio: LHXC03990 sin sufijo idrecepcion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:07:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 88f684a006 Usa formato RIPS completo para numero TNS: LHXC03990-314522
El numero del kardex en TNS ahora incluye el PREFIJO de Firebird y el
NUM_FACTURA zero-padded a 5 dígitos, igual al numFactura del RIPS
(ej: LHXC03404). Se agrega -{idrecepcion} al final para garantizar
unicidad ya que múltiples IDRECEPCION comparten el mismo NUM_FACTURA.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 20:03:03 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 6905a4132e Simplifica numero único en TNS: siempre usar {factura}-{idrecepcion}
Elimina la lógica condicional que dependía de rda_test_log para detectar
colisiones. Ahora cada IDRECEPCION siempre genera un numero único y
reproducible en TNS sin consultar historial previo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 19:59:31 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d9d3deef6c Fix colisión de numero de factura en TNS cuando varios IDRECEPCION comparten NUM_FACTURA
- json_generator: agrega parámetro numero_override para usar un número alternativo
- test_rda: detecta si el NUM_FACTURA ya fue enviado exitosamente (sesión o rda_test_log) y usa "{factura}-{idrecepcion}" como numero único en TNS
- transaccion: misma lógica en envío masivo, evita que el segundo IDRECEPCION de la misma factura falle con 409

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 19:50:30 -05:00