From 72973973d4dad1fb155e03b642df6007d6a5d12d Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:26:49 -0500 Subject: [PATCH] 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 --- app/routes/automation.py | 2 ++ app/routes/queries.py | 4 ++++ app/routes/test_rda.py | 4 +++- app/services/json_generator.py | 10 +++++++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/routes/automation.py b/app/routes/automation.py index 512e856..e24ae5d 100644 --- a/app/routes/automation.py +++ b/app/routes/automation.py @@ -62,6 +62,7 @@ SELECT rel.COD_EXAMEN, COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS, rel.PRECIO, + COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional, @@ -72,6 +73,7 @@ JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN) LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA +LEFT JOIN TARIFA t ON TRIM(t.COD_EXAMEN) = TRIM(rel.COD_EXAMEN) AND t.TARIFA = e.TARIFA WHERE r.FECHA_RECEPCION BETWEEN :fecha_ini AND :fecha_fin AND r.NUM_FACTURA > 0 {filtro_contrato_rda} diff --git a/app/routes/queries.py b/app/routes/queries.py index 0f24da1..f259021 100644 --- a/app/routes/queries.py +++ b/app/routes/queries.py @@ -51,6 +51,7 @@ WHERE p.DOCIDENT = :doc_num""", rel.COD_EXAMEN, COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS, rel.PRECIO, + COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional, @@ -61,6 +62,7 @@ JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN) LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA +LEFT JOIN TARIFA t ON TRIM(t.COD_EXAMEN) = TRIM(rel.COD_EXAMEN) AND t.TARIFA = e.TARIFA WHERE r.NUM_FACTURA = :num_factura""", "description": "Servicios de una recepción por número de factura" }, @@ -85,6 +87,7 @@ WHERE r.NUM_FACTURA = :num_factura""", rel.COD_EXAMEN, COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS, rel.PRECIO, + COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA, rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional, @@ -95,6 +98,7 @@ JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN) LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA +LEFT JOIN TARIFA t ON TRIM(t.COD_EXAMEN) = TRIM(rel.COD_EXAMEN) AND t.TARIFA = e.TARIFA WHERE r.FECHA_RECEPCION BETWEEN :fecha_ini AND :fecha_fin ORDER BY r.IDRECEPCION""", "description": "Servicios en un rango de fechas (para RdaPaciente/Insertar)" diff --git a/app/routes/test_rda.py b/app/routes/test_rda.py index 0c360b8..a6afe67 100644 --- a/app/routes/test_rda.py +++ b/app/routes/test_rda.py @@ -22,7 +22,8 @@ SELECT r.NIT_EMPRESA, r.DIAG_PPAL, r.TIPOUSU, r.TIPOUSUSISPRO, r.AUTORIZACION, r.CLASEPROC, r.HORAINICIORECEPCION, r.VALORTOTAL, r.VALORDESC, rel.COD_EXAMEN, COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS, - rel.PRECIO, rel.FECHA_REPORTADO, + rel.PRECIO, COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA, + rel.FECHA_REPORTADO, m.COD_ESPECIALIDAD, COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional, e.CODCONTRATO, @@ -32,6 +33,7 @@ JOIN RELACION rel ON rel.IDRECEPCION = r.IDRECEPCION LEFT JOIN EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN) LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA +LEFT JOIN TARIFA t ON TRIM(t.COD_EXAMEN) = TRIM(rel.COD_EXAMEN) AND t.TARIFA = e.TARIFA WHERE {where} AND r.NUM_FACTURA > 0 AND e.CODCONTRATO IS NOT NULL diff --git a/app/services/json_generator.py b/app/services/json_generator.py index cef5989..51b83d3 100644 --- a/app/services/json_generator.py +++ b/app/services/json_generator.py @@ -123,6 +123,14 @@ def agrupar_por_recepcion(rows: list) -> dict: return grupos +def _calcular_descuento_pct(rows: list) -> int: + total_cobrado = sum(float(r.get("PRECIO") or 0) for r in rows) + total_tarifa = sum(float(r.get("PRECIO_TARIFA") or r.get("PRECIO") or 0) for r in rows) + if total_tarifa > 0 and total_tarifa > total_cobrado: + return round((total_tarifa - total_cobrado) / total_tarifa * 100) + return 0 + + def generar_rda_paciente(rows: list, default_profesional: str = "", default_especialidad: str = "", default_remisionante: str = "00", default_prefijo: str = "00", numero_override: str = "") -> dict: @@ -220,7 +228,7 @@ def generar_rda_paciente(rows: list, default_profesional: str = "", default_espe "numeroAutorizacion": autorizacion, "fechaAutorizacion": date.today().strftime("%d/%m/%Y"), "vigenciaAutorizacion": vigencia, - "descuento": int(float(h.get("VALORDESC") or 0)), + "descuento": _calcular_descuento_pct(rows), "detallePedido": detalle_pedido, "detalleFormaPago": [{ "codigoFormaPago": cod_forma_pago,