Delete contact successful
This commit is contained in:
parent
7f64a2a548
commit
800d828f75
1 changed files with 78 additions and 70 deletions
|
|
@ -7223,7 +7223,7 @@ class SageConnector:
|
||||||
def definir_contact_defaut(self, numero: str, contact_numero: int) -> Dict:
|
def definir_contact_defaut(self, numero: str, contact_numero: int) -> Dict:
|
||||||
"""
|
"""
|
||||||
Définit un contact comme contact par défaut du client
|
Définit un contact comme contact par défaut du client
|
||||||
VERSION CORRIGÉE pour Sage 100
|
VERSION REFACTORISÉE
|
||||||
"""
|
"""
|
||||||
if not self.cial:
|
if not self.cial:
|
||||||
raise RuntimeError("Connexion Sage non établie")
|
raise RuntimeError("Connexion Sage non établie")
|
||||||
|
|
@ -7231,54 +7231,31 @@ class SageConnector:
|
||||||
try:
|
try:
|
||||||
with self._com_context(), self._lock_com:
|
with self._com_context(), self._lock_com:
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
logger.info(f"[DÉFINIR CONTACT PAR DÉFAUT] Client={numero}, Contact={contact_numero}")
|
logger.info(f"[DEFINIR CONTACT PAR DEFAUT] Client={numero}, Contact={contact_numero}")
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
|
|
||||||
# Charger le contact - CORRECTION ICI
|
# Récupérer le nom du contact via SQL
|
||||||
logger.info("[1] Chargement du contact")
|
logger.info("[1] Recuperation infos contact")
|
||||||
|
nom_contact = None
|
||||||
# Trouver la factory
|
prenom_contact = None
|
||||||
factory_contact = None
|
|
||||||
for factory_name in ["FactoryContact", "FactoryContactTiers", "FactoryTypeContacts"]:
|
|
||||||
try:
|
|
||||||
if hasattr(self.cial.CptaApplication, factory_name):
|
|
||||||
factory_contact = getattr(self.cial.CptaApplication, factory_name)
|
|
||||||
break
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not factory_contact:
|
|
||||||
raise RuntimeError("Factory contacts non trouvée")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# ReadNumero peut accepter 1 ou 2 paramètres
|
with self._get_sql_connection() as conn:
|
||||||
try:
|
cursor = conn.cursor()
|
||||||
persist_contact = factory_contact.ReadNumero(numero, contact_numero)
|
cursor.execute(
|
||||||
except TypeError:
|
"SELECT CT_Nom, CT_Prenom FROM F_CONTACTT WHERE CT_Num = ? AND CT_No = ?",
|
||||||
persist_contact = factory_contact.ReadNumero(contact_numero)
|
[numero, contact_numero]
|
||||||
|
)
|
||||||
|
row = cursor.fetchone()
|
||||||
|
|
||||||
if not persist_contact:
|
if not row:
|
||||||
raise ValueError(f"Contact CT_No={contact_numero} non trouvé")
|
raise ValueError(f"Contact CT_No={contact_numero} non trouve")
|
||||||
|
|
||||||
# Caster
|
nom_contact = row.CT_Nom.strip() if row.CT_Nom else ""
|
||||||
contact = None
|
prenom_contact = row.CT_Prenom.strip() if row.CT_Prenom else ""
|
||||||
for interface in ["IBOContactT3", "IBOContact3", "IBOContactT"]:
|
|
||||||
try:
|
|
||||||
contact = win32com.client.CastTo(persist_contact, interface)
|
|
||||||
break
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not contact:
|
|
||||||
contact = persist_contact
|
|
||||||
|
|
||||||
contact.Read()
|
|
||||||
|
|
||||||
nom_contact = getattr(contact, "CT_Nom", "")
|
|
||||||
prenom_contact = getattr(contact, "CT_Prenom", "")
|
|
||||||
nom_complet = f"{prenom_contact} {nom_contact}".strip() if prenom_contact else nom_contact
|
nom_complet = f"{prenom_contact} {nom_contact}".strip() if prenom_contact else nom_contact
|
||||||
|
logger.info(f" OK Contact trouve: {nom_complet}")
|
||||||
logger.info(f" ✓ Contact trouvé: {nom_complet}")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Contact introuvable: {e}")
|
raise ValueError(f"Contact introuvable: {e}")
|
||||||
|
|
@ -7290,32 +7267,35 @@ class SageConnector:
|
||||||
try:
|
try:
|
||||||
persist_client = factory_client.ReadNumero(numero)
|
persist_client = factory_client.ReadNumero(numero)
|
||||||
if not persist_client:
|
if not persist_client:
|
||||||
raise ValueError(f"Client {numero} non trouvé")
|
raise ValueError(f"Client {numero} non trouve")
|
||||||
|
|
||||||
client = win32com.client.CastTo(persist_client, "IBOClient3")
|
client = win32com.client.CastTo(persist_client, "IBOClient3")
|
||||||
client.Read()
|
client.Read()
|
||||||
logger.info(f" ✓ Client chargé: {client.CT_Intitule}")
|
logger.info(f" OK Client charge: {client.CT_Intitule}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Client introuvable: {e}")
|
raise ValueError(f"Client introuvable: {e}")
|
||||||
|
|
||||||
# Définir le contact par défaut
|
# Définir le contact par défaut
|
||||||
logger.info("[3] Définition du contact par défaut")
|
logger.info("[3] Definition du contact par defaut")
|
||||||
|
|
||||||
ancien_contact = getattr(client, "CT_Contact", "")
|
ancien_contact = getattr(client, "CT_Contact", "")
|
||||||
client.CT_Contact = nom_complet
|
client.CT_Contact = nom_complet
|
||||||
logger.info(f" CT_Contact: '{ancien_contact}' → '{nom_complet}'")
|
logger.info(f" CT_Contact: '{ancien_contact}' -> '{nom_complet}'")
|
||||||
|
|
||||||
# Essayer CT_NoContact si disponible
|
if hasattr(client, 'CT_NoContact'):
|
||||||
if self._try_set_attribute(client, "CT_NoContact", contact_numero):
|
try:
|
||||||
|
client.CT_NoContact = contact_numero
|
||||||
logger.info(f" CT_NoContact = {contact_numero}")
|
logger.info(f" CT_NoContact = {contact_numero}")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
# Enregistrement
|
# Enregistrement
|
||||||
logger.info("[4] WRITE")
|
logger.info("[4] Enregistrement")
|
||||||
try:
|
try:
|
||||||
client.Write()
|
client.Write()
|
||||||
client.Read()
|
client.Read()
|
||||||
logger.info(" ✓ Client mis à jour")
|
logger.info(" OK Client mis a jour")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error_detail = str(e)
|
error_detail = str(e)
|
||||||
try:
|
try:
|
||||||
|
|
@ -7324,10 +7304,10 @@ class SageConnector:
|
||||||
error_detail = f"{sage_error.Description} (Code: {sage_error.Number})"
|
error_detail = f"{sage_error.Description} (Code: {sage_error.Number})"
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
raise RuntimeError(f"Échec mise à jour: {error_detail}")
|
raise RuntimeError(f"Echec mise a jour: {error_detail}")
|
||||||
|
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
logger.info(f"[SUCCÈS] Contact par défaut: {nom_complet}")
|
logger.info(f"[SUCCES] Contact par defaut: {nom_complet}")
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
@ -7453,6 +7433,7 @@ class SageConnector:
|
||||||
def supprimer_contact(self, numero: str, contact_numero: int) -> Dict:
|
def supprimer_contact(self, numero: str, contact_numero: int) -> Dict:
|
||||||
"""
|
"""
|
||||||
Supprime un contact via COM
|
Supprime un contact via COM
|
||||||
|
VERSION REFACTORISÉE
|
||||||
"""
|
"""
|
||||||
if not self.cial:
|
if not self.cial:
|
||||||
raise RuntimeError("Connexion Sage non établie")
|
raise RuntimeError("Connexion Sage non établie")
|
||||||
|
|
@ -7463,27 +7444,53 @@ class SageConnector:
|
||||||
logger.info(f"[SUPPRESSION CONTACT] CT_No={contact_numero}")
|
logger.info(f"[SUPPRESSION CONTACT] CT_No={contact_numero}")
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
|
|
||||||
# Lire le contact
|
# Récupérer le nom du contact via SQL
|
||||||
factory_contact = self.cial.CptaApplication.FactoryContactT
|
logger.info("[1] Recuperation infos contact")
|
||||||
|
nom_contact = None
|
||||||
|
prenom_contact = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
persist = factory_contact.ReadNumero(numero, contact_numero)
|
with self._get_sql_connection() as conn:
|
||||||
if not persist:
|
cursor = conn.cursor()
|
||||||
raise ValueError(f"Contact CT_No={contact_numero} non trouvé")
|
cursor.execute(
|
||||||
|
"SELECT CT_Nom, CT_Prenom FROM F_CONTACTT WHERE CT_Num = ? AND CT_No = ?",
|
||||||
|
[numero, contact_numero]
|
||||||
|
)
|
||||||
|
row = cursor.fetchone()
|
||||||
|
|
||||||
contact = win32com.client.CastTo(persist, "IBOContactT3")
|
if not row:
|
||||||
|
raise ValueError(f"Contact CT_No={contact_numero} non trouve")
|
||||||
|
|
||||||
|
nom_contact = row.CT_Nom.strip() if row.CT_Nom else ""
|
||||||
|
prenom_contact = row.CT_Prenom.strip() if row.CT_Prenom else ""
|
||||||
|
|
||||||
|
logger.info(f" OK Contact trouve: {prenom_contact} {nom_contact}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"Contact introuvable: {e}")
|
||||||
|
|
||||||
|
# Charger le contact via FactoryDossierContact
|
||||||
|
logger.info("[2] Chargement du contact")
|
||||||
|
factory_dossier = self.cial.CptaApplication.FactoryDossierContact
|
||||||
|
|
||||||
|
try:
|
||||||
|
persist = factory_dossier.ReadNomPrenom(nom_contact, prenom_contact)
|
||||||
|
|
||||||
|
if not persist:
|
||||||
|
raise ValueError(f"Contact non trouvable via ReadNomPrenom")
|
||||||
|
|
||||||
|
contact = win32com.client.CastTo(persist, "IBOTiersContact3")
|
||||||
contact.Read()
|
contact.Read()
|
||||||
nom_contact = contact.CT_Nom
|
logger.info(f" OK Contact charge: {contact.Nom}")
|
||||||
logger.info(f" ✓ Contact trouvé: {nom_contact}")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Contact introuvable: {e}")
|
raise ValueError(f"Contact introuvable: {e}")
|
||||||
|
|
||||||
# Supprimer
|
# Supprimer
|
||||||
logger.info("[SUPPRESSION]")
|
logger.info("[3] Suppression")
|
||||||
try:
|
try:
|
||||||
contact.Remove()
|
contact.Remove()
|
||||||
logger.info(" ✓ Remove() réussi")
|
logger.info(" OK Remove() reussi")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error_detail = str(e)
|
error_detail = str(e)
|
||||||
try:
|
try:
|
||||||
|
|
@ -7492,17 +7499,18 @@ class SageConnector:
|
||||||
error_detail = f"{sage_error.Description} (Code: {sage_error.Number})"
|
error_detail = f"{sage_error.Description} (Code: {sage_error.Number})"
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
logger.error(f" ✗ Erreur Remove: {error_detail}")
|
logger.error(f" ERROR Remove: {error_detail}")
|
||||||
raise RuntimeError(f"Échec suppression contact: {error_detail}")
|
raise RuntimeError(f"Echec suppression contact: {error_detail}")
|
||||||
|
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
logger.info(f"[SUCCÈS] Contact supprimé: {nom_contact}")
|
logger.info(f"[SUCCES] Contact supprime: {prenom_contact} {nom_contact}")
|
||||||
logger.info("=" * 80)
|
logger.info("=" * 80)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"numero": numero,
|
"numero": numero,
|
||||||
"contact_numero": contact_numero,
|
"contact_numero": contact_numero,
|
||||||
"nom": nom_contact,
|
"nom": nom_contact,
|
||||||
|
"prenom": prenom_contact,
|
||||||
"supprime": True,
|
"supprime": True,
|
||||||
"date_suppression": datetime.now().isoformat()
|
"date_suppression": datetime.now().isoformat()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue