Files
Monitores/app.py
T

103 lines
8.7 KiB
Python

from flask import Flask, render_template, jsonify, Response
from conexion import get_connection
from dotenv import load_dotenv
import os
load_dotenv()
ip = os.getenv("IPSERVER")
puerto = os.getenv("PORT")
modo = os.getenv("MODE", "1")
monitor1 = os.getenv("MONITOR_ID_1")
monitor2 = os.getenv("MONITOR_ID_2")
es_quirofano_1 = os.getenv("IS_QUIRO_1")
es_quirofano_2 = os.getenv("IS_QUIRO_2")
tema = os.getenv("THEME", "csm")
extender = os.getenv("EXTEND")
query = ""
tema_styles = {
"csm": {
"bg1":"#114b94",
"bg2":"#0a6eb2"
},
"imq": {
"bg1":"#CC0C00",
"bg2":"#e6392d"
}
}
app = Flask(__name__)
def obtener_turnos(mon_id, qry):
conn = get_connection()
if not conn:
return []
try:
cursor = conn.cursor()
cursor.execute(qry,{'monitor':mon_id})
datos = cursor.fetchall()
cursor.close()
conn.close()
return datos
except Exception as e:
print(f"Error al conectar: {e}")
return None
def obtener_pie(mon_id1, mon_id2):
conn = get_connection()
if not conn:
return []
try:
cursor = conn.cursor()
if modo == "2":
cursor.execute("SELECT MENSAJE FROM CSMK_MONITOR_PIE WHERE MONITOR_ID IN (:monitor, :monitor2) AND INACTIVO = 0 ORDER BY MONITOR_ID, MONITOR_PIE_ID ASC",{'monitor':mon_id1, 'monitor2':mon_id2})
else:
cursor.execute("SELECT MENSAJE FROM CSMK_MONITOR_PIE WHERE MONITOR_ID IN (:monitor) AND INACTIVO = 0 ORDER BY MONITOR_ID, MONITOR_PIE_ID ASC",{'monitor':mon_id1})
mensajes = [fila[0] for fila in cursor.fetchall()]
mensaje_final = "       ".join(mensajes)
cursor.close()
conn.close()
return mensaje_final
except Exception as e:
print(f"Error al conectar: {e}")
return None
@app.route('/')
def index():
tema_colores = tema_styles.get(tema, tema_styles["csm"])
return render_template("index.html", mode=modo, theme=tema, theme_colors=tema_colores, quiro1=es_quirofano_1, quiro2=es_quirofano_2)
@app.route('/api/datos1')
def api_datos1():
if modo == "2" and extender =="1":
query = "WITH BASE AS (SELECT CONS_ESTADO.CODIGO_IMPRESION AS CONSULTA, CONS_ESTADO.ESTADO_ID AS ESTADO_CONSULTA, NVL (CONS_TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL (CONS_TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM (SELECT ROW_NUMBER () OVER (PARTITION BY ESTADO.ESTANCIA_ID ORDER BY ESTADO.CONSULTA_ESTADO_ID DESC) AS RN, ESTADO.ESTADO_ID, ESTANCIA.* FROM CSMK_CONSULTA_ESTADO ESTADO JOIN CSMK_ESTANCIA ESTANCIA ON ESTADO.ESTANCIA_ID = ESTANCIA.ESTANCIA_ID WHERE ESTADO.FECHA = TRUNC (SYSDATE) AND ESTANCIA.MONITOR_ID = :monitor) CONS_ESTADO LEFT JOIN (SELECT t.* FROM (SELECT TM.*, ROW_NUMBER () OVER (PARTITION BY TM.ESTANCIA_ID ORDER BY TM.TURNO_MON_ID DESC) AS RN FROM CSMK_TURNO_MON TM WHERE TM.FECHA = TRUNC (SYSDATE) AND TM.ESTADO_ID IN (1, 2) AND TM.MONITOR_ID = :monitor) t WHERE t.RN = 1) CONS_TURNOS ON CONS_ESTADO.ESTANCIA_ID = CONS_TURNOS.ESTANCIA_ID AND CONS_ESTADO.MONITOR_ID = CONS_TURNOS.MONITOR_ID WHERE CONS_ESTADO.RN = 1), numerada AS (SELECT b.*, ROW_NUMBER () OVER (ORDER BY b.CONSULTA ASC) AS rn_global, COUNT (*) OVER () AS total FROM base b) SELECT CONSULTA, ESTADO_CONSULTA, TURNO, ESTADO_TURNO FROM numerada WHERE rn_global <= total / 2 ORDER BY rn_global"
else:
if es_quirofano_1 == "1":
query = "SELECT QUIROFANOS.CODIGO_INTERNO AS CONSULTA, 1 AS ESTADO_CONSULTA, NVL (TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL (TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM (SELECT DISTINCT(CSMK_TURNO.CODIGO_PERSONAL), FP.CODIGO_INTERNO FROM CSMK_TURNO, NOVAHIS.FPERSONA FP WHERE ESTANCIA_ID = 639 AND FECHA = TRUNC(SYSDATE) AND CSMK_TURNO.CODIGO_PERSONAL = FP.CODIGO_PERSONAL) QUIROFANOS LEFT JOIN (SELECT t.* FROM (SELECT CT.CODIGO_PERSONAL, CTM.*, ROW_NUMBER () OVER (PARTITION BY CT.CODIGO_PERSONAL ORDER BY CTM.TURNO_MON_ID DESC) AS RN FROM CSMK_TURNO_MON CTM, CSMK_TURNO CT WHERE CTM.FECHA = TRUNC (SYSDATE) AND CTM.ESTADO_ID IN (1, 2) AND CTM.MONITOR_ID = :monitor AND CTM.TURNO_ID = CT.TURNO_ID) t WHERE t.RN = 1) TURNOS ON QUIROFANOS.CODIGO_PERSONAL = TURNOS.CODIGO_PERSONAL ORDER BY QUIROFANOS.CODIGO_INTERNO ASC"
else:
query ="SELECT CONS_ESTADO.CODIGO_IMPRESION AS CONSULTA, CONS_ESTADO.ESTADO_ID AS ESTADO_CONSULTA, NVL(CONS_TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL(CONS_TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM ( SELECT ROW_NUMBER () OVER ( PARTITION BY ESTADO.ESTANCIA_ID ORDER BY ESTADO.CONSULTA_ESTADO_ID DESC ) AS RN, ESTADO.ESTADO_ID, ESTANCIA.* FROM CSMK_CONSULTA_ESTADO ESTADO JOIN CSMK_ESTANCIA ESTANCIA ON ESTADO.ESTANCIA_ID = ESTANCIA.ESTANCIA_ID WHERE ESTADO.FECHA = TRUNC (SYSDATE) AND ESTANCIA.MONITOR_ID = :monitor ) CONS_ESTADO LEFT JOIN ( SELECT t.* FROM ( SELECT TM.*, ROW_NUMBER() OVER ( PARTITION BY TM.ESTANCIA_ID ORDER BY TM.TURNO_MON_ID DESC ) AS RN FROM CSMK_TURNO_MON TM WHERE TM.FECHA = TRUNC (SYSDATE) AND TM.ESTADO_ID IN (1,2) AND TM.MONITOR_ID = :monitor ) t WHERE t.RN = 1 ) CONS_TURNOS ON CONS_ESTADO.ESTANCIA_ID = CONS_TURNOS.ESTANCIA_ID AND CONS_ESTADO.MONITOR_ID = CONS_TURNOS.MONITOR_ID WHERE CONS_ESTADO.RN = 1 ORDER BY CONSULTA ASC"
filas = obtener_turnos(monitor1, query)
return jsonify(filas)
@app.route('/api/datos2')
def api_datos2():
global monitor2
if modo == "2" and extender =="1":
monitor2 = monitor1
query = "WITH BASE AS (SELECT CONS_ESTADO.CODIGO_IMPRESION AS CONSULTA, CONS_ESTADO.ESTADO_ID AS ESTADO_CONSULTA, NVL (CONS_TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL (CONS_TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM (SELECT ROW_NUMBER () OVER (PARTITION BY ESTADO.ESTANCIA_ID ORDER BY ESTADO.CONSULTA_ESTADO_ID DESC) AS RN, ESTADO.ESTADO_ID, ESTANCIA.* FROM CSMK_CONSULTA_ESTADO ESTADO JOIN CSMK_ESTANCIA ESTANCIA ON ESTADO.ESTANCIA_ID = ESTANCIA.ESTANCIA_ID WHERE ESTADO.FECHA = TRUNC (SYSDATE) AND ESTANCIA.MONITOR_ID = :monitor) CONS_ESTADO LEFT JOIN (SELECT t.* FROM (SELECT TM.*, ROW_NUMBER () OVER (PARTITION BY TM.ESTANCIA_ID ORDER BY TM.TURNO_MON_ID DESC) AS RN FROM CSMK_TURNO_MON TM WHERE TM.FECHA = TRUNC (SYSDATE) AND TM.ESTADO_ID IN (1, 2) AND TM.MONITOR_ID = :monitor) t WHERE t.RN = 1) CONS_TURNOS ON CONS_ESTADO.ESTANCIA_ID = CONS_TURNOS.ESTANCIA_ID AND CONS_ESTADO.MONITOR_ID = CONS_TURNOS.MONITOR_ID WHERE CONS_ESTADO.RN = 1), numerada AS (SELECT b.*, ROW_NUMBER () OVER (ORDER BY b.CONSULTA ASC) AS rn_global, COUNT (*) OVER () AS total FROM base b) SELECT CONSULTA, ESTADO_CONSULTA, TURNO, ESTADO_TURNO FROM numerada WHERE rn_global > total / 2 ORDER BY rn_global"
else:
if es_quirofano_2 == "1":
query = "SELECT QUIROFANOS.CODIGO_INTERNO AS CONSULTA, 1 AS ESTADO_CONSULTA, NVL (TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL (TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM (SELECT DISTINCT(CSMK_TURNO.CODIGO_PERSONAL), FP.CODIGO_INTERNO FROM CSMK_TURNO, NOVAHIS.FPERSONA FP WHERE ESTANCIA_ID = 639 AND FECHA = TRUNC(SYSDATE) AND CSMK_TURNO.CODIGO_PERSONAL = FP.CODIGO_PERSONAL) QUIROFANOS LEFT JOIN (SELECT t.* FROM (SELECT CT.CODIGO_PERSONAL, CTM.*, ROW_NUMBER () OVER (PARTITION BY CT.CODIGO_PERSONAL ORDER BY CTM.TURNO_MON_ID DESC) AS RN FROM CSMK_TURNO_MON CTM, CSMK_TURNO CT WHERE CTM.FECHA = TRUNC (SYSDATE) AND CTM.ESTADO_ID IN (1, 2) AND CTM.MONITOR_ID = :monitor AND CTM.TURNO_ID = CT.TURNO_ID) t WHERE t.RN = 1) TURNOS ON QUIROFANOS.CODIGO_PERSONAL = TURNOS.CODIGO_PERSONAL ORDER BY QUIROFANOS.CODIGO_INTERNO ASC"
else:
query ="SELECT CONS_ESTADO.CODIGO_IMPRESION AS CONSULTA, CONS_ESTADO.ESTADO_ID AS ESTADO_CONSULTA, NVL(CONS_TURNOS.CODIGO_TURNO, NULL) AS TURNO, NVL(CONS_TURNOS.ESTADO_ID, 2) AS ESTADO_TURNO FROM ( SELECT ROW_NUMBER () OVER ( PARTITION BY ESTADO.ESTANCIA_ID ORDER BY ESTADO.CONSULTA_ESTADO_ID DESC ) AS RN, ESTADO.ESTADO_ID, ESTANCIA.* FROM CSMK_CONSULTA_ESTADO ESTADO JOIN CSMK_ESTANCIA ESTANCIA ON ESTADO.ESTANCIA_ID = ESTANCIA.ESTANCIA_ID WHERE ESTADO.FECHA = TRUNC (SYSDATE) AND ESTANCIA.MONITOR_ID = :monitor ) CONS_ESTADO LEFT JOIN ( SELECT t.* FROM ( SELECT TM.*, ROW_NUMBER() OVER ( PARTITION BY TM.ESTANCIA_ID ORDER BY TM.TURNO_MON_ID DESC ) AS RN FROM CSMK_TURNO_MON TM WHERE TM.FECHA = TRUNC (SYSDATE) AND TM.ESTADO_ID IN (1,2) AND TM.MONITOR_ID = :monitor ) t WHERE t.RN = 1 ) CONS_TURNOS ON CONS_ESTADO.ESTANCIA_ID = CONS_TURNOS.ESTANCIA_ID AND CONS_ESTADO.MONITOR_ID = CONS_TURNOS.MONITOR_ID WHERE CONS_ESTADO.RN = 1 ORDER BY CONSULTA ASC"
filas = obtener_turnos(monitor2, query)
return jsonify(filas)
@app.route('/api/footer')
def api_pie():
mensaje = obtener_pie(monitor1, monitor2)
return Response(mensaje, mimetype='text/plain')
if __name__ == '__main__':
app.run(debug=True,host=ip, port=puerto)