import win32com.client import logging logger = logging.getLogger(__name__) def _extraire_fournisseur_enrichi(fourn_obj): try: numero = getattr(fourn_obj, "CT_Num", "").strip() if not numero: return None intitule = getattr(fourn_obj, "CT_Intitule", "").strip() data = { "numero": numero, "intitule": intitule, "type": 1, "est_fournisseur": True, } try: sommeil = getattr(fourn_obj, "CT_Sommeil", 0) data["est_actif"] = sommeil == 0 data["en_sommeil"] = sommeil == 1 except Exception: data["est_actif"] = True data["en_sommeil"] = False try: adresse_obj = getattr(fourn_obj, "Adresse", None) if adresse_obj: data["adresse"] = getattr(adresse_obj, "Adresse", "").strip() data["complement"] = getattr(adresse_obj, "Complement", "").strip() data["code_postal"] = getattr(adresse_obj, "CodePostal", "").strip() data["ville"] = getattr(adresse_obj, "Ville", "").strip() data["region"] = getattr(adresse_obj, "Region", "").strip() data["pays"] = getattr(adresse_obj, "Pays", "").strip() parties_adresse = [] if data["adresse"]: parties_adresse.append(data["adresse"]) if data["complement"]: parties_adresse.append(data["complement"]) if data["code_postal"] or data["ville"]: ville_cp = f"{data['code_postal']} {data['ville']}".strip() if ville_cp: parties_adresse.append(ville_cp) if data["pays"]: parties_adresse.append(data["pays"]) data["adresse_complete"] = ", ".join(parties_adresse) else: data["adresse"] = "" data["complement"] = "" data["code_postal"] = "" data["ville"] = "" data["region"] = "" data["pays"] = "" data["adresse_complete"] = "" except Exception as e: logger.debug(f"Erreur adresse fournisseur {numero}: {e}") data["adresse"] = "" data["complement"] = "" data["code_postal"] = "" data["ville"] = "" data["region"] = "" data["pays"] = "" data["adresse_complete"] = "" try: telecom_obj = getattr(fourn_obj, "Telecom", None) if telecom_obj: data["telephone"] = getattr(telecom_obj, "Telephone", "").strip() data["portable"] = getattr(telecom_obj, "Portable", "").strip() data["telecopie"] = getattr(telecom_obj, "Telecopie", "").strip() data["email"] = getattr(telecom_obj, "EMail", "").strip() try: site = ( getattr(telecom_obj, "Site", None) or getattr(telecom_obj, "Web", None) or getattr(telecom_obj, "SiteWeb", "") ) data["site_web"] = str(site).strip() if site else "" except Exception: data["site_web"] = "" else: data["telephone"] = "" data["portable"] = "" data["telecopie"] = "" data["email"] = "" data["site_web"] = "" except Exception as e: logger.debug(f"Erreur telecom fournisseur {numero}: {e}") data["telephone"] = "" data["portable"] = "" data["telecopie"] = "" data["email"] = "" data["site_web"] = "" try: data["siret"] = getattr(fourn_obj, "CT_Siret", "").strip() except Exception: data["siret"] = "" try: if data["siret"] and len(data["siret"]) >= 9: data["siren"] = data["siret"][:9] else: data["siren"] = getattr(fourn_obj, "CT_Siren", "").strip() except Exception: data["siren"] = "" try: data["tva_intra"] = getattr(fourn_obj, "CT_Identifiant", "").strip() except Exception: data["tva_intra"] = "" try: data["code_naf"] = ( getattr(fourn_obj, "CT_CodeNAF", "").strip() or getattr(fourn_obj, "CT_APE", "").strip() ) except Exception: data["code_naf"] = "" try: data["forme_juridique"] = getattr( fourn_obj, "CT_FormeJuridique", "" ).strip() except Exception: data["forme_juridique"] = "" try: cat_tarif = getattr(fourn_obj, "N_CatTarif", None) data["categorie_tarifaire"] = ( int(cat_tarif) if cat_tarif is not None else None ) except Exception: data["categorie_tarifaire"] = None try: cat_compta = getattr(fourn_obj, "N_CatCompta", None) data["categorie_comptable"] = ( int(cat_compta) if cat_compta is not None else None ) except Exception: data["categorie_comptable"] = None try: cond_regl = getattr(fourn_obj, "CT_CondRegl", "").strip() data["conditions_reglement_code"] = cond_regl if cond_regl: try: cond_obj = getattr(fourn_obj, "ConditionReglement", None) if cond_obj: cond_obj.Read() data["conditions_reglement_libelle"] = getattr( cond_obj, "C_Intitule", "" ).strip() else: data["conditions_reglement_libelle"] = "" except Exception: data["conditions_reglement_libelle"] = "" else: data["conditions_reglement_libelle"] = "" except Exception: data["conditions_reglement_code"] = "" data["conditions_reglement_libelle"] = "" try: mode_regl = getattr(fourn_obj, "CT_ModeRegl", "").strip() data["mode_reglement_code"] = mode_regl if mode_regl: try: mode_obj = getattr(fourn_obj, "ModeReglement", None) if mode_obj: mode_obj.Read() data["mode_reglement_libelle"] = getattr( mode_obj, "M_Intitule", "" ).strip() else: data["mode_reglement_libelle"] = "" except Exception: data["mode_reglement_libelle"] = "" else: data["mode_reglement_libelle"] = "" except Exception: data["mode_reglement_code"] = "" data["mode_reglement_libelle"] = "" data["coordonnees_bancaires"] = [] try: factory_banque = getattr(fourn_obj, "FactoryBanque", None) if factory_banque: index = 1 while index <= 5: try: banque_persist = factory_banque.List(index) if banque_persist is None: break banque = win32com.client.CastTo(banque_persist, "IBOBanque3") banque.Read() compte_bancaire = { "banque_nom": getattr(banque, "BI_Intitule", "").strip(), "iban": getattr(banque, "RIB_Iban", "").strip(), "bic": getattr(banque, "RIB_Bic", "").strip(), "code_banque": getattr(banque, "RIB_Banque", "").strip(), "code_guichet": getattr(banque, "RIB_Guichet", "").strip(), "numero_compte": getattr(banque, "RIB_Compte", "").strip(), "cle_rib": getattr(banque, "RIB_Cle", "").strip(), } if compte_bancaire["iban"] or compte_bancaire["numero_compte"]: data["coordonnees_bancaires"].append(compte_bancaire) index += 1 except Exception: break except Exception as e: logger.debug(f"Erreur coordonnées bancaires fournisseur {numero}: {e}") if data["coordonnees_bancaires"]: data["iban_principal"] = data["coordonnees_bancaires"][0].get("iban", "") data["bic_principal"] = data["coordonnees_bancaires"][0].get("bic", "") else: data["iban_principal"] = "" data["bic_principal"] = "" data["contacts"] = [] try: factory_contact = getattr(fourn_obj, "FactoryContact", None) if factory_contact: index = 1 while index <= 20: try: contact_persist = factory_contact.List(index) if contact_persist is None: break contact = win32com.client.CastTo(contact_persist, "IBOContact3") contact.Read() contact_data = { "nom": getattr(contact, "CO_Nom", "").strip(), "prenom": getattr(contact, "CO_Prenom", "").strip(), "fonction": getattr(contact, "CO_Fonction", "").strip(), "service": getattr(contact, "CO_Service", "").strip(), "telephone": getattr(contact, "CO_Telephone", "").strip(), "portable": getattr(contact, "CO_Portable", "").strip(), "email": getattr(contact, "CO_EMail", "").strip(), } nom_complet = ( f"{contact_data['prenom']} {contact_data['nom']}".strip() ) if nom_complet: contact_data["nom_complet"] = nom_complet else: contact_data["nom_complet"] = contact_data["nom"] if contact_data["nom"]: data["contacts"].append(contact_data) index += 1 except Exception: break except Exception as e: logger.debug(f"Erreur contacts fournisseur {numero}: {e}") data["nb_contacts"] = len(data["contacts"]) if data["contacts"]: data["contact_principal"] = data["contacts"][0] else: data["contact_principal"] = None try: data["encours_autorise"] = float(getattr(fourn_obj, "CT_Encours", 0.0)) except Exception: data["encours_autorise"] = 0.0 try: data["ca_annuel"] = float(getattr(fourn_obj, "CT_ChiffreAffaire", 0.0)) except Exception: data["ca_annuel"] = 0.0 try: data["compte_general"] = getattr(fourn_obj, "CG_Num", "").strip() except Exception: data["compte_general"] = "" try: date_creation = getattr(fourn_obj, "CT_DateCreate", None) data["date_creation"] = str(date_creation) if date_creation else "" except Exception: data["date_creation"] = "" try: date_modif = getattr(fourn_obj, "CT_DateModif", None) data["date_modification"] = str(date_modif) if date_modif else "" except Exception: data["date_modification"] = "" return data except Exception as e: logger.error(f" Erreur extraction fournisseur: {e}", exc_info=True) return { "numero": getattr(fourn_obj, "CT_Num", "").strip(), "intitule": getattr(fourn_obj, "CT_Intitule", "").strip(), "type": 1, "est_fournisseur": True, "est_actif": True, "en_sommeil": False, "adresse": "", "complement": "", "code_postal": "", "ville": "", "region": "", "pays": "", "adresse_complete": "", "telephone": "", "portable": "", "telecopie": "", "email": "", "site_web": "", "siret": "", "siren": "", "tva_intra": "", "code_naf": "", "forme_juridique": "", "categorie_tarifaire": None, "categorie_comptable": None, "conditions_reglement_code": "", "conditions_reglement_libelle": "", "mode_reglement_code": "", "mode_reglement_libelle": "", "iban_principal": "", "bic_principal": "", "coordonnees_bancaires": [], "contacts": [], "nb_contacts": 0, "contact_principal": None, "encours_autorise": 0.0, "ca_annuel": 0.0, "compte_general": "", "date_creation": "", "date_modification": "", } __all__ = ["_extraire_fournisseur_enrichi"]