refactored create client method to align IBOClientFactory3's requirement

This commit is contained in:
Fanilo-Nantenaina 2025-12-05 20:29:21 +03:00
parent e8558e207b
commit 914ea61243

View file

@ -2378,7 +2378,7 @@ class SageConnector:
def creer_client(self, client_data: Dict) -> Dict:
"""
Crée un nouveau client dans Sage 100c via l'API COM,
en utilisant CreateNew() pour obtenir l'objet concret.
en utilisant Create() pour obtenir l'objet Tiers.
"""
if not self.cial:
raise RuntimeError("Connexion Sage non établie")
@ -2388,22 +2388,28 @@ class SageConnector:
# 1. Accès à la Factory Client (CptaApplication si Tiers)
factory_client = self.cial.CptaApplication.FactoryClient
# CORRECTION CRITIQUE: Utiliser CreateNew() pour obtenir l'objet Tiers concret
client = factory_client.CreateNew()
# ✅ CORRECTION CRITIQUE: Utiliser Create() au lieu de CreateNew()
persist_client = factory_client.Create()
if not persist_client:
raise RuntimeError("Factory.Create() a retourné None")
# Cast en IBOClient3 pour accéder aux propriétés
client = win32com.client.CastTo(persist_client, "IBOClient3")
# 2. Remplissage des Champs OBLIGATOIRES (Conformes F_COMPTET)
# CT_Num (Numéro de compte)
# CT_Num (Numéro de compte) - Optionnel si auto-numérotation
num_prop = client_data.get("num", "")
if num_prop:
# S'assurer que le numéro est en majuscule (conforme Alpha Majuscule)
client.CT_Num = num_prop.upper()
# CT_Intitule - Si cette ligne échoue, l'objet créé n'est pas bon.
# CT_Intitule - OBLIGATOIRE
client.CT_Intitule = client_data["intitule"]
client.CT_Type = 0 # 0 = Client
# CORRECTION : Utiliser CT_CompteG (mappé à CG_NumPrinc)
# CORRECTION : Utiliser CT_CompteG (mappé à CG_NumPrinc)
if client_data.get("compte_collectif"):
client.CT_CompteG = client_data["compte_collectif"]
@ -2415,46 +2421,68 @@ class SageConnector:
client.N_Condition = 1
client.N_Risque = 1
# CT_NumPayeur doit être défini, souvent égal à CT_Num
client.CT_NumPayeur = client.CT_Num
# CT_NumPayeur doit être défini - Si pas de num, sera auto-généré
if num_prop:
client.CT_NumPayeur = num_prop.upper()
# 3. CHAMPS OPTIONNELS
# --- Adresse principale (Accès via sous-objet Adresse) ---
# Ajout d'une gestion d'erreur sur l'accès aux sous-objets car ils peuvent varier
try:
if client_data.get("adresse"): client.Adresse.Adresse = client_data["adresse"]
if client_data.get("code_postal"): client.Adresse.CodePostal = client_data["code_postal"]
if client_data.get("ville"): client.Adresse.Ville = client_data["ville"]
if client_data.get("pays"): client.Adresse.Pays = client_data["pays"]
if client_data.get("adresse"):
client.Adresse.Adresse = client_data["adresse"]
if client_data.get("code_postal"):
client.Adresse.CodePostal = client_data["code_postal"]
if client_data.get("ville"):
client.Adresse.Ville = client_data["ville"]
if client_data.get("pays"):
client.Adresse.Pays = client_data["pays"]
except Exception as e:
logger.warning(f"Impossible de définir l'adresse: {e}")
# --- Contact / Télécom (Accès via sous-objet Telecom) ---
try:
if client_data.get("telephone"): client.Telecom.Telephone = client_data["telephone"]
if client_data.get("email"): client.Telecom.EMail = client_data["email"]
if client_data.get("telephone"):
client.Telecom.Telephone = client_data["telephone"]
if client_data.get("email"):
client.Telecom.EMail = client_data["email"]
except Exception as e:
logger.warning(f"Impossible de définir les télécoms: {e}")
# --- Identifiants ---
if client_data.get("siret"): client.CT_Siret = client_data["siret"]
if client_data.get("tva_intra"): client.CT_Identifiant = client_data["tva_intra"]
if client_data.get("siret"):
client.CT_Siret = client_data["siret"]
if client_data.get("tva_intra"):
client.CT_Identifiant = client_data["tva_intra"]
# 4. Écriture en base
client.Write()
# ✅ IMPORTANT: Relire pour récupérer le numéro auto-généré
client.Read()
num_final = client.CT_Num
logger.info(f"✅ Client créé et conforme: {num_final} - {client.CT_Intitule}")
if not num_final:
raise RuntimeError("CT_Num vide après Write() - création échouée")
logger.info(f"✅ Client créé: {num_final} - {client.CT_Intitule}")
# ✅ Forcer le refresh du cache pour que le nouveau client soit visible
self._refresh_cache_clients()
return {
"numero": num_final,
"intitule": client.CT_Intitule,
"compte_collectif": getattr(client, "CT_CompteG", "")
"compte_collectif": getattr(client, "CT_CompteG", ""),
"adresse": client_data.get("adresse"),
"ville": client_data.get("ville"),
"email": client_data.get("email")
}
except Exception as e:
logger.error(f"❌ Erreur création client: {e}", exc_info=True)
# Gestion d'erreur remontant l'erreur COM détaillée (si disponible)
error_message = str(e)
if self.cial: