ECOM Warehouse Management System


 * Enseignant : Didier Donsez
 * Etudiants M2PGI : CASAGRANDE Thierry, RICHARD David

Matériel

 * RFID + QRCode + Barcode 1D
 * USB Barcode reader
 * USB NFC Reader

Logiciels

 * Apache Felix
 * Drools Expert

Introduction
Ce projet a pour but de fournir un système permettant la gestion d'un entrepôt. Le système doit gérer les entrées et sorties de produits. Un moteur de règles permettra d'analyser les différentes opérations et pour certains évènements particuliers (par exemple un produit bientôt en rupture de stock) le manager sera notifié. Les mouvements de stock seront effectués à l'aide d'une scanette et d'un lecteur NFC. Nous avons choisi de gérer un stockage de bouteilles de vins.

Architecture
Notre système se compose de trois parties : Le "Tag System" qui permet d'utiliser le lecteur NFC pour communiquer avec le server de l'entrepôt Le "Barcode System" qui permet d'utiliser une scanette pour communiquer avec le server de l'entrepôt Le "Warehouse Server" qui permet de gérer l'entrepôt



Tag System et Barcode System sont tout deux composés de deux modules :
 * Un module « Reader » (TagReader et BarcodeReader) qui permet de scanner les objets et de communiquer avec le serveur grâce à des requêtes REST
 * Un module « GUI » (TagGUI et BarcodeGUI) qui offre une interface en Swing pour utiliser le module « Reader »

Warehouse Server :
 * Une base de données pour stocker les informations des produits de l'entrepôt
 * Un module « WarehouseManager » permettant d'effectuer des opérations sur la base de données
 * Deux modules « Solver » (TagSolver et BarcodeSolver) exposant des services REST afin de récuperer les informations envoyées par les « Readers », les analyser et effectuer l'opération requise
 * Un module « ManagerNotifier » offrant la possibilité d'envoyer des emails au manager de l'entrepôt (utilisation de l'API JavaMail)
 * Un moteur de règles basé sur Drools pour implémenter une logique métier

Les différents modules étant des bundles OSGi, les systèmes devront tourner sur une plateforme OSGi.

Fonctionnalités prévues et fonctionnalités réalisées
L'objectif de ce projet était de réaliser les fonctionnalités suivantes :
 * Ajouter un produit grâce à un lecteur NFC
 * Ajouter un produit grâce à une scanette
 * Retirer des produits du stock grâce à un lecteur NFC
 * Retirer des produits du stock grâce à une scanette
 * Stocker les informations des produits dans une base de données
 * Interagir avec la base de données
 * Envoyer un mail au manager en cas de stock faible d'un produit
 * Envoyer un mail au manager pour l'informer des variations de stock sur une période donnée

Toutes les fonctionnalités ont été réalisées excepté l'envoi d'un mail au manager pour l'informer des variations de stock.

Evolutions envisageables
L'architecture a été pensée de manière à pouvoir facilement ajouter des modules supplémentaires pour interagir avec les « Reader », en plus de l'interface graphique déjà présente. Par exemple une console web, une interface en ligne de commmande ou une interface orientée smartphone (ce qui n'est pas le cas de l'interface actuelle)

Notre système permet la gestion de bouteilles de vin. Il aurait cependant été intéressant d'offrir au manager la possibilité de gérer d'autres produits en lui proposant une gestion générique des produits stockés.

Le moteur de règles pourrait être exploité d'une meilleure manière, de nouvelles règles plus élaborées pourraient être créées.

Permettre à l'utilisateur de configurer les éventuelles options d'un modules (Mail du manager, serveur de messagerie, url et port du serveur, …)

Difficultés rencontrées
Nous avons été confrontés à de nombreux problèmes de dépendances, il a fallut en effet trouver les bundles nécessaires au bon fonctionnement de notre système.

L'implémentation d'un moteur de règles est complexe et nécessite la compréhension de certains aspects non triviaux.

Nous avons rencontrés de nombreuses difficultés avec le lecteur NFC ainsi que sa librairie.

Apports personnels
Ce projet nous a permis d'améliorer nos compétences dans les domaines suivants :
 * Utilisation d'une plateforme OSGi
 * Création de bundles OSGi (Notamment avec iPOJO)
 * Utilisation de Drools
 * Utilisation de REST

Manuel d'installation
Les sources du projet sont disponibles sur le svn suivant : https://subversion.assembla.com/svn/M2M-warehouse/

Notre projet est un projet Maven, il est donc nécessaire de le compiler grâce à cet outil. Le projet est découpé en trois modules distincts (TagSystem, BarcodeSystem, WarehouseServer) qu'il est possible de compiler séparément. Les bundles générés doivent être déployés sur une plateforme OSGi (Par exemple Felix)

Le deploiement des bundles du projet nécessite des services fournis par d'autres bundles. Ces bundles nécessaires sont téléchargeables sur le svn dans le dossier Bundles présent à la racine du dépôt.

Installation du lecteur NFC (Tikitag)
Pour utiliser le lecteur NFC il est nécessaire d'installer les librairies suivantes :
 * libccid
 * pcscd
 * pcsc-tools
 * libpcsclite1
 * libpcsclite-dev

Installation de la scanette
La scanette ne demande pas d'installation particulière, il suffit seulement de la brancher à un port USB.

Base de données
La base de données doit être une base MySQL, car nous avons choisi ce type de base pour implementer le WarehouseManager. Cette base doit contenir une table VINS. Cette table peut être créée à l'aide de la requête suivante : create table VINS (idVin integer auto_increment, name varchar(256), year integer, color varchar(10), price float, quantity integer, tag varchar(30),   barcode varchar(30), primary key (idVin));

Configuration Felix
Nous avons du modifier le fichier de configuration de Felix pour exporter certaines classes afin qu'elles soient chargées par défaut par le système. Notre fichier est disponible sur le svn.

Manuel Utilisateur
L'utilisation de notre système est assez simple, que ce soit pour une utilisation avec la scanette ou le lecteur NFC elle se fait à travers l'interface. Cette interface permet à l'utilisateur de modifier la quantité d'un produit en ajoutant ou retirant une quantité choisie. Elle permet également d'ajouter un nouveau produit qui n'existerai pas dans la base.

Modification de la quantité d'un vin :
 * Sélectionner l'action : Ajouter ou Supprimer
 * Saisir la quantité à ajouter ou retirer
 * Scanner le produit avec le lecteur NFC ou la scanette
 * Valider le scan
 * Le produit existe :
 * Les informations et la nouvelle quantité pour le produit sont affichées
 * Le produit n'existe pas :
 * Compléter les informations concernant le produit dans le panel apparu
 * Valider les informations entrées
 * Possibilité de passer à un nouveau produit en recommençant la procédure