diff --git a/sage_connector.py b/sage_connector.py index 9eeb42f..0046bd1 100644 --- a/sage_connector.py +++ b/sage_connector.py @@ -1355,138 +1355,91 @@ class SageConnector: # ÉTAPE 8 : COMPLÉTER LES CHAMPS OBLIGATOIRES POUR FACTURE # ======================================== if type_cible == 60: # Facture - logger.info("[TRANSFORM] Completion champs obligatoires facture...") - - # 1. Mode de règlement (CRITIQUE) - try: - mode_reglement = None - - # 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) + logger.info( + "[TRANSFORM] Completion champs obligatoires facture..." + ) + + # 1. Code journal (SEUL CHAMP VRAIMENT CRITIQUE) try: journal = None - + # Essayer de récupérer du document source try: - journal = getattr(doc_source, 'DO_CodeJournal', None) + journal = getattr(doc_source, "DO_CodeJournal", None) if journal: - logger.info(f"[TRANSFORM] Journal source: {journal}") + logger.info( + f"[TRANSFORM] Journal source: {journal}" + ) except: 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: - try: - # Récupérer le paramètre société - param_societe = self.cial.CptaApplication.ParametreSociete - if param_societe: - # Journal vente par défaut - journal = getattr(param_societe, 'P_CodeJournalVte', 'VE') - logger.info(f"[TRANSFORM] Journal societe: {journal}") - except: - pass - - # Dernier recours : "VE" (standard Sage) - if not journal: - journal = "VE" - logger.info("[TRANSFORM] Journal par defaut: VE") - - doc_cible.DO_CodeJournal = journal - + journal = "VTE" + logger.info("[TRANSFORM] Journal par defaut: VTE") + + # Vérifier si le champ existe avant de l'assigner + if hasattr(doc_cible, "DO_CodeJournal"): + doc_cible.DO_CodeJournal = journal + logger.info( + f"[TRANSFORM] Code journal defini: {journal}" + ) + else: + logger.warning( + "[TRANSFORM] DO_CodeJournal inexistant sur ce document" + ) + except Exception as e: - logger.error(f"[TRANSFORM] Erreur code journal: {e}") - raise - - # 4. Souche de numérotation + # Le journal n'est peut-être pas obligatoire sur votre installation + logger.warning( + f"[TRANSFORM] Impossible de definir code journal: {e}" + ) + + # 2. Souche de numérotation (copie depuis source) try: - souche = getattr(doc_source, 'DO_Souche', 0) - doc_cible.DO_Souche = souche - logger.info(f"[TRANSFORM] Souche: {souche}") + souche = getattr(doc_source, "DO_Souche", 0) + if hasattr(doc_cible, "DO_Souche"): + doc_cible.DO_Souche = souche + logger.info(f"[TRANSFORM] Souche: {souche}") except Exception as e: - logger.warning(f"[TRANSFORM] Erreur souche: {e}") - try: - doc_cible.DO_Souche = 0 - except: - pass - - # 5. Type de calcul (taxes) + logger.debug(f"[TRANSFORM] Souche non definie: {e}") + + # 3. Régime de TVA (si présent) try: - type_calcul = getattr(doc_source, 'DO_TypeCalcul', None) - if type_calcul is not None: - doc_cible.DO_TypeCalcul = type_calcul - logger.info(f"[TRANSFORM] Type calcul: {type_calcul}") + regime = getattr(doc_source, "DO_Regime", None) + if regime is not None and hasattr(doc_cible, "DO_Regime"): + doc_cible.DO_Regime = regime + logger.info(f"[TRANSFORM] Regime TVA: {regime}") except Exception as e: - logger.debug(f"[TRANSFORM] Type calcul non defini: {e}") - - # 6. Code taxe (important si TVA) + logger.debug(f"[TRANSFORM] Regime TVA non defini: {e}") + + # 4. Type de transaction (si présent) try: - code_taxe = getattr(doc_source, 'DO_CodeTaxe1', None) - if code_taxe is not None: - doc_cible.DO_CodeTaxe1 = code_taxe - logger.info(f"[TRANSFORM] Code taxe: {code_taxe}") + transaction = getattr(doc_source, "DO_Transaction", None) + if transaction is not None and hasattr( + doc_cible, "DO_Transaction" + ): + doc_cible.DO_Transaction = transaction + logger.info(f"[TRANSFORM] Transaction: {transaction}") except Exception as e: - logger.debug(f"[TRANSFORM] Code taxe non defini: {e}") - - # 7. Écrire le document avec tous les champs - logger.info("[TRANSFORM] Ecriture document avec champs obligatoires...") + logger.debug(f"[TRANSFORM] Transaction non definie: {e}") + + # 5. Domaine (Vente = 0) + 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() - # ============================================================================== - # 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...") - # Relire pour vérifier que tout est OK + # Relire pour vérifier doc_cible.Read() - # Diagnostic pré-validation + # Diagnostic pré-validation (uniquement champs existants) 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(): - logger.info(f" {nom}: {valeur}") + # Liste des champs à vérifier (avec hasattr pour éviter les erreurs) + 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 = [] - if not getattr(doc_cible, 'CT_Num', None): + + if not getattr(doc_cible, "CT_Num", None): 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: erreur = f"Champs obligatoires manquants: {', '.join(champs_manquants)}" @@ -1532,23 +1489,29 @@ class SageConnector: logger.info("[TRANSFORM] Appel Process()...") process.Process() logger.info("[TRANSFORM] Document cible valide avec succes") - + except Exception as e: logger.error(f"[TRANSFORM] ERREUR Process(): {e}") logger.error("[TRANSFORM] === DIAGNOSTIC COMPLET ===") - - # Afficher TOUS les attributs du document + + # Afficher uniquement les attributs DO_ et CT_ qui existent try: - for attr in dir(doc_cible): - if attr.startswith('DO_') or attr.startswith('CT_'): - try: - valeur = getattr(doc_cible, attr, 'N/A') - logger.error(f" {attr}: {valeur}") - except: - pass + attributs_doc = [ + attr + for attr in dir(doc_cible) + if (attr.startswith("DO_") or attr.startswith("CT_")) + and not callable(getattr(doc_cible, attr, None)) + ] + + for attr in sorted(attributs_doc): + try: + valeur = getattr(doc_cible, attr, "N/A") + logger.error(f" {attr}: {valeur}") + except: + pass except: pass - + raise # ========================================