File size: 5,380 Bytes
72b45b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1efb0d1
 
72b45b0
 
 
 
 
 
 
 
 
 
1efb0d1
 
72b45b0
 
 
 
 
 
 
 
 
 
 
 
 
 
1efb0d1
 
 
1ae7d42
 
72b45b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ae7d42
 
 
 
 
 
 
 
 
 
72b45b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import streamlit as st
import pandas as pd
import re
from datetime import datetime
import pdfplumber
import plotly.express as px
import io

def extract_data_from_pdf(pdf_content):
    data_list = []
    current_record = {}
    
    for line in pdf_content.split('\n'):
        # Extract header information
        if 'Entreprise::' in line:
            if current_record and 'temperature_data' in current_record:
                data_list.append(current_record)
            current_record = {'temperature_data': []}
        
        # Extract metadata
        if 'Date:' in line:
            try:
                date_str = re.search(r'Date:\s*(\d{2}[./]\d{2}[./]\d{4})', line).group(1)
                date_str = date_str.replace('/', '.')
                current_record['date'] = datetime.strptime(date_str, '%d.%m.%Y').strftime('%Y-%m-%d')
            except:
                current_record['date'] = None
        
        if 'Produit:' in line:
            current_record['produit'] = line.split('Produit:')[-1].strip()
        
        if 'Utilisateur:' in line:
            current_record['utilisateur'] = line.split('Utilisateur:')[-1].strip()
        
        # Extract temperature data
        if any(x in line for x in ['Début', '+ ', 'Fin']) and '°C' in line:
            try:
                parts = line.strip().split()
                time = parts[0] if 'Début' in line or 'Fin' in line else parts[1]
                
                # Extract temperature values
                temp_sterilisateur = float(parts[-3].replace('°C', ''))
                temp_coeur = float(parts[-2].replace('°C', ''))
                valeur_f = float(parts[-1])
                
                current_record['temperature_data'].append({
                    'temps': time,
                    'temp_sterilisateur': temp_sterilisateur,
                    'temp_coeur': temp_coeur,
                    'valeur_f': valeur_f
                })
            except Exception as e:
                # If extraction fails, skip the line
                continue
    
    # Add last record
    if current_record and 'temperature_data' in current_record:
        data_list.append(current_record)
    
    return data_list

def analyze_sterilization(data):
    results = []
    
    for record in data:
        temp_data = pd.DataFrame(record['temperature_data'])
        
        # Skip if temperature data is empty
        if temp_data.empty:
            st.warning(f"Données de température manquantes pour l'enregistrement du {record['date']}")
            continue
        
        # Determine product type and required temperature
        is_nutabreizh = 'NutaBreizh' in record['produit']
        required_temp = 108 if is_nutabreizh else 103
        
        # Count minutes at required temperature
        minutes_at_temp = len(temp_data[temp_data['temp_coeur'] >= required_temp])
        
        # Calculate max temperatures
        max_temp_sterilisateur = temp_data['temp_sterilisateur'].max()
        max_temp_coeur = temp_data['temp_coeur'].max()
        
        # Determine if criteria met
        criteria_met = minutes_at_temp >= 30
        
        results.append({
            'Date': record['date'],
            'Produit': record['produit'],
            'Utilisateur': record['utilisateur'],
            'Temperature_Requise': required_temp,
            'Minutes_Temperature_Requise': minutes_at_temp,
            'Temperature_Max_Sterilisateur': max_temp_sterilisateur,
            'Temperature_Max_Coeur': max_temp_coeur,
            'Criteres_Respectes': criteria_met
        })
    
    return pd.DataFrame(results)

def main():
    st.title("Analyse des Protocoles de Stérilisation")
    
    uploaded_file = st.file_uploader("Choisir un fichier PDF", type="pdf")
    
    if uploaded_file is not None:
        # Read PDF content
        pdf_text = ""
        with pdfplumber.open(uploaded_file) as pdf:
            for page in pdf.pages:
                pdf_text += page.extract_text() + "\n"
        
        # Process data
        data = extract_data_from_pdf(pdf_text)
        results_df = analyze_sterilization(data)
        
        # Display results
        st.subheader("Résultats de l'analyse")
        st.dataframe(results_df)
        
        # Create visualization
        if not results_df.empty:
            fig = px.scatter(results_df, 
                            x='Date', 
                            y='Minutes_Temperature_Requise',
                            color='Criteres_Respectes',
                            hover_data=['Produit', 'Temperature_Requise'],
                            title="Minutes à température requise par production")
            st.plotly_chart(fig)
        else:
            st.warning("Aucune donnée valide à afficher.")
        
        # Export button
        if st.button("Exporter en Excel"):
            output = io.BytesIO()
            with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
                results_df.to_excel(writer, index=False)
            
            output.seek(0)
            st.download_button(
                label="Télécharger l'analyse",
                data=output,
                file_name="analyse_sterilisation.xlsx",
                mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
            )

if __name__ == "__main__":
    main()