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>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
15f6ca65db
commit
72973973d4
@@ -62,6 +62,7 @@ SELECT
|
|||||||
rel.COD_EXAMEN,
|
rel.COD_EXAMEN,
|
||||||
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
||||||
rel.PRECIO,
|
rel.PRECIO,
|
||||||
|
COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA,
|
||||||
rel.FECHA_REPORTADO,
|
rel.FECHA_REPORTADO,
|
||||||
m.COD_ESPECIALIDAD,
|
m.COD_ESPECIALIDAD,
|
||||||
COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional,
|
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 EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN)
|
||||||
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
||||||
LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA
|
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
|
WHERE r.FECHA_RECEPCION BETWEEN :fecha_ini AND :fecha_fin
|
||||||
AND r.NUM_FACTURA > 0
|
AND r.NUM_FACTURA > 0
|
||||||
{filtro_contrato_rda}
|
{filtro_contrato_rda}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ WHERE p.DOCIDENT = :doc_num""",
|
|||||||
rel.COD_EXAMEN,
|
rel.COD_EXAMEN,
|
||||||
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
||||||
rel.PRECIO,
|
rel.PRECIO,
|
||||||
|
COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA,
|
||||||
rel.FECHA_REPORTADO,
|
rel.FECHA_REPORTADO,
|
||||||
m.COD_ESPECIALIDAD,
|
m.COD_ESPECIALIDAD,
|
||||||
COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional,
|
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 EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN)
|
||||||
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
||||||
LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA
|
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""",
|
WHERE r.NUM_FACTURA = :num_factura""",
|
||||||
"description": "Servicios de una recepción por número de 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,
|
rel.COD_EXAMEN,
|
||||||
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
||||||
rel.PRECIO,
|
rel.PRECIO,
|
||||||
|
COALESCE(t.VALOR, rel.PRECIO) AS PRECIO_TARIFA,
|
||||||
rel.FECHA_REPORTADO,
|
rel.FECHA_REPORTADO,
|
||||||
m.COD_ESPECIALIDAD,
|
m.COD_ESPECIALIDAD,
|
||||||
COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional,
|
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 EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN)
|
||||||
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
||||||
LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA
|
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
|
WHERE r.FECHA_RECEPCION BETWEEN :fecha_ini AND :fecha_fin
|
||||||
ORDER BY r.IDRECEPCION""",
|
ORDER BY r.IDRECEPCION""",
|
||||||
"description": "Servicios en un rango de fechas (para RdaPaciente/Insertar)"
|
"description": "Servicios en un rango de fechas (para RdaPaciente/Insertar)"
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ SELECT
|
|||||||
r.NIT_EMPRESA, r.DIAG_PPAL, r.TIPOUSU, r.TIPOUSUSISPRO, r.AUTORIZACION, r.CLASEPROC,
|
r.NIT_EMPRESA, r.DIAG_PPAL, r.TIPOUSU, r.TIPOUSUSISPRO, r.AUTORIZACION, r.CLASEPROC,
|
||||||
r.HORAINICIORECEPCION, r.VALORTOTAL, r.VALORDESC, rel.COD_EXAMEN,
|
r.HORAINICIORECEPCION, r.VALORTOTAL, r.VALORDESC, rel.COD_EXAMEN,
|
||||||
COALESCE(NULLIF(TRIM(ex.NUM_ISS), ''), TRIM(rel.COD_EXAMEN)) AS CUPS,
|
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,
|
m.COD_ESPECIALIDAD,
|
||||||
COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional,
|
COALESCE(NULLIF(TRIM(m.CODIGO), ''), NULLIF(TRIM(r.USUARIO), ''), '') AS profesional,
|
||||||
e.CODCONTRATO,
|
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 EXAMEN ex ON TRIM(ex.CODIGO) = TRIM(rel.COD_EXAMEN)
|
||||||
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
LEFT JOIN MEDICO m ON m.CODIGO = r.COD_MEDICO
|
||||||
LEFT JOIN EMPRESA e ON e.NIT = r.NIT_EMPRESA
|
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}
|
WHERE {where}
|
||||||
AND r.NUM_FACTURA > 0
|
AND r.NUM_FACTURA > 0
|
||||||
AND e.CODCONTRATO IS NOT NULL
|
AND e.CODCONTRATO IS NOT NULL
|
||||||
|
|||||||
@@ -123,6 +123,14 @@ def agrupar_por_recepcion(rows: list) -> dict:
|
|||||||
return grupos
|
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 = "",
|
def generar_rda_paciente(rows: list, default_profesional: str = "", default_especialidad: str = "",
|
||||||
default_remisionante: str = "00", default_prefijo: str = "00",
|
default_remisionante: str = "00", default_prefijo: str = "00",
|
||||||
numero_override: str = "") -> dict:
|
numero_override: str = "") -> dict:
|
||||||
@@ -220,7 +228,7 @@ def generar_rda_paciente(rows: list, default_profesional: str = "", default_espe
|
|||||||
"numeroAutorizacion": autorizacion,
|
"numeroAutorizacion": autorizacion,
|
||||||
"fechaAutorizacion": date.today().strftime("%d/%m/%Y"),
|
"fechaAutorizacion": date.today().strftime("%d/%m/%Y"),
|
||||||
"vigenciaAutorizacion": vigencia,
|
"vigenciaAutorizacion": vigencia,
|
||||||
"descuento": int(float(h.get("VALORDESC") or 0)),
|
"descuento": _calcular_descuento_pct(rows),
|
||||||
"detallePedido": detalle_pedido,
|
"detallePedido": detalle_pedido,
|
||||||
"detalleFormaPago": [{
|
"detalleFormaPago": [{
|
||||||
"codigoFormaPago": cod_forma_pago,
|
"codigoFormaPago": cod_forma_pago,
|
||||||
|
|||||||
Reference in New Issue
Block a user