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:
parent
8b676f7195
commit
5abeaebf56
1 changed files with 108 additions and 145 deletions
|
|
@ -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
|
||||
|
||||
# ========================================
|
||||
|
|
|
|||
Loading…
Reference in a new issue