[nom]
Titre Professionnel
Développeur Web &
Web Mobile
Session juin 2021
[nom]
Entreprise d’accueil : Green IT Solutions
Organisme de formation : ISFAC Poitiers
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Sommaire
Présentation de l’entreprise.................................................................................................................4
Présentation [nom]
Objectif.............................................................................................................................................5
Mise en Œuvre.................................................................................................................................5
Contexte................................................................................................................................................6
Qu’est ce que Dolibarr ?..................................................................................................................6
Qu’est ce qu’est une API ?................................................................................................................6
Cahiers des charges..............................................................................................................................7
Expression du besoin.......................................................................................................................7
Spécifications Fonctionnelles...........................................................................................................7
Spécifications Techniques................................................................................................................8
Analyse..................................................................................................................................................9
Étude de l’existant............................................................................................................................9
Modélisation des tables.................................................................................................................10
Modification des tables du module...............................................................................................12
Scripts SQL.....................................................................................................................................15
Modifications sur les écrans..........................................................................................................16
Points clefs du développement..........................................................................................................19
Versioning......................................................................................................................................19
Mise en place de l’API....................................................................................................................19
Programmation de la classe NdfpApi.............................................................................................26
Essai et vérification du code..........................................................................................................32
Mise en place de la gestion des véhicules utilisateurs..................................................................34
Veille sécuritaire.................................................................................................................................38
Recette de fonctionnement................................................................................................................39
Recherche sur sites Anglophones.......................................................................................................40
Traduction......................................................................................................................................41
Conclusion du stage............................................................................................................................42
ANNEXES.............................................................................................................................................43
Conventions dans Dolibarr.................................................................................................................44
Norme PHP.....................................................................................................................................44
Normes SQL...................................................................................................................................45
Normes HTML................................................................................................................................47
Autres Normes Dolibarr.................................................................................................................47
Arborescence Module Dolibarr..........................................................................................................48
Modèle physique de données............................................................................................................49
Extrait code fichier index.php « passerelle » API...............................................................................52
Exemple mise en place d’un serveur API Restler................................................................................55
Initialisation...................................................................................................................................55
Annotation.....................................................................................................................................55
Diagramme de classe NdfpVehicle.....................................................................................................56
ISFAC Poitiers -2020 / 2021
Développer la partie front-end d’une application Web ou Web
Mobile en intégrant les
Développeur Web et Web Mobile · Aurélien Girard
C1 : Maquetter une application
C2 : Réaliser une interface utilisateur web statique et
adaptable · X
recommandations de sécurité C3 : Développer une interface web dynamique
Développer la partie back-end d’une application Web ou Web
Mobile en intégrant les X
C4 : Réaliser une interface utilisateur avec une solution de gestion de contenu ou E-commerce
C5 : Créer une base de données · X
C6 : Développer les composants d’accès aux données · X
recommandations de sécurité C7 : Développer la partie back-end web ou web mobile
X
C8 : Élaborer et mettre en œuvre des composants dans
une application de gestion de contenu ou E-commerce · X
Page 3/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Présentation de l’entreprise
Green IT Solutions
Green IT solution est une société de services dans les systèmes d’information, située au centre-ville de Niort dans les Deux-Sèvres.
Depuis ça création en 2011 par Mr Bertrand FRUCHET, cette petite entreprise de cinq employés est le partenaire et l’allié des entreprises PME/PMI locales, quel que soit leur secteur d’activité pour fournir des serveurs, des solutions de virtualisation et de mise en clusters.
Green IT Solutions propose à ses partenaires des solutions sur mesures et innovantes tout en respectant l’environnement. Pour permettre aux entreprises de diminuer leur empreinte carbone, de réduire leurs émissions de gaz à effet de serre, leur consommation énergétique. En résumé permettre de réduire l’impact écologique du numérique.
Présentation de l’entreprise · Page 4/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Présentation [nom]
[nom] a été réalisé sur la période du 12 avril au 04 juin, au sein de l'entreprise Green IT
Solutions, en binôme avec un autre stagiaire, Hugo Milecamps provenant d’une formation similaire. Lui s’occupant de la partie développement mobile avec de la programmation sous Android Studio et moi de la partie Web avec la programmation du module Dolibarr.
Dolibarr est une application open source de gestion d’entreprise s’exécutant au sein d’un serveur web. qui peut être donc accessible au travers d’internet. Il comporte différents modules internes
(présents a l’installation) ou externes que l’utilisateur active selon ses besoins (gestion [nom], congé, gestion de stock,…).
Objectif
L’objectif [nom] est la mise en place d'un service API permettant à une application cliente, dans notre cas une application Android, de communiquer avec un module de gestion de note de frais d'un environnement Dolibarr.
Mise en Œuvre
Nous avons décidé, au vu du temps qui nous était alloué et des recommandations de notre superviseur, de partir sur un fork d’un module Dolibarr de gestion de note de frais déjà existant
Note de frais plus ou Ndfp, disponible en open source sur Github et déjà utilisé par notre entreprise d’accueil. Afin de nous concentrer en grande partie sur l'API et le développement de l'application Android (pour mon collègue), tout en ajoutant quelques fonctionnalités sur le module.
Résumé cahier des charges :
- Programmation de l’API afin de permettre à la future application Android de communiquer avec le service de gestion de note de frais au travers de celui-ci.
- Ajouter la possibilité de joindre des justificatifs aux dépenses d'une note de frais.
- Ajouter la gestion des véhicules personnels des utilisateurs notamment pour les frais kilométriques.
- Refonte graphique de l’interface d’une note de frais pour corriger les problèmes d’affichage.
- Correction sur la base de données.
Le but étant pour notre entreprise d’accueil, de pouvoir à terme, proposer à ses clients, en plus de ses services habituels (serveurs, virtualisation) cet ensemble "logiciel" :
➔ Application Dolibarr avec module de gestion de notes de frais associé à l’application Android.
Présentation [nom] · Page 5/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Contexte
Qu’est ce que Dolibarr ?
Dolibarr est un progiciel de gestion Intégré pour les entreprises, en open source. C’est un logiciel modulaire qui s’adapte aux besoins de l’entreprise. Il s’exécute au sein d’un serveur Web.
Il nécessite APACHE, MySQL et PHP pour fonctionner.
Qu’est ce qu’est une API ?
Une API facilite l’interaction entre deux applications différentes. Elle sert d’intermédiaire, le client va envoyer une requête HTTP vers L’API, celle-ci va chercher l’information dans la base de données puis renvoyer la réponse au client. C’est une séparation entre le client et le serveur.
L’API permet d’accéder aux données de façon standardisée, c’est-à-dire que peu importe quel langage est utilisé par le client, et peu importe comment le serveur est construit, ils communiqueront en utilisant le protocole HTTP et en se transmettant les données sous un format compréhensible par eux deux (XML ou JSON).
Contexte · Page 6/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Cahiers des charges
Expression du besoin
L’objectif est de faciliter la gestion des frais pour les employés en déplacement. Ils pourront accéder au service à partir de leur téléphone portable, leur permettant de saisir presque immédiatement leurs frais et de joindre les justificatifs en même temps.
Le résultat souhaité étant un gain de temps et une charge de travail diminuée, à la fois du coté des employés en déplacement mais aussi du coté du personnel chargé de la vérification et de la validation des frais en fin de mois.
Spécifications Fonctionnelles
Mise en place d’un accès aux données depuis l’API
L’application mobile doit pouvoir avec des appels HTTP vers l’API, consulter, modifier ou supprimer les différentes notes de frais de l’utilisateur, lui permettant aussi d’en créer de nouvelle.
Gestion des justificatifs
Permettre l’ajout d’un fichier justificatif à une dépense. (Prise d’une photo depuis le téléphone pour envoyer avec une dépense par exemple).
Mise en place d’une gestion des véhicules personnels
Pour la gestion kilométrique, permettre à l’utilisateur d’enregistrer ses différents véhicules personnels, qu’il pourrait être amené à utiliser dans le cadre de sa pratique professionnelle. Afin de garder une trace kilométrique sur ceux-ci. Permettant de calculer ses frais kilométriques plus aisément.
Refonte et correction
Il a été demandé de corriger certains problèmes d’affichage présent sur le module d’origine, notamment sur les écrans les moins larges. Il n’a pas été demandé de passer l’interface en responsive design. Corriger quelques erreurs sur la base de données, notamment lors de l’installation du module d’origine.
Cahiers des charges · Page 7/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Spécifications Techniques
Front End · Back End
- HTML5 · • · PHP 7.4
- CSS3 · • · JSON
- JS et JQUERY · • · MySQL
- AJAX · • · Dolibarr 13.0
Logiciels et applications utilisés
- Visual Studio Code
- JMerise (le maquettage de la base de données)
- GitLab (le versioning [nom] et sa gestion)
- PhpMyAdmin
- Composer
- Git
- PostMan (envoie de requêtes HTTP)
Environnement Dolibarr
Le développement d’un module externe Dolibarr impose certaines contraintes/règles de développement :
- Arborescence des fichiers et [nom] dans le module ainsi que leur nommage.
- Normes Copyright ( en-tête des fichiers ).
- Utilisation des fonctions Dolibarr ( notamment pour la sécurité sur les données).
- Convention de nommage des variables et des fonctions.
- SQL :Règle sur les structures des tables et les champs ( convention de nommage, champs obligatoires, types de champs) et sur les requêtes.
- Règles sur les accès à la base de données.
- Norme HTML.
- Dolibarr utilise le design pattern MVC, la particularité est que la partie controller C et la partie view V sont dans le même fichier et sont séparées par des balises commentaires.
- Utilisation des classes de style Dolibarr dans le HTML.
Voir Annexe n°1 page 44 pour la liste non exhaustive des conventions de programmation dans Dolibarr
Cahiers des charges · Page 8/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Analyse
Étude de l’existant
Avant de faire le choix de modifier le module externe Note de frais plus, nous avons étudié les autres solutions possibles :
Solution 1 - Développer un tout nouveau module :
Si cela est la solution qui semble la plus intéressante niveau apprentissage et connaissance à acquérir, elle n’était pas réalisable dans les temps accordés.
Solution 2 - Modifier le module note de frais de base de Dolibarr :
L’avantage est que le code du module est d’actualité et correspond aux conventions actuelles de Dolibarr mais il reste simple, et ne comprend pas de gestion de frais kilométrique.
Solution 3 – Modifier un module externe existant :
Le module externe Ndfp, plus complet que le module de base de Dolibarr, nous a donc semblé le meilleur choix pour répondre au besoin.
En plus d’être déjà connu de notre entreprise d’accueil, il permettait de réaliser [nom] dans les temps. Le seul inconvénient est le code plus « ancien ».
Après ce choix technique fait, pour mener à bien la suite [nom], j’ai étudié le fonctionnement de l’application Dolibarr et plus particulièrement celui du module externe. Afin de déceler les éléments sur lesquels j’allais devoir intervenir pour apporter les modifications souhaitées
Liste des points de recherche :
- Déterminer les différentes entités.
- Les tables de la base de données et leurs relations.
- L’organisation des fichiers (qui sert à quoi...etc…).
- Comment modifier, installer un module dans Dolibarr.
Voir Annexe n°2 page 48 pour l’organisation des fichiers et [nom] d’un module
Dolibarr
Analyse · Page 9/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Modélisation de s tables
Rétro conception du modèle conceptuel de données du module Ndfp, avec le logiciel JMerise, afin d’avoir une idée plus précise des éléments qui « composent » la note de frais, et des différentes relations entre eux.
Pour information, les tables du module sont générées à l’installation de celui-ci dans Dolibarr, grâce aux scripts SQL placés dans [nom] « sql » à la racine du module.
Modèle conceptuel de données
J’ai uniquement modélisé les tables du module. J’ai donc représenté dans le mcd les clés étrangères qui renvoient vers des tables des modules internes du Dolibarr que j’ai choisi de ne pas modéliser dans un souci de lisibilité et aussi car elles n’interviennent pas dans le fonctionnement du module note de frais (à part la table utilisateur).
Analyse · Page 10/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Règles de Gestion
Avec le modèle conceptuel de données et en utilisant le module externe, j’ai pu déterminé les règles de gestion entre les entités.
Une note de frais peut contenir zéro ou plusieurs lignes de dépenses.
Une ligne de dépense appartient à une seule note de frais.
Une note de frais est la propriété d'un seul utilisateur
Un utilisateur peut avoir plusieurs notes de frais
Une note de frais est validée par un seul utilisateur (qui n’est pas forcément l’auteur).
Un utilisateur peut valider plusieurs notes de frais.
Une dépense a zéro ou une catégorie de véhicule.
Une catégorie de véhicule à zéro ou plusieurs dépenses
Une ligne de dépense a un type de dépenses.
Un type de dépense à zéro ou plusieurs dépenses.
Une dépense si elle est de type jalon a zéro ou plusieurs lignes de taxes
Chaque ligne de taxes appartient à une seul dépense.
Une ligne de taxe peut avoir zéro ou plusieurs lignes de TVA.
Une ligne de TVA est associé à une ligne de taxe.
Une dépense à zéro ou une catégorie de paiement.
Une catégorie de paiement a zéro ou plusieurs dépenses.
Une catégorie de véhicules peut avoir zéro ou plusieurs barèmes kilométriques.
Un barème kilométrique n’a qu’une seule catégorie de véhicules.
Une catégorie de véhicules possède zéro ou plusieurs tranches kilométrique.
Une tranche kilométrique n’est associée qu’a une seule catégorie de véhicules.
Une tranche kilométrique a plusieurs barèmes kilométriques qui lui sont associés.
Un barème kilométrique n’a qu’une seule tranche kilométrique.
Voir annexe n°3 page 48 pour le modèle physique de données
Analyse · Page 11/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Modification d es tables du module
Création d’une nouvelle table, pour gérer les véhicules des utilisateurs, ndfp_vehicle.
Modification de la table ndfp_det (lignes de dépenses d’une note de frais), avec l’ajout de deux relations :
- une relation avec la nouvelle table des véhicules utilisateur ndfp_vehicle.
- une relation avec la table ecm_directories, qui contient les informations sur les justificatifs uploader sur le Dolibarr.
Modèle conceptuel de données Modifier
Analyse · Page 12/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Modèle logique de données
Analyse · Page 13/56
ISFAC Poitiers -2020 / 2021
Développeur Web et Web Mobile · Aurélien Girard
Modèle physique de données modifié
Nom colonne · TYPE
rowid · INT
fk_ndfp · INT
comment · TEXT
ref_ext · TEXT(30)
datec · DATETIME
dated · DATETIME
datef · DATETIME
fk_user_author · INT
previous_exp · INT
fk_exp · INT
tva · DOUBLE
qty · INT
cur_iso · TEXT(3)
rate · DOUBLE
total_ht_cur · DOUBLE
total_ttc_cur · DOUBLE
total_ht · DOUBLE
total_ttc · DOUBLE
total_tva · DOUBLE
milestone · INT
tms · TIMESTAMP
fk_vehicle · INT
fk_ecm_files · INT
Nom colonne · TYPE
rowid · INT
imma · TEXTR(11)
model · TEXT(30)
total_km · INT
km_curr_year · INT
km_last_year · INT
created_at · DATETIME
fk_cat · INT
fk_user · INT
tms · timestamp
Analyse
TABLE NDFP_DET (TABLE LIGNE DE DÉPENSE)
CP ? · Unique · Not Null · Clé · Remarques
étrangère ?
X · Auto incrément
X · X · ndfp_det.fk_ndfp = Ndfp.rowid
X
X
X · X
X · ndfp_det.fk_exp = _c_ndfp_exp.rowid
X
X
X · = ndfp_vehicle.rowid
X · = ecm_files.rowid
TABLE NDFP_VEHICLE (TABLE VEHICULE)
CP ? · Unique · Not Null · Clé étrangère ? Remarques
X · Auto incrément
X · X
X
X · ndfp_vehicle = ndfp_tax_cat.rowid
X · X · ndfp_vehicle.fk_user = User.rowid
X
Page 14/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Scripts SQL
Pour permettre la création des tables avec leurs modifications lors de l’installation du module, j’ai créé un nouveau script SQL pour la table ndfp_véhicle et modifié celui existant de la table ndfp_det.
Analyse · Page 15/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Modifications sur les écrans
Écran d’une note de frais
Formulaire de sélection d’un document déjà présent dans le répertoire document du module :
Formulaire d’upload d’un fichier :
Sélection du véhicule personnel, dans le cas d’un frais kilométrique
Analyse · Page 16/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Écran final d’une note frais après modification :
Analyse · Page 17/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Écran gestion des véhicules
Contient le formulaire de création d’un véhicule et le tableau des véhicules de l’utilisateur.
Avec les informations sur les kilomètres parcourus de chaque véhicule.
Analyse · Page 18/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Points clefs du développement
Versioning
Dans l’objectif que mon binôme qui était donc sur la partie cliente, qu’il développait en parallèle puisse bénéficier en permanence des dernières mise à jour fonctionnelles de L’API. Nous avons utilisé le GithLab de l’entreprise afin de travailler l’un et l’autre sur les mêmes versions du module.
Mise en place de l’API
Prérequis
- Activer l’utilisation des services API de Dolibarr dans la pages de configuration des modules.
- Le jeton API doit être généré sur les profils des utilisateurs (seul les comptes enregistrés sur le Dolibarr et avec un jeton d’api auront accès aux services).
Figure 1: Interface profil utilisateur avec clé pour api généré
Points clefs du développement · Page 19/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
L’API Dolibarr
Il m’a semblé nécessaire d’essayer de comprendre dans un premier temps, comment fonctionne l’API de Dolibarr en interne.
On peut dire qu’il y a deux niveaux à l’API Dolibarr, il y a tout d’abord, les classes qui constituent le cœur de l’API, situées dans [nom] /htdocs /api /. Elles utilisent le bundle Luracast Restler
(disponible sur Github), c’est un ensemble de classes PHP qui permettent de monter un serveur
API.
Ce composant va en outre se charger d’instancier les classes API des différents modules du Dolibarr, gérer la sérialization ou deserialization des données lors de la réception des requêtes
HTTP et l’envoi de réponses vers le client. Il permet aussi l’emploi d’annotations dans les classes
API des modules.
[nom] /htdocs /api / contient notamment les fichiers suivants :
- api_login.class.php : Lorsque l’utilisateur depuis le client, envoie une requête de connexion vers l’Uri /login, c’est la méthode index() de cette classe qui la « réceptionne » et qui va vérifier les identifiants et renvoyer la clé API si tout est correct.
- api_access.class.php : Son but est de vérifier les clés API reçu lors des requêtes, passées soit en paramètre de L’URL, soit dans le header de la requête. Elle vérifie après réception, que la clé à une correspondance avec un utilisateur existant. Si oui sa variable statique $user contiendra l’utilisateur connecté.
- api.class.php : Contient la classe DolibarrApi, parente de la future classe PHP API du module note de frais.
- index.php : C’est la « passerelle » de L’API. C’est par ce fichier qu’on accède aux différents services API du Dolibarr. Il instancie la classe DolibarrApi et utilise le bundle Luracast pour charger les différentes classes API détectées dans les modules Dolibarr.
Ensuite dans un second niveau, il y a les classes API propre aux modules (internes ou externes) du Dolibarr.
De la même façon qu’on pourrait le voir dans un framework comme Symfony par exemple, ces fichiers font offices de Controller qui écouteront les requêtes sur les routes associées à leurs méthodes et appliqueront la logique de celles-ci lors de la réception de la requête attendue . On associe une route à une méthode en utilisant les annotations.
Voir Annexe n°3 page 52 pour un extrait de code du fichier index.php
Voir Annexe n°4 page 55 pour la mise en place d’un service api avec Luracast Restler
Points clefs du développement · Page 20/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Ajout d’un service API pour un module
Pour ajouter le service API à un module Dolibarr, il faut créer un unique fichier nommé sous une forme bien précise api_<monModule>.class.php à placer dans [nom] class du module.
Dolibarr détectera automatiquement le nouveau service et il sera alors visible sur l’explorateur de services du système (le fichier index.php vu précédemment, scanne les [nom] à la recherche des fichiers api, d’où le nom du fichier selon un forme bien précise, et les ajoute à la liste des classes
API à instancier) .
Le fichier créé qui dans mon cas se nomme api_ndfp.class.php, il contiendra la classe PHP
NdfpAPI, qui définira avec ses différentes méthodes les points d’accès aux données (ou endpoints) de notre service API note de frais.
La classe PHP NdfpApi hérite de la classe
DolibarrApi, ce qui lui permet de bénéficier des méthodes et propriétés de celle-ci, notamment l’instance de la connexion à la base de données
$db initialiser à la construction ou encore de la méthode statique _checkAcessToRessource() qui permet de vérifier les droits de l’utilisateur connecté sur le module.
Points clefs du développement · Page 21/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Définir la structure de l’API
Afin de définir les endpoints qui composeront mon API, c’est-à-dire les URL auxquels le client va envoyer des appels, je me suis posé les questions suivantes :
- Quelles sont les ressources qui devront être accessibles ?
- Quels sont les URI à partir desquelles le client accédera à mes ressources ? ( les URI seront le moyen d’identifier nos ressources par exemple : /ndfp/{id} pour accéder à une note de frais).
- Quels sont les différents types d’action dont nous avons besoin sur les ressources. Ce sont les verbes HTTP (GET, PUT, DELETE, POST). Avons-nous besoin d’un CRUD complet ou juste d’une lecture ?
- Dans le cas des requêtes du type POST et PUT, Quelles sont les données dans le JSON que je m’attends à recevoir ?
- Quelles réponses je retourne selon les résultats ? (code erreur, réponse au format JSON).
Répondre à ces questions, m’a permis de définir une liste de requêtes auxquelles l’API pourra répondre, ainsi que les différents formats de réponses qu’elle retournera au client.
Les EndPoint :
Un endpoint est L’URL complet qu’on utilise pour nos requête HTTP vers l’API ( c’est donc le nom de domaine + l’URI d’accès à nos ressources ).
par exemple pour accéder aux documents :
- URI : /documents
- endpoint : [lien] mon- [lien] → permet d’accéder à la ressource documents.
Format d’un requête HTTP :
Verbe HTTP + URI + VERSION HTTP + HEADER + BODY
Format d’un Réponse HTTP
Version HTTP + Code de réponse HTTP + HEADER + BODY
Points clefs du développement · Page 22/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Je suis donc parti tout d’abord sur la rédaction d’une documentation de l’API, en renseignant pour chaque ressource accessible :
- Les URI et les verbes HTTP disponibles.
- Les paramètres qui doivent être passé à L’URL (si il y en a).
- Un exemple de requête.
- Les réponses possibles avec là aussi un exemple.
Cela à été utile pour mon binôme qui travaillait en parallèle sur le client d’Android d’avoir une documentation claire sur ce qu’attend l’API. Et cette documentation sera utile par la suite pour les futurs développeurs qui souhaiteront travailler sur cette API.
Points clefs du développement · Page 23/56
ISFAC Poitiers -2020 / 2021
Développeur Web et Web Mobile · Aurélien Girard
Extrait de la documentation API
Paramètres
Schéma
en gras les champs obligatoires
Requête
Réponse
renvoie l’id de la note de frais créée
Code http
Paramètres
Schéma
Requête
Réponse renvoie le JSON contenant la note de frais
Code HTTP
Points clefs du développement
POST - / nfpapi
{
"fk_user_author": "1", "fk_user_valid": "0", "fk_user": "1", "ref" : "PROV", "dates" : [téléphone], "datee" : [téléphone], "fk_cat": "6", "fk_mode_reglement": "3", “description”: “une description”, “comment_user” : “un commentaire de l’utilisateur’, “comment_admin” : “un commentaire de l’admin”
}
[lien]
31
200 · Note de frais créée
401 · L’utilisateur n’a pas l’autorisation
500 · Erreur lors de la création de la note de frais
GET - / nfpapi / {id}
id · Id d’une note de frais
[lien]
{
"id": "31", "cur_iso": "EUR", "ref": "(PROV31)", "entity": "1", "datec": [téléphone], "tms": [téléphone], "dates": [téléphone], "datee": [téléphone], "datef": [téléphone], "date_valid": "", "fk_user_author": "1", "fk_user_valid": "0", "fk_user": "1", "statut": "0", "fk_soc": "-1", "fk_project": "0", …
}
200 · Ok requête réussi
401 · L’utilisateur n’a pas les droits de lectures sur cette note de frais
500 · Erreur du serveur lors de la récupération des données
Page 24/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Mode de d’authentification
Pour pouvoir accéder aux différents services actifs du Dolibarr depuis le client, les utilisateurs doivent s’authentifier. Pour cela un premier appel vers une URL, en renseignant son login et son mot de passe, est nécessaire. Si les identifiants de connexion sont corrects alors le jeton de l’utilisateur est renvoyé.
Réponse JSON :
Le JSON contenant le statut de la requête (ici 200), le jeton de l’utilisateur. Ce jeton devra être fourni à chaque nouvel appel d’API ensuite, soit en tant que paramètre dans L’URL soit dans le header de la requête HTTP.
Points clefs du développement · Page 25/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Programmation de la classe NdfpApi
Une fois mes différents points d’accès de mon API définis, j’ai pu m’attaquer à la programmation de ceux-ci dans la classe NdfpApi.
J’utilise les annotations dans les entêtes de mes méthodes, pour définir :
- L’ URI d’accès à ma méthode ainsi que le type de verbe HTTP auquel la méthode répond.
- Les paramètres et leur type attendu.
- Les réponses et les codes HTTP possibles en cas d’erreur.
Par exemple pour la méthode postLine() qui permet d’ajouter une ligne de dépense à une note de frais :
Points clefs du développement · Page 26/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Structure du code :
Pour chaque méthode de ma classe NdfpApi, j’ai suivi une même « structure ».
Avant même d’agir sur la base de données, je vérifie les droits de l’utilisateur qui envoie la requête
(l’API à reçu son token dans le header de la requête http ). Si l’utilisateur ne possède pas les droits, une exception est levée et un code d’erreur est renvoyé. Si il possède les droits on poursuit.
Dans le cas d’un requête du type POST ou PUT, je vérifie si les données minimales attendues sont présentes, là aussi en cas d’erreur je lève une exception et renvoie un code d’erreur.
Ensuite, j’utilise les méthodes CRUD ou select de mes ressources pour accéder, créer, modifier ou supprimer les données. La aussi en cas d’erreur lors des requêtes SQL vers la base de données, je lève une exception et retourne un code d’erreur, en l’occurrence un code HTTP 500.
Et pour terminer, si tout est allé pour le mieux, je renvoie une réponse qui peut être un tableau au format JSON (dans le cas des requêtes GET) ou juste l’id de la ressource créée ou modifiée, avec un code HTTP 200
Exemple avec la méthode post() création d’une note de frais :
Points clefs du développement · Page 27/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Exemple d’accès à la ressource type de dépense (liste des dépenses ), méthode getExp() :
la méthode privé fetch qui exécute la requête vers la base de données :
Points clefs du développement · Page 28/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Méthode index qui correspond au GET /ndfpapi/ : Récupération des notes de frais :
Possède de nombreux paramètres pour trier sur la requête SQL ou même de rajouter un critère de recherche à la requête SQL. Elle retourne la liste des notes de frais, ou uniquement celles d’un utilisateur si le paramètre user_ids est renseigné.
Points clefs du développement · Page 29/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Exemple de JSON renvoyer lors d’un GET notes de frais
[
{
"id": "1", "cur_iso": "EUR", "ref": "(PROV1)", "entity": "1", "datec": [téléphone], "tms": [téléphone], "dates": [téléphone], "datee": [téléphone], "datef": [téléphone], "date_valid": "", "fk_user_author": "1", "fk_user_valid": "0", "fk_user": "1", "statut": "0", "fk_soc": "-1", "fk_project": "0", "fk_cat": "5", "fk_mode_reglement": "0", "billed": 0, "total_tva": "[téléphone]", "total_ht": "[téléphone]", "total_ttc": "[téléphone]", "mode_reglement": "", "autoclass": 0, "description": "", "comment_user": "", "comment_admin": "", "lines": [
{
"rowid": "1", "comment": "une dépense ajouter avec un post", "fk_cat": 0, "previous_exp": 0, "ref_ext": "", "fk_ndfp": "1", "datec": [téléphone], "dated": [téléphone], "datef": "", "fk_user_author": "0", "fk_exp": "9", "fk_tva": "[téléphone]", "qty": "1", "rate": "[téléphone]", "cur_iso": "EUR", "total_ht_cur": "[téléphone]", "total_ttc_cur": "[téléphone]", "total_ht": "[téléphone]", "total_ttc": "[téléphone]", "total_tva": "[téléphone]", "tms": [téléphone], "milestone": 0, "label": "Parking", "code": "EX_PAR", "fk_product": "0", "fk_product_type": null,
Points clefs du développement · Page 30/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
"fk_ecm_files": 0,
"fk_vehicle": 0, "tva_tx": "[téléphone]"
}
],
"tva_lines": [], "tax_lines": [], "user_author_infos": "SuperAdmin", "user_validator_infos": "", "ref_ext": null, "status": null, "note_public": null, "note_private": null, "date_creation": null, "date_validation": null, "date_modification": null, "alreadypaid": null
}
]
Points clefs du développement · Page 31/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Essai et vérification du code
L’interface explorer de Dolibarr, liste les différents services API actif et permet d’interagir avec ceux-ci. (accessible avec la route /api/index.php/explorer)
Cette interface permet de tester son code et vérifier la détection par le système des différents endpoints créés.
Elle permet d’interagir avec ceux-ci de la même façon que le client interagira avec eux, avec l’envoi de requêtes avec ou non des données au format JSON.
Ci-dessous les endpoints que j’ai créé pour l’API note de frais.
Points clefs du développement · Page 32/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Test d’une requête :
Toujours à partir de l’interface explorer de l’API Dolibarr, ci dessous le test d’une requête post vers ndfpapi/ 1/ line : ajout d’une ligne de dépense à la note de frais d’id :1
Réponse reçu de l’API : id de la ligne de dépense créée.
Points clefs du développement · Page 33/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Mise en place de la gestion des véhicules utilisateurs
Classe NdfpVehicle
Pour mettre en place la gestion des véhicules des utilisateurs, création d’une nouvelle classe PHP, NdfpVehicle. Cette classe contient les méthodes CRUD (create, read, update, delete) ainsi que les méthodes pour mettre à jour les valeurs kilométriques.
Points clefs du développement · Page 34/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Méthode création d’un véhicule :
voir annexe n° 5 page 56 pour le diagramme de classe NdfpVehicle
Points clefs du développement · Page 35/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Page vehicle.php
Un nouvel écran de gestion des véhicules à été ajouté, pour qu’il soit accessible depuis le menu
Dolibarr, il faut modifier le fichier descripteur de notre module pour indiquer la nouvelle entrée du menu.
Ensuite pour pouvoir accéder à l’environnement Dolibarr depuis la page il faut inclure le fichier main.inc.php ce qui permet d’accéder aux variables suivantes :
- $user l'objet qui contient les caractéristiques de l'utilisateur et ses droits.
- $conf l'objet qui contient la configuration de Dolibarr.
- $db l'objet qui contient le handler de connexion à la base de données.
- $langs l'objet qui contient la langue de l'utilisateur.
J’ai suivi les recommandations de programmation de Dolibarr pour la création de nouvelle page.
Par exemple l’inclusion de mes classes PHP doit se faire avec une fonction Dolibarr et non pas avec include_once.
De même en suivant les pratiques de Dolibarr, le fichier PHP doit être divisé en trois parties. Une partie inclusion des classes et librairies, ainsi qu’initialisations des objets et des variables.
Points clefs du développement · Page 36/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Une second section « Action » qui correspond au Controller du modèle MVC
Et enfin un troisième section VIEW :
Points clefs du développement · Page 37/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Veille sécuritaire
Concernant la veille sécuritaire, Dolibarr met à disposition des fonctionnalités pour vérifier facilement les droits d’accès de l’utilisateur. Et préconise par exemple d’utiliser les fonctions des librairies Dolibarr pour vérifier les données reçues et pour accéder à la base de données.
Dans le cas de l’accès à l’API :
La classe DolibarrApiAcces récupère la clé d’api dans L’URL ou dans le header de la requête. Si il est présent, elle vérifie que la clé reçue correspond à celle d’un utilisateur.
Après cette vérification, si tout est correct, l’utilisateur alors connecté est représenté par la variable statique $user, ce qui me permet ensuite de vérifier ses droits sur le module en lui même.
La définition des différents droits possibles sur un module est dans le fichier descriptif du module.
Veille sécuritaire · Page 38/56
Développeur Web et Web Mobile
ISFAC Poitiers -2020 / 2021
Recette de fonctionnement
Fonctionnalité
Interagir avec le module note de frais au travers de l’API depuis un client Mobile
Ajouter des justificatifs aux dépenses
Gérer les véhicules personnels des utilisateurs
Correction des bugs et refonte du code légacy
Recette de fonctionnement
Aurélien Girard
Fonctionnelle · Non-fonctionnelle
X
X
X
X
Page 39/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Recherche sur sites Anglophones
Dans le cadre de mon [nom], j’ai eu à effectuer des recherches, notamment en Anglais, pour trouver des informations sur le fonctionnement de L’API Dolibarr et en particulier du bundle
Luracast restler.
Site web utilise :
[lien]
Recherche sur sites Anglophones · Page 40/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Traduction
Vous avez deux options pour créer votre propre serveur d’API REST
- L’option la plus pratique est d’utiliser un modèle d’application comme « Restler Application » lequel est fourni avec de nombreux paquets qui vous aideront avec votre logique métier. Si vous choisissez cette option, sélectionner une branche dans le dépôt (Github) et procédez en suivant les instructions qui s’y trouvent.
- Créer un [nom] à partir de zéro, de cette façon vous avez le contrôle sur chaque aspect de votre application. Si vous choisissez cette option, suivez les différentes étapes ci-dessous.
- Créez un [nom] qui contiendra votre [nom] et ouvrez le dans le terminal.
- Saisissez « composer init » pour créer le composer.json.
- Quand cela sera demandé pour les dépendances, saisissez « restler/framework » et « ^5 » pour la contrainte de version.
- En alternative, vous pouvez laisser les champs vides et créer le composer.json en premier avec lancer : « composer require restler/framework:^5 ».
Recherche sur sites Anglophones · Page 41/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Conclusion du stage
Ce stage fut pour moi, une très bonne expérience. Ce fut l’occasion de mettre en pratique et en valeur les connaissances acquises lors de la formation au sein de l’ISFAC de Poitiers.
Le sujet [nom] fut l’opportunité pour moi de découvrir l’environnement Dolibarr, d’avoir une vision globale de son fonctionnement et vision encore plus précise du fonctionnement d’un module externe grâce à la modification de l’un deux.
Ce stage m’a aussi permis de travailler en équipe, ce qui implique une organisation différente d’un travail en autonomie, tant dans l’organisation des tâches et leur répartition que dans la communication.
De plus, être au contact de professionnels qui ne sont pas forcement dans le développement web, mais dans d’autres domaines de l’informatique m’a permis aussi d’étendre mes connaissances.
Je tiens à remercier nos formateurs, les équipes de l’ISFAC toujours à notre écoute, ainsi que mon
Maître de Stage M. Bertrand Fruchet, qui m’ont permis d’effectuer mon [nom] dans les meilleures conditions.
Conclusion du stage · Page 42/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
ANNEXES
ANNEXES · Page 43/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Conventions dans Dolibarr
Norme PHP
- Les chaînes doivent avoir les variables sorties de chaîne print "Mon texte affiche ma ".$variable." !\n";
- Les commentaires doivent suivre la syntaxe C
/* Bloc de commentaire
*/
$monobjet = new MonObjet($db);
$result=$monobjet->fetch($idobject);
for ($i = 1 , $i < 2 ; $i++)
{
// commentaire sur une ligne print $i;
}
- Les fonctions doivent retourner une valeur strictement > à 0 en cas de succès, et un nombre < à 0 en cas d'erreur.
- Pas de code mort (non utilisé) dans le code principal de Dolibarr (le code utilisé uniquement par un module externe doit être inclus dans le module externe).
- Utiliser "include_once" pour l'inclusion de tout fichier contenant des définitions de fonction ou de classes (donc fichiers *.class.php et *.lib.php), utiliser "include" pour tout inclusion de fichier de type template ou contenant un mixte de HTML et PHP (donc fichiers *.inc.php et *.tpl.php).
Conventions dans Dolibarr · Page 44/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Structures des classes et champs
Certaines propriétés de classes se retrouvent dans de nombreuses classes. Pour homogénéité, on utilisera les noms suivants:
- entity · that is id for the multicompany feature
- date_creation: · date of creation
- date_modification: · date of last modification
- date_validation: · date validation
- tms
- fk_user_creation: · id of user creating object
- fk_user_modification: · id of user doing modification
- import_key · qui contiendra le code d'import YYYYMMDDHHMMSS si vous faites des imports en masse dans la table.
- fk_user_validation: · object User
Normes SQL
Lorsque vous créez une table, il est recommandé de prendre les même conventions de nommages de tables que les autres tables Dolibarr. Avec, à minima les champs suivant:
- rowid INTEGER AUTO_INCREMENT PRIMARY KEY · qui est l'id technique
- entity INTEGER default 1 · that is id for the multicompany feature
- date_creation · datetime · that is the creation date
- tms · timestamp · qui sera un champ contenant la date de chaque mise à jour (la base de donnée le gère tout seul, pas besoin de le gérer par le code)
- import_key · varchar(32) · qui contiendra le code d'import YYYYMMDDHHMMSS si vous faites des imports en masse dans la table.
- status · smallint · pour stocker le status d'un object
- Type de champs
- integer pour tout nombre entier, id ou clé étrangère (bigint éventuellement accepté pour les id des très grosses tables)
- smallint pour tout numérique entier de petite taille
- double(24,8) pour tout montant
- double(6,3) pour les taux de tva
- real pour une quantité
- varchar pour une chaine (y compris de longueur 1)
- timestamp pour un champ date+heure devant être mis a jour automatiquement
- datetime pour un champ date+heure
- date pour un champ date
Conventions dans Dolibarr · Page 45/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
La clé primaire d'une table s'appelle rowid.
Il y a quelques tables qui échappent à cette règle actuellement (ex Table llx_c_actioncomm), pour des raisons historiques. Une évolution pourra être étudiée pour une prochaine version.
Le nom d'une clé étrangère commence par le préfixe fk_ suivi du nom de la table liée (requis pour éviter doublons globales à la base, problématiques sous certains SGBD comme postgresql) puis du champ lié (pour permettre plusieurs clés étrangères différentes sur une même table).
Exemple: fk_facture_fourn_fk_soc
Règles de codage SQL
- Utilisation des alias/nommage de champs. Dans le cas des select on pourra utiliser les alias pour simplifier l'écriture des requêtes: select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy
- Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple:
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
- Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d'une valeur différente.
Bon: · INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
- Les fonctions NOW, SYSDATE ou DATEDIFF sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP, par exemple par la fonction dol_now(), et non du moteur de base de données. Ceci afin d'avoir une meilleure portabilité du code mais surtout d'avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée.
Par exemple, on ne fera pas:
$sql="SELECT rowid FROM table where datefield = NOW()";
mais:
$sql="SELECT rowid FROM table where datefield = '".$this->db->idate(dol_now())."'";
Conventions dans Dolibarr · Page 46/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Par exemple, on ne fera pas:
$sql="SELECT rowid FROM table where DATEDIFF(table.datefield, NOW()) > 7";
mais:
$sql="SELECT rowid FROM table where datefield < '".$this->db->idate(dol_now() - (7 * 24 *
3600))."'";
Normes HTML
- Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote*.
- Les liens href doivent être absolus en se basant sur la fonction dol_buildpath() pour obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs. Pour les tags img, il faut faire appel à la fonction img_picto().
Par exemple:
print '<a href="'.dol_buildpath('/monrep/mapage.php').'">'.img_picto('Texte alt','nompictopng','').'</a>';
Autres Normes Dolibarr
Les nombres réels, montants et calculs
En PHP comme dans d'autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables. Essayer de faire par exemple print [téléphone];
Vous n'obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d'autres exemples qui ne fonctionnent pas. Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num() avec le 2eme paramètre renseigné à: 'MU', 'MT' ou 'MS' selon le besoin (voir doc fonction).
print price2num[téléphone], 'MT');
S'il ne s'agit pas d'un prix sur lequel s'adapte les paramètres MU, MT ou MS, il faut utiliser la fonction round().
Conventions dans Dolibarr · Page 47/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Ar borescence Module Dolibarr
- Mymodule/ : contient les pages php
- mymodule/build/les pages de compilation ou de building
- mymodule/core/modules/contient le fichier de description du module modMyModule.class.php
- mymodule/core/triggers contains triggers provided by module
- mymodule/admin/ contient les pages de paramétrage et d’interface d’administration du module
- mymodule/class/ contient les class PHP utilisées par le module
- mymodule/css/ contient les fichiers css utilisé par les pages du module
- mymodule/docs les documents du module (fichier descriptif)
- mymodule/img contient les fichiers images utilisé par le module
- mymodule/langs/xx_XX contient les fichiers langs utilisé par le module pour les traductions
- mymodule/lib contient les fichiers libraries de fonctions utilisé par le module
- mymodule/scripts
- mymodule/sql contient les fichiers sql des tables du modules, chargé à l’installation du module par la fonction init du module descriptor modMyModule,class.php
Arborescence Module Dolibarr · Page 48/56
ISFAC Poitiers -2020 / 2021
Développeur Web et Web Mobile · Aurélien Girard
Modèle physique de données
Nom colonne · TYPE
rowid · INT
cur_iso · TEXT( 3 )
ref · TEXT(30)
entity · INT
datec · DATETIME
dates · DATETIME
datee · DATETIME
datef · DATETIME
fk_user · INT
fk_user_author · INT
statut · INT
fk_soc · INT
fk_project · INT
fk_cat · INT
fk_mode_reglement · INT
billed · INT
previous_exp · INT
total_tva · DOUBLE
total_ht · DOUBLE
total_ttc · DOUBLE
description · TEXT
note_public · TEXT
note_provate · TEXT
tms · TIMESTAMP
date_valid · DATETIME
fk_user_valid · INT
comment_user · TEXT
comment_admin · TEXT
model_pdf · TEXT(255)
Modèle physique de données
TABLE NDFP (TABLE NOTE DE FRAIS)
CP ? · Unique · Not Null · Clé · Remarques
etrangère ?
X · Auto incrément
X
X
X
X
X · X · Ndfp.fk_user = user.rowid
X · X · Ndfp.fk_user_author = user.rowid
X
X · X
X · X
X · Ndfp.fk_cat = c_ndfp_exp_tax_cat.rowid
X · Ndfp.fk_mode_reglement =
c_ndfp_exp_pay_cat.rowid
X
X · X · Ndfp.fk_user_valid = user.rowid
Page 49/56
ISFAC Poitiers -2020 / 2021
Nom colonne · TYPE
rowid · INT
fk_ndfp · INT
comment · TEXT
ref_ext · TEXT(30)
datec · DATETIME
dated · DATETIME
datef · DATETIME
fk_user_author · INT
previous_exp · INT
fk_exp · INT
fk_cat · INT
tva · DOUBLE
qty · INT
cur_iso · TEXT(3)
rate · DOUBLE
total_ht_cur · DOUBLE
total_ttc_cur · DOUBLE
total_ht · DOUBLE
total_ttc · DOUBLE
total_tva · DOUBLE
milestone · INT
tms · TIMESTAMP
Développeur Web et Web Mobile · Aurélien Girard
TABLE NDFP_DET (TABLE LIGNE DE DÉPENSE)
CP ? · Unique · Not Null · Clé étrangère ? · Remarques
X · Auto incrément
X · X · ndfp_det.fk_ndfp = Ndfp.rowid
X
X
X · X · Ndfp.fk_user_author = user.rowid
X · = _c_ndfp_exp.rowid
X · = c_ndfp_exp_atx_cat.rowid
X
X
TABLE C_NDFP_EXP (TABLE DES TYPES DE DEPENSES)
Nom colonne · TYPE
rowid · INT
code · TEXT( 12 )
label · TEXT(48)
tva · DOUBLE
fk_product · INT
active · INT
accountancy_code · TEXT(11)
Modèle physique de données
CP ? · Unique · Not Null · Clé étrangère ? · Remarques
X · Auto incrément
X
X
X
X
Page 50/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile
TABLE C_NDFP_TAX_CAT (TABLE DES CATÉGORIES DE VÉHICULES)
Nom colonne · TYPE · CP ? · Unique · Not Null · Clé étrangère ?
rowid · INT · X
label · TEXT( 48) · X
active · INT · X
fk_parent · INT · X
Aurélien Girard
Remarques
Auto incrément
c_ndfp_tax_cat.rowid
TABLE C_NDFP_EXP_TAX (BAREME POUR CHAQUE TRANCHE KILOMÉTRIQUE)
Nom colonne · TYPE · CP ? · Unique · Not Null · Clé étrangère ?
rowid · INT · X
coef · DOUBLE · X
offset · DOUBLE · X
fk_cat · INT · X · X
fk_range · INT · X · X
TABLE C_NDFP_EXP_RANGE (FOURCHETTE KILOMÉTRIQUE)
Nom colonne · TYPE · CP ? · Unique · Not Null · Clé étrangère ?
rowid · INT · X
range · DOUBLE · X
active · INT · X
fk_cat · INT · X · X
Remarques
Auto incrément
c_ndfp_tax_cat.rowid
c_ndfp_exp_range.rowid
Remarques
Auto incrément
c_ndfp_tax_cat.rowid
Les trois tables ci-dessus avec leur relation, permette de modéliser la table ci-dessous. Qui est le barème Urssaf pour les frais kilométriques.
Modèle physique de données
Page 51/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Extrait code fichier index.php « passerelle » API
$api = new DolibarrApi($db, '', $refreshcache);
//var_dump($api->r->apiVersionMap);
// Enable the Restler API Explorer.
// See [lien] for more info.
$api->r->addAPIClass('Luracast\\Restler\\Explorer');
$api->r->setSupportedFormats('JsonFormat', 'XmlFormat', 'UploadFormat'); // 'YamlFormat'
$api->r->addAuthenticationClass('DolibarrApiAccess', '');
// Define accepted mime types
UploadFormat::$allowedMimeTypes = array('image/jpeg', 'image/png', 'text/plain', 'application/octet-stream');
// Restrict API to some IPs if (!empty($conf->global->API_RESTRICT_ON_IP))
{
$allowedip = explode(' ', $conf->global->API_RESTRICT_ON_IP);
$ipremote = getUserRemoteIP();
if (!in_array($ipremote, $allowedip))
{
dol_syslog('Remote ip is '.$ipremote.', not into list '.$conf->global->API_RESTRICT_ON_IP);
print 'APIs are not allowed from the IP '.$ipremote;
header('HTTP/1.1 503 API not allowed from your IP '.$ipremote);
//session_destroy();
exit(0);
}
}
// Call Explorer file for all APIs definitions (this part is slow) if (!empty($reg[1]) && $reg[1] == 'explorer' && ($reg[2] == '/swagger.json' || $reg[2] == '/ swagger.json/root' || $reg[2] == '/resources.json' || $reg[2] == '/resources.json/root'))
{
// Scan all API files to load them
$listofapis = array();
$modulesdir = dolGetModulesDirs();
foreach ($modulesdir as $dir)
{
// Search available module dol_syslog("Scan directory ".$dir." for module descriptor files, then search for API files");
$handle = [lien](dol_osencode($dir));
if (is_resource($handle))
{
Extrait code fichier index.php « passerelle » API · Page 52/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
while (($file = readdir($handle)) !== false)
{
$regmod = array();
if (is_readable($dir.$file) && preg_match("/^mod(.*)\.class\.php$/i", $file, $regmod))
{
$module = strtolower($regmod[1]);
$moduledirforclass = getModuleDirForApiClass($module);
$modulenameforenabled = $module;
if ($module == 'propale') { $modulenameforenabled = 'propal'; } if ($module == 'supplierproposal') { $modulenameforenabled = 'supplier_proposal'; } if ($module == 'ficheinter') { $modulenameforenabled = 'ficheinter'; }
dol_syslog("Found module file ".$file." - module=".$module." - modulenameforenabled=".
$modulenameforenabled." - moduledirforclass=".$moduledirforclass);
// Defined if module is enabled
$enabled = true;
if (empty($conf->$modulenameforenabled->enabled)) $enabled = false;
if ($enabled)
{
// If exists, load the API class for enable module
// Search files named api_<object>.class.php into /htdocs/<module>/class directory
// [lien] : use getElementProperties() function ?
$dir_part = dol_buildpath('/'.$moduledirforclass.'/class/');
$handle_part = [lien](dol_osencode($dir_part));
if (is_resource($handle_part))
{
while (($file_searched = readdir($handle_part)) !== false)
{
if ($file_searched == 'api_access.class.php') continue;
$regapi = array();
if (is_readable($dir_part.$file_searched) && preg_match("/^api_(.*)\.class\.php$/i", $file_searched, $regapi))
{
$classname = ucwords($regapi[1]);
$classname = str_replace('_', '', $classname);
require_once $dir_part.$file_searched;
if (class_exists($classname.'Api'))
{
//dol_syslog("Found API by index.php: classname=".$classname."Api for module ".
$dir." into ".$dir_part.$file_searched);
$listofapis[strtolower($classname.'Api')] = $classname.'Api';
} elseif (class_exists($classname))
{
Extrait code fichier index.php « passerelle » API · Page 53/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
//dol_syslog("Found API by index.php: classname=".$classname." for module ".
$dir." into ".$dir_part.$file_searched);
$listofapis[strtolower($classname)] = $classname;
} else { dol_syslog("We found an api_xxx file (".$file_searched.") but class ".
$classname." does not exists after loading file", LOG_WARNING);
}
}
}
}
}
}
}
}
}
// Sort the classes before adding them to Restler.
// The Restler API Explorer shows the classes in the order they are added and it's a mess if they are not sorted.
asort($listofapis);
foreach ($listofapis as $apiname => $classname)
{
$api->r->addAPIClass($classname, $apiname);
}
//var_dump($api->r);
}
Extrait code fichier index.php « passerelle » API · Page 54/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Exemple mise en place d’un serveur API Restler
Initialisation
Annotation
Exemple mise en place d’un serveur API Restler · Page 55/56
ISFAC Poitiers -2020 / 2021 · Développeur Web et Web Mobile · Aurélien Girard
Diagramme de classe NdfpVehicle
Diagramme de classe NdfpVehicle · Page 56/56