87 lines
3.5 KiB
Python
87 lines
3.5 KiB
Python
# Insertion des tableaux excel dans les tables respectives(Meudon & Roissy).
|
||
import streamlit as st
|
||
import pandas as pd
|
||
import mysql.connector
|
||
|
||
# 🔐 Identifiants MySQL
|
||
MYSQL_HOST = "54.36.188.119"
|
||
MYSQL_USER = "michel"
|
||
MYSQL_PASSWORD = "#SO2&1nf%mZ@jfh"
|
||
|
||
# Connexion à la base MySQL
|
||
def get_connection(database_name):
|
||
return mysql.connector.connect(
|
||
host=MYSQL_HOST,
|
||
user=MYSQL_USER,
|
||
password=MYSQL_PASSWORD,
|
||
database=database_name
|
||
)
|
||
|
||
# Fonction d'insertion
|
||
def inserer_donnees(conn, data, date_choisie):
|
||
cursor = conn.cursor()
|
||
for _, row in data.iterrows():
|
||
cursor.execute("""
|
||
INSERT INTO Inventaire (Id_Article, Quantité, Prix, Date)
|
||
VALUES (%s, %s, %s, %s)
|
||
""", (row['Id_Article'], row['Quantité'], row['Prix'], date_choisie))
|
||
conn.commit()
|
||
cursor.close()
|
||
|
||
# Interface Streamlit
|
||
st.title("📦 Import Inventaire dans MySQL")
|
||
|
||
uploaded_file = st.file_uploader("📥 Charger le fichier Excel (.xlsx)", type="xlsx")
|
||
|
||
if uploaded_file:
|
||
try:
|
||
df = pd.read_excel(uploaded_file, sheet_name="Inventaire", usecols="C:E", header=1)
|
||
df.columns = ["Id_Article", "Prix", "Quantité"]
|
||
df = df[["Id_Article", "Quantité", "Prix"]] # Réorganisation
|
||
|
||
# Nettoyage : retirer les lignes où Quantité est vide ou invalide
|
||
df = df.dropna(subset=["Quantité"])
|
||
df = df[df["Quantité"].astype(str).str.strip() != ""]
|
||
df = df[pd.to_numeric(df["Quantité"], errors='coerce').notnull()]
|
||
|
||
colonnes_attendues = ["Id_Article", "Quantité", "Prix"]
|
||
if all(col in df.columns for col in colonnes_attendues):
|
||
st.success("✅ Fichier reconnu")
|
||
st.dataframe(df)
|
||
# 🔍 Validation des types pour Quantité et Prix
|
||
try:
|
||
df["Quantité"] = df["Quantité"].astype(float).round(2)
|
||
df["Prix"] = df["Prix"].astype(float).round(2)
|
||
except ValueError as ve:
|
||
st.error("❌ Erreur : La colonne 'Quantité' ou 'Prix' contient une valeur non numérique.")
|
||
st.stop()
|
||
|
||
# ✅ Optionnel : vérifier qu’aucune valeur n’est négative
|
||
if (df["Quantité"] < 0).any() or (df["Prix"] < 0).any():
|
||
st.warning("⚠️ Certaines valeurs de 'Quantité' ou 'Prix' sont négatives.")
|
||
|
||
date_choisie = st.date_input("🗓️ Choisir la date pour cet inventaire")
|
||
# Mapping affichage vers noms de base MySQL
|
||
base_mapping = {
|
||
"Roissy": "Roissy",
|
||
"Meudon": "Meudon"
|
||
}
|
||
|
||
base_affichee = st.selectbox("📍 Choisir la base de destination", list(base_mapping.keys()))
|
||
nom_base_mysql = base_mapping[base_affichee]
|
||
|
||
if st.button("✅ Insérer dans la base sélectionnée"):
|
||
try:
|
||
conn = get_connection(nom_base_mysql)
|
||
inserer_donnees(conn, df, date_choisie)
|
||
conn.close()
|
||
st.balloons()
|
||
st.success(f"✅ Insertion réussie dans {base_affichee}")
|
||
st.toast(f"{len(df)} lignes ajoutées pour la date {date_choisie}", icon="📦")
|
||
except Exception as e:
|
||
st.error(f"❌ Erreur lors de l'insertion : {e}")
|
||
else:
|
||
st.error(f"❌ Le fichier doit contenir les colonnes : {colonnes_attendues}")
|
||
except Exception as e:
|
||
st.error(f"❌ Erreur de lecture du fichier : {e}")
|