diff --git a/domo91.py b/domo91.py index fd21d46..4473fe9 100644 --- a/domo91.py +++ b/domo91.py @@ -6,6 +6,7 @@ from datetime import date import matplotlib.pyplot as plt import matplotlib.dates as mdates from fpdf import FPDF +import os st.set_page_config(page_title="Domo91 - Surveillance", layout="wide") st.title("📡 Supervision TempĂ©ratures") @@ -17,7 +18,84 @@ db_config = { "password": "#SO2&1nf%mZ@jfh", "database": "Sondes" } +# --- Fonction de gĂ©nĂ©ration PDF --- +def generer_pdf(site, date_str): + st.info(f"GĂ©nĂ©ration du rapport PDF pour {site} Ă  la date {date_str}") + try: + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor(dictionary=True) + cursor.execute(f"SELECT Sonde, Date, Temperature FROM `{site}` WHERE DATE(Date) = %s ORDER BY Sonde, Date", (date_str,)) + rows = cursor.fetchall() + df = pd.DataFrame(rows) + df["Heure"] = pd.to_datetime(df["Date"]).dt.strftime("%H:%M") + + releves = {} + for sonde in df["Sonde"].unique(): + df_sonde = df[df["Sonde"] == sonde] + releves[sonde] = list(zip(df_sonde["Heure"], df_sonde["Temperature"])) + + table_alertes = f"Alertes_{site}" + cursor.execute(f"SELECT Sonde, Debut_defaut, Status FROM {table_alertes} WHERE DATE(Debut_defaut) = %s", (date_str,)) + alertes = cursor.fetchall() + + cursor.close() + conn.close() + + class RapportPDF(FPDF): + def header(self): + self.set_font("Arial", "B", 14) + self.cell(0, 10, "Rapport de surveillance des sondes", ln=1, align="C") + self.set_font("Arial", "", 12) + self.cell(0, 10, f"Date : {date_str}", ln=1, align="C") + self.ln(5) + + def site_info(self, site_name): + self.set_font("Arial", "B", 12) + self.cell(0, 10, f"Site : {site_name}", ln=1) + self.ln(2) + + def releves_section(self, data): + self.set_font("Arial", "B", 12) + self.cell(0, 10, "RelevĂ©s de tempĂ©rature", ln=1) + for sonde, mesures in data.items(): + self.set_font("Arial", "B", 11) + self.cell(0, 8, f"Sonde : {sonde}", ln=1) + self.set_font("Arial", "", 10) + for heure, temp in mesures: + self.cell(0, 6, f"{heure} - {temp} °C", ln=1) + self.ln(2) + + def alertes_section(self, data): + self.set_font("Arial", "B", 12) + self.cell(0, 10, "Alertes enregistrĂ©es", ln=1) + self.set_font("Arial", "", 10) + for a in data: + self.cell(0, 6, f"{a['Sonde']} - {a['Debut_defaut']} - {a['Status']}", ln=1) + + pdf = RapportPDF() + pdf.add_page() + pdf.site_info(site) + pdf.releves_section(releves) + pdf.alertes_section(alertes) + + file_name = f"rapport_{site}_{date_str}.pdf" + output_dir = "PDF" + os.makedirs(output_dir, exist_ok=True) # 🔧 CrĂ©e le dossier si absent + output_path = os.path.join(output_dir, file_name) + + pdf.output(output_path) + + with open(output_path, "rb") as f: + st.download_button( + label="đŸ“„ TĂ©lĂ©charger le rapport PDF", + data=f, + file_name=file_name, + mime="application/pdf" + ) + + except Exception as e: + st.error(f"Erreur lors de la gĂ©nĂ©ration du PDF : {e}") # --- Initialisation session --- if "authenticated" not in st.session_state: st.session_state["authenticated"] = False @@ -61,65 +139,6 @@ with st.sidebar: if st.button("đŸ“„ TĂ©lĂ©charger l’état du jour (PDF)"): site = st.session_state["lieu_autorise"] date_val = st.session_state["selected_date"].strftime("%Y-%m-%d") - def generer_pdf(site, date_str): - releves = { - "Chambre 1": [("06:00", 3.5), ("07:00", 3.2), ("08:00", 3.1)], - "CongĂ©lateur": [("06:00", -18.1), ("07:00", -17.8), ("08:00", -17.5)] - } - alertes = [ - {"Sonde": "Chambre 2", "Debut": f"{date_str} 08:45", "Statut": "En cours"}, - {"Sonde": "CongĂ©lateur", "Debut": f"{date_str} 12:30", "Statut": "AcquittĂ©e"} - ] - - class RapportPDF(FPDF): - def header(self): - self.set_font("Arial", "B", 14) - self.cell(0, 10, "Rapport de surveillance des sondes", ln=1, align="C") - self.set_font("Arial", "", 12) - self.cell(0, 10, f"Date : {date_str}", ln=1, align="C") - self.ln(5) - - def site_info(self, site_name): - self.set_font("Arial", "B", 12) - self.cell(0, 10, f"Site : {site_name}", ln=1) - self.ln(2) - - def releves_section(self, data): - self.set_font("Arial", "B", 12) - self.cell(0, 10, "RelevĂ©s de tempĂ©rature", ln=1) - for sonde, mesures in data.items(): - self.set_font("Arial", "B", 11) - self.cell(0, 8, f"Sonde : {sonde}", ln=1) - self.set_font("Arial", "", 10) - for heure, temp in mesures: - self.cell(0, 6, f"{heure} - {temp} °C", ln=1) - self.ln(2) - - def alertes_section(self, data): - self.set_font("Arial", "B", 12) - self.cell(0, 10, "Alertes enregistrĂ©es", ln=1) - self.set_font("Arial", "", 10) - for a in data: - self.cell(0, 6, f"{a['Sonde']} - {a['Debut']} - {a['Statut']}", ln=1) - - pdf = RapportPDF() - pdf.add_page() - pdf.site_info(site) - pdf.releves_section(releves) - pdf.alertes_section(alertes) - - file_name = f"rapport_{site}_{date_str}.pdf" - output_path =file_name - pdf.output(output_path) - - with open(output_path, "rb") as f: - st.download_button( - label="đŸ“„ TĂ©lĂ©charger le rapport PDF", - data=f, - file_name=file_name, - mime="application/pdf" - ) - generer_pdf(site, date_val) else: st.info("SĂ©lectionnez une date pour activer la gĂ©nĂ©ration PDF.") @@ -180,3 +199,5 @@ if st.session_state["authenticated"]: except Exception as e: st.error(f"Erreur MySQL : {e}") + +