import os import json import pandas as pd from datetime import datetime from modules.logger import log_event DOSSIER_FINANCE = "/DATA/AppData/MULTI-IA-AETHAS38/Finances" FICHIER_AUDIT = os.path.join(DOSSIER_FINANCE, "aethas_financial_audit.json") def initialiser_dossier_finance(): os.makedirs(DOSSIER_FINANCE, exist_ok=True) if not os.path.exists(FICHIER_AUDIT): with open(FICHIER_AUDIT, 'w', encoding='utf-8') as f: json.dump([], f) def generer_export_comptable(): """ Génère un Livre des Recettes Excel conforme URSSAF via Pandas. Idéal pour le calcul direct du Chiffre d'Affaires à déclarer. """ initialiser_dossier_finance() chemin_export = os.path.join(DOSSIER_FINANCE, f"Livre_Recettes_URSSAF_{datetime.now().strftime('%Y_%m')}.xlsx") try: with open(FICHIER_AUDIT, 'r', encoding='utf-8') as f: donnees_brutes = json.load(f) except Exception: donnees_brutes = [] # Formatage strict pour la comptabilité d'auto-entrepreneur lignes_comptables = [] if not donnees_brutes: # Génération d'une ligne d'exemple légale si le fichier est vide lignes_comptables.append({ "Date d'encaissement": datetime.now().strftime("%Y-%m-%d"), "Référence (N° Facture / Chat ID)": "EXEMPLE-001", "Client (Utilisateur)": "Exemple_Client", "Nature de la prestation": "Services techniques IA (Prestation de services)", "Coût API Brut HT (€)": float(transaction.get("cout_brut_api_eur", transaction.get("cout_brut_api", 0.0))), "Marge Commerciale (€)": float(transaction.get("prix_facture_client_eur", 0.0)) - float(transaction.get("cout_brut_api_eur", 0.0)), "Montant encaissé HT (€)": float(transaction.get("prix_facture_client_eur", transaction.get("prix_facture_client", 0.0))) }) else: for transaction in donnees_brutes: cout_brut = float(transaction.get("cout_api", 0.0)) montant_facture = float(transaction.get("montant_facture", 0.0)) lignes_comptables.append({ "Date d'encaissement": transaction.get("date", datetime.now().strftime("%Y-%m-%d")), "Référence (N° Facture / Chat ID)": transaction.get("id", "N/A"), "Client (Utilisateur)": transaction.get("utilisateur", "Inconnu"), "Nature de la prestation": f"Requête IA - {transaction.get('modele', 'Multi-modèle')}", "Coût API Brut HT (€)": cout_brut, "Marge Commerciale (€)": montant_facture - cout_brut, "Montant encaissé HT (€)": montant_facture }) # Création du DataFrame Pandas df = pd.DataFrame(lignes_comptables) # Calcul des totaux pour le TCD total_ca = df["Montant encaissé HT (€)"].sum() total_marge = df["Marge Commerciale (€)"].sum() # Création du fichier Excel avec onglets multiples via Openpyxl with pd.ExcelWriter(chemin_export, engine='openpyxl') as writer: df.to_excel(writer, sheet_name="Livre des Recettes", index=False) # Onglet de synthèse analytique resume = pd.DataFrame({ "Indicateur Financier": ["Chiffre d'Affaires Total (Déclaration URSSAF)", "Coûts d'Infrastructure (API)", "Bénéfice Net Estimé"], "Montant (€)": [total_ca, df["Coût API Brut HT (€)"].sum(), total_marge] }) resume.to_excel(writer, sheet_name="Synthèse_Fiscale", index=False) # Accès aux feuilles pour le formatage esthétique workbook = writer.book worksheet = writer.sheets["Livre des Recettes"] worksheet.insert_rows(1) worksheet.cell(row=1, column=1, value="AETHAS38 - Siège : Charvieu-Chavagneux (38230) - Registre des recettes") worksheet.column_dimensions['A'].width = 18 worksheet.column_dimensions['C'].width = 20 worksheet.column_dimensions['D'].width = 45 log_event("INFO", "FINANCE", f"Export comptable généré : {chemin_export}") return chemin_export