Hello, je me permets de prendre la suite de ce fil pour une petite suggestion. Dans dolibarr il y a le champ maison-mère qui est 99% du temps vide. Or, on peut considérer que la maison mère est le siège social et cette info est très facilement trouvable dans l’api sirene. On peut considérer que le siège est un potentiel prospect et donc avoir l’info peut être intéressante.
J’ai un peu dégrossi le truc, en python, et vu que je ne sais pas du tout coder, merci chatgpt!
import requests
import json
def get_safe_value(data, key):
if data:
keys = key.split(".")
value = data
for k in keys:
if isinstance(value, dict):
value = value.get(k)
else:
value = None
break
return value if value is not None else ""
return ""
def create_dolibarr_tiers(api_key, data):
url = 'https://gestion.capable.contact/htdocs/api/index.php/' # L'URL de votre Dolibarr avec le chemin vers l'API
# Appel de l'API pour créer le tiers
headers = {
'DOLAPIKEY': api_key,
'Content-Type': 'application/json',
}
# Add this print statement to check the data before making the request
print("Data to be sent to Dolibarr API:")
print(json.dumps(data, indent=2)) # Pretty print the data
response = requests.post(url + 'thirdparties', data=json.dumps(data), headers=headers)
# Vérification de la réponse
if response.status_code == 200:
try:
response_data = response.json()
# Check if the response_data is an integer (ID) directly
if isinstance(response_data, int):
created_tier_id = response_data
print("Le tiers a été créé avec succès. ID du tiers:", created_tier_id)
return created_tier_id
else:
print("La réponse de l'API ne contient pas l'ID attendu.")
return None
except json.JSONDecodeError:
print("Erreur lors de la récupération des données de la réponse.")
print(response.text)
return None
else:
print(f"Erreur lors de la création du tiers. Code d'erreur: {response.status_code}")
print(response.text)
return None
def query_sirene_api(token, numero_siret, entity_type):
base_url = "https://api.insee.fr/entreprises/sirene/V3/"
if entity_type == "etablissement_siege":
url = base_url + "siret?q=siren:" + numero_siret[:9] + "%20AND%20etablissementSiege%3Atrue"
elif entity_type == "etablissement":
url = base_url + "siret/" + numero_siret
headers = {"Authorization": "Bearer " + token}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # Check for any request errors
data = response.json()
return data
except requests.exceptions.RequestException as e:
print("Error:", e)
return None
if __name__ == "__main__":
# Remplacez "VOTRE_TOKEN" par votre vrai token d'accès à l'API SIRENE
token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# Demander le numéro SIRET à l'utilisateur
numero_siret = input("Veuillez entrer le numéro SIRET que vous souhaitez rechercher: ")
# Récupérer le siège depuis l'API SIRENE
result_etablissement_siege = query_sirene_api(token, numero_siret, entity_type="etablissement_siege")
if result_etablissement_siege:
print("Résultat de la requête pour l'établissement siège :")
print(result_etablissement_siege)
# Créer le premier tiers (le siège) et récupérer l'ID du tier créé
data_etablissement_siege = {
"name": get_safe_value(result_etablissement_siege["etablissements"][0]["periodesEtablissement"][0], "enseigne1Etablissement") # utiliser OR permet d'avoir plusieurs valeurs en fallback. Prévoir d'utiliser des ecrans pour chosir.
or get_safe_value(result_etablissement_siege["etablissements"][0], "denominationUsuelleEtablissement")
or "UNKNOWN",
"name_alias": get_safe_value(result_etablissement_siege["etablissements"][0]["uniteLegale"], "denominationUniteLegale"),
"client": 2,
"code_client": "ssmezzze{yy}{mm}-{0000}",
"fournisseur": 0,
"address": get_safe_value(result_etablissement_siege["etablissements"][0]["adresseEtablissement"], "numeroVoieEtablissement")
+ " " + get_safe_value(result_etablissement_siege["etablissements"][0]["adresseEtablissement"], "typeVoieEtablissement")
+ " " + get_safe_value(result_etablissement_siege["etablissements"][0]["adresseEtablissement"], "libelleVoieEtablissement"),
"zip": get_safe_value(result_etablissement_siege["etablissements"][0]["adresseEtablissement"], "codePostalEtablissement"),
"town": get_safe_value(result_etablissement_siege["etablissements"][0]["adresseEtablissement"], "libelleCommuneEtablissement"),
"country_id": 1,
"status": "1",
"idprof1": get_safe_value(result_etablissement_siege["etablissements"][0], "siren"),
"idprof2": get_safe_value(result_etablissement_siege["etablissements"][0], "siret"),
"idprof3": get_safe_value(result_etablissement_siege["etablissements"][0]["uniteLegale"], "activitePrincipaleUniteLegale"),
"idprof4": "",
"idprof5": "",
"idprof6": "",
"assujetti_tva": "",
"numero_tva": "",
"type_tiers": "",
"type_entite_legale": "",
"capital": "",
"langue_defaut": "",
"maison_mere": "",
"fk_stcomm": "",
"forme_juridique_code": get_safe_value(result_etablissement_siege["etablissements"][0]["uniteLegale"], "categorieJuridiqueUniteLegale"),
"effectif_id": get_safe_value(result_etablissement_siege["etablissements"][0], "trancheEffectifsEtablissement"),
"typent_code": get_safe_value(result_etablissement_siege["etablissements"][0]["uniteLegale"], "categorieEntreprise"),
"typent_id": 0,
"logo": "",
# ...
}
# Check the typent_code and map it to typent_id accordingly
if data_etablissement_siege["typent_code"] == "PME":
data_etablissement_siege["typent_id"] = 1
elif data_etablissement_siege["typent_code"] == "ETI":
data_etablissement_siege["typent_id"] = 2
elif data_etablissement_siege["typent_code"] == "GE":
data_etablissement_siege["typent_id"] = 3
# Remplacez "VOTRE_CLEF_D_API" par votre clé d'API Dolibarr
api_key_dolibarr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
created_tier_id = create_dolibarr_tiers(api_key_dolibarr, data_etablissement_siege)
if created_tier_id:
# Récupérer l'établissement depuis l'API SIRENE
result_etablissement = query_sirene_api(token, numero_siret, entity_type="etablissement")
if result_etablissement:
print("Résultat de la requête pour l'établissement :")
print(result_etablissement)
# Créer le second tiers (établissement) en utilisant l'ID du premier tier comme "parent"
data_etablissement = {
"name": get_safe_value(result_etablissement["etablissement"]["periodesEtablissement"][0], "enseigne1Etablissement"),
"name_alias": get_safe_value(result_etablissement["etablissement"]["uniteLegale"], "denominationUniteLegale"),
"client": 3, # 2 signifie "Prospect", # 3 signifie "Prospect/client"
"code_client": "sCseeezU{yy}{mm}-{0000}",
"fournisseur": 0, # 0 signifie "Non" pour le fournisseur
"address": get_safe_value(result_etablissement["etablissement"]["adresseEtablissement"], "numeroVoieEtablissement")
+ " " + get_safe_value(result_etablissement["etablissement"]["adresseEtablissement"], "typeVoieEtablissement")
+ " " + get_safe_value(result_etablissement["etablissement"]["adresseEtablissement"], "libelleVoieEtablissement"),
"zip": get_safe_value(result_etablissement["etablissement"]["adresseEtablissement"], "codePostalEtablissement"),
"town": get_safe_value(result_etablissement["etablissement"]["adresseEtablissement"], "libelleCommuneEtablissement"),
"country_id": 1, # Replace with the appropriate country ID in Dolibarr
"status": "1", # 1 Ouvert, 2 clos.
"idprof1": get_safe_value(result_etablissement["etablissement"], "siren"),
"idprof2": get_safe_value(result_etablissement["etablissement"], "siret"),
"idprof3": get_safe_value(result_etablissement["etablissement"]["uniteLegale"], "activitePrincipaleUniteLegale"),
"idprof4": "", # Champ vide
"idprof5": "", # Champ vide
"idprof6": "", # Champ vide
"effectifs": get_safe_value(result_etablissement["etablissement"]["uniteLegale"], "trancheEffectifsUniteLegale"),
# Ajoutez d'autres champs ici si nécessaire
"assujetti_tva": "", # Champ vide
"numero_tva": "", # Champ vide
"type_tiers": "", # Champ vide
"type_entite_legale": "", # Champ vide
"capital": "", # Champ vide
"langue_defaut": "", # Champ vide
"maison_mere": "", # Champ vide
"fk_stcomm": "", # ne correspond pas au statut du commercial
"fk_formejuidique": "",
"logo": "", # Champ vide
"parent": created_tier_id,
# ...
}
create_dolibarr_tiers(api_key_dolibarr, data_etablissement)
else:
print("La requête pour l'établissement a échoué.")
else:
print("La création du premier tiers a échoué.")
else:
print("Les informations nécessaires ne sont pas présentes dans la réponse de l'API SIRENE.")
Ce code est juste une trame, les données sont mappées à l’arrache.
EDIT: 24h plus tard. J’ai réussi a ajouter une case à cocher directement dans le module sur le même modèle que celle qui recherche les tiers ouverts ou fermés, qui filtre pour savoir si l’établissement est un siège ou non. En cochant cette case, je n’ai bien que les sièges sociaux.