feat(logs): filtro por cédula de paciente en historial de envíos
- Agrega columna cedula a tabla envios (migración automática) - _guardar_envio almacena la cédula en los 4 pasos de automation - pac_map (COD_PACIENTE→DOCIDENT) para RDA/preserv/ventas - logs.py busca por cedula LIKE en vez de idrecepcion/contrato - logs.html etiqueta el input como "Cédula paciente" Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
03655427a5
commit
599391739f
@@ -25,6 +25,8 @@ def _migrate(conn):
|
|||||||
conn.execute("ALTER TABLE envios ADD COLUMN contrato TEXT")
|
conn.execute("ALTER TABLE envios ADD COLUMN contrato TEXT")
|
||||||
if "mensaje_tns" not in cols:
|
if "mensaje_tns" not in cols:
|
||||||
conn.execute("ALTER TABLE envios ADD COLUMN mensaje_tns TEXT")
|
conn.execute("ALTER TABLE envios ADD COLUMN mensaje_tns TEXT")
|
||||||
|
if "cedula" not in cols:
|
||||||
|
conn.execute("ALTER TABLE envios ADD COLUMN cedula TEXT")
|
||||||
|
|
||||||
tables = {r[0] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")}
|
tables = {r[0] for r in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")}
|
||||||
if "activity_log" not in tables:
|
if "activity_log" not in tables:
|
||||||
|
|||||||
+16
-10
@@ -559,6 +559,8 @@ async def run_automation(
|
|||||||
api_sucursal = configs.get("api_sucursal", "")
|
api_sucursal = configs.get("api_sucursal", "")
|
||||||
timeout = int(configs.get("api_timeout", 30))
|
timeout = int(configs.get("api_timeout", 30))
|
||||||
|
|
||||||
|
pac_map = {str(r.get("CODIGO", "")): str(r.get("DOCIDENT") or "").strip() for r in rows_pac_todos}
|
||||||
|
|
||||||
pasos_set = {p.strip() for p in pasos.split(",")}
|
pasos_set = {p.strip() for p in pasos.split(",")}
|
||||||
resultado = {
|
resultado = {
|
||||||
"fecha": fecha,
|
"fecha": fecha,
|
||||||
@@ -597,7 +599,8 @@ async def run_automation(
|
|||||||
"codigo": codigo_pac, "doc": doc, "nombre": nombre, "ok": ok, "msg": msg,
|
"codigo": codigo_pac, "doc": doc, "nombre": nombre, "ok": ok, "msg": msg,
|
||||||
})
|
})
|
||||||
|
|
||||||
_guardar_envio(user["user_id"], "terceros", fecha, tercero_json, msg, ok)
|
_guardar_envio(user["user_id"], "terceros", fecha, tercero_json, msg, ok,
|
||||||
|
cedula=str(row.get("DOCIDENT") or "").strip())
|
||||||
|
|
||||||
# ── Sync paralelo a WhatsApp Lab (silencioso) ─────────────────────────────
|
# ── Sync paralelo a WhatsApp Lab (silencioso) ─────────────────────────────
|
||||||
wa_url = configs.get("whatsapp_url", "").rstrip("/")
|
wa_url = configs.get("whatsapp_url", "").rstrip("/")
|
||||||
@@ -654,8 +657,9 @@ async def run_automation(
|
|||||||
})
|
})
|
||||||
|
|
||||||
_guardar_envio(user["user_id"], "transaccion", factura, rda_json, msg, ok,
|
_guardar_envio(user["user_id"], "transaccion", factura, rda_json, msg, ok,
|
||||||
fecha_inicio=fecha, fecha_fin=fecha,
|
fecha_inicio=fecha, fecha_fin=fecha, servicios=len(grupo_rows),
|
||||||
servicios=len(grupo_rows))
|
idrecepcion=id_recepcion, contrato=str(grupo_rows[0].get("CODCONTRATO") or "").strip(),
|
||||||
|
cedula=pac_map.get(str(grupo_rows[0].get("COD_PACIENTE", "")), ""))
|
||||||
|
|
||||||
# ── PASO 3: Enviar Pre-servicios (RCXC / SC) ──────────────────────────────
|
# ── PASO 3: Enviar Pre-servicios (RCXC / SC) ──────────────────────────────
|
||||||
grupos_ps_all = _agrupar_por_presserv(rows_ps)
|
grupos_ps_all = _agrupar_por_presserv(rows_ps)
|
||||||
@@ -698,8 +702,9 @@ async def run_automation(
|
|||||||
})
|
})
|
||||||
|
|
||||||
_guardar_envio(user["user_id"], "transaccion", factura_ps, rda_json, msg, ok,
|
_guardar_envio(user["user_id"], "transaccion", factura_ps, rda_json, msg, ok,
|
||||||
fecha_inicio=fecha, fecha_fin=fecha,
|
fecha_inicio=fecha, fecha_fin=fecha, servicios=len(grupo_rows),
|
||||||
servicios=len(grupo_rows))
|
idrecepcion=id_ps, contrato=str(grupo_rows[0].get("CODCONTRATO") or "").strip(),
|
||||||
|
cedula=pac_map.get(str(grupo_rows[0].get("COD_PACIENTE", "")), ""))
|
||||||
|
|
||||||
# ── PASO 4: Enviar Facturas Venta ─────────────────────────────────────────
|
# ── PASO 4: Enviar Facturas Venta ─────────────────────────────────────────
|
||||||
excluded_ventas = load_excluded_ventas_set()
|
excluded_ventas = load_excluded_ventas_set()
|
||||||
@@ -742,7 +747,8 @@ async def run_automation(
|
|||||||
|
|
||||||
_guardar_envio(user["user_id"], "ventas", factura_display, venta_json, msg, ok,
|
_guardar_envio(user["user_id"], "ventas", factura_display, venta_json, msg, ok,
|
||||||
fecha_inicio=fecha, fecha_fin=fecha, servicios=len(grupo_rows),
|
fecha_inicio=fecha, fecha_fin=fecha, servicios=len(grupo_rows),
|
||||||
idrecepcion=id_rec, contrato=contrato_vta)
|
idrecepcion=id_rec, contrato=contrato_vta,
|
||||||
|
cedula=pac_map.get(str(grupo_rows[0].get("COD_PACIENTE", "")), ""))
|
||||||
|
|
||||||
r1 = resultado["paso1_terceros"]
|
r1 = resultado["paso1_terceros"]
|
||||||
r2 = resultado["paso2_rda"]
|
r2 = resultado["paso2_rda"]
|
||||||
@@ -759,16 +765,16 @@ async def run_automation(
|
|||||||
|
|
||||||
def _guardar_envio(user_id, tipo, factura, json_data, respuesta, ok,
|
def _guardar_envio(user_id, tipo, factura, json_data, respuesta, ok,
|
||||||
fecha_inicio=None, fecha_fin=None, servicios=0,
|
fecha_inicio=None, fecha_fin=None, servicios=0,
|
||||||
idrecepcion=None, contrato=None):
|
idrecepcion=None, contrato=None, cedula=None):
|
||||||
try:
|
try:
|
||||||
conn = get_connection()
|
conn = get_connection()
|
||||||
conn.execute("""
|
conn.execute("""
|
||||||
INSERT INTO envios (user_id, tipo, factura, idrecepcion, contrato,
|
INSERT INTO envios (user_id, tipo, factura, idrecepcion, contrato, cedula,
|
||||||
fecha_inicio, fecha_fin,
|
fecha_inicio, fecha_fin,
|
||||||
pacientes_count, servicios_count, status, json_enviado, respuesta_api, created_at)
|
pacientes_count, servicios_count, status, json_enviado, respuesta_api, created_at)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
""", (
|
""", (
|
||||||
user_id, tipo, factura, idrecepcion, contrato,
|
user_id, tipo, factura, idrecepcion, contrato, cedula,
|
||||||
fecha_inicio, fecha_fin,
|
fecha_inicio, fecha_fin,
|
||||||
1, servicios,
|
1, servicios,
|
||||||
"success" if ok else "error",
|
"success" if ok else "error",
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ async def logs_page(
|
|||||||
where.append("e.factura LIKE ?")
|
where.append("e.factura LIKE ?")
|
||||||
params.append(f"%{factura}%")
|
params.append(f"%{factura}%")
|
||||||
if paciente:
|
if paciente:
|
||||||
where.append("(CAST(e.idrecepcion AS TEXT) LIKE ? OR e.contrato LIKE ?)")
|
where.append("(e.cedula LIKE ? OR e.factura LIKE ?)")
|
||||||
params += [f"%{paciente}%", f"%{paciente}%"]
|
params += [f"%{paciente}%", f"%{paciente}%"]
|
||||||
if fecha_desde:
|
if fecha_desde:
|
||||||
where.append("DATE(e.created_at) >= ?")
|
where.append("DATE(e.created_at) >= ?")
|
||||||
|
|||||||
@@ -62,8 +62,8 @@
|
|||||||
class="px-3 py-1.5 border border-gray-300 rounded-lg text-sm w-28">
|
class="px-3 py-1.5 border border-gray-300 rounded-lg text-sm w-28">
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label class="block text-xs font-medium text-gray-500 mb-1">IDRECEP / Contrato</label>
|
<label class="block text-xs font-medium text-gray-500 mb-1">Cédula paciente</label>
|
||||||
<input type="text" name="paciente" value="{{ filtro_paciente }}" placeholder="ID o contrato"
|
<input type="text" name="paciente" value="{{ filtro_paciente }}" placeholder="Nro. documento"
|
||||||
class="px-3 py-1.5 border border-gray-300 rounded-lg text-sm w-36">
|
class="px-3 py-1.5 border border-gray-300 rounded-lg text-sm w-36">
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
|
|||||||
Reference in New Issue
Block a user