refactor: Revise mandatory invoice field assignment by removing payment and tax calculation fields, and adding VAT regime and transaction type.

This commit is contained in:
Fanilo-Nantenaina 2025-11-28 11:47:50 +03:00
parent 8b676f7195
commit 5abeaebf56

View file

@ -1355,138 +1355,91 @@ class SageConnector:
# ÉTAPE 8 : COMPLÉTER LES CHAMPS OBLIGATOIRES POUR FACTURE # ÉTAPE 8 : COMPLÉTER LES CHAMPS OBLIGATOIRES POUR FACTURE
# ======================================== # ========================================
if type_cible == 60: # Facture if type_cible == 60: # Facture
logger.info("[TRANSFORM] Completion champs obligatoires facture...") logger.info(
"[TRANSFORM] Completion champs obligatoires facture..."
# 1. Mode de règlement (CRITIQUE) )
try:
mode_reglement = None # 1. Code journal (SEUL CHAMP VRAIMENT CRITIQUE)
# Essayer de récupérer du client
if client_obj_cible:
try:
mode_reglement = getattr(client_obj_cible, 'CT_ModeRegl', None)
if mode_reglement is not None:
logger.info(f"[TRANSFORM] Mode reglement client: {mode_reglement}")
except:
pass
# Si pas trouvé, utiliser celui du document source
if mode_reglement is None:
try:
mode_reglement = getattr(doc_source, 'DO_ModeRegl', None)
if mode_reglement is not None:
logger.info(f"[TRANSFORM] Mode reglement source: {mode_reglement}")
except:
pass
# Forcer une valeur par défaut si toujours None
if mode_reglement is None:
mode_reglement = 0 # 0 = Aucun
logger.info("[TRANSFORM] Mode reglement defaut: 0 (Aucun)")
doc_cible.DO_ModeRegl = mode_reglement
except Exception as e:
logger.error(f"[TRANSFORM] Erreur mode reglement: {e}")
raise
# 2. Conditions de règlement
try:
cond_reglement = None
if client_obj_cible:
try:
cond_reglement = getattr(client_obj_cible, 'CT_CondRegl', None)
if cond_reglement is not None:
doc_cible.DO_CondRegl = cond_reglement
logger.info(f"[TRANSFORM] Conditions reglement: {cond_reglement}")
except:
pass
# Fallback sur document source
if cond_reglement is None:
try:
cond_reglement = getattr(doc_source, 'DO_CondRegl', None)
if cond_reglement is not None:
doc_cible.DO_CondRegl = cond_reglement
except:
pass
except Exception as e:
logger.warning(f"[TRANSFORM] Conditions reglement non definies: {e}")
# 3. Code journal (CRITIQUE pour comptabilisation)
try: try:
journal = None journal = None
# Essayer de récupérer du document source # Essayer de récupérer du document source
try: try:
journal = getattr(doc_source, 'DO_CodeJournal', None) journal = getattr(doc_source, "DO_CodeJournal", None)
if journal: if journal:
logger.info(f"[TRANSFORM] Journal source: {journal}") logger.info(
f"[TRANSFORM] Journal source: {journal}"
)
except: except:
pass pass
# Si pas trouvé, essayer le journal par défaut de Sage # Si pas trouvé, utiliser "VTE" (Ventes - confirmé existant dans votre config)
if not journal: if not journal:
try: journal = "VTE"
# Récupérer le paramètre société logger.info("[TRANSFORM] Journal par defaut: VTE")
param_societe = self.cial.CptaApplication.ParametreSociete
if param_societe: # Vérifier si le champ existe avant de l'assigner
# Journal vente par défaut if hasattr(doc_cible, "DO_CodeJournal"):
journal = getattr(param_societe, 'P_CodeJournalVte', 'VE') doc_cible.DO_CodeJournal = journal
logger.info(f"[TRANSFORM] Journal societe: {journal}") logger.info(
except: f"[TRANSFORM] Code journal defini: {journal}"
pass )
else:
# Dernier recours : "VE" (standard Sage) logger.warning(
if not journal: "[TRANSFORM] DO_CodeJournal inexistant sur ce document"
journal = "VE" )
logger.info("[TRANSFORM] Journal par defaut: VE")
doc_cible.DO_CodeJournal = journal
except Exception as e: except Exception as e:
logger.error(f"[TRANSFORM] Erreur code journal: {e}") # Le journal n'est peut-être pas obligatoire sur votre installation
raise logger.warning(
f"[TRANSFORM] Impossible de definir code journal: {e}"
# 4. Souche de numérotation )
# 2. Souche de numérotation (copie depuis source)
try: try:
souche = getattr(doc_source, 'DO_Souche', 0) souche = getattr(doc_source, "DO_Souche", 0)
doc_cible.DO_Souche = souche if hasattr(doc_cible, "DO_Souche"):
logger.info(f"[TRANSFORM] Souche: {souche}") doc_cible.DO_Souche = souche
logger.info(f"[TRANSFORM] Souche: {souche}")
except Exception as e: except Exception as e:
logger.warning(f"[TRANSFORM] Erreur souche: {e}") logger.debug(f"[TRANSFORM] Souche non definie: {e}")
try:
doc_cible.DO_Souche = 0 # 3. Régime de TVA (si présent)
except:
pass
# 5. Type de calcul (taxes)
try: try:
type_calcul = getattr(doc_source, 'DO_TypeCalcul', None) regime = getattr(doc_source, "DO_Regime", None)
if type_calcul is not None: if regime is not None and hasattr(doc_cible, "DO_Regime"):
doc_cible.DO_TypeCalcul = type_calcul doc_cible.DO_Regime = regime
logger.info(f"[TRANSFORM] Type calcul: {type_calcul}") logger.info(f"[TRANSFORM] Regime TVA: {regime}")
except Exception as e: except Exception as e:
logger.debug(f"[TRANSFORM] Type calcul non defini: {e}") logger.debug(f"[TRANSFORM] Regime TVA non defini: {e}")
# 6. Code taxe (important si TVA) # 4. Type de transaction (si présent)
try: try:
code_taxe = getattr(doc_source, 'DO_CodeTaxe1', None) transaction = getattr(doc_source, "DO_Transaction", None)
if code_taxe is not None: if transaction is not None and hasattr(
doc_cible.DO_CodeTaxe1 = code_taxe doc_cible, "DO_Transaction"
logger.info(f"[TRANSFORM] Code taxe: {code_taxe}") ):
doc_cible.DO_Transaction = transaction
logger.info(f"[TRANSFORM] Transaction: {transaction}")
except Exception as e: except Exception as e:
logger.debug(f"[TRANSFORM] Code taxe non defini: {e}") logger.debug(f"[TRANSFORM] Transaction non definie: {e}")
# 7. Écrire le document avec tous les champs # 5. Domaine (Vente = 0)
logger.info("[TRANSFORM] Ecriture document avec champs obligatoires...") try:
if hasattr(doc_cible, "DO_Domaine"):
doc_cible.DO_Domaine = 0 # 0 = Vente
logger.info("[TRANSFORM] Domaine: 0 (Vente)")
except Exception as e:
logger.debug(f"[TRANSFORM] Domaine non defini: {e}")
# Écrire le document avec les champs complétés
logger.info(
"[TRANSFORM] Ecriture document avec champs completes..."
)
doc_cible.Write() doc_cible.Write()
# ============================================================================== # ==============================================================================
# PARTIE 3 : AMÉLIORATION ÉTAPE 9 - Validation avec diagnostic détaillé # ÉTAPE 9 : VALIDATION SIMPLIFIÉE (à remplacer aussi)
# ============================================================================== # ==============================================================================
# ======================================== # ========================================
@ -1494,33 +1447,37 @@ class SageConnector:
# ======================================== # ========================================
logger.info("[TRANSFORM] Validation document cible...") logger.info("[TRANSFORM] Validation document cible...")
# Relire pour vérifier que tout est OK # Relire pour vérifier
doc_cible.Read() doc_cible.Read()
# Diagnostic pré-validation # Diagnostic pré-validation (uniquement champs existants)
logger.info("[TRANSFORM] === PRE-VALIDATION CHECK ===") logger.info("[TRANSFORM] === PRE-VALIDATION CHECK ===")
champs_critiques = {
"Type": getattr(doc_cible, 'DO_Type', '?'),
"Client": getattr(doc_cible, 'CT_Num', '?'),
"Date": getattr(doc_cible, 'DO_Date', '?'),
"Mode reglement": getattr(doc_cible, 'DO_ModeRegl', '?'),
"Code journal": getattr(doc_cible, 'DO_CodeJournal', '?'),
"Souche": getattr(doc_cible, 'DO_Souche', '?'),
"Statut": getattr(doc_cible, 'DO_Statut', '?'),
}
for nom, valeur in champs_critiques.items(): # Liste des champs à vérifier (avec hasattr pour éviter les erreurs)
logger.info(f" {nom}: {valeur}") champs_a_verifier = [
"DO_Type",
"CT_Num",
"DO_Date",
"DO_CodeJournal",
"DO_Souche",
"DO_Statut",
"DO_Regime",
"DO_Transaction",
]
# Vérifier que les champs critiques ne sont pas vides for champ in champs_a_verifier:
try:
if hasattr(doc_cible, champ):
valeur = getattr(doc_cible, champ, "?")
logger.info(f" {champ}: {valeur}")
except:
pass
# Vérifier UNIQUEMENT les champs absolument critiques
champs_manquants = [] champs_manquants = []
if not getattr(doc_cible, 'CT_Num', None):
if not getattr(doc_cible, "CT_Num", None):
champs_manquants.append("Client (CT_Num)") champs_manquants.append("Client (CT_Num)")
if type_cible == 60: # Facture
if not getattr(doc_cible, 'DO_CodeJournal', None):
champs_manquants.append("Code journal (DO_CodeJournal)")
if getattr(doc_cible, 'DO_ModeRegl', None) is None:
champs_manquants.append("Mode reglement (DO_ModeRegl)")
if champs_manquants: if champs_manquants:
erreur = f"Champs obligatoires manquants: {', '.join(champs_manquants)}" erreur = f"Champs obligatoires manquants: {', '.join(champs_manquants)}"
@ -1532,23 +1489,29 @@ class SageConnector:
logger.info("[TRANSFORM] Appel Process()...") logger.info("[TRANSFORM] Appel Process()...")
process.Process() process.Process()
logger.info("[TRANSFORM] Document cible valide avec succes") logger.info("[TRANSFORM] Document cible valide avec succes")
except Exception as e: except Exception as e:
logger.error(f"[TRANSFORM] ERREUR Process(): {e}") logger.error(f"[TRANSFORM] ERREUR Process(): {e}")
logger.error("[TRANSFORM] === DIAGNOSTIC COMPLET ===") logger.error("[TRANSFORM] === DIAGNOSTIC COMPLET ===")
# Afficher TOUS les attributs du document # Afficher uniquement les attributs DO_ et CT_ qui existent
try: try:
for attr in dir(doc_cible): attributs_doc = [
if attr.startswith('DO_') or attr.startswith('CT_'): attr
try: for attr in dir(doc_cible)
valeur = getattr(doc_cible, attr, 'N/A') if (attr.startswith("DO_") or attr.startswith("CT_"))
logger.error(f" {attr}: {valeur}") and not callable(getattr(doc_cible, attr, None))
except: ]
pass
for attr in sorted(attributs_doc):
try:
valeur = getattr(doc_cible, attr, "N/A")
logger.error(f" {attr}: {valeur}")
except:
pass
except: except:
pass pass
raise raise
# ======================================== # ========================================