MondelezApp / app.py
luisbv's picture
Update app.py
62e8857
Raw
History Blame Contribute Delete
6.94 kB
import streamlit as st
import pandas as pd
import requests
import json
import re
import os
#from dotenv import load_dotenv
from datetime import datetime, timedelta, time
import pandas as pd
from io import BytesIO
import streamlit as st
# Load environment variables
#load_dotenv()
st.set_page_config(
page_title="馃崻Extracci贸n Reportes Mondelez",
layout="wide",
initial_sidebar_state="expanded",
)
columns_incidents = [
"Sitio", "Regi贸n", "Tipo de veh铆culo", "Nombre del colaborador", "Edad",
"脕rea", "Puesto", "Antig眉edad en 谩rea", "Antig眉edad en el puesto",
"Fecha y hora del accidente", "Fecha y hora en que se report贸 al supervisor",
"Fecha y hora de notificaci贸n va a servicio m茅dico/HSE", "Lugar del accidente",
"Descripci贸n del accidente", "DX", "TX", "D铆as de incapacidad", "Clasificaci贸n"
]
all_columns = columns_incidents + ["Enviado por", "Fecha envio"]
df = pd.DataFrame(columns=all_columns)
# Configuraci贸n inicial
st.title("Extracci贸n Reportes de Incidentes WhatsApp")
st.sidebar.header("Configuraci贸n de la App")
token = os.getenv("TOKEN_WHATSAPP")
excel_file = os.getenv("EXCEL_FILENAME") # Archivo donde se guardar谩n los datos
group_id = os.getenv("GROUP_ID_WHATSAPP") #st.sidebar.text_input("ID del Grupo")
print(group_id)
print(token)
today = datetime.today()
one_week_ago = today - timedelta(days=7)
hora_inicio = time(0, 0)
hora_fin = today.time()
with st.sidebar:
cols = st.sidebar.columns(2)
with cols[0]:
fecha_inicio = st.date_input("Fecha de Inicio", value=datetime.today(), min_value=one_week_ago, max_value=today, key="start_date")
fecha_fin = st.date_input("Fecha de Fin", value=datetime.today(), min_value=one_week_ago, max_value=today, key="end_date")
with cols[1]:
t_inicio = st.time_input("Hora Inicio", hora_inicio, key="start_time")
t_fin = st.time_input("Hora Fin", hora_fin, key="end_time")
# Funci贸n para obtener mensajes
start_date = datetime.combine(fecha_inicio, t_inicio)
end_date = datetime.combine(fecha_fin, t_fin)
def convert_date_to_timestamp(date):
return int(date.timestamp())
time_from = convert_date_to_timestamp(start_date)
time_to = convert_date_to_timestamp(end_date)
def get_group_messages(group_id, token):
url = f"https://gate.whapi.cloud/messages/list/{group_id}?time_from={time_from}&time_to={time_to}&count=100&sort=desc"
print(url)
headers = {
"accept": "application/json",
"Authorization": f"Bearer {token}"
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return json.loads(response.text).get('messages', [])
else:
st.error(f"Error al obtener mensajes del grupo {group_id}. C贸digo: {response.status_code}")
return []
# Funci贸n para extraer informaci贸n del mensaje
def parse_message(message):
pattern = r"[\n][鈥(.*?): (.*)"
matches = re.findall(pattern, message)
return {key.strip(): value.strip() for key, value in matches}
# Funci贸n para verificar duplicados
def check_duplicates(existing_df, new_data):
# Combinar los datos existentes con los nuevos
new_df = pd.DataFrame(new_data)
combined_df = pd.concat([existing_df, new_df], ignore_index=True)
combined_df.drop_duplicates(subset=[
"Sitio", "Regi贸n", "Tipo de veh铆culo", "Nombre del colaborador",
"脕rea", "Puesto"
], inplace=True)
# Filtrar solo los nuevos datos
return combined_df[~combined_df.index.isin(existing_df.index)], combined_df
# Cargar el archivo Excel existente
def load_existing_data(file_path):
try:
return pd.read_excel(file_path)
except FileNotFoundError:
return pd.DataFrame(columns=all_columns)
# Guardar el archivo actualizado
def save_data_to_excel(file_path, df):
with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
df.to_excel(writer, index=False, sheet_name='Reportes')
# Obtener grupos
if token:
if group_id:
if st.sidebar.button("Cargar Mensajes Incidentes"):
messages = get_group_messages(group_id, token)
accident_reports = []
for message in messages:
if "text" in message:
if "body" in message['text']:
if "REPORTE DE INCIDENTE" in message['text']['body']:
if any(column not in message['text']['body'] for column in columns_incidents):
print("Mensaje no analizado",message['text']['body'])
continue
else:
accident_reports.append(
{
'mensaje': message['text']['body'],
'fecha': message['timestamp'],
'usuario': message['from_name']
}
)
# Filtrar mensajes relevantes
#accident_reports = [msg['text']['body'] for msg in messages if "REPORTE DE INCIDENTE" in msg['text']['body']]
# Procesar los reportes
report_data = []
for report in accident_reports:
parsed = parse_message(report['mensaje'])
parsed['Fecha envio'] = report['fecha']
parsed['Enviado por'] = report['usuario']
report_data.append(parsed)
# Mostrar datos en la app
if report_data:
# Cargar datos existentes
existing_data = load_existing_data(excel_file)
# Verificar duplicados
new_data, updated_data = check_duplicates(existing_data, report_data)
if not new_data.empty:
st.header("Reportes Extra铆dos")
df = pd.DataFrame(new_data)
df_edited = st.data_editor(df, hide_index=True)
# Guardar datos actualizados
st.download_button(
label = "Guardar Reportes",
data = df_edited.to_csv(index=False),
file_name="reportes_accidentes.csv",
mime="text/csv")
#save_data_to_excel(excel_file, updated_data)
st.success("Datos actualizados en el archivo Excel.")
else:
st.warning("No se encontraron reportes nuevos para agregar.")
else:
st.warning("No se encontraron reportes de accidentes nuevos para agregar.")
else:
st.sidebar.info("Introduce un ID de grupo para comenzar.")
else:
st.sidebar.info("Introduce tu token de API.")