Module SIRENE - Fiabilisez les infos de vos tiers

Je ne comprends pas pourquoi mon lien hypertexte est remplacé par les termes Challenge JS… Veuillez lire les URL où pointent les liens. La différence tient à l’ajout de « /entreprise » dans le lien correct

@isamuse corrigé :wink:

utilise les balises de texte préformaté si tu veux que ton texte reste exactement comme inséré, sans être interprété par le forum.

1 « J'aime »

Bonjour à tous,

J’utilise le module depuis quelques jours seulement et franchement bravo @aspangaro-Inovea pour ce module très utile et qui fonctionne à la perfection.

Un point que je n’avais pas capté tout de suite. On peut changer, dans les paramètres du module, le site sur lequel s’effectue la recherche du numéro SIREN.

C’est vraiment top.

Merci beaucoup.
Cordialement.

2 « J'aime »

Tiens une petite idée pour le module SIRENE, enfin si ça plaît !

Il pourrait être intéressant de relier SIRENE à d’autres sources officielles répertoriant des personnes morales, par exemple la base des associations Répertoire National des Associations (RNA) - data.gouv.fr.

En effet, les associations ont aussi des activités commerciales qui justifient qu’elles puissent être un tiers dans Dolibarr.

Bon week-end à tous.

Bonjour à tous,

Nous sommes en train de travailler sur Sirene v3 chez OpenDSI. Cette nouvelle version doit apporter en complément de la connexion à l’API Sirene, la connexion à l’API Pappers.

Contrairement à l’API Sirene, l’API Pappers n’est pas gratuite et une fois passé le forfait de 100 jetons offerts par mois, il est nécessaire d’attendre le mois suivant ou bien de réapprovisionner son compte (ce qui est généreux, cela laisse quand même plus de 100 recherches directes de sociétés : voir tarification en abonnement ou à l’utilisation)

Nous venons donc vers vous, heureux utilisateurs du module Sirene pour savoir qu’elle serait la meilleure intégration à vos yeux de l’API Pappers qui contient tout de même plus d’informations. (RCS, Capital, Nom du gérant, Site Web, numéro de téléphone, compte de résultat si publié au greffe, etc…)

Ma première réflexion correspond à une intégration de l’API Pappers dites secondaires, l’API Sirene de l’Insee reste principale et l’API Pappers (non obligatoire) viendra la secondée en ajoutant des informations complémentaires. A ce titre, je pensais mettre un bouton complémentaire du type « Rechercher sur Pappers » dans la fenêtre de vérification des informations du tiers.

image

A vos claviers, venez nous aider à faire le meilleur choix, le vôtre !

Merci d’avance à ceux qui prendront le temps de répondre :wink:

1 « J'aime »

Très bien l’ajout de ces données complémentaires !

Je ne comprends pas bien si vous comptez avoir un sourcing sirene + un soursing Pappers, pour les données complémentaires, ou si vous pourriez envisager un seul sourcing Pappers (qui doit lui-même s’alimenter avec l’API Sirene j’imagine).

Ce qui m’importe, c’est d’abord la fiabilité de la source, y compris la rapidité des mises à jour par rapport aux publication officielles des entreprises. J’aurais donc tendance à d’abord privilégier les sources officielles comme l’API Sirene.

Mais si Pappers se fournit en données auprès de Sirene dans des délais raisonnables, je choisirais sans me poser de questions d’aller piocher dans Pappers. En effet, pour mon activité, 100 jetons gratuits par mois, c’est bien suffisant.

En conclusion, oui pour une intégration secondaire, mais éventuellement avec le choix dans la configuration du module de pouvoir d’un seul coup rapatrier aussi l’information complémentaires disponible sur Pappers pour éviter un clic supplémentaire sur « Rechercher sur Pappers ».

Et puisque vous me demandez mon avis, j’y ajoute : disposer sur l’écran de recherche, d’un compteur du nombre de recherches effectuées sur Pappers…

Voilà mes réflexions.

Et pour finir prête à financer cette évolution.

1 « J'aime »

Salut Alexandre
Super nouvelle ce qui serait bien serait d’avoir en option la possibilité d’obliger la création d’un tiers par votre module.

A la création d’un tiers avoir une page de recherche de tiers et de création par siret / siren si on le connait, avant d’afficher la fiche du tiers avec un bouton création manuel pour créer classiquement. Pour inciter la création par l’api.

Pas d’ouverture sur d’autre api?

L’ors de la création ou mise a jour des données avoir le solde de crédits restant.

Bonjour,

Merci pour vos précédents retours, je prendrai le temps d’y répondre demain.

En attendant, vous trouverez la version 7.0.43 qui améliore / corrige les points suivants :

[7.0.43] - 23-06-2022

  • Meilleure récupération du nom de l’enseigne (nom alternatif ou alias) au niveau de l’établissement
  • Compatibilité avec Doliwamp sur Windows (Problème SSL / cURL / GuzzleHttp)

