Auberson Thierry PDF
Auberson Thierry PDF
Auberson Thierry PDF
TRAVAIL DE BACHELOR
MÉMOIRE
FILIÈRE INFORMATIQUE
RÉALISÉ PAR
Thierry Auberson
Professeur responsable :
M. Nicolas Glassey
Entreprise d’accueil :
Travail de Bachelor
Préambule
Ce travail de Bachelor est réalisé en vue de l'obtention du titre de Bachelor of
Sciences en Ingénierie.
Doyenne du
Centre Formation de Base
L. Larghi
_______________________________________________________________________________
HEIG-VD, av. Sport 20, 1401 Yverdon-les-Bains
Tél. 024/557 76 09 / 07 Fax : 024/557 76 01
Département FEE
Filière Informatique
Orientation Systèmes de gestion
Candidat Auberson Thierry
Responsable Glassey Nicolas
Résumé publiable
La boucherie est aujourd’hui gérée et dirigée par son propriétaire, Monsieur Eric Peguiron, et
emploi trois collaborateurs. Elle connaît un succès grandissant dans la région, si bien que des
clients de tout le canton de Vaud se déplacent pour acheter ses produits et spécialités.
Eric Peguiron jadis âgé d’à peine 20 ans, s’est vu contraint de reprendre les rennes de
l’entreprise suite au décès prématuré de son père, Monsieur Alfred Peguiron. Ne comptant
alors pour seul employé que son propriétaire, la gestion du travail, la planification de la
production et la gestion des commandes s’effectuaient à l’aide de supports papiers, tels que des
post-it et un agenda. Le jeune boucher-charcutier a ainsi dû faire face très jeune à une charge
colossale de travail pour reprendre et moderniser l’entreprise de son père. Ce qui ne lui a pas
permis de concentrer ses efforts sur l’optimisation des tâches de gestion administrative et de
planification de son entreprise.
La solution qui sera développée dans le cadre de ce projet sera une application web, ayant
comme cadre les fonctionnalités de base d’un progiciel de gestion intégré pour effectuer la
partie de la gestion d’entreprise faite aujourd’hui sur des supports en papier. La solution
permettra ainsi de laisser libre choix futur quant au matériel de l’infrastructure informatique
cliente. Des composants tels que des écrans web ou ordinateurs répondant au normes
agroalimentaires pourraient ainsi être utilisés en laboratoire. Ces composants sont
généralement intégrés dans des boîtiers en INOX et peuvent ainsi être lavés et désinfectés avec
les produits de nettoyage spécifiques de la boucherie-charcuterie.
Candidat
Auberson Thierry Date: 10.09.2018 Signature:
Responsable
Glassey Nicolas Date: 14.09.2018 Signature:
Je remercie Madame Sonia Zahnd, Monsieur Lionel Favre et Monsieur Jacques Rochat,
collaborateurs de l’entreprise d’accueil Boucherie-Charcuterie Eric Peguiron, pour leur
participation active pendant toute la durée de la réalisation de ce travail de Bachelor. Leur
expérience métier, leurs conseils et leurs recommandations m’ont permis d’avoir une meilleure
compréhension de leur environnement de travail, ce qui m’a permis d’adapter au mieux ce projet à
leurs besoins.
Enfin, je tiens à remercier du fond du coeur Madame Elodie Auberson, ma très chère épouse, ainsi
que Luca et Elio Auberson, mes deux enfants, de m’avoir soutenu sans relâche tout au long de la
réalisation de ce travail de Bachelor, mais également et surtout durant ces quatres dernières années
d’études. Sans leur amour inconditionnel, leur force de caractère et leur courage infaillible, la
concrétisation de cette formation en emploi n’aurait jamais pu aboutir. Je leur dédie ce travail de
Bachelor.
1 Préambule 3
2 Résumé 5
3 Remerciements 7
10.10.4.5.2 Exemples complexes avec des jointures sur les tables 58
10.11.2 Exemple d’une requête avec jointure sur deux tables 62
11.4.8.1 L’affichage des dates en langue française dans les vues 80
17.4 Règles de validation spécifiques pour les valeurs TIME et Database 157
Un point important fut également d’apporter une attention toute particulière aux différentes parties
prenantes de ce projet, à savoir les collaborateurs de l’entreprise, qui en seront les futurs
utilisateurs. Car le succès de ce travail réside en grande partie dans son adoption par les
collaborateurs de la boucherie. La solution doit s’approcher au maximum des méthodes de travail
actuelles afin de leur éviter le plus possible un changement radical qui se traduirait par de la
résistance, voire même un refus d’utilisation.
Ce mémoire présentera ainsi le développement de l’application proprement dite, ainsi que les
différences avec ce qui avait été planifié dans le cadre de la pré-étude. Car dans cette phase, lors
de la conception, certaines difficultés techniques n’avaient pas pu être prévues et la solution finale
diffère légèrement.
Le contexte particulier de ce projet imposait le fait que la pré-étude devait intégrer une analyse
détaillée et figer les choix techniques, les modèles de bases de données et les interfaces
graphiques. Cela dans le but d’avoir un cadre clairement défini quant à ce que ce projet devait
réaliser et également ne pas réaliser, et de s’y tenir.
Elle se situe à Fey, dans le canton de Vaud, sur l’axe du LEB, la compagnie du chemin de fer
Lausanne-Echallens-Bercher.
Dès sa plus tendre enfance, Eric Peguiron rêvait de devenir boucher-charcutier pour un jour
reprendre les rennes de “l’entreprise de papa”. A sa sortie de l’école obligatoire, il a effectué son
apprentissage à la boucherie Plancherelle d’Orbe. Il comptait ensuite rester y travailler quelques
années, et éventuellement travailler dans d’autres boucheries de la région, afin d’acquérir de
l’expérience en dehors de l’entreprise familiale. Ceci dans le but d’être mieux préparé le jour où il
devrait reprendre l’entreprise de ses parents et devenir patron à son tour.
Mais la vie en a voulu autrement et le parcours qu’il avait prévu a été complètement renversé. Ce fut
en 2006, alors qu’il terminait à peine son apprentissage et avait alors tout juste 20 ans, quand son
père décède subitement. Ce fut donc sans pouvoir prolonger sa formation qu’il s’est trouvé dans
l’obligation de reprendre du jour au lendemain l’entreprise familiale.
C’est alors avec un courage exemplaire et un travail titanesque que Eric a repris l’entreprise de son
père. Les infrastructures étant déjà vieillissantes, notre jeune boucher est reparti de zéro et a vécu
sans salaire pendant une année pour se préparer à redémarrer.
Il lui a ainsi fallu reprendre contact avec les fournisseurs, moderniser ses machines et
infrastructures, se mettre à jour sur le plan administratif et refaire sa clientèle. Après 12 ans,
l’entreprise jouit d’une excellente renommée dans la région, si bien que des clients s’y déplacent de
tout le canton de Vaud. En plus d’avoir repris ses activités, la boucherie-charcuterie s’est agrandie,
car en plus de son titulaire, elle compte aujourd’hui trois employés et un apprenti boucher-charcutier.
L’entreprise génère aujourd’hui un chiffre d’affaires trois fois plus élevé qu’à l’époque où elle était
dirigée par ses parents. Ce volume d’affaires est en constante croissance, si bien que Monsieur Eric
Peguiron doit commencer à songer à d’éventuels futurs agrandissements.
Ce prix a été gagné à un concours, placé sous le patronage de la fondation “ swiss skils “
(www.swiss-skills.ch), qui vise à promouvoir le système de formation professionnelle duale suisse
auprès du grand public. Chaque année, tous les apprentis qui terminent leur formation
professionnelle avec une note supérieure à 5,5 sur 6 sont invités à participer à ce championnat
suisse.
Eric Peguiron éprouve une grande fierté et ne tarit pas d’éloges lorsqu’il évoque le succès de Lionel,
son second, qui a effectué sa formation auprès de lui.
7.3 Organisation
L’entreprise est dirigée par son propriétaire, Monsieur Eric Peguiron. Elle est divisée en deux
secteurs d’activité principaux, le laboratoire où s’effectue la préparation des produits et le magasin
où ils sont vendus.
La conduite des travaux en laboratoire est assurée par Monsieur Lionel Favre, avec l’appui de
Monsieur Eric Peguiron. Ensemble, ils prennent en charge la formation de leur apprenti, Monsieur
Alex Duplan.
La conduite de la vente en magasin est assurée par Monsieur Jacques Rochat, avec l’appui de
Madame Sonia Zahnd.
Lorsqu’il est en déplacement, Monsieur Eric Peguiron transmet la conduite de son entreprise à son
second, Monsieur Lionel Favre, qui se charge du bon déroulement des activités pendant son
absence.
Le processus d’abattage ne fait pas partie des activités de l’entreprise, il est effectué par des
abattoires partenaires.
La viande est livrée par camion sous la forme de quartiers qui seront ensuite utilisés pour la
fabrication des différents produits vendus en magasin.
Le but de ce projet est d’implémenter une solution, sous la forme d’une application Web, dont les
fonctionnalités de base s’apparentent à ce que propose un progiciel de gestion intégré (ERP) sous
la forme de modules. Les fonctionnalités attendues sont :
Tout comme dans tout ERP, les diverses fonctionnalités ont des dépendances les unes avec les
autres. Une commande client est destinée, et donc liée à un client, et contient un ou plusieurs
articles commandés. La gestion des commandes clients dépend ainsi de la gestion des clients et
des articles.
Pour pouvoir fonctionner, ces fonctionnalités nécessitent que l’application intègre d’autres
fonctionnalités sur lesquelles elles seront basées telles que :
Le résultat attendu de ce projet permettra de répondre au besoin métier spécifique du client, sans
alourdir le processus actuel.
Les seules contraintes sont les moyens financiers et la disponibilité du système. L’investissement
financier de matériel doit être le plus faible possible et le système doit proposer un moyen de
restauration en cas de dommage.
L'infrastructure matérielle à installer doit compléter l’infrastructure actuelle sans modifier ce qui est
existant. Le serveur d’application vient s’insérer dans le réseau et doit être accessible par les
composants existants.
Le stockage réseau NAS connecté au réseau de l’entreprise sera utilisé comme serveur de
sauvegarde des données de l’application. Ce NAS est équipé de deux disques durs montés en
RAID 1 (copie miroir, 1 à 1). En cas de dommage de l’un des deux disques, l’intégrité des données
est assurée car elles sont entièrement enregistrées sur chacun des deux disques durs.
3. Je suis sur la page des commandes d'un jour défini par le collaborateur, lorsque je clique
sur le bouton imprimer les commandes, l'application génère un fichier (pdf ou autre)
contenant toutes les commandes clients dont chacune sur une page différente.
2. Je suis sur la page des commandes à produire le jour suivant, lorsque je clique sur le
bouton imprimer les commandes, l’application génère un fichier (pdf ou autre) contenant
toutes les commandes clients dont chacune sur une page différente.
3. Je suis sur la page des commandes d’un jour défini par le collaborateur, lorsque je clique
sur le bouton imprimer les commandes, l’application génère un fichier (pdf ou autre)
contenant toutes les commandes clients dont chacune sur une page différente.
Cette méthode consiste à découper l’ensemble du projet en fonctionnalités métier, décrites sous la
formes de ‘User Stories’, qui sont implémentées de manière itérative. Contrairement à un
développement conventionnel avec une méthode ‘Waterfall’, les fonctionnalités peuvent être livrées
ou mises en production chez le client au fur et à mesure du développement. Cela lui permet de
pouvoir valider si les fonctionnalités livrées correspondent à son besoin et à ses attentes. Il peut
également disposer de l’application, la tester et prendre en main son nouvel outil de travail.
De manière générale, cette méthode permet de conserver un contact proche et régulier avec le
client. Elle lui permet ainsi de pouvoir demander des modifications ou des ajouts de fonctionnalités
durant la phase de développement. Il peut ainsi avoir une meilleure garantie que son produit
correspondra bien à ses besoins métier.
Une Release correspond à une version d’un produit. Ce travail de Bachelor est développé dans une
seule Release et correspond à la solution complète attendue par le mandant.
Cette Release est découpée en plusieurs Sprints qui correspondent à des phases de
développement de la solution, les itérations. Le principe est de procéder à un Sprint Planning avec
le client avant de démarrer le sprint en question et de convenir des fonctionnalités, les user stories,
qui seront implémentées. La durée du sprint est fixe et définie à l’avance, et l’estimation se fait sur le
nombre de fonctionnalités qui pourront être implémentées pendant cette itération. Contrairement à
une méthode Waterfall qui tente d’estimer le temps nécessaire pour réaliser un travail défini.
Au terme du sprint, une démonstration est faite au client lors d’une sprint review. Ce sprint review
permet au client de confirmer si le développement répond ou pas à ses attentes. Les fonctionnalités
développées correspondent ainsi à des livrables potentiels. Ces fonctionnalités, les User stories,
sont décrites sous la forme de scénarios utilisateurs. Le but étant d’apporter une solution à un
besoin métier.
En résumé, cette méthode de découpage permet d’obtenir une granularité la plus fine possible d’un
projet complexe de grande envergure. Cela permet ainsi de pouvoir estimer facilement ce qui pourra
être développé durant les sprints de durées fixées auparavant.
Scrum fait également intervenir les notions de ‘Sandbox’, ‘Product Backlog’ et ‘Sprint Backlog’.
Ce sont des sortes de containers à fonctionnalités dans lesquelles se trouvent les stories en attente.
La Sandbox peut être vue comme une boîte à idées dans laquelle les diverses requêtes de
fonctionnalités y sont déposées. Les stories se trouvant dans la Sandbox n’ont pas encore été
validées par le client et pourraient très bien ne jamais être développées.
Les stories se trouvant dans le Product Backlog sont des fonctionnalités qui se trouvaient dans la
Sandbox et qui ont été validées par le client. Cela signifie qu’il souhaite qu’elles soient
implémentées car il en a le besoin mais qu’elles n’ont pas encore été planifiées. Les stories qui
figurent dans le product backlog doivent contenir de critères d’acceptation, qui serviront de base
pour le client et l’équipe de développement. Ces critères d’acceptation permettront de valider si ce
qui a été développé correspond ou pas à ce qui est attendu.
Le Sprint Backlog contient les stories qui ont été planifiées pour un sprint en particulier. Elles sont
ainsi transférées du Product Backlog lors des Sprint Planning en accord entre le client et l’équipe de
développement.
Les sprints doivent généralement tous avoir une durée identique qui varient de deux à quatre
semaines. Mais la planification de ce projet était légèrement différente. Le premier et le cinquième
sprints avaient une durée de une semaine alors que le deuxième, troisième et le quatrième avaient
une durée de trois semaines.
Cette planification était principalement due au fait que le client a fermé l’entreprise pendant deux
semaines pour les vacances d’été du 2 au 19 août. L’objectif était de pouvoir achever les deux
premiers sprints et livrer les fonctionnalités avant la fermeture estivale. Le développement des
fonctionnalités du troisième sprint pouvait ainsi se poursuivre pendant les vacances de l’entreprise
et être mis en production à leur retour.
Cette fonctionnalité n’avait pas été prévue lors de la pré-étude et a été ajoutée en cours
d’implémentation. Cela a conduit à la création d’une nouvelle story avec ses critères d’acceptation.
Cette fonctionnalité ayant une grande importance pour le mandant, elle a été directement ajoutée
dans le sprint backlog afin d’être mise en production en même temps que la gestion des
commandes clients.
Les différents outils et technologies utilisés dans le cadre de ce travail de Bachelor ont été définis et
choisis dans le cadre de la pré-étude et sont décrits dans ce chapitre.
RASPBERRY Pi 3 model B+
Il existe de nombreuses applications pour lesquelles ce type d’appareil peut-être utilisé. Il est équipé
des composants suivants :
Il existe plusieurs types de systèmes d’exploitation (OS) qui peuvent être installés, dont Windows 10
ou différentes distributions GNU/Linux. L’OS proposé de base par la communauté Raspberry se
nomme “RASPBIAN”, qui est la contraction de “RASPBERRY” et “Debian” dont RASPBIAN est
dérivé.
Ceci le rend parfaitement adapté à une utilisation en tant que serveur Web pour des applications
pas trop conséquentes. Le fait qu’il soit muni d’une interface WLAN donne également la souplesse
de pouvoir l’installer où l’on veut, il suffit simplement de le brancher à une source d’alimentation
électrique et il peut ensuite être accédé et configuré par réseau sans fil.
Dans le cadre de la pré-étude de ce travail de Bachelor, il avait été fait mention d’utiliser la
distribution “UBUNTU MATE” qui est une distribution dérivée de DEBIAN, tout comme l’est
RASPBIAN. L’avantage de UBUNTU MATE est qu’il contient l’ensemble des applications, ou la
collection de logiciels, fournies par les distributions UBUNTU destinées aux ordinateurs de bureau.
Mais la version pour RASPBERRY demande plus de ressources que la version de base RASPBIAN
et la mise à jour du système ne fonctionnait pas. Et cette collection de logiciels n’avait aucune utilité
dans l’utilisation de ce projet.
C’est donc la distribution RASPBIAN qui a été retenue et installée sur le serveur d’application de ce
projet.
Il fonctionne principalement sur des systèmes d’exploitation de type UNIX sur lequel est basé
RASPBIAN. Il est également conçu pour prendre en charge de nombreux modules tel que PHP
utilisé dans ce projet.
Ces caractéristiques font de Apache 2 un logiciel parfaitement adapté à ce projet. Son rôle est de
recevoir les requêtes HTTP sur le port 80 venant de l’application, et de les rediriger vers la racine de
l’application Web.
Logo de PHP
PHP permet d’accéder à une base de données et fait office d’interface entre les pages Web et la
base de données de l’application.
Ce langage est très populaire et est considéré comme une des bases pour la création de sites et
applications Web. Il a notamment été utilisé pour créer des sites célèbres tels que Facebook ou
Wikipedia.
Logo de JavaScript
Ces fonctions sont celles de recherches dynamiques de ressources dans les champs de saisies de
formulaires des interfaces utilisateurs. Lorsque l’utilisateur entre deux caractères ou plus dans un
champs de saisie, le programme réalisé en JavaScript filtre et affiche les données contenant ce
texte uniquement. Ceci rendant les pages Web dynamiques du point du vue de l’utilisateur.
MariaDB assure une interopérabilité avec MySQL afin de pouvoir le remplacer. Plusieurs
distributions GNU/Linux ont ainsi abandonné MySQL au profit de MariaDB telles que “Fedora”,
“openSuse” et “Debian”, qui sont les acteurs principaux dans le domaine.
Logo de MariaDB
Ce SGBDR a été rapidement adopté à large échelle, si bien que Google a annoncé son adoption en
2013 et a affecté un de ces ingénieurs à la Fondation MariaDB.
Cet outil est très apprécié dans le cadre de développements faisant intervenir de multiples
développeurs. Git stocke toutes les informations du projet dans un dépôt local, comme le code
source de l’application et les différentes versions de développement. Ce dépôt local peut ensuite
être transféré sur un dépôt distant d’un service Web d’hébergement, afin de le partager entre
différents membres d’une équipe de développeurs.
Un dépôt contient une branche de base, la branche “master”, qui contient la version du logiciel qui
est mise en production.
Il est généralement de coutume de créer une branche “develop” sur laquelle figure la version de
développement de l’application.
Ce type de scénario est connu sous le nom de “Workflow”. Il définit le processus de créations et de
migrations des branches de développement d’une application.
Bitbucket offre de nombreuses fonctionnalités semblables à GitHub, mais il favorise plutôt les petites
équipes de développements. Il présente l’avantage d’être gratuit et de n’avoir aucune limite de
dépôts privés pour des équipes inférieures à 5 développeurs. Contrairement à GitHub où seuls les
dépôts publiques sont gratuits.
Logo de Bitbucket
L’application développée est ainsi stockée dans le dépôt local de la machine de développement.
Lorsqu’une version de développement est achevée, elle est transférée sur le dépôt distant hébergé
sur Bitbucket pour pouvoir être récupérée par le serveur d’application en production chez le
mandant.
Logo de Laravel
L’utilisation de ce framework présente l’avantage de développer une application Web avec une
structure standard et connue de tout développeur Web. Il respecte des principes de développements
standards et est constitué de plusieurs outils intégrés qui facilitent le développement d’une
application. Cela permet de se concentrer uniquement sur le développement des fonctionnalités de
l’application et de ne pas devoir tout développer de zéro.
10.10.2.1 Accessibilité
Pour des raisons de sécurité sur le serveur, seul le dossier public doit être accessible par les clients
de l’application. Les autres dossiers ne sont accessibles que par l’application Laravel elle-même.
Puis le fichier routes.php est chargé et ce dernier se charge d’analyser la requête et de la rediriger.
Ce fichier contient généralement les différentes routes de l’application avec les différentes méthodes
(get, post, …). Les requêtes sont ainsi triées et redirigées vers les contrôleurs et ses méthodes.
La récupération de données est utilisée pour effectuer un index sur une collection de données par
exemple. Plus concrètement, il peut s’agir de récupérer la liste des contacts clients en base de
données pour les afficher dans un tableau.
Dans le cas d’une requête de formulaire, il s’agit par exemple de récupérer le formulaire de création
d’une ressource, comme de définir un nouveau contact client.
Le scénario ci-dessous représente l’ajout d’un nouveau contact client lié à un compte client déjà
existant en base de données. Ceci tout en respectant le principe ‘modèle-vue-contrôleur’.
1. L’utilisateur souhaite ajouter un nouveau contact client lié à un compte client existant. Le
bouton fait appel à la route nommée ‘account.createContact’.
2. Le gestionnaire de route redirige la requête vers la méthode du contrôleur correspondante. Il
s’agit de la méthode ‘create’ du contrôleur ‘ContactController :
‘ContactController@create’.
3. Le contrôleur fait appel au gestionnaire de données des comptes clients,
‘AccountRepository’, afin de récupérer le modèle du compte client ‘Account’ pour lequel
un nouveau contact sera ajouté.
4. Le gestionnaire de données récupère le modèle d’un compte client ‘Account’ avec ses
attributs.
5. Le gestionnaire de données récupère les données du compte client dont l’identifiant ‘id’
fourni et le copie dans le modèle ‘Account’.
6. Le contrôleur reçoit les données du compte client du gestionnaires de données.
7. Le contrôleur retourne la vue contenant le formulaire de création d’un nouveau contact
client. Le modèle du compte client ‘Account’ est transmis avec l’argument ‘compact’ à la
vue de création du contact client.
8. La vue contenant le formulaire de création d’un nouveau contact client, avec les données du
compte client correspondant, sont affiché à l’écran de l’utilisateur.
Cet exemple met parfaitement en scène la séparation de la gestion des tâches proposées par
Laravel. Là où d’autres framework effectuent tout le traitement de la récupération des données dans
le contrôleur, Laravel permet de séparer ces tâches entre le contrôleur et le gestionnaire de
données.
Dans ce cas précis, c’est le contrôleur des contacts clients qui récupère les données avec le
gestionnaire des données des comptes clients. Cela permet d’éviter d’avoir une duplication de code
entre le contrôleur des comptes clients et le contrôleur de contacts clients. Si tout le traitement était
effectué à l’intérieur des contrôleurs, le contrôleur de comptes clients et celui des contacts clients
contiendraient le même code pour récupérer les données d’un compte client en fonction de son
identifiant.
Le contrôleur a ainsi un rôle de coordinateur et fait appel aux différentes méthodes des
gestionnaires de données. Tout le code de gestion de la récupération des données propres aux
comptes clients est écrit dans le gestionnaire de données ‘Repository’ et le contrôleur n’a pas à
savoir comment cela est réalisé.
Cette organisation permet de séparer très clairement les rôles de chaque partie du code pour ainsi
respecter le principe ‘DRY’ (Don’t Repeat Yourself) qui signifie de ne jamais dupliquer le code. Cela
causerait des complications en cas de modifications dans la gestion des données d’une ressource.
Le code devrait ainsi être modifié à divers endroits et ceci est à proscrire.
L’exemple ci-dessous décrit le scénario d’enregistrement d’un nouveau contact client dont les
données ont été saisies par l’utilisateur.
1. L’utilisateur a rempli les champs du formulaire avec les données du nouveau contact client
et a cliqué sur le bouton ‘Enregistrer’. Ce bouton fait appel à la route nommée
‘account.storeContact’.
2. Le gestionnaire de route redirige la requête vers la méthode du contrôleur correspondante. Il
s’agit de la méthode ‘store’ du contrôleur ‘ContactController :
‘ContactController@store’.
3. Les valeurs des données saisies dans le formulaire sont vérifiées à l’aide des règles de
validation décrites dans la méthode ‘rules’ de ‘ContactCreateRequest’.
4. Cet méthode renvoie un tableau contenant les données et leur format au contrôleur pour
s’assurer qu’elles correspondent à ce qui est attendu.
5. Le contrôleur fait appel au gestionnaire de données des contacts clients,
‘ContactRepository’, afin d’enregistrer les données du nouveau contact client saisi dans le
formulaire.
6. Le gestionnaire de données récupère le modèle d’un contact client ‘Contact’ avec ses
attributs.
7. Le gestionnaire de données crée une nouvelle ressources ‘Contact’ et l‘enregistre en base
de données.
8. Le contrôleur reçoit les données du contact client nouvellement créé du gestionnaires de
données.
9. Le contrôleur appel la route pour l’affichage du compte client lié au contact client
nouvellement créé. Le modèle du compte client ‘Account’ est transmis avec l’argument
‘compact’ à la vue d’affichage du compte client..
10. La vue contenant d’affichage du compte client est affiché à l’écran de l’utilisateur.
Cet exemple correspond à celui de la requête POST avec en plus, la validation des données saisies
par l’utilisateur dans le formulaire. Cette opération permet de garantir que les formats des données
sont corrects et cohérents, et évite que les données en base de données soient corrompues.
Il démontre également l’importance de la séparation des tâches dans les différentes parties du code.
Pour afficher la liste des fonctions ou outils disponibles avec Artisan, il suffit d’ouvrir un terminal de
commande (le terminal Linux par exemple), de se positionner dans le dossier racine de l'application,
et d’entrer la commande :
php artisan
Une partie de ces fonctions permettent de construire les différentes parties du code avec leur
squelette de base.
Le squelette de la classe générée contient déjà le bon espace de nom, inclut la classe ‘Request’ qui
pourra être utilisée dans le code, et hérite de la classe ‘Controller’ déjà définie dans le framework.
Cela permet de s’affranchir de toutes ces définitions dites “de plomberie” et de se focaliser sur le
développement du code proprement dit. Les classes générées font ainsi usage des fonctionnalités
déjà fournies par le framework.
Il est important de respecter certaines conditions de nommage. Le mot clé ‘create’ au début ainsi
que le mot clé ‘table’ à la fin indiquent qu’il s’agit de la création d’une table. La classe ainsi générée
sera créée à cet effet.
Il s’agit ensuite de définir les colonnes de la tables en langage PHP comme ceci :
Cette classe contient la méthode ‘up’ qui créera la table souhaitée avec les différentes colonnes et
types de données qu’elle doit contenir. La gestion des clés étrangères est également gérée par la
migration.
Les informations de connexion à la base de données doivent figurer dans le fichier caché ‘.env’ à la
racine de l’application. Ces informations seront nécessaires à Artisan pour accéder à la base de
données et pour créer et modifier son contenu :
L’outil de migration procédera ainsi à la création (ou à la modification si cela est le cas) des tables
dans la base de données.
Et lors de la première migration, une table avec le nom ‘migration’ est également créée dans la
base de données. Cette table permet de conserver un historique des migrations qui ont déjà été
effectuées dans la base de données. Il est ainsi possible d’ajouter des tables ou de les modifier en
cours de développement, sans interférer sur les données qui pourraient déjà être présentes sur le
serveur en production. La table de migration se présente comme ceci :
L’outil de migration tient ainsi compte des migrations déjà effectuées sur la base de données en
question et exécute uniquement les migrations qui n’ont pas encore été faites. De cette manière, il
est possible d’ajouter des tables, de les modifier (modifications de colonnes par exemple), de
modifier les contraintes de clés étrangères, etc…
L’outil de migration permet également de revenir sur ses pas en cas d’erreur, dans la classe de
migration par exemple, à l’aide de la commande de ‘rollback’ par exemple.
La classe est automatiquement créée dans le dossier ‘seeds’ du dossier parent ‘database’ :
Ce dossier contient les classes de population créées ainsi qu’une classe ‘DatabaseSeeder.php’ qui
sera chargée d’appeler les différentes classes seeder.
Les classes Seeder permettent ainsi de remplir les données souhaitées. Lorsque cela est requis, il
est important que le Seeder renseigne les différentes contraintes telles que les clés étrangères :
Pour que ces données soient enregistrées en base de données, il suffit d’exécuter la population
avec la commande suivante :
Sur le principe, la syntaxe est un peu similaire à celle qui serait utilisée en langage SQL. La
différence est que les commandes SQL s’effectuent au travers de méthodes de la classe ‘Model’
héritée par l’objet modèle en question.
SELECT *
FROM contacts
WHERE name LIKE ‘%text_recherché%’
OR firstname LIKE ‘%text_recherché%’
ORDER BY name ASC;
L’exemple ci-dessous effectue une jointure sur la tables des compositions avec la table des
composants et celle des produits. Ensuite une sélection est effectuée, avec les colonnes choisies,
sur les lignes dont le produit correspond à l’identifiant passé en paramètre et dont le composant ne
doit pas correspondre à la valeur passée en paramètre.
Exemple d’une requête complexe avec des jointures avec le Query Builder
L’exemple ci-dessous effectue une requête en utilisant une fonction agrégative de somme sur
certaine valeurs.
Exemple d’une requête complexe avec des fonctions agrégatives avec le Query Builder
Le Query Builder permet ainsi d’effectuer toutes les requêtes qui seraient possibles en langage
SQL, et tout cela en langage PHP avec des méthodes définies dans le framework Laravel.
L’interprétation de code PHP dans une vue HTML devient plus élégante avec l’usage d’un système
de doubles accolades à la place des balises ‘<?php … ?>’. Les instructions Blade dans les pages
HTML sont donc exécutées avant d’être envoyées à l’utilisateur pour l’affichage à l’écran.
La syntaxe suivante :
Il est également possible d’interpréter du code logique dans une page HTML lorsque cela peut être
nécessaire :
Mais il est important de ne pas en abuser, car la logique du code doit être effectuée au niveau des
contrôleurs ou des repositories et non dans les pages HTML. Cette fonctionnalité a principalement
son utilité lorsque l’affichage sur l’interface graphique change en fonction des valeurs des variables
à afficher.
Les différentes pages HTML n’ont pas besoin de contenir toute la syntaxe complète de la page. Il
suffit de définir un modèle de base, appelé ‘layout’ dans lequel sont définies les balises communes
à toutes les pages comme le <head> ou le <title> par exemple. Ce layout peut également contenir
la bannière principale avec le menu de navigation.
Les pages HTML de l’application font appel au layout avec l’instruction ‘@extends(‘nom du
layout’)’ et lors de l’appel à cette page, Blade se charge de récupérer ce layout et d’y insérer son
contenu.
Le layout doit contenir une balise ‘@yield(‘nom du contenu’)’ qui lui indique où doit être inséré le
contenu de la page HTML :
Cette fonction permet ainsi d’économiser un temps précieux pour générer les différentes vues de
l’application. Et cela respecte également le principe DRY (Don’t Repeat Yourself) pour éviter la
duplication de code.
Ainsi, en cas de modification dans le design des interfaces graphiques, la modification ne doit être
effectuée qu’à un seul endroit, dans le layout.
Un ORM est un programme qui joue le rôle d’interface entre un programme applicatif et une base
de données relationnelle. Il permet de simuler une base de données orientée objet et simplifie
grandement l’association entre les tables de la base de données et les modèles objets de
l’application.
L’avantage majeur est que cela permet de réduire la quantité de code nécessaire à écrire pour lier
des objets de l’application et les tables de la base de données au travers des requêtes SQL.
3. La classe ‘Model’ de Laravel définit une méthode ‘findOrFail’ dont le modèle ‘Contact’ a
accès par héritage. Cette méthode permet de convertir la ligne complète du contact dont
l’identifiant est fourni en un objet de la classe ‘Contact’.
Il est ainsi possible de s’affranchir de la préparation du string de requête SQL ainsi que de
copier une à une les valeurs des colonnes de la table dans les attributs de la classe modèle.
1. La classe modèle ‘Contact’ doit définir une méthode ‘account’ qui décrit la relation qu’un
contact a avec un compte client. Dans ce cas, un contact appartient à un seul compte client.
Exemple d’appel à une méthode de la classe Model avec relation à un autre modèle
3. Le modèle ‘Contact’ peut ainsi être utilisé dans les vues HTML. Dans l’exemple ci-dessous,
il s’agit d’une itération sur la collection d’objets ‘Contact’ pour les afficher un à un dans un
tableau.
Les cinq premières lignes récupèrent les attributs du modèle ‘Contact’. Les deux dernières
récupèrent les attributs du modèle ‘Account’ au travers de la méthode ‘account’ du modèle
‘Contact’.
Exemple d’utilisation d’un objet de type Model avec relation dans une vue
Il devient ainsi très simple et rapide d’interagir avec la base de données au travers de l’application
développée avec Laravel.
Laravel intègre nativement le framework Bootstrap qui est une collection complète d’outils utiles à
cet effet. Il suffit ainsi simplement de définir des attributs ‘class’ aux balises HTML avec les
arguments corrects pour que le design des interfaces graphiques soit élégant et uniforme.
Logo de Bootstrap
Bootstrap est disponible sous licence de logiciel libre MIT (pour Massachusetts Institute of
Technology). Il peut donc être utilisé, copié et modifié à souhait, sous réserve d’indiquer les auteurs
avec la notice copyright.
La communauté Bootstrap met à disposition des exemples de pages Web mises en page avec ce
framework sur leur site internet, qui sont gratuitement téléchargeables et utilisables. Le
développement de ce projet s’est inspiré de l’un de ces modèles afin d’économiser un temps
précieux dans la définition de sa mise en page.
Le langage PHP s’est peu à peu développé en un langage évolué et permet aujourd’hui de
programmer en orienté objet. Un framework de tests unitaires nommé ‘PHPUnit’ dédié au langage
PHP a été développé et permet ainsi de tester les différentes fonctions d’une application.
Ces deux types de tests ne doivent pas nécessairement être séparés mais Laravel recommande
fortement de le faire. C’est pour cette raison que Artisan procède de cette manière.
Les tests unitaires sont généralement destinés à tester des fonctions particulières de l’application,
comme le résultat retourné par une méthode par exemple.
L’éditeur de texte utilisé dans la réalisation de ce travail de Bachelor se nomme ‘Atom’, un éditeur
de texte libre multi-plateformes édité par ‘GitHub’. Atom présente l’avantage de supporter de
multiple ‘plug-ins’ (ou modules d’extensions en français), ce qui le rend très complet et multi-usages.
Logo de Atom
Il implémente le plus-in ‘Git Control’ et indique les informations du dépôt local du gestionnaire de
versions Git. Il est ainsi possible de changer de branches ou d’en créer de nouvelles directement au
travers de son interface.
Afin d’alléger la bonne lecture de ce mémoire, les marches à suivre ainsi que les scripts utilisés pour
la réalisation de cette étape sont fournis avec les annexes. Ces documents peuvent être utilisés afin
de pouvoir reproduire l’installation complète de ce qui a été réalisé.
La station de développement a été utilisée pour tester l’application avant sa mise en production sur
le serveur. Les mêmes applications ont de ce fait été installées autant sur le serveur que sur la
station de développement.
La pré-étude faisant mention d’utiliser la distribution Ubuntu Mate sur le serveur. Le Raspberry
n’étant utilisé que comme serveur web, il était inutile d’installer la distribution Ubuntu Mate, qui est
plutôt destinée à une utilisation sur des ordinateurs de bureau. C’est donc Raspbian qui été utilisée
dans le cadre de ce projet.
Une colonne ‘fax’ a été ajoutée au modèle de base, car dans la logique du modèle, un contact client
pourrait avoir son propre numéro de fax.
Suite à la mise en production de la fonctionnalité de gestion des produits, et selon entente avec le
mandant, les contraintes de certaines colonnes ont été modifiées pour être NULLABLE. Il s’agit des
colonnes ‘family’, ‘unit_price’ et ‘unit’ car dans ce contexte, il n’est pas nécessaire de devoir les
renseigner.
La colonne ‘name’ s’est vue attribuer la contrainte ‘UNIQUE’ afin d’éviter des duplications de
produits en base de données.
La colonne ‘name’ s’est également vue attribuer la contrainte ‘UNIQUE’ afin d’éviter des
duplications de composants en base de données.
Une nouvelle colonne ‘remark’ a été ajoutée à la table ‘orders’ afin que l’utilisateur puisse indiquer
une remarque spécifique pour cette commande. Il pourrait s’agir d’un souhait du client d’emballer le
contenu de sa commande sous vide ou de trancher très fin son salami par exemple.
La table des lignes de commandes devaient initialement contenir deux clés étrangères faisant
références aux clés primaires des tables ‘orders’ et ‘products’. Le concept était qu’une ligne de
commande est rattachée à une seule commande et concerne un seul produit.
Mais la relation entre un produit et un composant est de type ‘N à N’, ce qui signifie qu’un produit
peut être constitué de plusieurs composants, et qu’un composant peut être utilisé dans la
composition de plusieurs produits. Ce type de relation nécessite d’avoir une table de liaison qui
contient la paire de clés étrangères référençant les deux clés primaires des deux tables concernées.
Une ligne de commande contient le prix du composant commandé. La commande d’un produit
composé de plusieurs composants crée ainsi plusieurs lignes de commandes dont chacune
concerne un composant. La clé étrangère référençant la clé primaire de la table des produits rendait
la récupération des composants plus complexe. Il aurait fallu itérer sur la liste de ses composants à
chaque écriture, ce qui aurait eu des conséquences sur la charge de travail du serveur et sur les
performances de l’application.
C’est pourquoi la table des lignes de commande contient une clé étrangère qui référence la clé
primaire de la table ‘compositions’. La table composition contenant la paire de clés étrangères sur
les tables de produits et de composants, il est de cette manière très facile et rapide de récupérer les
données concernées.
Cette nouvelle colonne a son utilité dans la modification détaillée des lignes de commandes. Elle
rend possible les modifications à tous les niveaux, à savoir la suppression d’une ligne seule ou de
tout l’assortiment d’un seul coup. Elle permet également l’ajout d’un composant pas encore
sélectionné ou de modifier les composants séparément dans les lignes de commandes.
La valeur dans ‘assortment_number’ est incrémentée de 1 à chaque ajout d’un nouvel assortiment
à la commande.
Cependant, Laravel ne se charge pas de la base de donnée proprement dite. C’est pourquoi un
court script SQL a tout de même été nécessaire pour la créer. Ce script se charge de créer la base
de données et de donner les privilèges à l’utilisateur souhaité :
Le reste a été généré par les classes de migrations que l’on peut retrouver dans le dossier
‘database\migrations’ qui se trouve à la racine de l’application Laravel.
L’accès à la base de données par le framework Laravel se configure via le fichier caché de
configuration de l’environnement ‘.env’ situé à la racine l’application :
Les différents fichiers de l’application pour la gestion des différentes ressources, qui correspondent
aux tables de la base de données, sont tous organisés de la même manière.
La quantité de fichiers de code source étant élevée, ce chapitre ne fera mention que de leur nom, de
leur rôle et de leur emplacement. Ceci dans l’objectif de pouvoir aisément les retrouver et qu’un
autre développeur soit en mesure de reprendre et poursuivre le développement de cette application
(le code source est fourni avec les annexes).
ichier web.php
F Exemple de quelques routes
Les propriétés indiquées dans le tableau avec la variable ‘$fillable’ sont celles qui peuvent être
mises à jour en masse. C’est-à-dire que ce sont les champs qui peuvent être modifiés lors de la
création d’une nouvelle ressource. Cela empêche de propager des informations erronées jusqu’à la
table dans la base données.
Les modèles définissent des méthodes qui gèrent leurs relations avec les autres modèles de
l’application. Dans l’exemple ci-dessous, une commande client concerne un seul contact client. Et
une commande client est concernée par plusieurs lignes de commandes :
Modèles de l’application
Il y a un contrôleur pour chaque type de fonctionnalité. Il y a donc un contrôleur par table de la base
de données pour la gestion des ressources, mais il peut en exister d’autres également. Ils se
trouvent dans le dossier ‘app\Http\Controller’ qui est à la racine de l’application.
Par exemple, la gestion des statistiques et des commandes fournisseurs ne sont pas référencées
par des tables en base de données. Ces contrôleurs s’appuient sur les données des tables des
commandes clients pour retourner les informations dans les vues.
Il y a une classe par ressource, par analogie une classe par table de la base de données. Elles se
trouvent dans le dossier ‘app\Repositories’ qui est à la racine de l’application.
Cette nouvelle règle de validation est définie dans la méthode ‘boot’ de la classe
‘AppServiceProvider’ du framework Laravel. Cette classe se trouve dans le dossier
‘app\Providers’ qui est à la racine de l’application.
Cette fonction de filtrage est exécutée dans la page Web elle-même, du côté du client, et a
nécessité de développer un script en JavaScript. Il se trouve dans le ‘public\js’ à la racine de
l’application.
Afin de respecter le principe DRY, la définition de ce format d’affichage a été ajouté à la classe de
configuration globale des vues ‘view.php’ qui se trouve dans le dossier ‘config’ à la racine de
l’application.
Lorsque l’utilisateur clique sur le bouton “Imprimer”, le contrôleur fait appel au gestionnaire de
données pour récupérer les données nécessaires. Le contrôleur récupère la vue avec la mise en
page pour l’impression et génère un fichier qui est affiché dans un nouvel onglet du navigateur.
Ces vues se trouvent dans le même dossier que les autres vues des commandes clients. La
différence avec les autres vues est que ce package n’assure pas la compatibilité avec le framework
CSS Bootstrap. Ces vues font ainsi appel à un autre layout dans lequel la définition des styles de
mise en page ont dû être défini.
Vues d’export pdf Layout des vues pdf Style de mise en page
4. Les statistiques :
a. La génération des statistiques. Ce sont les additions de tous les composants
commandés sur une période donnée.
Il est ainsi possible de créer une ressource, de l’afficher ou d’en lister plusieurs, de la modifier ou de
la supprimer. Ces différentes ressources peuvent avoir des dépendances. Il faut par exemple créer
un compte client avant de pouvoir créer un contact client.
Un clic sur le bouton ‘Nouveau compte’ permet de créer un nouveau compte client et un clic sur le
bouton ‘Effacer’ dans le tableau effacera le compte en question.
Il s’agit ainsi de renseigner si le compte est une entreprise ou non. Si non, il s’agit d’un compte client
privé. Une entreprise peut être identifiée par deux noms, qui représentent la raison sociale et des
informations complémentaires. Dans le cas d’un compte client privé, ces 2 champs représentent le
nom et le prénom du client. Un compte client privé est considéré comme une entreprise du point de
vue de l’application.
Dans le cas où la case ‘Est une entreprise’ était sélectionnée, ce formulaire est vide et contient le
minimum de champs nécessaires à renseigner. Ceci toujours dans l’objectif de minimiser le temps
de saisie.
Dans le cas d’un client privé, lors la case “Est une entreprise” n’était pas sélectionnée, ce formulaire
est déjà pré rempli avec le nom et le prénom du client repris des 2 noms du compte créé.
Le but de ce flux de navigation est de correspondre exactement au processus suivi jusqu’alors avec
la saisie manuscrite des informations du client.
La liste des contacts faisant partie de ce compte client sont listés en dessous. Un clic sur le bouton
‘Ajouter contact’ permet de créer un nouveau contact client qui travail pour ce compte client.
Les noms des contacts affichés contiennent un lien pour afficher les détails de ce contact et le
bouton ‘Effacer’ permet de supprimer ce contact. Il est ainsi non seulement retiré du compte client,
mais est également supprimé de la base de données.
Il est également possible de modifier l’information si le client est de type entreprise ou pas, ainsi que
de définir s’il est actif ou non. Cette dernière information est très importante car dans le cas où un
compte venait à ne plus exister, en cas de fermeture ou de faillite de l’entreprise par exemple, le
compte ne devrait en principe jamais être effacé. Car si ce client aurait passé des commandes par le
passé, lors de son effacement, toutes les commandes qui lui seraient affiliées seraient effacées
également. Cela aurait pour conséquence de modifier l’historique des commandes et ainsi de
fausser les statistiques.
Deux boutons permettent de modifier ce contact ou de lui saisir un nouvelle commande. Une
commande sera ainsi rattachée aux contacts clients, et non directement aux comptes, afin d’avoir
une traçabilité détaillées des commandes.
Tout comme pour les comptes clients, un contact client ne devrait en principe jamais être supprimé.
Cela afin de ne pas supprimer les commandes qui lui sont affiliées et de garantir l’historique pour les
statistiques.
Plusieurs champs propres aux contacts clients peuvent être renseignés en option et ne sont pas
obligatoires pour le bon déroulement de l’application. Cela permet une certaine souplesse dans le
cas où une entreprise aurait plusieurs adresses ou que des collaborateurs auraient une adresse
différente de celle de l’entreprise. L’adresse ainsi que le numéro de téléphone ou le portable
seraient différents de ceux du compte auquel il est rattaché.
Il est également possible de renseigner un titre particulier que ce contact pourrait avoir, tel que
“Docteur”, “Professeur” ou “Maître” dans le cas d’une personne exerçant une activité juridique.
Dans le cas où ce contact ne ferait plus partie de ce compte, si cette personne quittait l’entreprise
par exemple, il serait possible de le désactiver afin de ne pas le supprimer.
Par analogie, un compte client ne peut pas être supprimé si une commande client est enregistrée
pour l’un de ses contacts.
La convention veut qu’un client ne doit jamais être supprimé, sauf cas de force majeure, mais qu’il
doit être désactivé.
Ces produits seront utilisés pour la gestion des commandes. Le mandant doit ainsi prendre le temps
de saisir tous ses composants afin de pouvoir ensuite les ajouter dans les compositions de produits.
Cette tâche sera très sollicitée avant l’utilisation de l’application en production et devrait être moins
utilisée par la suite. L’usage de cette fonctionnalité se fera dans le but de modifier certains articles,
comme un changement de prix des matières premières par exemple, ou si le mandant venait à créer
une nouveauté dans ses articles.
Un client sur le bouton ‘Nouveau composant’ permet de créer un nouveau composant et un clic sur
le bouton ‘Effacer’ dans le tableau effacera le composant en question.
La quantité de viande à prévoir par personne ainsi que le temps de préparation sont optionnels. Leur
objectif est de prévoir une éventuelle future nouvelle fonctionnalité qui pourrait calculer la charge de
travail journalière en fonction des commandes saisies.
Détails du composant
Un bouton ‘Nouveau produit’ permet de créer un nouveau produit et un clic sur le bouton ‘Effacer’
dans le tableau effacera le produit en question.
Des indications optionnelles peuvent encore être renseignées, la quantité suggérée par personne
pour simplifier la saisie des commandes ou le temps de préparation nécessaire à sa préparation. Ce
dernier pourrait être utilisé afin de calculer la charge de travail journalière par exemple.
Par exemple, dans le cas d’un assortiment où un composant devrait être tranché, comme dans une
fondue chinoise par exemple, un coût de CHF 2.00 par kg est ajouté au prix de ce composant.
Le bouton ‘Modifier’ dans la zone de détails de produit permet de modifier le produit lui-même. Le
bouton ‘Ajouter composition’ dans la liste de compositions du produit permet d’ajouter une
nouvelle composition à ce produit.
Pour les produits dont le composant est revendu tel quel sans préparation, comme un filet de poulet
par exemple, la liste ne contient qu’une seule composition avec un coût de préparation à CHF 0.00.
Une fois le composant choisi, son prix est affiché juste à côté du champs de saisie afin de pouvoir
vérifier s’il a été correctement renseigné lors de sa création.
Il reste ensuite à renseigner les informations relatives à la préparation de composant dans cette
composition de produit.
Si aucune préparation n’est nécessaire, le prix et le type de la préparation peuvent rester vides.
L’application enregistrera le prix de la préparation à CHF 0.00 et le type de la préparation avec
‘Rien’.
La saisie de commande nécessite que la base de données de l’application ait été alimentée avec
des clients et des produits. Ceci afin de pouvoir attribuer une commande à un client et d’ajouter des
produits à la commande.
Elle est la base sur laquelle s’appuient les fonctionnalités qui répondront aux objectifs secondaires,
d’automatiser la préparation des commandes fournisseurs et l’historisation des produits commandés
à des fins de statistiques.
Le formulaire en tête du tableau permet de sélectionner la période pour laquelle les commandes
doivent être affichées. Ceci afin de pouvoir afficher les commandes antérieures qui ont déjà été
livrées.
Cette interface affiche les informations générales relatives aux commandes clients comme les
numéros de commandes, le nom du compte et du contact, la date de la commande et de la livraison,
les remarques particulières et le prix total de la commande.
Une fois les deux dates renseignées et validées par un clic sur le bouton ‘Afficher’, un bouton
‘Imprimer’ apparaît et permet d’imprimer ces commandes dans un fichier pdf. Ces commandes
peuvent ainsi être imprimées sur des feuilles de papier et sont utilisées comme tâches à faire pour
les collaborateurs de la boucherie-charcuterie en laboratoire.
Index des commandes clients avec filtre sur les dates de livraisons
Ces commandes imprimées sont ensuite transmises au client lorsqu’il vient récupérer sa commande
en magasin. Elles permettent au client d’avoir un récapitulatif de leur commande et d’être informés
des prix des produits qui leur sont vendus.
Les prix exactes sont ajoutés manuellement lorsque chaque composant est pesé à la préparation.
Les quantités affichées correspondent à ce qui a été commandé et ne sont jamais 100% exactes
lors du pesage.
Détails d’un contact client pour la saisie d’une nouvelle commande client
La création d’une commande demande de renseigner la date de livraison de cette dernière ainsi
qu’une remarque particulière si nécessaire. Il pourrait s’agir d’un souhait particulier quant à
l’emballage ou à une modalité de livraison par exemple.
Le numéro de commande est constitué du texte ‘PO’ pour Purchase Order (commande d’achat), de
la date de la saisie de la commande en format ‘Année-Mois-Jour’ (YYYYMMDD) et d’un numéro
qui s’incrémente automatiquement. Il est ainsi possible de saisir jusqu’à 9’999 commandes par jour.
Le prix total de la commande est également affiché. Il est à CHF 0.00 lors de sa création et est mis à
jour à chaque ajout, suppression ou modification de son contenu.
Cette interface contient trois boutons, ‘Modifier’ pour modifier la date de livraison ou la remarque,
‘Supprimer’ pour la supprimer de la base de données et ‘Imprimer’ pour imprimer uniquement
cette commande.
Sous les détails de la commande sont affichés les lignes de commandes. Chaque ligne de
commande correspond à un produit et à ses composants. Lors de la création de la commande, le
tableau ne contient aucune ligne de commande.
Un bouton ‘Ajouter assortiment’ permet d’ajouter des articles à la commande. Il est fait mention
d’assortiment car du point de vue de l’application, tous les produits sont considérés comme
assortiments.
Détails de la commande
Dans le cas d’un produit composé d’un seul composant, un seul composant est à sélectionner.
Un clic sur l’édition du produit, avec le bouton ‘+’, permet d’ajouter des composants pour ce produit.
Lors de la saisie, seuls les composants n’ayant pas déjà été sélectionnés peuvent être ajoutés.
Un clic sur le l’édition de composant, avec le bouton ‘O’, permet de modifier la quantité commandée
pour ce composant.
Un clic sur l’effacement, avec les boutons ‘X’, permettent soit de supprimer le composant en
question, soit de supprimer l’article au complet avec tous ces composants de la commande.
A chaque ajout ou modification des lignes de commandes, l’application recalcule le montant total de
la commande et l’indique dans le tableau des détails de la commande.
Auparavant, cette tâche s’effectuait sur la base des commandes clients saisies dans l’agenda en
papier et ses post-it. Les collaborateurs de la boucherie-charcuterie devaient additionner les
différents composants commandés pour les jours suivants sur une feuille de papier. Sitôt l'addition
faite, ils pouvaient appeler leur fournisseur et lui passer la commande.
Ces commandes sont généralement effectuées deux fois par semaine, le mardi et le vendredi, pour
les 3 jours suivants.
L’utilisateur a 3 possibilités pour préparer sa commande, soit sur une période définie avec une date
de début et de fin, soit une fonction rapide sur 3 jours ou soit sur un nombre de jours au choix. Ces
options permettent une souplesse en cas de périodes particulières, comme lors de jours fériés dans
la semaine en cours.
Une fois l’une des trois options sélectionnée, la “liste de courses” est directement affichée à l’écran,
ce qui simplifie grandement sa préparation.
Son objectif est de pouvoir avoir un aperçu des consommations par composants, pour que le
propriétaire de l’entreprise puisse calculer les amortissements de ses installations.
Lorsque l’utilisateur de l’application affiche la page des statistiques, un formulaire est affiché. Il y a 3
possibilités pour afficher les statistiques des commandes de composants, avec une date de début et
de fin, avec une fonction rapide de l’année en cours, ou d’entrer une année choisie.
Sélection de l’intervalle de temps pour afficher les statistiques des commandes de composants
Lorsque l’intervalle de temps est sélectionnée, l’application affiche un tableau avec les quantités
additionnées de chaque composants :
Ces valeurs sont la base sur laquelle M. Eric Peguiron s’appuiera pour ses différentes analyses
d’utilisations de ses installations.
Cette fonctionnalité est une plus-value de l’application par rapport au système manuscrit
actuellement en utilisation. La tâche d’additionner toutes ces valeurs sur un format manuscrit sur
une année complète prendrait un temps colossal, et c’est pour cette raison qu’elle n’est pas
effectuée.
Par exemple, en saisissant le texte ‘au’, l’application affichera un tableau pour chaque type de
ressources pour lesquelles le texte saisi est contenu.
Les ressources affichées contiennent des liens qui permettront d’afficher leurs détails à l’aide d’un
simple clic.
Cette fonctionnalité est particulièrement utile lorsqu’un client téléphone pour passer une commande.
L’utilisateur peut ainsi très rapidement accéder aux détails d’un contact afin de pouvoir créer une
commande client, et ainsi gagner un temps précieux dans la navigation.
1. Créer les dossiers locaux sur le serveur qui auront la fonction de point de montage distant
sur le NAS. Ces dossiers se trouvent dans ‘ /mnt/NAS/peguiplan/backup/ ‘ :
2. Ajouter une instruction pour ajouter un point de montage du dossier de sauvegarde du NAS
depuis le serveur d’application. Cette instruction est ajoutée dans le fichier ‘ /etc/fstab ‘ et
elle est exécutée directement lors du démarrage du serveur :
3. Cependant, lors du démarrage, cette instruction ne fonctionne pas car lors de son
exécution, le serveur n’est pas encore connecté au réseau sans fil (WiFi) de l’entreprise. Un
‘cronjob’ doit être ajouté dans le fichier ‘ /etc/crontab ’ qui ré-exécutera le fichier ‘
/etc/fstab ‘. Le délai est configuré à une minute (60 secondes) après le redémarrage du
serveur :
Cronjob dans la crontab pour exécuter le montage 60 secondes après le démarrage du serveur
Ces fonctionnalités décrites sous la forme de scénario, ou Stories, ont permis d’avoir une granularité
plus fine de l’ensemble du projet. Le temps et l’effort nécessaire à la réalisation de chacune de ces
fonctionnalités était plus simple à estimer. Et les critères d’acceptation définis au préalable simplifiait
grandement la validation de ces fonctionnalités par le client lors de la livraison.
L’utilisation de l’outil iceScrum n’était par contre pas nécessaire. Outre le fait que ce fut intéressant
de l’utiliser dans le but d’en apprendre son fonctionnement, son usage m’a pris du temps
inutilement. Dans le contexte où j’étais seul sur le développement, la création des tâches ne
m’apportait aucune plus-value, les stories uniquement auraient été largement suffisantes.
Malgré la demande du mandant d’ajouter une fonctionnalité en cours de développement, il a été très
simple de l’intégrer au cours de l’un des sprints. Il en ressort que le succès réside dans la
préparation.
La solution est simple d’utilisation, ergonomique et répond à son besoin. Pour Monsieur Eric
Peguiron, les objectifs fixés ont été entièrement atteints et il en est pleinement satisfait.
L’outil de gestion de version Git n’était pas maîtrisé et m’a également demandé un effort
d’apprentissage conséquent. Git prend surtout son sens lorsque plusieurs développeurs travaillent
sur le même projet, mais son utilisation m’a permis d’en apprendre les rudiments et les principes.
Et de manière plus générale, j’ai acquis beaucoup de connaissance sur la complexité et les
difficultés rencontrées dans la mise en place d’un ERP dans une entreprise. Ce type de projet
demande bien plus que des compétences en informatique. Un ERP agit sur la gestion d’entreprise
et ses processus. Il est donc primordial de bien en comprendre tous les tenants et aboutissants.
C’est seulement après avoir bien cerné quels sont les défis et difficultés auxquels font face les
collaborateurs qu’il devient possible de proposer la bonne solution qui répond à leurs attentes.
Mon emploi du temps et mes horaires irréguliers ont fait que j’ai dû investir du temps sur ce travail
de Bachelor quand il m’était possible de le faire. C’est pour cette raison que j’ai beaucoup travaillé
de nuit ou en fin de semaine.
Il s’agissait de la configuration de l’application HTTP Server Apache qui réceptionne les requêtes
HTTP de l’utilisateur et les renvoie vers la structure des fichiers de l’application Laravel. Une
configuration des utilisateurs et groupes du système d’exploitation Linux a été source de difficultés.
La fonction d’exécution automatique des scripts de backup m’ont également demandé un effort
important d’apprentissage. J’ai dû apprendre ce qu’était le logiciel Cron et comment créer des
scripts Shell pour Linux pour que la sauvegarde automatique de la base de données puisse
s’enregistrer sur le NAS.
Les principales difficultés auxquelles j’ai été confronté étaient la gestion de l’affichage des dates en
français avec la classe Carbon de Laravel, la création de certaines requêtes complexes avec
jointures entre les tables ou l’impression des commandes dans un fichier pdf.
Cette fonction étant exécutée du côté client, dans l’explorateur Web, elle devait être programmée en
langage JavaScript. Le développement de ce script m’a demandé beaucoup d’effort pour atteindre le
résultat attendu.
Ces fonctionnalités apporteraient une plus-value métier supplémentaire à l’entreprise et pour des
raisons de limitation de temps, elles n’ont pas été implémentées dans le cadre de ce travail de
Bachelor.
La gestion des recettes faisant partie des secrets de fabrication de l’entreprise, Monsieur Eric
Peguiron souhaite que l’accès à ces données ne soient réservées qu’à certains de ses
collaborateurs. Cela implique qu’une fonctionnalité supplémentaire devrait être implémentée :
Cet outil devait s’approcher le plus possible des méthodes de travail actuelles de l’entreprise afin de
minimiser au maximum l’effet de changement pour les employés. Ce point était déterminant dans
l’acceptation de l’outil par ses utilisateurs. Car dans le contexte actuel, les employés de la boucherie
ne sont pas habitués à l’usage de l’ordinateur pour gérer leurs activités au quotidien. Un
changement trop brutal aurait pu conduire à un refus d’adoption de la solution, ce qui était un des
facteurs de risques important pour ce projet.
Arrivé au terme de ce projet, le constat est que le résultat correspond parfaitement à ce qui était
attendu. L’application apporte beaucoup de satisfaction à ses futurs utilisateurs. Lors des mises en
production, le propriétaire de l’entreprise et ses employés ont eu l’occasion de tester et prendre en
main la solution. Leur retour d’information est très positif et ils se réjouissent de pouvoir en faire
usage.
Monsieur Eric Peguiron est très enthousiaste et a déjà présenté cette application à quelques uns de
ses amis propriétaires d’une boucherie-charcuterie de la région. Il en découle que ce
développement a également du potentiel pour d’autres entreprises.
Je tire un bilan très positif de cette expérience. Le résultat obtenu et la satisfaction du client
m’indique que ce projet a atteint ses objectifs, tant sur le plan fonctionnel que sur le plan technique.
La conception et la réalisation d’une telle application m’a énormément appris de choses. Car un outil
de gestion est bien plus qu’un développement informatique. Il agit sur l’ensemble des processus de
l’entreprise et des méthodes de travail de ses employés.
J’ai ainsi dû commencer par bien m'imprégner de la philosophie de l’entreprise et bien comprendre
quelles sont les difficultés et les attentes de ses collaborateurs. Ceci afin de pouvoir adapter au
mieux l’application à leurs besoins. Je suis ensuite passé par une étape d’explication de ce que je
voulais leur apporter. Pour cela, il m’a fallu vulgariser le plus possible les concepts de ce qui serait
réalisé, afin qu’ils en comprennent les rudiments et les raisons de la structure de l’application.
Sur le plan personnel, ce projet m’a permis de mettre en pratique de nombreuses connaissances
acquises durant ces quatre années de formations. De la gestion de projet et de processus en
passant par de la communication avec le client, le tout autour du développement d’un programme
informatique. Une excellente mise en situation de l’informatique de gestion.
La granularité du déroulement de ce travail était ainsi ramenée au niveau des Sprints pour lesquels
les fonctionnalités à développer étaient définies. Cela me donnait ainsi la flexibilité de pouvoir
investir du temps sur la réalisation de ce travail quand cela était possible, et de ne pas être lié à une
planification trop détaillée.
Pour une meilleure vue d’ensemble du déroulement des ces douze dernières semaines, le travail
accompli sera donc présentée selon une vision Scrum par Sprint avec le temps investi pour chaque
Story (fonctionnalités).
Le journal de travail détaillé avec une vision linéaire des heures investies par jour est livré avec les
annexes de ce mémoire.
14.1.1 Sprint 1
Durée : 1 semaine
Dates : du 9 au 13 juillet 2018
14.1.3 Sprint 3
Durée : 3 semaines
Dates : du 4 au 24 août 2018
Total : 5h 00’
14.1.5 Sprint 5
Durée : 1 semaine
Dates : du 15 au 21 septembre 2018
Total : 3h 00’
Date Horiare nuit Horaire matin Horaire après-midiHoraire soir Horaire nuit Somme d'heures Phase Travail effectué
09.01.2018 1700-1800 1800-1900 2,00 Sujet Client - Discussion du mandat
20.01.2018 1100-1200 1330-1730 5,00 Sujet Définition du mandat
20.01.2018 1730-1800 1800-1830 1,00 Sujet Conseiller - Discussion du mandat
27.01.2018 0930-1200 2,50 Sujet Modifications du mandat
08.02.2018 1800-1930 1,50 Sujet Modifications du mandat
11.02.2018 0900-1200 3,00 Sujet Modifications du mandat
12.02.2018 2100-2200 2200-0000 3,00 Sujet Finalisation du mandat
13.02.2018 1300-1400 1,00 Sujet Client - Signature du mandat
15.02.2018 Sujet Dépôt du mandat au secrétariat de la HEIG-VD
Date Horiare nuit Horaire matin Horaire après-midiHoraire soir Horaire nuit Somme d'heures Phase Travail effectué
29.03.2018 1045-1115 0,50 Préétude Conseiller - Planif initiale
14.04.2018 0900-1100 2,00 Préétude Conseiller - Point de situation
14.04.2018 1100-1200 1200-1400 3,00 Préétude UML - Use Case boucherie
14.04.2018 1400-1700 3,00 Préétude UML - Activity Diag Fabrication
14.04.2018 1100-1200 1200-1300 2,00 Préétude Planification pré-étude
14.04.2018 1300-1430 1,50 Préétude UML - Activity Diag Commande
14.04.2018 1430-1630 2,00 Préétude Document de pré-étude
23.04.2018 2200-0000 2,00 Préétude UML - EntityDiag Database
24.04.2018 1600-1700 1,00 Préétude Conseiller call - point de situation
24.04.2018 2200-0000 2,00 Préétude UML - Activity Diag Facturation
27.04.2018 1600-1800 2,00 Préétude Document de pré-étude
28.04.2018 0930-1100 1300-1500 3,50 Préétude Document de pré-étude
28.04.2018 1500-1530 0,50 Préétude Corrections UML
03.05.2018 2200-0000 2,00 Préétude Document de pré-étude
04.05.2018 0000-0100 1,00 Préétude Document de pré-étude
05.05.2018 1300-1600 3,00 Préétude Document de pré-étude
05.05.2018 1600-1700 1,00 Préétude UML - Conceptual Diag
Thierry Auberson 118 / 160
10.05.2018 1100-1200 1,00 Préétude Document de pré-étude
10.05.2018 1400-1730 3,50 Préétude IHM - maquettes graphiques
11.05.2018 1530-1800 1800-1900 3,50 Préétude IHM - maquettes graphiques
11.05.2018 1900-1930 0,50 Préétude UML - corrections
11.05.2018 1930-2000 0,50 Préétude Document de pré-étude
11.05.2018 2000-2100 1,00 Préétude UML - Logical Diag
19.05.2018 1500-1800 1800-2100 6,00 Préétude Document de pré-étude
20.05.2018 1000-1200 1330-1700 2300-0000 6,50 Préétude Document de pré-étude
21.05.2018 0000-0100 1,00 Préétude Document de pré-étude
24.05.2018 1730-1800 1800-1830 1,00 Préétude Conseiller - Backlog
26.05.2018 1000-1200 1200-1600 6,00 Préétude Document de pré-étude
Date Horiare nuit Horaire matin Horaire après-midiHoraire soir Horaire nuit Somme d'heures Phase Travail effectué
09.07.2018 1700-1800 1800-1900 2,00 Implémentation Installation du serveur Web
09.07.2018 1900-2200 2200-0000 5,00 Implémentation Configuration des applications sur le serveur Web
10.07.2018 2030-2200 2200-0000 2,50 Implémentation Configuration des application sur le serveur Web
10.07.2018 2300-0000 1,00 Implémentation Configuration de Git sur le PC de développement
11.07.2018 0000-0100 1,00 Implémentation Configuration de Git sur le serveur
11.07.2018 1400-1600 2,00 Implémentation Conseiller - Sprint planning
12.07.2018 1800-2200 2200-2230 4,50 Implémentation Installation du serveur chez le mandant
14.07.2018 1400-1800 2000-2200 2200-0000 8,00 Implémentation CRUD comptes clients
15.07.2018 0000-0100 1,00 Implémentation CRUD comptes clients
16.07.2018 2200-0000 2,00 Implémentation CRUD comptes clients
17.07.2018 0000-0200 2200-0000 4,00 Implémentation CRUD comptes clients
18.07.2018 0000-0200 2,00 Implémentation CRUD contacts clients
21.07.2018 0900-1200 1200-1800 9,00 Implémentation CRUD contacts clients
24.07.2018 1700-1800 1800-2200 2200-0000 7,00 Implémentation CRUD contacts clients
Thierry Auberson 120 / 160
25.07.2018 0000-0100 1900-2200 2200-0000 6,00 Implémentation CRUD contacts clients
26.07.2018 0000-0100 1600-1800 1800-1900 4,00 Implémentation CRUD produits
27.07.2018 1600-1800 2000-2200 2200-0000 6,00 Implémentation CRUD produits, composants
28.07.2018 0000-0100 1000-1200 1200-1300 1,00 Implémentation CRUD compositions
28.07.2018 1000-1200 1200-1300 3,00 Implémentation Client - Mise en pré-production
30.07.2018 1400-1800 1800-1900 5,00 Implémentation Modifications selon mandant
30.07.2018 2000-2100 1,00 Implémentation Client - Retrospective avec le mandant
30.07.2018 2130-2200 2200-2300 1,50 Implémentation CRUD compositions
31.07.2018 1600-1800 1800-2000 4,00 Implémentation CRUD compositions
02.08.2018 1600-1800 2,00 Implémentation CRUD compositions
03.08.2018 1600-1800 1800-2000 4,00 Implémentation Documentation code de l'application
04.08.2018 1000-1200 1200-1500 5,00 Implémentation Documentation code de l'application
04.08.2018 1500-1800 3,00 Implémentation Backup DB sur le NAS
06.08.2018 1500-1800 1800-2000 5,00 Implémentation CRUD commandes clients
07.08.2018 1700-1800 1800-2200 2200-0000 7,00 Implémentation CRUD commandes clients
08.08.2018 0000-0100 1600-1800 1800-1900 4,00 Implémentation CRUD commandes clients
09.08.2018 1600-1800 1800-2200 6,00 Implémentation CRUD commandes clients
10.08.2018 1500-1800 1800-1930 2100-0000 7,50 Implémentation CRUD commandes clients
11.08.2018 0000-0100 1,00 Implémentation Impression des commandes clients
21.08.2018 1800-2100 3,00 Implémentation Impression des commandes clients
22.08.2018 1800-2200 4,00 Implémentation Impression des commandes clients
23.08.2018 1700-1800 1800-1900 2,00 Implémentation Conseiller - client : mise en production
25.08.2018 1200-1400 2,00 Implémentation Résumé avec dépôt sur GAPS
25.08.2018 1400-1800 4,00 Implémentation Mémoire - rédaction
27.08.2018 1800-1930 1,50 Implémentation Mémoire - rédaction
01.09.2018 1100-1200 1200-1600 5,00 Implémentation Mémoire - rédaction
03.09.2018 1900-2200 2200-2300 4,00 Implémentation Mémoire - rédaction
04.09.2018 1800-2000 2,00 Implémentation Mémoire - rédaction
05.09.2018 1800-2100 3,00 Implémentation Affiche
08.09.2018 1000-1200 2,00 Implémentation Mémoire - rédaction
08.09.2018 1200-1600 4,00 Implémentation Afficher commandes fournisseurs
08.09.2018 1600-1700 1,00 Implémentation Statistiques des commandes clients
10.09.2018 1800-2200 4,00 Implémentation Mémoire - rédaction
15.09.2018 1100-1200 1200-1400 3,00 Implémentation Modifications restrict sur delete ressources
15.09.2018 1400-1600 2,00 Implémentation Documentation code de l'application
15.09.2018 1600-1800 1800-1900 3,00 Implémentation Mise en production solution finale et formation
Thierry Auberson 122 / 160
17.09.2018 1000-1130 1400-1500 2,50 Implémentation Mémoire - rédaction
17.09.2018 1500-1800 1800-2030 5,50 Implémentation Mémoire - rédaction
18.09.2018 1300-1800 1800-2100 8,00 Implémentation Mémoire - rédaction
19.09.2018 0900-1200 1200-1700 8,00 Implémentation Mémoire - rédaction
19.09.2018 2000-2200 2200-0000 4,00 Implémentation Mémoire - rédaction
20.09.2018 0000-0200 0900-1100 1400-1800 1800-2100 11,00 Implémentation Mémoire - rédaction
21.09.2018 0930-1030 1400-1700 4,00 Implémentation Mémoire - rédaction
22.09.2018 0900-1200 1200-1700 8,00 Implémentation Mémoire - rédaction
24.09.2018 1600-1800 1800-1900 2100-2300 5,00 Implémentation Mémoire - rédaction
26.09.2018 2000-2200 2200-0000 4,00 Implémentation Mémoire - rédaction
Total TB 317,50
Thierry Auberson 124 / 160
14.3 Rendez-vous et contacts avec le Conseiller et l’entreprise
d’accueil
Rapport
Actions à entreprendre
Rapport
Actions à entreprendre
Rapport
Présentation du mandat au mandant. M. Eric Peguiron a validé le mandat et les objectifs du projet et
a signé le document.
Actions à entreprendre
Rapport
Conférence téléphonique au sujet des ERP libres à tester. L’objectif est d’effectuer une analyse des
produits existants sur le marché afin d’identifier si l’un d’entre-eux pourrait être utilisé et adapté dans
le cadre de ce travail de Bachelor.
Dans le cas où aucune solution existante n’apporterait satisfaction et ne répondrait aux besoins et
attentes du clients, la décision de développer une application de feuille blanche serait justifiée.
Les ERP libres qui seront testés et analysés seront “Odoo” et “Dolibarr”, qui sont deux ERP libres
largement répandus.
Actions à entreprendre
Rapport
Actions à entreprendre
Rapport
Actions à entreprendre
Rapport
Conférence téléphonique au sujet de la planification du projet qui doit être décrite dans la pré-étude.
Les scénarios, les stories et les critères d’acceptation des différentes fonctionnalités qui seront
traités durant la phase d’implémentation doivent être décrits et planifiés. Ils seront ensuite utilisés
pour alimenter les stories et les critères d’acceptations de la plateforme de gestion de projet
IceScrum .
Actions à entreprendre
Rapport
Actions à entreprendre
Rapport
Clôture de la release qui était en cours pour la pré-étude et création d’une nouvelle release pour la
phase d’implémentation. Puis nous avons défini les sprints en fonction de la planification qui a été
définie dans la pré-étude.
La plateforme IceS
Actions à entreprendre
Rapport
Installation du serveur Raspberry dans la boucherie-charcuterie. Le serveur web est fonctionnel, est
connecté au réseau interne de l’entreprise et est configuré pour récupérer l’application sur le dépôt
décentralisé de gestion de version “Git”.
Le serveur web est accessible via un navigateur web sur un poste client, celui de la
boucherie-charcuterie.
Actions à entreprendre
1. Stopper le sprint 1.
2. Planifier les stories de gestion des clients et des produits dans le sprint 2.
3. Démarrer le sprint 2.
4. Développer les fonctionnalités du sprint 2, la gestion des clients et des produits.
Rapport
Actions à entreprendre
1. Stopper le sprint 2.
2. Planifier les stories de gestion des clients et des produits dans le sprint 3.
3. Démarrer le sprint 3.
4. Développer les fonctionnalités de la gestion des commandes clients.
Rapport
Nous avons commencé par faire une rétrospective sur les fonctionnalités qui avaient été mises en
production lors du sprint précédent :
● Gestion des comptes et contacts clients ;
● Gestion des produits, composants et compositions ;
● Rappel de la structure des clients et des produits afin de synchroniser les vocabulaires et la
compréhension globale du système.
J’ai ensuite fait jouer des scénarios de saisie de clients et des produits à M. Eric Peguiron et à son
employé, Monsieur Lionel Favre, afin qu’ils puissent tester l’outil eux-mêmes. La gestion des clients
et des produits correspond ainsi parfaitement avec leurs méthodes actuelles.
Nous sommes ensuite passé à l’utilisation de la gestion des commandes clients, qui est le contenu
du sprint en phase de livraison. Nous avons ainsi joué quelques scénarios réels, dans lequel des
clients les appellent et leur passe une commande. Ils ont constaté que les flux de navigation au
travers de l’application sont réalisés de manière optimale en fonction de leurs processus de travail.
Ils ont ensuite pu ajouter des produits composés ou non à leurs commandes, les modifier, en ajouter
ou en supprimer et faire les choix des composants des assortiments. Ils ont également pu tester
l’impression des commandes sur papier. Le résultat est très satisfaisant car il permet une souplesse
dans les choix des composants des assortiments, tout comme ils le font aujourd’hui.
Cette fonctionnalité est le noyau principal de ce qui est attendu de ce projet et a donné une
excellente satisfaction. Elle répond au besoin réel de l’entreprise.
J’ai ensuite fait la démonstration du bon fonctionnement des sauvegardes automatiques de la base
de données sur son NAS tous les jours à 1h du matin. Le résultat correspond à ce qui est attendu.
Le point critique majeur est la difficulté pour M. Eric Peguiron de restaurer le système en cas de
crash. Si cela devait arriver, il a besoin d’une méthode très simple et très rapide pour remonter son
système, afin de ne pas être arrêté dans ses activités.
En ce qui concerne les risques liés à la foudre, ils sont en principe inexistant car la
boucherie-charcuterie est équipée d’un parasurtenseur à gaz.
Actions à entreprendre
Rapport
Actions à entreprendre
ERP Enterprise Resource Planning ou PGI pour Progiciel de Gestion Intégré (en
français). Programme informatique pour la gestion d’entreprise, tel que la
gestion de la production, des ressources, des stocks ou de l'administration.
OS Operating System
Termes Signification
Production Activités qui consistent à produire les morceaux nobles telles que l’abattage
de l’animal, le désossage, etc...
Préparation Activité qui consiste à préparer les commandes des clients avec des
produits finis.
Termes Signification
Middleware Classes faisant partie du framework qui sont chargées d’effectuer des
traitements à l’arrivée d’une requête ou à son départ. Les middleware sont
une surcouche de l’application.
ORM Object Relational Mapping, outil qui permet d’effectuer des requêtes en
base de données via le programme applicatif et de s’affranchir du langage
SQL.
fork Nouveau logiciel créé à partir du code source d’un logiciel existant lorsque
les droits accordés par les auteurs le permettent.
package Fichier archive comprenant les fichiers, les informations et les procédures
nécessaires à l’installation d’un logiciel sur un système d’exploitation.
crontab Fichier contenant la table des tâches à effectuer par le logiciel cron.
cronjob Une tâche à effectuer par le logiciel cron. Correspond à une entrée dans le
fichier crontab et est défini avec les paramètres de date, heure et cycle
d’exécution.
Product Owner Le propriétaire d’un produit. Correspond au client ou au mandant d’un projet
qui en sera le bénéficiaire et l’utilisateur final.
Waterfall Technique de gestion de projet standard qui se déroule en une seule fois
avec livraison à la fin.
16.1 Livres
Sujets Titres de l’ouvrage Auteurs
PHP et Concevez votre SITE WEB avec PHP et MySQL OpenClassrooms - Mathieu
MySQL Le développement d’un site dynamique enfin à NEBRA
votre portée !
$ cd /home/share/Software_Linux
$ nxz ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
1. Ecrire la carte microSD du server (où /dev/mmcblk1 est le nom de la carte microSD):
https://raspbian-france.fr/installer-serveur-web-raspberry-lamp/
Installation de Apache
Installation de Apache
1. Installer laravel
cd /tmp
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
1. Configurer apache
cd /etc/apache2/sites-available
sudo nano laravel.conf
<VirtualHost *:80>
ServerName yourdomain.tld
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/your-project/public
<Directory /var/www/html/your-project>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
1. Exécuter les commandes :
Références supplémentaires :
https://httpd.apache.org/docs/2.4/vhosts/name-based.html
Installation de PHP
Installer nano
https://tutoandco.colas-delmas.fr/developpement/installer-php7-1-php7-1-fpm-debian-
raspberry-raspbian/
Bug Fix pour PhpMyAdmin avec PHP7
Voici quelques liens pour fixer des bugs qu'il pourrait y avoir avec PhpMyAdmin et PHP7
https://devanswers.co/problem-php-7-2-phpmyadmin-warning-in-librariessql-count/
https://devanswers.co/manually-upgrade-phpmyadmin/
https://www.phpmyadmin.net/downloads/
https://www.stewright.me/2016/03/turn-raspberry-pi-3-php-7-powered-web-server/
https://stackoverflow.com/questions/43408604/php7-install-ext-dom-issue
https://tutoandco.colas-delmas.fr/developpement/installer-php7-1-php7-1-fpm-debian-
raspberry-raspbian/
Installation de MariaDB
Stopper MariaDB
/etc/init.d/mysql stop
use mysql;
update mysql.user set password=PASSWORD("mynewpassword") where user='root';
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE user='root';
flush privileges;
quit
mysql -u root -p
https://support.rackspace.com/how-to/mysql-resetting-a-lost-mysql-root-password/
https://korben.info/comment-changer-le-mot-de-passe-root-perdu-de-mysql.html
https://stackoverflow.com/questions/1709078/how-can-i-restore-the-mysql-root-user-s
-full-privileges
https://www.howtogeek.com/50787/add-a-user-to-a-group-or-second-group-on-linux/
Installation de laravel
Installation de composer. Dans le terminal, aller dans le dossier du projet et coller le contenu
suivant :
Puis déplacer le fichier composer.phar dans le dossier suivant (pour pouvoir l'exécuter de
n'importe où)
cd ~/web/peguiplan
composer update
composer install
php artisan install
cp .env.example .env
php artisan key:generate
Changer des colonnes dans les tables de la DB avec les migrations requière Doctrine DBAL
Créer un dossier pour stocker l'application Laravel et créer un raccourci depuis le dossier
/var/www/
mkdir -p ~/web/peguiplan/
$ sudo ln -s ~/web/peguiplan /var/www/
http://valentinvannay.com/2016/01/21/installation-of-a-web-server-and-laravel-5-on-
a-raspberry-pi-2/
https://www.howtoforge.com/tutorial/install-laravel-on-ubuntu-for-apache/
Annexe 02
Préparation du dépôt Git sur Bitbucket
1. Aller sur Bitbucket.org
2. Créer un repository
https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
$ ls ~/.ssh/
id_rsa id_rsa.pub
Etape 2: Ajouter la clé au ssh-agent
$ eval `ssh-agent`
Agent pid 10263
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa:
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
1. Dans Bitbucket, aller dans Bitbucket settings depuis l'avatar en bas à gauche. La page Account
settings s'ouvre
2. Cliquer sur SSH keys Si des clés ont déjà été ajoutées, elles seront visibles sur cette page.
3. Dans le terminal, copier le contenu du public key file :
$ cat ~/.ssh/id_rsa.pub
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQC+SdGZ6J7iFqvcVg1drRNh+22bxA2L7xODTY0W36jBGkTL9iGhMH9
dZkGAa/gfY6AlPEOAVHOpLOJdWQqUyfs+W7LUH9w1H4lfFhuAZWpYmEwbaiT3tOon5lTi9JhOmDaYiOxiN1
34TNnZz00eBVRydKF5AHbMOycU2pKOJT5nidSLKdcm7aJwroAiAOpyHQK1Kdc8L4rd+GNBmjlz8chHI8fPG
KMHaTCdrhkhUZqKamhMoCQo8mqrfAoF/uOBIXVBI/d6ACB7hByRcUQa5nO5mCdyad+R4UKWD9XgZTEJT+w7
2Wh36llZ0tfpDRXYwSHerYoPZg9ItBlmqc7HvLR/ user@thi-tosh
1. Cliquer sur Save Bitbucket devrait envoyer un email pour confirmer l'ajout de la nouvelle clé.
2. Retourner dans le terminal et vérifier la configuration de l'utilisateur en entrant la commande
suivante :
$ ssh -T git@bitbucket.org
$ mkdir /home/share/Dev
$ sudo ln -s /home/share/Dev/ /var/www/Dev
localhost
1. Aller dans le dossier de Dev et clôner le dépôt distant sur la machine locale
$ cd /home/share/Dev/
user@thi-tosh:/home/share/Dev$ git clone git@bitbucket.org:tchery/peguiplan.git
Clonage dans 'peguiplan'...
Warning: Permanently added the RSA host key for IP address '104.192.143.2' to the
list of known hosts.
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Réception d\'objets: 100% (3/3), fait.
https://blog.whabash.com/posts/mounting_synology_nas_shared_folder_nfs_ubuntu_16_10
3. Installer nfs-common
Créer un dossier cible pour le point de montage et exécuter la commande suivante adaptée avec
l'adresse IP du serveur NFS et monter le point de montage
Pour ajouter un point de montage persistant vers le share NFS, ajouter une entrer dans le fichier
/etc/fstab :
et ajouter :
https://www.kinamo.fr/fr/support/faq/mysql-backup-automatique-base-de-donnees
1. Créer un fichier script nommé mysql_backup.sh et entrer le script suivant :
#!/bin/bash
DATE=$(date +"%Y%m%d")
BACKUP_DIR="/mnt/NAS/peguiplan/backup/mysql"
# Identifiants MySQL
MYSQL_USER="DBName"
MYSQL_PASSWORD="MyPasswordDB"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SKIPDATABASES="Database|information_schema|performance_schema|mysql"
RETENTION=14
mkdir -p $BACKUP_DIR/$DATE
# Dumb the databases in seperate names and gzip the .sql file
for db in $databases; do
echo $db
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables
--events --databases $db | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done
3. Créer un cronjob
0 1 * * * root /usr/local/sbin/mysql_backup.sh
Sauvegardez le fichier cron et redémarrer le service, ce qui se fait avec une des commandes
suivantes selon votre distribution Linux :
Pour tester si le crontab fonctionne correctement et si les droits sur le NAS Synology sont
configurés correctement, le cronjob peut être forcé à s'exécuter de la manière suivante :
cd /etc/crontab/
sudo ./mysql_backup.sh
Après un reboot, le Raspberry exécute directement la commande /etc/fstab Mais le Raspberry n'est
pas encore connecté au Wi-Fi et ne peut donc pas monter le dossier distant sur le NAS. C'est
pourquoi un cronjob, avec un délai de 60 secondes par exemple, peut être ajouté afin de monter le
dossier une fois le réseau connecté
https://askubuntu.com/questions/792973/how-can-i-force-a-mount-a-to-run-after-the-s
ystem-boots-up
Ouvrir le crontab
https://blog.whabash.com/posts/mounting_synology_nas_shared_folder_nfs_ubuntu_16_10
https://www.kinamo.fr/fr/support/faq/mysql-backup-automatique-base-de-donnees
https://domopi.eu/sauvegarde-de-la-carte-sd-du-raspberry-pi-sur-un-serveur-externe/
Annexe 04
Règles de validations custom pour les time and Database
Les règles de validations pour les formats de date et time n'existent pas par défaut dans Laravel. Il
faut les créer sois-même : Lien ici :
https://stackoverflow.com/questions/32006092/laravel-5-1-date-format-validation-all
ow-two-formats
<?php
namespace Peguiplan\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
Ou Date et Time :
Travail de Bachelor
Modèle d’authentification
Authentification
Le soussigné, Thierry Auberson, atteste par la présente avoir réalisé seul ce travail et n’avoir
utilisé aucune autre source que celles expressément mentionnées, si ce n’est les
connaissances acquises durant ses études et son expérience acquise dans une activité
professionnelle.
Thierry Auberson