diff --git a/faircot.py b/faircot.py new file mode 100644 index 0000000..e5f7372 --- /dev/null +++ b/faircot.py @@ -0,0 +1,93 @@ +import pandas as pd +import pyodbc +from sqlalchemy import create_engine, text, inspect +import re +import random +import string + +# Connexion SQL Server +sql_server_conn_str = ( + "DRIVER={ODBC Driver 18 for SQL Server};" + "SERVER=VPS88.DATACENTER.CSTI;" + "DATABASE=FAIRCOT_RC;" + "UID=SINGA_META;" + "PWD=Start.123;" + "TrustServerCertificate=yes;" +) + +sql_conn = pyodbc.connect(sql_server_conn_str) + +# Lire toute la vue +query = "SELECT * FROM [SINGA_VW_EXECUTION_FOLLOW_UP_BY_AGENT]" +df = pd.read_sql(query, sql_conn) +print("Colonnes chargées depuis la vue :") +print(df.columns.tolist()) + +# Connexion PostgreSQL +pg_user = "metabase" +pg_password = "dsproject" +pg_host = "localhost" +pg_port = "5432" +pg_db = "faircot" + +pg_conn_str = f"postgresql://{pg_user}:{pg_password}@{pg_host}:{pg_port}/{pg_db}" +pg_engine = create_engine(pg_conn_str) + +# Nettoyage des noms +def normalize_name(name): + return re.sub(r'\W+', '_', name.strip().lower()) + +# Génération d'un mot de passe fort (utile si tu crées les users) +def generate_password(length=12): + return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) + +# Obtenir la liste unique des agents et clients +agents = df['Agent'].dropna().unique() +clients = df['Customer'].dropna().unique() + +inspector = inspect(pg_engine) + +# Connexion brute pour exécuter DELETE/TRUNCATE +with pg_engine.connect() as conn: + trans = conn.begin() # démarrer transaction + try: + for agent in agents: + norm_name = normalize_name(str(agent)) + table_name = f"agent_{norm_name}" + + agent_df = df[df['Agent'] == agent].copy() + + if table_name in inspector.get_table_names(): + # La table existe → on la vide puis on recharge + conn.execute(text(f'DELETE FROM "{table_name}";')) + trans.commit() # valider le DELETE + trans = conn.begin() # redémarrer transaction + agent_df.to_sql(table_name, pg_engine, if_exists="append", index=False) + print(f"♻️ Table mise à jour : {table_name} ({len(agent_df)} lignes)") + else: + # La table n’existe pas → on la crée + agent_df.to_sql(table_name, pg_engine, if_exists="replace", index=False) + print(f"✅ Table créée : {table_name} ({len(agent_df)} lignes)") + + for client in clients: + norm_name = normalize_name(str(client)) + table_name = f"customer_{norm_name}" + + client_df = df[df['Customer'] == client].copy() + + if table_name in inspector.get_table_names(): + conn.execute(text(f'DELETE FROM "{table_name}";')) + trans.commit() # valider le DELETE + trans = conn.begin() + client_df.to_sql(table_name, pg_engine, if_exists="append", index=False) + print(f"♻️ Table mise à jour : {table_name} ({len(client_df)} lignes)") + else: + client_df.to_sql(table_name, pg_engine, if_exists="replace", index=False) + print(f"✅ Table créée : {table_name} ({len(client_df)} lignes)") + + trans.commit() + except Exception as e: + trans.rollback() + print("⚠️ Erreur :", e) + +print("\n🎉 Transfert terminé (tables créées ou mises à jour, droits conservés).")