/!\ Attention, le module Sirene nécessite désormais un autre module qui se nomme AdvanceDictionaries et que vous pourrez télécharger gratuitement sur le Dolistore :
Dolistore.com

Le module est disponible sur le Dolistore .

Excellente journée à tous,

Bonjour
ça concerne seulement la France je pense
Est ce vrai?
merci

Bonjour,

Tout comme l’API Sirène, oui , l’API pappers ne concerne que la France.

C’est un module difficile a internationaliser… Les sources de données pouvant être différentes pour chaque pays.

Bonne fin de journée

1 « J'aime »

Bonjour.
Ne pourrait-on pas laisser l’API Sirene en utilisation pour tout le monde et l’API Pappers réservé à seulement quelques personnes ? (droit supplémentaire)
Salut.

Bonjour @Mika69 ,

C’est exactement ce qu’on nous avons fait dans une version interne pour le moment.

l’API Sirene reste en principal, l’API Pappers vient en complément pour les informations que ne possède pas la première API (Pour le moment : Capital, nom du gérant, RCS).

La problématique est que sur l’API Pappers, il faut s’enregistrer avec un email et un nom de domaine non existant pour débloquer les 100 crédits mensuels. L’action de recherche en complément prenant moins d’un ticket.

La connexion a déjà été réalisé, il ne reste plus qu’à étendre les informations récupérées, c’est encore un peu pauvre sur ce point.

Restant à disposition pour échanger.
Bonne journée,

Bonjour à tous,

Pour rappel, les serveurs de l’INSEE sont en maintenance ce jour et donc le module Sirene ne sera pas fonctionnel une bonne partie de la journée.

Il convient de patienter jusqu’à demain pour un retour optimal du service

Excellente journée,

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! :joy:

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.

Bonjour
Merci pour la suggestion, c’est en effet une bonne idée :+1:

1 « J'aime »

Bonsoir,

Oui c’est une bonne idée avec une option pour activer la fonctionnalité.

L’intégration avec pappers est opérationnel?

Merci

Bonjour à tous,

Nous venons de publier la nouvelle version 7.0.58 du module Sirene qui corrige / améliore de nombreux points notamment sur les sièges sociaux / la tâche planifiée / l’accessibilité et le côté responsive du module.

Le module est compatible avec la v18 de Dolibarr fraichement sortie.

Voici la liste complète des nouveautés :

[7.0.58] - 10-08-2023

  • Ajout d’un champ complémentaire pour la date de vérification du tiers depuis la tâche planifiée
  • Mise à jour de la date d’appel à Sirene à la création d’un tiers et lors de la confirmation de la vérification manuelle
  • Le statut de détection d’une mise à jour Sirene est remise à zéro à chaque confirmation de vérification de tiers

[7.0.57] - 07-08-2023

  • Ajout d’exemple (basé sur le Dolibarr installé) lors de la recherche (UX - Placeholder)
  • Ajout libellé cliquable pour accéder aux champs de recherche (UX - Label for)
  • Ajout d’une option pour rechercher uniquement les sièges sociaux (option par défaut disponible dans l’admin du module)
  • Aide à la saisie sur le code Naf qui ne correspond pas à celle demandé dans Dolibarr (Ajout d’un point automatiquement si non-présence de ce caractère)
  • Correction affichage responsive - Le formulaire de recherche Sirene lors de la création d’un tiers s’adapte à l’affichage smartphone
  • Correction chargement Guzzle - Conflit en cas de présence d’un autoloader (Merci Frédéric France - NetLogic)
  • Ajustement libellé
  • Correction CSS

[7.0.56] - 12-07-2023

  • Divers correctifs sur la tâche planifiée
  • Limitation à 20 requêtes par minutes (pas plus) sur la tâche planifiée
  • Renommage de « Etat maj Sirene » par « Maj Sirene détectée »
  • Ajout de champ complémentaire pour avoir le statut administratif du tiers : « Fermé » ou « En activité »
  • Ajout de l’icône « étoile verte » lors de la recherche d’établissement pour préciser le siège social

[7.0.55] - 05-07-2023

  • Compatibility with PgSQL on SQL file (Merci Florian Henry - Scopen)
  • Move information OpenDsi to Easya Solutions

C’est en cours de discussion en interne.
Nous cherchons comment financer cette intégration.

Excellente journée et bonne rentrée à tout le monde !

Bonjour

J’ai vu que le module Sirene est passé en version 7.0.62
Quelques nouveautés ?

Merci d’avance

Bonjour,

Principalement la compatibilité avec PHP jusqu’à la version 8.2 et une correction pour la recherche sur les établissements ouverts.

Bonne soirée


Détail :

Décembre 2023 :

7.0.62

Correction : inversion de la recherche (API) des établissements “fermés” vers “actifs”.

7.0.61

Une erreur a été corrigée sur la recherche d’établissements ouverts.

Août 2023 :

7.0.59

Le module est maintenant compatible avec les versions 8 et supérieures de PHP

2 « J'aime »