Josedcape commited on
Commit
06bf405
·
verified ·
1 Parent(s): 3057752

Upload utils_data_manager (2).py

Browse files
Files changed (1) hide show
  1. utils_data_manager (2).py +429 -0
utils_data_manager (2).py ADDED
@@ -0,0 +1,429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import tempfile
3
+ import openai
4
+ from dotenv import load_dotenv
5
+ import PyPDF2
6
+ import nltk
7
+ from nltk.tokenize import word_tokenize
8
+ from nltk.corpus import stopwords
9
+ from nltk.stem import SnowballStemmer
10
+ import pandas as pd
11
+ from fpdf import FPDF
12
+ import streamlit as st
13
+ import requests
14
+ from google.cloud import texttospeech
15
+
16
+ nltk.download('punkt', quiet=True)
17
+ nltk.download('stopwords', quiet=True)
18
+
19
+ # Cargar las claves API desde el archivo .env
20
+ load_dotenv()
21
+ openai_api_key = os.getenv("OPENAI_API_KEY")
22
+ brevo_api_key = os.getenv("BREVO_API_KEY")
23
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "botidinamix-g.json"
24
+
25
+ # Verifica que las claves API están configuradas
26
+ if not openai_api_key:
27
+ st.error("No API key provided for OpenAI. Please set your API key in the .env file.")
28
+ else:
29
+ openai.api_key = openai_api_key
30
+
31
+ if not brevo_api_key:
32
+ st.error("No API key provided for Brevo. Please set your API key in the .env file.")
33
+
34
+ def extraer_texto_pdf(archivo):
35
+ texto = ""
36
+ if archivo:
37
+ with tempfile.NamedTemporaryFile(delete=False) as temp_file:
38
+ temp_file.write(archivo.read())
39
+ temp_file_path = temp_file.name
40
+ try:
41
+ with open(temp_file_path, 'rb') as file:
42
+ reader = PyPDF2.PdfReader(file)
43
+ for page in range(len(reader.pages)):
44
+ texto += reader.pages[page].extract_text()
45
+ except Exception as e:
46
+ st.error(f"Error al extraer texto del PDF: {e}")
47
+ finally:
48
+ os.unlink(temp_file_path)
49
+ return texto
50
+
51
+ def preprocesar_texto(texto):
52
+ tokens = word_tokenize(texto, language='spanish')
53
+ tokens = [word.lower() for word in tokens if word.isalpha()]
54
+ stopwords_es = set(stopwords.words('spanish'))
55
+ tokens = [word for word in tokens if word not in stopwords_es]
56
+ stemmer = SnowballStemmer('spanish')
57
+ tokens = [stemmer.stem(word) for word in tokens]
58
+ return " ".join(tokens)
59
+
60
+ def obtener_respuesta(pregunta, texto_preprocesado, modelo, temperatura=0.5, assistant_id=""):
61
+ try:
62
+ response = openai.ChatCompletion.create(
63
+ model=modelo,
64
+ messages=[
65
+ {"role": "system", "content": "Actua como Galatea la asistente de la clinica Odontologica OMARDENT y resuelve las inquietudes"},
66
+ {"role": "user", "content": f"{pregunta}\n\nContexto: {texto_preprocesado}"}
67
+ ],
68
+ temperature=temperatura
69
+ )
70
+ respuesta = response.choices[0].message['content'].strip()
71
+
72
+ # Configura la solicitud de síntesis de voz
73
+ client = texttospeech.TextToSpeechClient()
74
+ input_text = texttospeech.SynthesisInput(text=respuesta)
75
+ voice = texttospeech.VoiceSelectionParams(
76
+ language_code="es-ES", ssml_gender=texttospeech.SsmlVoiceGender.FEMALE
77
+ )
78
+ audio_config = texttospeech.AudioConfig(
79
+ audio_encoding=texttospeech.AudioEncoding.MP3
80
+ )
81
+
82
+ # Realiza la solicitud de síntesis de voz
83
+ response = client.synthesize_speech(
84
+ input=input_text, voice=voice, audio_config=audio_config
85
+ )
86
+
87
+ # Reproduce el audio en Streamlit
88
+ st.audio(response.audio_content, format="audio/mp3")
89
+ return respuesta
90
+
91
+ except openai.OpenAIError as e:
92
+ st.error(f"Error al comunicarse con OpenAI: {e}")
93
+ return "Lo siento, no puedo procesar tu solicitud en este momento."
94
+
95
+ except Exception as e:
96
+ st.error(f"Error al generar la respuesta y el audio: {e}")
97
+ return "Lo siento, ocurrió un error al procesar tu solicitud."
98
+
99
+ def guardar_en_txt(nombre_archivo, datos):
100
+ carpeta = "datos_guardados"
101
+ os.makedirs(carpeta, exist_ok=True)
102
+ ruta_archivo = os.path.join(carpeta, nombre_archivo)
103
+ try:
104
+ with open(ruta_archivo, 'a', encoding='utf-8') as archivo: # Append mode
105
+ archivo.write(datos + "\n")
106
+ except Exception as e:
107
+ st.error(f"Error al guardar datos en el archivo: {e}")
108
+ return ruta_archivo
109
+
110
+ def cargar_desde_txt(nombre_archivo):
111
+ carpeta = "datos_guardados"
112
+ ruta_archivo = os.path.join(carpeta, nombre_archivo)
113
+ try:
114
+ if os.path.exists(ruta_archivo):
115
+ with open(ruta_archivo, 'r', encoding='utf-8') as archivo:
116
+ return archivo.read()
117
+ else:
118
+ st.warning("Archivo no encontrado.")
119
+ return ""
120
+ except Exception as e:
121
+ st.error(f"Error al cargar datos desde el archivo: {e}")
122
+ return ""
123
+
124
+ def listar_archivos_txt():
125
+ carpeta = "datos_guardados"
126
+ try:
127
+ if not os.path.exists(carpeta):
128
+ return []
129
+ archivos = [f for f in os.listdir(carpeta) if f.endswith('.txt')]
130
+ archivos_ordenados = sorted(archivos, key=lambda x: os.path.getctime(os.path.join(carpeta, x)), reverse=True)
131
+ return archivos_ordenados
132
+ except Exception as e:
133
+ st.error(f"Error al listar archivos: {e}")
134
+ return []
135
+
136
+ def generar_pdf(dataframe, titulo, filename):
137
+ pdf = FPDF()
138
+ pdf.add_page()
139
+ pdf.set_font("Arial", size=12)
140
+ pdf.cell(200, 10, txt=titulo, ln=True, align='C')
141
+
142
+ for i, row in dataframe.iterrows():
143
+ row_text = ", ".join(f"{col}: {val}" for col, val in row.items())
144
+ pdf.cell(200, 10, txt=row_text, ln=True)
145
+
146
+ try:
147
+ with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as tmp_file:
148
+ pdf.output(tmp_file.name)
149
+ return tmp_file.name
150
+ except Exception as e:
151
+ st.error(f"Error al generar PDF: {e}")
152
+ return None
153
+
154
+ def enviar_correo(destinatario, asunto, contenido):
155
+ url = "https://api.brevo.com/v3/smtp/email"
156
+ headers = {
157
+ "accept": "application/json",
158
+ "api-key": brevo_api_key,
159
+ "content-type": "application/json"
160
+ }
161
+ payload = {
162
+ "sender": {"email": "tu_correo@dominio.com"},
163
+ "to": [{"email": destinatario}],
164
+ "subject": asunto,
165
+ "htmlContent": contenido
166
+ }
167
+ try:
168
+ response = requests.post(url, json=payload, headers=headers)
169
+ if response.status_code == 201:
170
+ st.success(f"Correo enviado a {destinatario}")
171
+ else:
172
+ st.error(f"Error al enviar el correo: {response.text}")
173
+ except Exception as e:
174
+ st.error(f"Error al enviar el correo: {e}")
175
+
176
+ def enviar_whatsapp(numero, mensaje):
177
+ url = "https://api.brevo.com/v3/whatsapp/send"
178
+ headers = {
179
+ "accept": "application/json",
180
+ "api-key": brevo_api_key,
181
+ "content-type": "application/json"
182
+ }
183
+ payload = {
184
+ "recipient": {"number": numero},
185
+ "sender": {"number": "tu_numero_whatsapp"},
186
+ "content": mensaje
187
+ }
188
+ try:
189
+ response = requests.post(url, json=payload, headers=headers)
190
+ if response.status_code == 201:
191
+ st.success(f"Mensaje de WhatsApp enviado a {numero}")
192
+ else:
193
+ st.error(f"Error al enviar el mensaje de WhatsApp: {response.text}")
194
+ except Exception as e:
195
+ st.error(f"Error al enviar el mensaje de WhatsApp: {e}")
196
+
197
+ def flujo_laboratorio():
198
+ st.title("🦷 Gestión de Trabajos de Laboratorio")
199
+
200
+ if 'laboratorio' not in st.session_state:
201
+ st.session_state.laboratorio = []
202
+
203
+ with st.form("laboratorio_form"):
204
+ tipo_trabajo = st.selectbox("Tipo de trabajo:", [
205
+ "Protesis total", "Protesis removible metal-acrilico", "Parcialita acrilico",
206
+ "Placa de blanqueamiento", "Placa de bruxismo", "Corona de acrilico",
207
+ "Corona en zirconio", "Protesis flexible", "Acker flexible"
208
+ ])
209
+ doctor = st.selectbox("Doctor que requiere el trabajo:", ["Dr. Jose Daniel C", "Dr. Jose Omar C"])
210
+ fecha_entrega = st.date_input("Fecha de entrega:")
211
+ fecha_envio = st.date_input("Fecha de envío:")
212
+ laboratorio = st.selectbox("Laboratorio dental:", ["Ernesto Correa lab", "Formando Sonrisas"])
213
+ nombre_paciente = st.text_input("Nombre paciente:")
214
+ observaciones = st.text_input("Observaciones:")
215
+ numero_orden = st.text_input("Número de orden:")
216
+ cantidad = st.number_input("Cantidad:", min_value=1, step=1)
217
+
218
+ submitted = st.form_submit_button("Registrar Trabajo")
219
+
220
+ if submitted:
221
+ trabajo = {
222
+ "tipo_trabajo": tipo_trabajo,
223
+ "doctor": doctor,
224
+ "fecha_entrega": str(fecha_entrega),
225
+ "fecha_envio": str(fecha_envio),
226
+ "laboratorio": laboratorio,
227
+ "nombre_paciente": nombre_paciente,
228
+ "observaciones": observaciones,
229
+ "numero_orden": numero_orden,
230
+ "cantidad": cantidad,
231
+ "estado": "pendiente"
232
+ }
233
+ st.session_state.laboratorio.append(trabajo)
234
+ datos_guardados = mostrar_datos_como_texto([trabajo]) # Append only the new entry
235
+ guardar_en_txt('trabajos_laboratorio.txt', datos_guardados)
236
+ st.success("Trabajo registrado con éxito.")
237
+
238
+ if st.session_state.laboratorio:
239
+ st.write("### Trabajos Registrados")
240
+ df_trabajos = pd.DataFrame(st.session_state.laboratorio)
241
+ st.write(df_trabajos)
242
+
243
+ pdf_file = generar_pdf(df_trabajos, "Registro de Trabajos de Laboratorio", "trabajos_laboratorio.pdf")
244
+ st.download_button(
245
+ label="📥 Descargar PDF",
246
+ data=open(pdf_file, 'rb').read(),
247
+ file_name="trabajos_laboratorio.pdf",
248
+ mime="application/pdf"
249
+ )
250
+
251
+ def flujo_insumos():
252
+ st.title("📦 Gestión de Insumos")
253
+
254
+ if 'insumos' not in st.session_state:
255
+ st.session_state.insumos = []
256
+
257
+ with st.form("insumos_form"):
258
+ insumo_nombre = st.text_input("Nombre del Insumo:")
259
+ insumo_cantidad = st.number_input("Cantidad Faltante:", min_value=0, step=1)
260
+ submitted = st.form_submit_button("Agregar Insumo")
261
+
262
+ if submitted and insumo_nombre:
263
+ insumo = {"nombre": insumo_nombre, "cantidad": insumo_cantidad}
264
+ st.session_state.insumos.append(insumo)
265
+ datos_guardados = mostrar_datos_como_texto([insumo]) # Append only the new entry
266
+ guardar_en_txt('insumos.txt', datos_guardados)
267
+ st.success(f"Insumo '{insumo_nombre}' agregado con éxito.")
268
+
269
+ if st.session_state.insumos:
270
+ st.write("### Insumos Registrados")
271
+ insumos_df = pd.DataFrame(st.session_state.insumos)
272
+ st.write(insumos_df)
273
+
274
+ pdf_file = generar_pdf(insumos_df, "Registro de Insumos Faltantes", "insumos.pdf")
275
+ st.download_button(
276
+ label="📥 Descargar PDF",
277
+ data=open(pdf_file, 'rb').read(),
278
+ file_name="insumos_faltantes.pdf",
279
+ mime="application/pdf"
280
+ )
281
+
282
+ def buscar_datos_guardados():
283
+ st.title("🔍 Buscar Datos Guardados")
284
+
285
+ carpeta = "datos_guardados"
286
+ if not os.path.exists(carpeta):
287
+ st.info("No se encontraron archivos de datos guardados.")
288
+ return
289
+
290
+ archivos = listar_archivos_txt()
291
+
292
+ if archivos:
293
+ archivo_seleccionado = st.selectbox("Selecciona un archivo para ver:", archivos)
294
+
295
+ if archivo_seleccionado:
296
+ datos = cargar_desde_txt(os.path.join(carpeta, archivo_seleccionado))
297
+ if datos:
298
+ st.write(f"### Datos del archivo {archivo_seleccionado}")
299
+ st.text_area("Datos", datos, height=300)
300
+
301
+ # Link to download the file
302
+ try:
303
+ with open(os.path.join(carpeta, archivo_seleccionado), 'rb') as file:
304
+ st.download_button(
305
+ label="📥 Descargar Archivo TXT",
306
+ data=file,
307
+ file_name=archivo_seleccionado,
308
+ mime="text/plain"
309
+ )
310
+ except Exception as e:
311
+ st.error(f"Error al preparar la descarga: {e}")
312
+
313
+ # Enviar el archivo seleccionado por correo
314
+ if st.button("Enviar por correo"):
315
+ contenido = f"Datos del archivo {archivo_seleccionado}:\n\n{datos}"
316
+ enviar_correo("josedcape@gmail.com", f"Datos del archivo {archivo_seleccionado}", contenido)
317
+
318
+ # Enviar el archivo seleccionado por WhatsApp
319
+ if st.button("Enviar por WhatsApp"):
320
+ mensaje = f"Datos del archivo {archivo_seleccionado}:\n\n{datos}"
321
+ enviar_whatsapp("3114329322", mensaje)
322
+
323
+ else:
324
+ st.warning(f"No se encontraron datos en el archivo {archivo_seleccionado}")
325
+ else:
326
+ st.info("No se encontraron archivos de datos guardados.")
327
+
328
+ def generar_notificaciones_pendientes():
329
+ if 'laboratorio' not in st.session_state or not st.session_state.laboratorio:
330
+ st.info("No hay trabajos pendientes.")
331
+ return
332
+
333
+ pendientes = [trabajo for trabajo in st.session_state.laboratorio if trabajo["estado"] == "pendiente"]
334
+ if pendientes:
335
+ st.write("### Notificaciones de Trabajos Pendientes")
336
+ for trabajo in pendientes:
337
+ st.info(f"Pendiente: {trabajo['tipo_trabajo']} - {trabajo['numero_orden']} para {trabajo['doctor']}. Enviado a {trabajo['laboratorio']} el {trabajo['fecha_envio']}.")
338
+
339
+ def mostrar_datos_como_texto(datos):
340
+ texto = ""
341
+ if isinstance(datos, dict):
342
+ for key, value in datos.items():
343
+ texto += f"{key}: {value}\n"
344
+ elif isinstance(datos, list):
345
+ for item in datos:
346
+ if isinstance(item, dict):
347
+ for key, value in item.items():
348
+ texto += f"{key}: {value}\n"
349
+ texto += "\n"
350
+ else:
351
+ texto += f"{item}\n"
352
+ return texto
353
+
354
+ def flujo_presupuestos():
355
+ st.title("💰 Asistente de Presupuestos")
356
+ st.markdown("Hola Dr. cuénteme en que puedo ayudarle?")
357
+
358
+ lista_precios = {
359
+ "Restauraciones en resina de una superficie": 75000,
360
+ "Restauraciones en resina de dos superficies": 95000,
361
+ "Restauraciones en resina de tres o más superficies": 120000,
362
+ "Restauración en resina cervical": 60000,
363
+ "Coronas metal-porcelana": 750000,
364
+ "Provisional": 80000,
365
+ "Profilaxis simple": 75000,
366
+ "Profilaxis completa": 90000,
367
+ "Corona en zirconio": 980000,
368
+ "Blanqueamiento dental láser por sesión": 150000,
369
+ "Blanqueamiento dental casero": 330000,
370
+ "Blanqueamiento mixto": 430000,
371
+ "Prótesis parcial acrílico hasta 6 dientes": 530000,
372
+ "Prótesis parcial acrílico de más de 6 dientes": 580000,
373
+ "Prótesis flexible hasta 6 dientes": 800000,
374
+ "Prótesis flexible de más de 6 dientes": 900000,
375
+ "Prótesis total de alto impacto": 650000,
376
+ "Acker flexible hasta 2 dientes": 480000,
377
+ "Exodoncia por diente": 85000,
378
+ "Exodoncia cordal": 130000,
379
+ "Endodoncia con dientes terminados en 6": 580000,
380
+ "Endodoncia de un conducto": 380000,
381
+ "Endodoncia de premolares superiores": 480000,
382
+ }
383
+
384
+ tratamiento = st.selectbox("Selecciona el tratamiento", list(lista_precios.keys()))
385
+ cantidad = st.number_input("Cantidad", min_value=1, step=1)
386
+
387
+ if st.button("Calcular Presupuesto"):
388
+ if tratamiento and cantidad:
389
+ precio_total = lista_precios[tratamiento] * cantidad
390
+ st.success(f"El precio total para {cantidad} {tratamiento} es: {precio_total} COP")
391
+
392
+ def flujo_radiografias():
393
+ st.title("📸 Registro de Radiografías")
394
+
395
+ if 'radiografias' not in st.session_state:
396
+ st.session_state.radiografias = []
397
+
398
+ with st.form("radiografias_form"):
399
+ nombre_paciente = st.text_input("Nombre del Paciente:")
400
+ tipo_radiografia = st.selectbox("Tipo de Radiografía:", ["Periapical", "Panorámica", "Cefalométrica"])
401
+ fecha_realizacion = st.date_input("Fecha de Realización:")
402
+ observaciones = st.text_area("Observaciones:")
403
+
404
+ submitted = st.form_submit_button("Registrar Radiografía")
405
+
406
+ if submitted:
407
+ radiografia = {
408
+ "nombre_paciente": nombre_paciente,
409
+ "tipo_radiografia": tipo_radiografia,
410
+ "fecha_realizacion": str(fecha_realizacion),
411
+ "observaciones": observaciones
412
+ }
413
+ st.session_state.radiografias.append(radiografia)
414
+ datos_guardados = mostrar_datos_como_texto([radiografia])
415
+ guardar_en_txt('radiografias.txt', datos_guardados)
416
+ st.success("Radiografía registrada con éxito.")
417
+
418
+ if st.session_state.radiografias:
419
+ st.write("### Radiografías Registradas")
420
+ df_radiografias = pd.DataFrame(st.session_state.radiografias)
421
+ st.write(df_radiografias)
422
+
423
+ pdf_file = generar_pdf(df_radiografias, "Registro de Radiografías", "radiografias.pdf")
424
+ st.download_button(
425
+ label="📥 Descargar PDF",
426
+ data=open(pdf_file, 'rb').read(),
427
+ file_name="radiografias.pdf",
428
+ mime="application/pdf"
429
+ )