Public Access
87 lines
4.1 KiB
Python
87 lines
4.1 KiB
Python
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 |