Sync / Call vers une Application depuis Dolibarr

Bien le bonjour,

J’aurais besoin d’aide pour développer un module d’interfaçage avec un logiciel de caisse.

J’arrive à synchroniser / faire correspondre les objets de mon application avec ceux de Dolibarr grace au champ ref_ext.

Le problème se pose lors de l’utilisation des dictionnaires (TVA, modes de paiements, devises, …).

N’ayant pas trouvé mon bonheur sur les internets, j’ai pensé à plusieurs choses :

  • Modifier / Altérer les dictionnaires déjà existant pour rajouter un champ ref_ext. Cela me parait le plus propre. Lors de la récupération des tickets depuis mon application, je pourrais utiliser la fonction dol_getIdFromCode() pour faire le lien entre les factures et les modes de paiements par exemple.

  • Créer une classe dans mon module pour chaque dictionnaire et ainsi faire le lien entre mon application et dolibarr : semble moche et lourd pour stocker seulement 2 id

  • Modifier les entrées dans les dictionnaires pour faire correspondre les row_id entre mon application et Dolibarr

En espérant avoir été claire dans mes explications… :smiley:

J’ai l’impression de réinventer la roue, j’imagine que d’autres avant moi ont essayés de faire des calls d’API depuis Dolibarr vers une API externe mais pas trouvé mon bonheur.

Merci pour votre aide !

Lucien (MasterIT)

Bonjour,
Je ne comprends pas bien. Tu semble indiquer que tu veux appeler une API d’une autre application depuis Dolibarr, mais dans ce que tu décris, tu fais appel à des données de Dolibarr depuis une autre appli.

Bonjour Yves,

Merci pour ta réactivité.

C’est bien des appels vers une autre API d’une autre application depuis Dolibarr. Ca me permet de récupérer mes tickets de caisse que je souhaite intégrer dans Dolibarr en tant que facture.

Lors d’un premier appel, je récupère par exemple les modes de paiements dans un objet du style :

modeDePaiements: [
  {
    id: 789,
    label: "Paiement en espèce",
    ...
  },
  {
    id: 654654,
    label: "Paiement en chèque",
    ...
  }
]

Lors d’un autre appel, je recois mes ventes générer depuis mon application externe dans une response du style :

ticketDeCaisses: [
  {
    id: 111111111,
    montant: 123.45,
    modeDePaiement: 789, // ID de mon application correspondant par exemple au paiement par espèce
    ...
  },
  {
    id: 111111111,
    montant: 123.45,
    modeDePaiement: 789, // ID de mon application correspondant par exemple au paiement par espèce
    ...
  }
]

Alors que sur dolibarr, le mode de paiement en espèce stocké en BDD (dans la table c_paiement) est par exemple :

{
  id: 4, // ID dans dolibarr
  entity: 1,
  code: LIQ,
  libelle: Cash,
  ...
}

Comment faire correspondre ces 2 identifiants (dans l’exemple 789 pour mon application et 4 pour dolibarr)?

Bonjour,
Je comprends donc que tu fais un module dans Dolibarr qui cause avec une autre partie de l’application.
J’éviterais de toucher aux tables de Dolibarr, pour éviter tout souci lors d’une migration.
Je crois que j’ajouterais une table de correspondance entre les codes de Dolibarr et ceux de ton application.
Si tu juges que c’est trop overkilled, fais un simple tableau dans ton code.
Ma « réactivité » est un pur hasard :stuck_out_tongue:

2 « J'aime »

Et bah le hasard fait bien les choses.

Houla, le simple tableau codé en dur … :cold_face:

J’aime bien ton idée de créer une table de correspondance. Qu’est-ce que tu penses de faire ça en BDD avec une table comme :

CREATE TABLE llx_ma_super_table(
	rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
	dolibarr_id integer NOT NULL, --ID dans dolibarr
	application_id integer NOT NULL, --ID dans mon application
	type varchar(128) NOT NULL --Le type d'objet à faire correspondre (mode de paiement, TVA ou devises)
) ENGINE=innodb;

Est-ce que cela te semble propre? :face_with_monocle:

Merci en tout cas.

1 « J'aime »

Bon, en fin de compte, je me suis fait une petit table en BDD. Je vous la met ici pour ceux que ça intéresse :

CREATE TABLE llx_pasteque_mapping
(
    rowid   integer AUTO_INCREMENT PRIMARY KEY NOT NULL,
    ref     varchar(128)                       NOT NULL, -- ID dans Dolibarr
    ref_ext integer                            NOT NULL, --ID dans mon application
    type    varchar(128)                       NOT NULL, -- Le type d'objet à faire correspondre (dans mon cas : mode de paiement, TVA ou devises)
    status  smallint                           NOT NULL
) ENGINE = innodb;

Et je me suis aussi fait une fonction pour récupérer tout ça. Si vous avez plus propre, je suis preneur :


	/**
	 * Get the mapping between dolibarr and an external application
	 * 
	 * @param string $type Filter to only return spectific object type (payment method or tva or unit)
	 * @return array|null An array with external application id as key and dolibarr id as value or null
	 */
	private function getObjectsMapping($type = null)
	{
		global $db;

		$mapping = [];
 
		$sql = "SELECT m.rowid as rowid, m.ref as ref, m.ref_ext as ref_ext, m.type as type FROM " . MAIN_DB_PREFIX . "pasteque_mapping m ";
		if ($type != null) {
			$sql .= " WHERE type = '$type'";
		}

		$resql = $db->query($sql);

		if ($resql) {
			while ($new_object = $db->fetch_array($resql)) {
				$mapping[$new_object['ref_ext']] = $new_object;
			}

			return $mapping;
		}

		return null;

	}

Happy coding

(Et merci Yves)