Académique Documents
Professionnel Documents
Culture Documents
POLYTECHNIQUE DE ETECH
MADAGASCAR
Présenté par :
RAZAKAMANANTSOA Miantsa Tiana
Membres du Jury :
Président du jury : Professeur RABOANARY Julien Amédée, Recteur de l’ISPM
Encadreur pédagogique : Monsieur RANDRIANOROVELO Michel André, Enseignant
Chercheur à l’ISPM
Encadreur professionnel : Monsieur RAKOTONDRANIVO A. T. A. Santatra, Directeur
Technique à Etech
Novembre 2023
« Pour moi, j'aurais recours à Dieu, Et
c'est à Dieu que j'exposerais ma cause. »
Job 5 :8
REMERCIEMENTS
Tout d’abord, nous tenons à remercier le Seigneur Tout puissant de nous avoir donné à
chacun la santé, la foi et le courage dans l’accomplissement de notre stage.
Nous tenons aussi à exprimer notre profonde gratitude aux personnes suivantes :
Le Professeur RABOANARY Julien Amédée, Recteur de l’Institut Supérieur
Polytechnique de Madagascar ;
Madame RAZAFINDRAHETY Aimée Noëline, Directeur Administratif et Financier
de l’Institut Supérieur Polytechnique de Madagascar ;
Monsieur PIERRE PAUL Ardile, Président de la société Arkeup,Etech, de nous avoir
accueillis dans son entreprise durant notre stage ;
Tous les membres de jury qui ont bien voulu accepter de juger ce travail
À toute l’équipe Odoo et AppWork d’Etech, pour leur accueil chaleureux et leurs
conseils.
Il nous est aussi impossible de ne pas exprimer notre gratitude et nos sincères
remerciements, plus particulièrement :
À Monsieur RANDRIANOROVELO Michel André, enseignant chercheur à l’ISPM,
notre encadreur pédagogique, pour ses conseils, sa disponibilité et son appui durant
notre stage ;
À Monsieur RAKOTONDRANIVO A. T. A. Santatra, Directeur Technique chez Etech,
notre encadreur professionnel, pour son appui technique tout au long de notre stage ;
Au corps professoral de l’ISPM de nous avoir enseigné et de nous avoir donné des
connaissances et savoir-faire par leurs compétences durant nos études ;
À tous nos proches, familles et ami(e)s, qui nous ont soutenus durant toute la période de notre
stage.
i
AVANT PROPOS
ii
Liste des abréviations
# 2D/3D 2/3 Dimensions
B BA Business Analyste
BU Business Unit
D DP Directeur de Projet
DTJA Droit et Techniques Juridiques des Affaires
iii
Électronique, Systèmes Informatiques et Intelligence
ESIIA
Artificielle
École Supérieure de Sciences et Techniques de l’Information à
ESSTIM
Madagascar
I I Integrated
IA Intelligence Artigicielle
IAA Industries Agro-Alimentaires
ID Identification
IDE Integrated Development Environment
IOT Internet Of Things
ICMP Industries Chimiques, Minières et Pétrolières
Informatique de Gestion, Génie Logiciel et Intelligence
IGGLIA
Artificielle
Informatique Multimédia, Technologie de l’Information et de la
IMTICIA
Communication et Intelligence Artificielle
Informatique, Statistiques Appliquées et Intelligence
ISAIA
Artificielle
ISPM Institut Supérieur Polytechnique de Madagascar
iv
Méthode d'Étude et de Réalisation Informatique pour les
M MERISE
Systèmes d'Entreprise
Ministère de l'Enseignement Supérieur et de la Recherche
MESupReS
Scientifique
M2M Mobile Originated
MSE Maintenance des Systèmes Électroniques
MSI Maintenance des Systèmes Informatiques
MT Mobile Terminated
MVC Modèle-Vue-Contrôleur
MA Moving Average
ML Machine Learning
N NET Network
Nouvelles Technologies de l’Information et de la
NTIC
Communication
v
SQL Structured Query Language
U UI User Interface
UML Unified Modeling Language
URL Uniform Resource Locator
vi
Liste des figures
vii
Figure 32 : Logo module prédiction sur vente Odoo ................................................. - 56 -
Figure 33 : Authentification sur Odoo ........................................................................ - 57 -
Figure 34 : Page d’accueil Odoo .................................................................................. - 57 -
Figure 35 : Information simple module Odoo ............................................................ - 58 -
Figure 36 : Liste module Odoo .................................................................................... - 58 -
Figure 37 : Bouton d’installation module Odoo ......................................................... - 58 -
Figure 38 : Module Prédiction de vente parmi les autres ......................................... - 58 -
Figure 39 : Graphe de résultat de la prédiction ......................................................... - 59 -
Figure 40 : Bouton filtre chronologique de la prédiction .......................................... - 59 -
Figure 41 : Résultat de la prédiction en fonction du mois......................................... - 60 -
Figure 42 : Menu analyse de vente .............................................................................. - 60 -
Figure 43 : Filtre et groupe article par quantité commandée ................................... - 61 -
Figure 44 : Graphe article le plus commandé ............................................................ - 61 -
Figure 45 : Menu historiques d’apprentissage ........................................................... - 62 -
Figure 46 : Liste des historiques d’apprentissage ...................................................... - 62 -
Figure 47 : Vue formulaire d’un historique d’apprentissage ................................... - 63 -
Figure 48 : Menu planification des apprentissages .................................................... - 63 -
Figure 49 : Vue formulaire pour la planification des apprentissages ...................... - 64 -
Figure 50 : Menu Configuration du module............................................................... - 64 -
Figure 51 : Paramètre de l’apprentissage ................................................................... - 65 -
Figure 52 : Sélection variable d’apprentissage .......................................................... - 65 -
Figure 53 : Paramétrage du modèle d’apprentissage ................................................ - 67 -
Figure 54 : Diagramme de cas d’utilisation ................................................................ - 79 -
Figure 55 : Diagramme d’activité ................................................................................ - 80 -
Figure 56 : Diagramme de séquence ........................................................................... - 80 -
Figure 57 : Diagramme de classe ................................................................................. - 81 -
Figure 58 : Installation des dépendances odoo ........................................................... - 83 -
Figure 59 : Installation sktime ..................................................................................... - 84 -
Figure 60 : Vue création base de données Odoo ........................................................ - 84 -
viii
Liste des tableaux
Tableau 1 : Habilitation des toutes les formations à l’ISPM par le MESupReS ....... - 3 -
Tableau 2 : Comité de direction de Etech ................................................................... - 21 -
Tableau 3 : Liste des moyens matériels ....................................................................... - 26 -
Tableau 4 : Opérateur de domaine sur Odoo ............................................................. - 32 -
Tableau 5 : Les types de champs sur Odoo ................................................................. - 33 -
ix
Sommaire
Introduction ......................................................................................................................... - 1 -
Partie I : Présentation générale.......................................................................................... - 2 -
Présentation de l’ISPM .................................................................................. - 3 -
Présentation d’Etech .................................................................................... - 15 -
Présentation du projet .................................................................................. - 23 -
Conclusion .......................................................................................................................... - 88 -
x
Introduction
A l’ère de l’évolution numérique actuelle, l’efficacité opérationnelle et la prise de
décision éclairée sont des éléments essentiels pour la réussite d’une entreprise. Dans ce
contexte, la société Etech, réputée dans le service numérique propose une solution innovante
fusionnant deux domaines technologiques puissants : l’ERP (un outil pour gérer les activités de
l’entreprise) et le machine Learning (Une technologie qui permet aux ordinateurs d’apprendre
par eux-mêmes)
Pour une entreprise commerciale en pleine croissance, la gestion de stock est parfois
difficile surtout au moment de l’approvisionnement des articles à mettre en vente.
Effectivement une bonne gestion de cette partie pousse l’entreprise à adopter un outil
performant et plus efficace en vue d’être plus rentable et de gagner en performance pour faire
face à la concurrence et aussi pour une évolution croissante sur le marché.
Actuellement, Odoo est l’un des outils le plus utilisé sur le marché. En tant qu’ERP,
Odoo couvre l’ensemble du système d’information d’une entreprise standard. Mais il s’avère
que certaines fonctionnalités natives d’Odoo, comme le vente et le stock sont parfois
insuffisantes pour les entreprises. De ce fait, il est indispensable de créer des modules
spécifiques pour combler différents besoins
Le présent travail décrit les différentes étapes de la réalisation du projet en question :
en premier lieu nous allons commencer par faire une présentation générale, en deuxième lieu
nous exposerons les méthodes et matériels utilisés grâce à des rappels théoriques et en
décrivant les langages et outils utilisés et en troisième lieu le résultat obtenu en donnant
quelques extraits de codes et interfaces ; et en quatrième lieu et dernier nous terminerons avec
la partie discussion où l’on va voir la conception et la réalisation du projet, l’approche
qualitative et les perspectives d’évolutions du projet
-1-
Partie I : Présentation générale
-2-
Présentation de l’ISPM
1.1. Historique
L’I.S.P.M. (Institut Supérieur Polytechnique de Madagascar) qui célèbre cette année son
vingt-neuvième anniversaire, a été créé en Janvier 1993 par le Professeur RABOANARY Julien
Amédée et qui en est le Recteur.
Au début, l’ISPM était connu sous le nom de l’ESSTIM ou École Supérieure de Sciences
et Techniques de l’Information à Madagascar. Il ne comptait qu’un seul département
comportant comme filière la filière Informatique de Gestion, Génie Logiciel et Intelligence
Artificielle (IGGLIA). Son siège se trouvait à Ankadindramamy.
L’Institut a été homologué par l’État suivant l’Arrêté Ministériel n°3725 du 19 Août 1994.
Toutes les formations offertes par l’ISPM sont habilitées par le Ministère de l’Enseignant
Supérieur et de la Recherche Scientifique.
Tableau 1 : Habilitation des toutes les formations à l’ISPM par le MESupReS
-3-
Arts, lettres et Sciences Technique du Tourisme Arrêté n°33213/2014-MESupReS
Humaines/Licence du 04 novembre 2014
Arts, lettres et Sciences Technique du Tourisme Arrêté n°33033/2015-MESupReS
Humaines/Master du 05 novembre 2015
Sciences et Technique de Arrêté n°33213/2014-MESupReS
Technologies/Licence l’environnement et du du 04 novembre 2014
Tourisme
Sciences et Environnement et tourisme Arrêté n°37440/2014-MESupReS
Technologies/Master du 26 décembre 2014
(Source : Brochure de l’ISPM)
-4-
2010 : Informatique, Statistiques Appliquées et Intelligence Artificielle (ISAIA).
1.2.2 Logo
On peut le distinguer et l’identifier par son logo, son Hymne et sa devise « FAHAIZANA -
FAMPANDROSOANA – FIHAVANANA ».
Son logo est illustré par trois figures évocatrices de la vision du fondateur, à savoir :
une toque,
Madagascar au sein du monde,
deux mains qui se serrent,
le tout est érigé sur un socle portant l’abréviation ISPM.
-5-
La toque signifie que l’Établissement procure aux étudiants à la fin de leur parcours à
l’ISPM des connaissances dignes des diplômes obtenus.
La carte de Madagascar au milieu du globe terrestre indique que la formation est de
fournir à la nation un rythme de développement au niveau mondial.
Les deux mains qui se serrent illustrent l’esprit du « Fihavanana » au sein de l’Institut.
Le logo a été conçu par Falimiamina (1ère promotion CAA) et RAHARINOSY
Voajanahary.
-6-
1.2.3 Hira Faneva : « Ilay ISPM tena maminay »
Ho mendrika tokoa
Ho mafy orina avokoa
Ny "FAHAIZANA – FAMPANDROSOANA - FIHAVANANA"
Ho andry sy tokin’ny Tanindrazana
Fa ny fihavanana firaisankina
No asandratray hatrany hatrany
Manoloana fifaliana fahoriana
Mandra-pialanay ety an-tany
-7-
Dimy amby roampolo taona ny Sekoly izao
Be ireo nandalo ka tafita tao
Tsy mifidifidy na manavaka
Fa ISPM dia tena miavaka
L’objectif de l’ISPM est de former des étudiants pour obtenir un diplôme de Master en
phase avec les progrès scientifiques et technologiques et conscients des réalités économiques
et sociales à Madagascar. Il s’agit d’une formation supérieure à vocation académique et
professionnelle de trois cycles.
- L’étudiant passe d’abord une formation de Premier Cycle de trois années (Bac+3)
sanctionnée par le Diplôme de Licence.
- Après l’obtention de ce diplôme, l’étudiant peut faire deux choix :
Soit, entrer dans la vie professionnelle munie du diplôme de Licence.
Soit, poursuivre ses études du Second Cycle pour la préparation du Diplôme de
Master (Bac+5) qui dure deux ans et six mois de stage, après l’obtention du diplôme
de Licence.
- Enfin, l’étudiant désirant encore continuer peut effectuer des recherches scientifiques
pour obtenir un diplôme de doctorat.
Il est à préciser que les diplômes délivrés par l’ISPM sont reconnus par le Ministère de la
Fonction Publique.
-8-
Figure 3 : Cursus universitaire à l’ISPM
(Source : Brochure de l’ISPM)
-9-
Mention Génie Civil et Architecture
Génie Civil et Architecture (GCA)
Mention Droit et Techniques des Affaires
Commerce et Administration des Affaires (CAA)
Économie et Management de Projet (EMP)
Finances et Comptabilités (FIC)
Droit et Techniques Juridiques des Affaires (DTJA)
Mention Biotechnologie
Industries Agro-Alimentaires (IAA)
Agriculture et Élevage (AEE)
Pharmacologie et Industries Pharmaceutiques (PIP)
Mention Technique du Tourisme
Tourisme et Environnement (TEE)
Tourisme et Hôtellerie (TEH)
Il est à rappeler que toutes les formations de l’ISPM sont habilitées par le Ministère de
l’Enseignant Supérieur et de la Recherche Scientifique.
En second cycle, la formation initie les étudiants dans l’esprit d’analyse et de conception :
- 10 -
La Conception Orientée Objet(COO), l’Analyse Orientée Objet (AOO), la
Programmation Orientée Objet Avancée (POOA),
L’Intelligence Artificielle, l’Informatique Décisionnelle, RNA (Réseaux de Neurones
Artificiels),
Méthodologie d’Analyse et le langage de modélisation orientée objet : Unified
Modeling Language (UML), Méthode de conduite de projet informatique, Gestion de
Projet, Gestion des processus Informatique,
Théories des Langages, Théories des Automates et Compilateurs,
Algorithmiques Avancées,
Cryptographie et Codage,
SGBDR (Système de Gestion de Base de Données Relationnelles),
et un cours de management dispensé en cinquième année.
- 11 -
- 12 -
1.6. Organigramme de l’ISPM
Actuellement, le système LMD est déjà adopté à l’ISPM et les enseignants sont impliqués
profondément dans la recherche. Les étudiants doivent également effectuer leurs propres
recherches pour approfondir leurs savoirs et leurs acquis.
L’Examen « Clinique » est aussi un des plus grandes particularités de l’ISPM. C’est
l’épreuve à passer avant la préparation de l’ingéniorat. Il consiste en l’évaluation de l’étudiant
sur toutes ses connaissances, depuis la première année jusqu’à le cinquième. La réussite à ce
test donne accès au stage ainsi qu’au mémoire de fun du Second Cycle.
- 13 -
1.7.5 Supports académiques
L’ISPM offre aussi un bouquet complet de complexe sportif à ses étudiants. À savoir : un terrain
de basket-ball, un terrain de football, un terrain de volley-ball, des tables de baby-foot, des
tables de tennis de table.
- 14 -
Présentation d’Etech
2.2. Historique
Créée en 2005, Etech Madagascar est une société de services en ingénierie informatique
née par la collaboration de Patrick Trebalag, Dominique et Fred Felix.
Elle se spécialise dans le domaine du développement d’applications informatiques
notamment dans l’externalisation des services informatiques et de la sous-traitance offshore et
constitue une véritable solution pour l’optimisation des coûts de développements informatiques.
Etech possède une vraie compétence dans le développement informatique autour des nouvelles
technologies équivalent aux meilleurs niveaux français.
Après quelques difficultés commerciales en Juin 2008, Pierre-Paul Ardile, Président
Directeur Général d’un cabinet de conseil expert des solutions professionnelles mobiles :
« Mov’age », a été contacté par les anciens actionnaires de la société dans le but de transférer
l’activité.
En septembre 2008, sous la direction de Monsieur Pierre-Paul Ardile, de nouveaux
collaborateurs, associent compétences malagasy et française, reprennent les activités de la
société. Depuis, Etech travaille en étroite collaboration avec la société de services informatiques
française « ArkeUp » qui la représente en France. Etech, spécialiste des solutions digitales web,
mobile et e-business en offshore fait partie du Groupe ArkeUp avec une représentation en
France et au Maroc.
- 15 -
En 2016, le groupe a fait l’acquisition de deux sociétés de renom chacun dans leur
domaine : TMS Consulting et Nelli Studio. TMS Consulting est spécialisé dans
l’accompagnement de direction générale et de directions métiers dans leur stratégie digitale.
Elle s’est, depuis sa création en 2013, spécialisée dans la création et la conception d’applications
métiers développées sur mesure pour ses clients. Le groupe est également devenu actionnaire
majoritaire de Nelli Studio, acteur majeur dans le gaming sur mobile à Madagascar ainsi que
dans le domaine de la réalisation de films d’animation 2D et 3D. Cette croissance externe
permet de renforcer encore plus le positionnement du groupe en général et d’Etech en particulier
comme un acteur de choix dans la zone Océan Indien.
Durant cette même année, l’Etech établit un partenariat avec CISCO.
En 2017, Etech obtient sa certification « Odoo Gold Partner », ce qui est une grande première
à Madagascar.
- 16 -
Figure 6 : Etech en 2020
(Source : Brochure de Etech)
Implantations géographiques
Figure 8 : eTech
(Source : Brochure de Etech)
- 17 -
2.3. Valeurs
Passion : « La passion, une des valeurs qui nourrit les équipes d’Etech. C’est la flamme qui
nous pousse à dépasser nos limites pour atteindre l’excellence. C’est l’élément
indispensable à l’expression de notre savoir-faire. »
Expertise : « Nos solides compétences répondent entièrement aux besoins techniques et
budgétaires de nos clients. Plus de 30 langages, outils et technologies sont pratiqués
quotidiennement par nos ingénieurs experts. À ce jour, plus de 300 projets ont été
matérialisés. »
Innovation : « Notre société ambitionne de devenir la référence dans l’exploitation des
nouvelles technologies. L’innovation nous guide vers une amélioration continue et nous
permet d’aborder chaque projet sous le meilleur angle afin d’obtenir un résultat optimal. »
Excellence : « L’excellence technique est le pilier de notre groupe, le carrefour de tous nos
travaux. Nous nous remettons en cause continuellement sur notre processus d’intervention,
nos méthodologies, nos échecs et analysons nos réussites. Cette recherche permanente de
qualité est l’assurance de notre succès. »
Talents : « La passion, l’expertise et l’innovation vont de pair avec les talents de nos
collaborateurs. Ces derniers sont notre moteur et nous mettons un point d’honneur à miser
sur leur épanouissement et ce, à tous les niveaux. La complémentarité des savoir-faire
valorise notre esprit d’équipe. »
Engagement : « Notre société à l’égard de nos clients se résume à l’honnêteté et le respect.
Leurs difficultés sont les nôtres et nos succès sont les leurs. Une confiance mutuelle dans
une relation gagnant-gagnant qui aboutit sur une collaboration à long terme. »
2.4. Activités
- 18 -
Le développement,
Le déploiement,
La maintenance et le support des applications.
Plateforme de services :
- Développement Web spécifique,
- E-commerce et marketplace
Solution ERP :
- Mise en place de module de gestion (RH / Comptabilité / Vente / Achat /
Stock…)
Développement spécifique :
- Mobiles (iOS / Android / Windows),
- IOT, J2EE & .NET
Infrastructure et service cloud :
- Audit Systèmes et Réseaux,
- Helpdesk et Hébergement de données
Les objets connectés :
- Marketing personnalisé et beacon,
- « Home facility »,
- M2M
BPO, services clients et webmarketing :
- Rédaction,
- Community Management,
- Assistance Virtuelle et Marketing Digital
Innovation et recherche :
- Intelligence Artificielle,
- Machine Learning,
- Robotisation
Topographie 2D et 3D :
- Numérisation de plan en 2D et 3D,
- Modélisation architecturale
Gaming et animation :
- 19 -
- Réalisation de films d’animation 2D/3D
- Conception d’applications et de jeux pour supports mobiles (iOS et Android)
Partenaires
2.5. Organisation
- 20 -
Le Directeur de BU occupe un rôle étendu, incluant la responsabilité de la rentabilité, la
stratégie en matière de personnel et la mise en œuvre du plan d’affaires. L’organisation interne
du BU implique une diversité de rôles, allant du directeur aux responsables de chapitre, sous la
supervision du directeur de BU. Les attributions des rôles sont établies par le directeur de BU.
Cela comprend le Directeur de BU (avec éventuellement un coordonnateur), le Manager CC /
Deputy, le Middle Management (DP, CP, BA, RT, TL, …), ainsi que les Chapter Leads.
Figure 9 : Organisation agile
(Source : Newsletter Etech)
- 21 -
L’organigramme d’Etech :
- 22 -
Présentation du projet
3.1. Généralité
3.1.2 Problématique
Sur-stockage
Le problème de sur stockage se produit lorsque les entreprises ont accumulé trop de
produits qu’elles ne peuvent pas vendre rapidement. Cela peut entrainer des coûts de stockage
élevés (pour les entrepôts loués) et des pertes financières
Sous-stockage
Le problème de sous stockage survient lorsque les entreprises n’ont pas suffisamment
de produits en stock pour répondre à la demande de leurs clients. Cela peut entrainer des
ruptures de stock, des ventes perdues et une insatisfaction client
- 23 -
Gestion inadéquate des stocks périssables
Les produits périssables doivent être vendus avant leur date de péremption, et une
mauvaise gestion de ces stocks peut entrainer des pertes financières
Une mauvaise estimation de la demande future peut entrainer des surstocks ou des sous-
stock.
Les couts associés au stockage, tels que les loyers d’entrepôts, l’assurances, la
maintenance, peuvent grever les marges bénéficiaires
Les produits qui ne se vendent pas peuvent devenir obsolètes ce qui entraine des pertes
financières.
La gestion manuelle des stocks peut être sujette à des erreurs humaines, ce qui peut
entrainer des problèmes de précision.
Les entreprises doivent s’adapter à des demandes variables en fonction des saisons, ce
qui peut compliquer la gestion des stocks.
3.1.3 Solution
La solution que l’on a apportée pour résoudre ces problèmes sur la gestion de stock
d’Odoo consiste à la création d’un module de prédiction de vente. Ce module prédit le futur
- 24 -
vente en utilisant les historiques de vente à ce jour et offre la possibilité de prédire le future en
jour, semaine, mois et en’ année.
Ce module est issu de la fonctionnalité modulaire qu’offre Odoo et de la prédiction des
séries temporelles dérivés de la machine Learning. Bien qu’il existe différent modèle et de
Framework pour la prédiction des séries temporelles, dans ce projet on a utilisé le modèle
AutoARIMA pour une valeur prédite plus proche de la réalité.
Les traitements des données se fait entièrement dans le serveur hôte de l’application
Odoo et une fois que les traitements sont faits les données de vente prédites seront ensuite
affichées dans une vue graphique pour faciliter la lisibilité des utilisateurs et de faire
comparaison en temps réel sur la vente native en seulement quelque clic.
3.2. Objectif
L’objectif de ce projet est d’aider les entreprises qui utilisent Odoo à anticiper la
demande future de leurs produits, ce qui permet de prendre des décisions éclairées en matières
de gestion de stocks, la planification de la production et les ventes.
Les objectifs spécifiques incluent aussi à faire découvrir les fonctionnalités nombreuses
d’Odoo liée à la vente comme par exemple :
La gestion des prospects et des clients
Le catalogue de produits et tarification
Le devis et commandes de ventes
La gestion de stock et de l’inventaire
La facturation et suivi des paiements
La gestion des contrats
L’automatisation des taches
Les outils comptables
- 25 -
3.3. Domaines d’activités
Il est possible d’installer le module issu de ce projet localement ou aussi à grande échelle
dans le plateforme Odoo nécessitant quelque dépendances (Python). Actuellement, il est en
cours d’expérimentation et de test pour future commercialisation.
Etant donné que ce projet a été effectué au sein de l’Etech , toutes entités, organisations,
associations qui veulent en bénéficier sont priées donc de se rendre au sein de l’Etech.
Des matériels montrés par le tableau suivant sont également mis en œuvre :
Des ordinateurs ayant les caractéristiques et configurations suivants pour le développement de
l’application :
Tableau 3 : Liste des moyens matériels
3.5. Conception
Tout d’abord, nous avons fait plusieurs tests d’apprentissage en utilisant la bibliothèque
open source « SKTIME » pour trouver le meilleur modèle de prédiction. Nous avons testé les
modèles sur l’IDE Pycharm notebook avec des jeux de données similaires aux données de vente
- 26 -
Odoo ; avant de faire les tests d’apprentissage, il est à noter que les données doivent d’abord
subir des filtres et différents traitements.
Puis, après avoir obtenu le modèle optimal pour notre prédiction, nous avons fait
l’implémentation du code du traitement des données et de l’apprentissage sur Odoo en
important les bibliothèques nécessaires. Après implémentation sur Odoo, nous avons refait les
tests d’apprentissage pour bien être sûr de l’efficacité de la prédiction
Ensuite, concernant les interfaces, Odoo nous propose sa puissance back end pour
permettre le paramétrage et le ré ajustage du modèle utilisé pour la prédiction et aussi pour
définir des actions planifiées qu’on utilisera pour les apprentissages systématiques de notre
modèle.
Enfin, pour visualiser les résultats de la prédiction, nous avons créé un nouveau type de
vue sur Odoo en ayant recours à des graphiques JavaScript « Chart.js ».
- 27 -
Partie II : Matériels et méthodes
- 28 -
Outils et Langages Utilisés
Le choix des outils et langages utilisés était imposé par la plateforme utilisée. En effet,
La plateforme Odoo exige l’usage des langages bien particuliers dont le langage Python, XML
et JavaScript. Par ailleurs, pour la prédiction des données, nous avons utilisé une bibliothèque
Python de Machine Learning « SKTIME »
4.1. Odoo
- 29 -
La partie serveur est écrite en langage Python. Les différentes briques sont organisées en
modules. Un module est un dossier avec une structure prédéfinie contenant du code Python et
des fichiers XML. Un module définit la structure de données, les formulaires, les rapports, les
menus, les procédures, le flux de travail, etc.
4.1.2 ORM
L’ORM ou Object Relation Mapping est le moteur d’Odoo. Dans Odoo, le modèle de
données est décrit et manipulé via des classes et des objets .C ‘est le travail ORM de combler
le fossé, aussi transparent que possible pour le développeur, entre Python et la base de données
(PostgreSQL), qui fournira la persistance dont nous avons besoins pour nos objets.
Model
Le modèle définit la structure de données qui sera utilisé dans l’application. Il est
représenté par une classe Python dont les attributs seront stockés dans la base de données.
Pour créer un modèle, il faut hériter un odoo.models.model .
# -*- coding: utf-8 -*-
from odoo import fields, models, api, _
class MyModel(models.Model):
_name = 'a.model' #Model identifier used for table name
Héritage et extension
- 30 -
Figure 13 : Héritage modèle sur odoo
(Source : www.odoo.com/documentation/15.0/fr )
Recordset
Un Recordset est une liste d’instance d’un même modèle. Par exemple,
res.partner(1,2,3) est un liste d’enregistrement d’un modèle res.partner dont les identifiants
(id) sont 1,2 et 3.
- 31 -
- browse() : met une liste d’ID comme argument et retourne un recordset.
>>>self.browse([7, 18, 12])
res.partner(7, 18, 12)
Les domaines
Un domaine est une liste de critère, ou chaque critère est un tuple (ou bien une liste) et
a la forme suivante : (field_name, operator, value)
- field_name : est un nom du champ du modèle courant.
- operator : sert à comparer le champ et la valeur value. Les principaux opérateurs sont :
Tableau 4 : Opérateur de domaine sur Odoo
Les champs sont ajoutés dans le modèle en les définissant dans sa classe Python. Les
champs non-relationnels d’Odoo sont :
- 32 -
Tableau 5 : Les types de champs sur Odoo
- 33 -
deux colonnes qui va stocker les ID des modèles en relation, cela est effectué
automatiquement par Odoo.
Parfois, il y a des fonctionnalités particulières qu’on veut utiliser plusieurs fois dans les
modèles. Répéter le même code dans différents fichiers n’est pas une bonne pratique, il est
préférable de pouvoir les implémenter une seule et de les réutiliser.
Un modèle abstrait permet de créer un modèle générique qui implémente des
fonctionnalités qui peuvent être héritées par des modèles réguliers.
Sa création est la même que la création d’un modèle normal sauf qu’au lieu d’hériter
models.Model, il faut hériter models.AbstractModel. A part cela, un modèle abstrait n’a pas de
représentation dans la base de données.
- 34 -
- Form : affichage détaillé d’un enregistrement d’un modèle
- 35 -
- Kanban : affichage des données d’un modèle d’un ticket
- 36 -
- Pivot : vue tableau croisé dynamique
La vue List
- 37 -
Ce qui est le plus important dans la création d’une vue c’est ce qui est ajouté dans le
champs arch. C’est à partir de la balise principale dans le champs arch que Odoo identifie le
type de vue à créer.
Pour une vue liste, la balise principale doit être <tree> Après avoir spécifié la balise
principale, il faut citer les colonnes à afficher dans la liste, comme dans l’exemple précédente
La vue Form
La balise principale pour la vue Form est <form>. En général, il est composé de :
- Status bar (à l’entête) :
Son but est d’afficher l’état de l’enregistrement en cours et c’est aussi sur le status
bar que les boutons ajouter dans la vue vont être placés.
- Corps ou bien sheet (c’est le formulaire lui-même)
C’est ici que les champs du modèle vont apparaître. Pour ce faire, il faut utiliser la
balise field comme pour la vue liste.
- Le bas de page (là où il y a les historiques et les messages)
C’est sur le bas du formulaire que les commentaires et les historiques relatifs à
l’enregistrement vont être postés.
De ce fait, une vue Form a la structure suivante :
- 38 -
4.2. Le langage Python
Python est un langage puissant et riche en possibilités. Dès l’installation, nous disposons
de nombreuses fonctionnalités intégrées au langage. Il est, en outre, très facile d'étendre les
fonctionnalités existantes. Ainsi, il existe ce qu'on appelle des bibliothèques qui aident le
développeur à travailler sur des projets particuliers.
Concrètement, voilà ce qu'on peut faire avec Python :
- De petits programmes très simples, appelés scripts, chargés d'une mission très
précise sur votre ordinateur ;
- Des programmes complets, comme des jeux, des suites bureautiques, des
logiciels multimédias, des clients de messagerie…
- Des projets très complexes, comme des progiciels (ensemble de plusieurs
logiciels pouvant fonctionner ensemble, principalement utilisés dans le monde
professionnel).
Python est un langage de programmation interprété, c'est-à-dire que les instructions que
vous lui envoyez sont « transcrites » en langage machine au fur et à mesure de leur lecture. Les
avantages d'un langage interprété sont la simplicité (on ne passe pas par une étape de
compilation avant d'exécuter son programme) et la portabilité (un langage tel que Python est
censé fonctionner aussi bien sous Windows que sous Linux ou Mac OS, et nous ne devrions
avoir à effectuer aucun changement dans le code pour le passer d'un système à l'autre).
Lors de la création de la Python Software Foundation, en 2001, et durant les années qui
ont suivi, le langage Python est passé par une suite de versions que l'on a englobées dans
l'appellation Python 2.x (2.3, 2.5, 2.6…). Actuellement, la dernière version de Python est la
version 3.12.
- 39 -
4.3. Le langage JavaScript
JavaScript qui est souvent abrégé en JS, est un langage de script, orienté objet,
principalement connu comme le langage de script des pages web. Mais il peut aussi être utilisé
sur de nombreux environnements extérieurs aux navigateurs tels que pour les serveurs avec
l’utilisation de Node.js.
JavaScript peut être employé en tant que langage procédural ou orienté objet. Les objets
sont créés par le programme et des méthodes et des propriétés leurs sont attachées lors de
l’exécution, contrairement aux définitions de classes courantes dans les langages compilés
comme C++ et Java. Une fois qu’un objet a été construit, il peut servir de modèle (ou prototype)
pour créer des objets similaires.
La syntaxe de base est volontairement similaire à Java et à C++ pour réduire le nombre de
concepts nouveaux à assimiler par un débutant. Les structures de contrôle, telles que les
instructions if, les boucles for et while, les blocs switch et try…catch fonctionnent pratiquement
de la même manière que dans ces langages.
Le code qu’il utilise n’est pas compilé mais interprété par un navigateur. Le code source
reste tel quel et c’est l’interpréteur, c’est-à-dire le navigateur, qui se chargera de l’analyser et
de réaliser les actions qu’il contient. À ce titre, il est plus rapide à produire puisqu’un seul
fichier suffit pour le mettre en place et il n’est pas nécessaire de recourir à un compilateur.
Il est lié à une page en html en étant intégrant directement intégré dedans dans la balise
script ou dans un document lié à la page html par l’attribut href de la base script
Dans le développement web, Javascript est surtout utilisé pour rendre interactif l’interface
du site ou de l’application web et pour valider les formulaires en envoyant des requêtes vers un
serveur.
- 40 -
4.4. PostgreSQL
La couche modèle est définie avec des objets Python dont les données sont stockées dans une
base de données PostgreSQL. La correspondance de cette structure est gérée automatiquement
par Odoo c’est ce qui a été vu dans la partie ORM.
PostgreSQL est un système de gestion de base de données totalement gratuite et très
riche en fonctionnalités.
Sa rapidité, sa communauté très active et sa compatibilité sur les toutes les plateformes
ont propulsé ce langage parmi les meilleures solutions en usage professionnelle de base de
données.
- 41 -
Figure 23 : Machine Learning et Intelligence artificielle
(Source : https://user.oc-static.com/)
Les modèles de machine Learning sont des représentations mathématiques qui capturent
les relations dans les données. Les algorithmes de machine Learning sont des méthodes qui
permettent de créer, d’entrainer et dévaluer ces modèles.
- Apprentissage supervisé : les modèles sont entrainés sur des données étiquetées, c’est-
à-dire des données associées à des réponses connues. Ces modèles sont utilisés pour
prédire des réponses similaires sur de nouvelles données.
- Apprentissage non supervisé : les modèles identifient des structures et des modèles
dans les données non étiquetées. Ils sont utilisés pour la classification, la réduction de
dimension, le regroupement, etc.
- Apprentissage par renforcement : les modèles apprennent à prendre des décisions en
interagissant avec un environnement. Ils reçoivent des récompenses ou des pénalités en
fonction de leurs actions.
- 42 -
4.5.4 Evaluation des modèles
Les performances des modèles de machine Learning sont évaluées à l’aide de mesures
telles que l'exactitude, la précision, le rappel, la F1-score, etc. Ces mesures permettent de
déterminer l'efficacité d'un modèle.
Le machine Learning est utilisé dans de nombreux domaines, notamment la vision par
ordinateur, le traitement du langage naturel, la recommandation de contenu, la prédiction de
ventes, la détection de fraude, la médecine, l'automatisation industrielle, et bien d'autres.
Le deep Learning est une sous-catégorie du machine Learning qui se concentre sur
l'utilisation de réseaux de neurones artificiels pour résoudre des tâches complexes, telles que la
reconnaissance d'images, la traduction automatique, etc.
4.6. AutoARIMA
- 43 -
- AR(p) : Le processus AR signifie autorégressif : Il s'agit des valeurs passées de
la série temporelle utilisées pour prédire la valeur actuelle.
- (I) : I signifie « Integrated » pour intégration.
- (MA) : MA signifie « moving average » ou en français moyenne mobile
Le modèle ARIMA avec Python donne la possibilité de faire des prévisions basées sur
des observations historiques, ce qui crée un avantage concurrentiel. Par exemple, si une
organisation a la capacité de mieux prévoir les quantités vendues d’un produit, elle sera dans
une position plus favorable pour optimiser les niveaux de stock. Cela peut se traduire par une
augmentation des liquidités des réserves de trésorerie de l’organisation, une diminution du
fonds de roulement et une amélioration de la satisfaction des clients en réduisant l’arriéré des
commandes.
Pour entrer dans les détails sur le modèle AutoARIMA, parlons un peu des séries temporelles.
La tendance
- 44 -
La saisonnalité
- 45 -
autocorrélations, de l'analyse des séries temporelles, etc. Cela peut être un processus laborieux
et nécessiter des connaissances en séries temporelles.
L'AutoARIMA sélectionne finalement le modèle ARIMA avec les ordres (p, d, q) qui
minimisent l'erreur de prévision sur l'ensemble d'entraînement. Cette combinaison d'ordres est
considérée comme la meilleure configuration pour le modèle ARIMA.
4.6.5 Prévision
Une fois que le modèle ARIMA optimal est identifié, il peut être utilisé pour prévoir les
valeurs futures de la série temporelle. Vous pouvez générer des prévisions pour un certain
nombre de pas en avant.
4.7. SKTIME
SKTIME est une bibliothèque open source en Python spécialement conçue pour le
traitement et l'analyse de séries temporelles. Elle propose des outils et des méthodes avancées
pour la modélisation, la classification et la régression de données temporelles. sktime vise à
rendre plus accessible le travail avec des séries temporelles complexes en offrant une structure
de données uniforme et des fonctionnalités adaptées aux spécificités de ces données.
Sktime est conçu pour fonctionner en tandem avec scikit-learn, une bibliothèque de
machine learning populaire en Python. Cela signifie que les modèles sktime peuvent être
intégrés dans des pipelines scikit-learn et utilisés avec d'autres outils de machine Learning.
- 46 -
Figure 25 : Logo SKTIME
(Source : https://www.sktime.net/)
4.7.1 Installation
Sktime est actuellement pris en charge par les versions 3.8, 3.9, 3.10, 3.11, et 3.12 de
python. Elle est supportés par les systèmes d’exploitation Mac OS X, OS de type Unix,
Windows 8.1 et supérieur.
L'installation de la bibliothèque sktime se fait en utilisant l'outil de gestion des packages
de Python, pip. Voici comment vous pouvez installer sktime :
- Ouvrer un terminal ou une invite de commande
- Utilisez la commande suivante pour installer sktime
pip install sktime
Assurez-vous d'avoir une connexion Internet active, car pip téléchargera et installera sktime
depuis le référentiel Python Package Index (PyPI).
Types de données
Sktime est conçu pour l'apprentissage automatique des séries temporelles. Les données
de séries temporelles font référence à des données dont les variables sont ordonnées dans le
temps ou à un indice indiquant la position d'une observation dans la séquence de valeurs.
Dans sktime, les données de séries temporelles peuvent se référer à des données unies
variées, multivariées ou de panel, la différence étant liée au nombre et à l'interrelation entre les
- 47 -
variables de séries temporelles, ainsi qu'au nombre d'occurrences pour lesquelles chaque
variable est observée.
- Les données de séries temporelles uni variées se réfèrent à des données où une
seule variable est suivie dans le temps.
- Les données de séries temporelles multivariées se réfèrent à des données où
plusieurs variables sont suivies dans le temps pour la même instance. Par
exemple, plusieurs indicateurs économiques trimestriels pour un pays ou
plusieurs relevés de capteurs d'une même machine.
- Les données de séries temporelles en panel sont des données dont les variables
(uni variées ou multivariées) sont suivies pour plusieurs instances. Par
exemple, plusieurs indicateurs économiques trimestriels pour plusieurs pays ou
plusieurs relevés de capteurs pour plusieurs machines.
Taches d’apprentissage
Réduction
Bien que la liste ci-dessus présente chaque tâche d'apprentissage séparément, il est
souvent possible d'adapter une tâche d'apprentissage pour aider à résoudre une autre tâche
d'apprentissage connexe. Par exemple, une approche de la prévision consisterait à utiliser un
- 48 -
modèle de régression qui prendrait explicitement en compte la dimension temporelle des
données. Cependant, une autre approche consiste à réduire le problème de prévision à la
régression transversale, où les données d'entrée sont tabulées et les décalages des données sont
traités comme des caractéristiques indépendantes dans les algorithmes de régression tabulaire
de type scikit-learn. De même, une approche de la tâche d'annotation des séries temporelles,
comme la détection des anomalies, consiste à réduire le problème à l'utilisation d'un
prévisionniste pour prédire les valeurs futures et à signaler les observations trop éloignées de
ces prédictions comme des anomalies. sktime intègre généralement ce type de réductions par
l'utilisation de classes composables qui permettent aux utilisateurs d'adapter une tâche
d'apprentissage pour résoudre une autre tâche connexe.
Les extraits de code ci-dessous sont conçus pour présenter les fonctionnalités de sktime
afin que vous puissiez les utiliser rapidement.
Prévisions
from sktime.datasets import load_airline
from sktime.forecasting.base import ForecastingHorizon
from sktime.forecasting.model_selection import temporal_train_test_split
from sktime.forecasting.theta import ThetaForecaster
from sktime.performance_metrics.forecasting import
mean_absolute_percentage_error
y = load_airline()
y_train, y_test = temporal_train_test_split(y)
fh = ForecastingHorizon(y_test.index, is_relative=False)
forecaster = ThetaForecaster(sp=12) # monthly seasonal periodicity
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
mean_absolute_percentage_error(y_test, y_pred)
- 49 -
Classification des séries temporelles
from sktime.classification.interval_based import
TimeSeriesForestClassifier
from sktime.datasets import load_arrow_head
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X, y = load_arrow_head()
X_train, X_test, y_train, y_test = train_test_split(X, y)
classifier = TimeSeriesForestClassifier()
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
accuracy_score(y_test, y_pred)
X, y = load_arrow_head()
X_train, X_test, y_train, y_test = train_test_split(X, y)
- 50 -
Annotation de séries temporelles
from sktime.annotation.adapters import PyODAnnotator
from pyod.models.iforest import IForest
from sktime.datasets import load_airline
y = load_airline()
pyod_model = IForest()
pyod_sktime_annotator = PyODAnnotator(pyod_model)
pyod_sktime_annotator.fit(y)
annotated_series = pyod_sktime_annotator.predict(y)
4.8. Pycharm
- 51 -
Figure 27 : Logo Pycharm
(Source : https://upload.wikimedia.org/ )
Pour lancer un serveur Odoo sur Pycham, il nous faut une version Python compatible à notre
version Odoo. Sur ce projet nous avons utilisé la version 3.7 de python parce que sur cette
version, il est possible de lancer presque la plupart des différents version d’odoo.
Aller dans le menu Run > Edit Configurations. Nous obtenons cette boite de dialogue.
- 52 -
Puis cliquer sur OK.
- 53 -
Figure 31 : Interface Jupiter Notebook Pycharm
(Source : Auteur)
On a pu voir que plusieurs outils ont été utiles pour mieux gérer la réalisation du projet.
Odoo a principalement besoin des langages Python et XML mais aussi quelques langages utiles
pour le développement web. La notion de machine Learning pour les différentes recherches sur
la prédiction, Sktime pour le traitement des séries temporelles et pour la prévision de celles-ci,
Pycharm et Jupiter notebook pour l’édition des codes. Maintenant que tout est clair concernant
les outils et matériels utilisés, passons aux résultats attendus ainsi que la réalisation proprement
dite du projet.
- 54 -
Partie III : Résultats
- 55 -
Interfaces et fonctionnement
L'authentification dans Odoo peut être réalisée de plusieurs façons, en fonction des
besoins de chaque application. Odoo prend en charge plusieurs méthodes d'authentification, y
compris l'authentification de base par nom d'utilisateur (ou courriel) et mot de passe,
l'authentification OAuth, l'authentification LDAP, etc.
- 56 -
Figure 33 : Authentification sur Odoo
(Source : Auteur)
- 57 -
Dans notre cas, le module « prédiction de vente » est déjà installé
- 58 -
A l’ouverture du module, on peut déjà voir par défaut le graphe de la prédiction de vente par
jour.
Par défaut, nous avons vu la prédiction de vente par jour bien qu’il est aussi possible
d’avoir la prédiction chronologique en fonction de la « semaine », « mois » et en fonction de
« l’année » en appuyant directement sur les boutons suivant qui se situent en haut à gauche :
- 59 -
Prenons exemple en appuyant sur le bouton « MOIS », on obtient le graphe qui suit :
- 60 -
Nous avons intégré cette vue dans notre module pour avoir un raccourci direct dans
l’analyse de vente et pour pouvoir prendre un décision en faisant correspondre la prédiction et
les articles vendus. Dans cette vue, il est possible de regrouper et de filtrer les articles pour
obtenir par exemple l’article le mieux vendu, ou le plus commander dans le module.
- 61 -
Dans le cas pratique, en comparant ces données avec la prédiction on peut déjà prendre
une décision par rapport à la gestion de stock, sur quel article il faut commander et sur quel
article il ne faut pas commander.
Pour avoir le statut des récents apprentissages sur le module et pour être au courant des
éventuelles erreur d’apprentissage, nous avons créé une vue destinée uniquement à cela.
La vue est composée d’une vue liste et d’une vue formulaire et est accessible en cliquant
sur le menu « Historiques d’apprentissages »
- 62 -
5.5.2 La vue formulaire
On peut voir chaque historique d’apprentissage sur une vue formulaire, les données sont
similaires au vue liste mais avec surplus les données résultant l’apprentissage en format « liste
de dictionnaire »
Nous avons créé des actions planifiées sur Odoo avec le modèle natif « ir.cron » pour
des apprentissages systématiques afin de mettre à jour les données pour la prédiction et pour
avoir une prédiction plus proche de la réalité.
Pour accéder aux paramétrages de la planification, nous avons créé un menu raccourci
dans le module.
- 63 -
Dans la vue, one peut :
- Exécuter manuellement l’apprentissage
- Modifier la fréquence d’apprentissage
- Modifier la prochaine date d’exécution
- Modifier le nombre d’appels
- Modifier la priorité du la panification par rapport aux autres instance
- Activer ou désactiver la planification de l’apprentissage
- 64 -
Dans cette section, on a le paramétrage de l’apprentissage et celui du modèle statistique
utilisé pour l’apprentissage « AutoARIMA »
- 65 -
trimestrielles, 12 pour des données mensuelles ou 1 pour des données annuelles
(non saisonnières). La valeur par défaut est 1. Notez que si sp == 1 (c.-à-d. non
saisonnier), la valeur de seasonal est fixée à False.
- test : Type de test de racine unitaire à utiliser pour détecter la stationnarité si
stationnaire est Faux et si d est Aucun.
- method : La méthode détermine quel solveur de scipy.optimize est utilisé.
- information_criterion : Critère d'information utilisé pour sélectionner le
meilleur modèle ARIMA. L'un de pmdarima.arima. auto_arima.
VALID_CRITERIA, ('aic', 'bic', 'hqic', 'oob').
- maxiter : Le nombre maximum d'évaluations de la fonction.
- start_p : La valeur initiale de p, l'ordre (ou le nombre de décalages temporels)
du modèle autorégressif ("AR"). Doit être un nombre entier positif.
- max_p : Valeur maximale de p, incluse. Doit être un nombre entier positif
supérieur ou égal à start_p.
- start_P : La valeur initiale de P, l'ordre de la partie auto-régressive du modèle
saisonnier.
- max_P : Valeur maximale de P, incluse. Doit être un nombre entier positif
supérieur à start_P.
- d : L'ordre de première différenciation. S'il est nul (par défaut), la valeur sera
automatiquement sélectionnée en fonction des résultats du test (c'est-à-dire que
le test de Kwiatkowski-Phillips-Schmidt-Shin, de Dickey-Fuller augmenté ou de
Phillips-Perron sera effectué pour trouver la valeur la plus probable). Doit être
un nombre entier positif ou nul. Notez que si d est nul, la durée d'exécution peut
être significativement plus longue.
- max_d : La valeur maximale de d, ou le nombre maximal de différences non
saisonnières. Doit être un nombre entier positif supérieur ou égal à d.
- D : L'ordre de la différenciation saisonnière. Si aucun (par défaut, la valeur sera
automatiquement sélectionnée en fonction des résultats du test_saisonnier). Doit
être un nombre entier positif ou None.
- max_D : Valeur maximale de D. Doit être un nombre entier positif supérieur à
D.
- start_q : Valeur initiale de q, l'ordre du modèle de moyenne mobile ("MA").
Doit être un nombre entier positif.
- 66 -
- max_q : La valeur maximale de q, incluse. Doit être un nombre entier positif
supérieur à start_q.
- start_Q : La valeur initiale de Q, l'ordre de la partie moyenne mobile du modèle
saisonnier.
- max_Q : Valeur maximale de Q, incluse. Doit être un nombre entier positif
supérieur à start_Q.
- 67 -
Extraits de code
Le projet étant un module odoo, les codes sont répartis en plusieurs niveaux, nous allons
en citer quelques extraits.
class SalePredictionModel(models.Model):
_name = 'sale.prediction.model'
_description = "Machine learning model"
_order = 'prediction_date'
compute="_compute_predicted_status")
prediction_week_status = fields.Selection([('predicted', 'Predicted'),
('none', 'None')],
compute="_compute_predicted_status")
prediction_month_status = fields.Selection([('predicted', 'Predicted'),
('none', 'None')],
compute="_compute_predicted_status")
prediction_year_status = fields.Selection([('predicted', 'Predicted'),
('none', 'None')],
compute="_compute_predicted_status")
prediction_day = JobSerialized(string="Prediction value (Day)",
base_type=list)
prediction_week = JobSerialized(string="Prediction value (Week)",
base_type=list)
prediction_month = JobSerialized(string="Prediction value (Month)",
base_type=list)
prediction_year = JobSerialized(string="Prediction value (Year)",
base_type=list)
error = fields.Text(string="Error from learning")
company_id = fields.Many2one('res.company', required=True)
training_column =
- 68 -
fields.Selection(related='company_id.training_column', readonly=True)
def _compute_predicted_status(self):
for rec in self:
rec.prediction_day_status = 'predicted' if
len(list(rec.prediction_day)) >= 1 else 'none'
rec.prediction_week_status = 'predicted' if
len(list(rec.prediction_week)) >= 1 else 'none'
rec.prediction_month_status = 'predicted' if
len(list(rec.prediction_month)) >= 1 else 'none'
rec.prediction_year_status = 'predicted' if
len(list(rec.prediction_year)) >= 1 else 'none'
def _compute_predicted_view(self):
for rec in self:
rec.prediction_day_view = str(rec.prediction_day)
rec.prediction_week_view = str(rec.prediction_week)
rec.prediction_month_view = str(rec.prediction_month)
rec.prediction_year_view = str(rec.prediction_year)
def get_predicted_data(self):
self.ensure_one()
return {"prediction_day": self.prediction_day,
"prediction_week": self.prediction_week,
"prediction_month": self.prediction_month,
"prediction_year": self.prediction_year,
"training_column":
dict(self._fields['training_column']._description_selection(self.env)).get(
self.training_column)}
6.1.2 Configuration
# -*- coding: utf-8 -*-
import base64
from io import BytesIO
import datetime
import joblib
from sktime.forecasting.arima import AutoARIMA
from sktime.forecasting.compose import EnsembleForecaster
from sktime.forecasting.base import ForecastingHorizon
from odoo import api, fields, models
import pandas as pd
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
training_column =
fields.Selection(related="company_id.training_column", readonly=False)
test = fields.Selection(related="company_id.test", readonly=False)
method = fields.Selection(related="company_id.method", readonly=False)
information_criterion =
fields.Selection(related="company_id.information_criterion",
readonly=False)
maxiter = fields.Integer(related="company_id.maxiter", readonly=False)
# p
start_p = fields.Integer(related="company_id.start_p", readonly=False)
- 69 -
max_p = fields.Integer(related="company_id.max_p", readonly=False)
start_P = fields.Integer(related="company_id.start_P", readonly=False)
max_P = fields.Integer(related="company_id.max_P", readonly=False)
# d
d = fields.Integer(related="company_id.d", readonly=False)
max_d = fields.Integer(related="company_id.max_d", readonly=False)
D = fields.Integer(related="company_id.D", readonly=False)
max_D = fields.Integer(related="company_id.max_D", readonly=False)
# q
start_q = fields.Integer(related="company_id.start_q", readonly=False)
max_q = fields.Integer(related="company_id.max_q", readonly=False)
start_Q = fields.Integer(related="company_id.start_Q", readonly=False)
max_Q = fields.Integer(related="company_id.max_Q", readonly=False)
sp = fields.Integer(related="company_id.sp", readonly=False)
seasonal = fields.Boolean(related="company_id.seasonal",
readonly=False)
stationary = fields.Boolean(related="company_id.stationary",
readonly=False)
def start_training(self):
company_id = self.env.company
training_column = company_id.training_column
information_criterion = company_id.information_criterion
test = company_id.test
method = company_id.method
maxiter = company_id.maxiter
seasonal = company_id.seasonal
stationary = company_id.stationary
sp = company_id.sp
# All p
start_p = company_id.start_p
max_p = company_id.max_p
start_P = company_id.start_P
max_P = company_id.max_P
# All d
d = company_id.d
max_d = company_id.max_d
D = company_id.D
max_D = company_id.max_D
# All q
start_q = company_id.start_q
max_q = company_id.max_q
start_Q = company_id.start_Q
max_Q = company_id.max_Q
self.env.cr.execute("""SELECT * FROM sale_report""")
response = self.env.cr.dictfetchall()
df = pd.DataFrame(response)[['date', training_column]]
df_group_by_day = df.groupby(pd.Grouper(key='date', axis=0,
freq='D', sort=True)).sum()
df_group_by_week = df.groupby(pd.Grouper(key='date', axis=0,
freq='W', sort=True)).sum()
df_group_by_month = df.groupby(pd.Grouper(key='date', axis=0,
freq='M', sort=True)).sum()
df_group_by_year = df.groupby(pd.Grouper(key='date', freq='Y',
sort=True)).sum()
df_group = {'df_day': df_group_by_day, 'df_week': df_group_by_week,
'df_month': df_group_by_month,
'df_year': df_group_by_year}
vals = {}
- 70 -
error_message = ''
for key in list(df_group.keys()):
vals.update({key: []})
try:
current_df = df_group.get(key)
current_df = self._sanitize_data(df=current_df,
periode=key)
# y_train, y_test =
model_selection.temporal_train_test_split(current_df, test_size=1)
forecaster = EnsembleForecaster([
# ("naive",NaiveForecaster(strategy="drift",sp=12)),
("autoARIMA",
AutoARIMA(test=test, start_p=start_p, max_p=max_p,
start_P=start_P, max_P=max_P, d=d,
max_d=max_d, D=D, max_D=max_D,
start_q=start_q, max_q=max_q, start_Q=start_Q,
max_Q=max_Q, maxiter=maxiter,
information_criterion=information_criterion,
method=method, seasonal=seasonal,
stationary=stationary, sp=sp,
error_action='ignore',
suppress_warnings=True,
stepwise=True)),
# ("autoETS",
# AutoETS(auto=True, sp=1, n_jobs=None, restrict=True,
allow_multiplicative_trend=True, ignore_inf_ic=False)),
# ("fbprophet",
Prophet(seasonality_mode="multiplicative"))
])
# forecaster.fit(y_train)
forecaster.fit(current_df)
fh = self._get_forecasting_horizon(current_df, periode=key)
y_pred = forecaster.predict(fh)
df_with_prediction = pd.concat([current_df, y_pred],
ignore_index=False)
data_dict = df_with_prediction.to_dict('index')
index_list = list(data_dict.keys())
data_prediction_list = [
{'date': date_key.to_pydatetime(), 'value':
data_dict.get(date_key).get(training_column)}
for date_key in
index_list]
vals.update({key: data_prediction_list})
except Exception as e:
error_message += str(e)
self.env['sale.prediction.model'].create(
{'prediction_date': datetime.datetime.now(), 'prediction_day':
vals.get('df_day'),
'prediction_week': vals.get('df_week'), 'prediction_month':
vals.get('df_month'),
'prediction_year': vals.get('df_year'), 'error':
error_message, 'company_id': company_id.id,
'training_column': training_column})
- 71 -
df = df.resample('W').sum()
elif periode == "df_month":
df = df.resample('M').sum()
elif periode == "df_year":
df = df.resample('Y').sum()
return df
- 72 -
<field name="error" string="Erreur d'apprentissage"/>
</tree>
</field>
</record>
<record id="sale_prediction_config_settings_action"
model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_id" ref="res_config_settings_view_form"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'sales_forecasting_ml', 'bin_size':
False}</field>
</record>
- 73 -
<field name="name">Historiques d'apprentissage</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.prediction.model</field>
<field name="view_mode">tree,form</field>
</record>
<record id="order_report_all_action" model="ir.actions.act_window">
<field name="name">Sales Analysis</field>
<field name="res_model">sale.report</field>
<field name="view_mode">graph,pivot</field>
<field name="view_id"></field> <!-- force empty -->
<field name="search_view_id" ref="sale.view_order_product_search"/>
<field name="context">{'search_default_Sales':1,
'group_by_no_leaf':1,'group_by':[],
'search_default_filter_order_date': 1}
</field>
<field name="help">This report performs analysis on your quotations and
sales orders. Analysis check your sales
revenues and sort it by different group criteria (salesman, partner,
product, etc.) Use this report to perform
analysis on sales not having invoiced yet. If you want to analyse
your turnover, you should use the Invoice
Analysis report in the Accounting application.
</field>
</record>
<record id="sale_prediction_cron_action" model="ir.actions.act_window">
<field name="name">Apprentissage systématique</field>
<field name="res_model">ir.cron</field>
<field name="view_mode">form</field>
<field name="res_id"
ref="sales_forecasting_ml.sales_prediction_model_training_cron"/>
</record>
<!-- menu report-->
<menuitem id="menu_sale_prediction" name="Prédiction de vente"
sequence="80"
web_icon="sales_forecasting_ml,static/description/icon.png">
<menuitem id="menu_sale_prediction_report"
name="Prédiction de vente"
action="sale_prediction_report_action"
sequence="1"/>
<menuitem id="menu_sale_analyse_report"
name="Analyse de vente"
action="order_report_all_action"
sequence="2"/>
<menuitem id="menu_sale_prediction_config"
name="Configurations" sequence="3">
<!-- This Menu Item must have a parent and an action -->
<menuitem id="menu_sale_prediction_model_config" name="Historiques
d'apprentissage"
action="sale_prediction_model_action" sequence="1"/>
<menuitem id="menu_sale_prediction_planning_config_settings"
name="Planification d'apprentissage"
action="sale_prediction_cron_action" sequence="2"/>
<menuitem id="menu_sale_prediction_config_settings"
name="Configuration"
action="sale_prediction_config_settings_action"
sequence="3"/>
</menuitem>
</menuitem>
<!--menu config-->
</odoo>
- 74 -
6.2.2 Graphes de prédiction (vue qweb)
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template">
<t t-name="ForecastView" class="o_calendar_container">
<div class="o_forecast_view">
<div class="o_forecast_canvas_container">
<canvas class="o_forecast_canvas" id="day_forecast"/>
<canvas class="o_forecast_canvas" id="week_forecast"/>
<canvas class="o_forecast_canvas" id="month_forecast"/>
<canvas class="o_forecast_canvas" id="year_forecast"/>
</div>
</div>
</t>
<t t-name="ForecastView.buttons">
<div class="o_forecast_buttons">
<div class="btn-group" role="toolbar" aria-label="Main actions">
<button class="btn btn-primary dropdown-toggle o-no-caret" data-
toggle="dropdown" aria-expanded="false">
Forecast Measures
<i class="fa fa-caret-down ml-1"/>
</button>
<div class="dropdown-menu o_forecast_measures_list" role="menu">
<div role="separator" class="dropdown-divider"/>
<a role="menuitem" href="#" class="dropdown-item">Sale</a>
</div>
</div>
<div class="btn-group" role="toolbar" aria-label="Group By"
style="display:none;">
<button class="btn btn-secondary dropdown-toggle o-no-caret" data-
toggle="dropdown"
aria-expanded="false">
<i class="small mr-1 fa fa-bars"/>
Forecast Date
<i class="fa fa-caret-down ml-1"/>
</button>
<div class="dropdown-menu o_forecast_dates_list" role="menu">
<a role="menuitem" href="#" class="dropdown-item" data-
field="day">Day</a>
<a role="menuitem" href="#" class="dropdown-item" data-
field="week">Week</a>
<a role="menuitem" href="#" class="dropdown-item" data-
field="month">Month</a>
<a role="menuitem" href="#" class="dropdown-item" data-
field="year">Year</a>
</div>
</div>
<div class="btn-group">
<button type="button" class="o_forecast_button_day btn btn-
secondary" data-field="day">Day</button>
<button type="button" class="o_forecast_button_week btn btn-
secondary" data-field="week">Week</button>
<button type="button" class="o_forecast_button_month btn btn-
secondary" data-field="month">Month</button>
<button type="button" class="o_forecast_button_year btn btn-
secondary" data-field="year">Year</button>
</div>
</div>
- 75 -
</t>
</templates>
- 76 -
Partie IV : Discussion
- 77 -
Analyse et conception UML
Après avoir suivi les entreprises dans l’utilisation Odoo, on a constaté que celles dans
le domaine de la vente ont quelques problèmes liés à la gestion de stock, surtout au moment de
l’approvisionnement des articles. Cependant, après avoir parcouru la liste des applications dans
l’App Store d’Odoo, soit le module solutionnant ce problème est très payant, soit il est ne
correspond pas aux besoins spécifiques des entreprises.
De ce fait, l’idée est venue de combiner le machine Learning et Odoo pour créer un
module pouvant prédire la future vente sur Odoo, d’où l’intérêt de ce projet. Après nombreux
recherche sur le machine Learning, nous avons enfin eu des notions pour permettre de
s’approfondir encore un plus dans le domaine. Nous avons donc commencé à faire des
expérimentations prédiction avec des modèles de machine Learning et aussi avec des données
fictives (dataset) téléchargées sur internet en utilisant Jupiter Notebook sur Pycharm.
Une fois les modèles instaurés, on a obtenu des résultats expérimentaux mais qui sont
quand même convainquant dans le terme de prédiction ; puis on a filtré ces modèles pour ensuite
refaire l’expérience et l’implémentation sur Odoo avec des données réelles
Sur odoo, l’implémentation requière à la fois les compétences fonctionnelles et les
compétences technique ; suivant les normes natives d’Odoo ; et en considérant les utilisateurs
de notre module, l’interface a été conçu de manière intuitif pour une utilisation facile.
Afin d’atteindre l’objectif fixé sur ce projet nous avons opté pour Odoo pour les
différentes raisons suivantes :
Pour ses fonctionnalités
Pour son intégration
Pour sa modularité
Pour son modèle économique avantageux
- 78 -
7.1.3 Modélisation du système
Nous allons utiliser quelques diagrammes énumérer ci-dessus pour modéliser notre
application.
Le diagramme de cas d'utilisation est un diagramme UML utilisé pour donner une vision
globale du comportement fonctionnel d'un système logiciel.
Voici donc le diagramme de cas d’utilisation approprié à notre système.
- 79 -
Figure 55 : Diagramme d’activité
(Source : Auteur)
Diagramme de séquence
Les diagrammes cités ci-dessus nous permet de tirer les diagrammes de classes. Les
objets travaillant ensemble ont été identifiés tout au long de l’analyse.
- 80 -
Figure 57 : Diagramme de classe
(Source : Auteur)
- 81 -
Environnement de développement
Avant de plonger dans le développement de notre application avec Odoo, nous devons
configurer notre environnement de développement, et nous devons apprendre les tâches
administratives de base pour cela. Nous allons donc voir comment configurer l’environnement
de travail, où nous allons plus tard, construire nos applications Odoo.
Odoo est construit en utilisant le langage de programmation Python et utilise la base de
données PostgreSQL pour son stockage de données, ce sont donc les principales exigences que
nous devrions avoir dans notre hôte Odoo. L'installation source nécessite l'installation manuelle
des dépendances.
Pour exécuter Odoo à partir de la source, nous devrons d'abord installer les bibliothèques
Python, cela en dépend. Le code source Odoo peut ensuite être téléchargé à partir de Nightly et
exécuté à partir de la source. Pour garder les choses en ordre, travaillons dans un répertoire
/odoo-dev dans le répertoire /D.
Installer Python 3.7, cocher "ajouter python.exe au chemin" lors de l'installation, puis
redémarrer pour s’assurer que le PATH des variables d’environnement est mis à jour. Si Python
est déjà installé, il faut s’assurer qu'il s’agit bien de la version 3.7, les versions précédentes sont
moins pratiques.
- 82 -
8.3. Installation de PostgreSQL
SKTIME est une bibliothèque, donc les dépendances liées sont directement comprises
dans l’installation de sktime avec la commande suivante :
- 83 -
Figure 59 : Installation sktime
(Source : Auteur)
- 84 -
Activer le mode développeur. Le mode développeur active une liste déroulante près du
sommet des fenêtres Odoo, ce qui permet quelques options de configuration avancées
disponibles dans l’application. Cela aussi désactive la minification de JavaScript et CSS utilisée
par le client Web, ce qui rend plus facile de déboguer le comportement côté client. Maintenant,
aller dans la liste des applications. Installer le module Prédiction de vente Nous pouvons
maintenant procéder à la personnalisation.
- 85 -
Approche qualitative du projet
La qualité est l’ensemble des caractères, des propriétés qui font que quelque chose,
matérielle ou immatérielle, corresponde d’une bonne ou d’une mauvaise manière aux attentes
qui la concernent.
L’importance du projet réside dans son aide aux entreprises utilisant la technologie
Odoo. Dans un cas où il leur est nécessaire de définir les articles à réapprovisionner, le projet
va les aider grandement dans cette tâche. Sans le projet, ils n’auront de solution que d’acheter
des modules payant dans la liste des applications dans l’App Store Odoo ou aussi d’engager
des développeurs pour concevoir le module avec un long processus Bien que les données de
vente sont déjà à porter de main sur odoo, l’analyse et le traitement de ces données reste encore
difficile à effectuer. Avec le projet, ils n’auront besoin que d’utiliser le module d’application et
avec seulement quelque clic, ils pourront voir le future sous leurs yeux.
Dans notre cas, l’utilisation Odoo propose la restriction et l’accès à des déférentes vue grâce
au système de groupe. Ce qui fait qu’une fois connecté, l’utilisateur sait déjà ce qu’il est
possible de faire ou de ne pas faire en fonction des droits qui lui ont été données. De plus, même
si l’utilisateur n’as pas encore beaucoup d’expérience sur le fonctionnel Odoo grace au info-
bulle, il pourra se familiariser facilement et rapidement sur l’environnement.
- 86 -
9.3.2 Qualité interne
Comme les qualités, les améliorations possibles concernent aussi d’un côté la capacité
technique et de l’autre la capacité fonctionnelle du module.
Du côté fonctionnel, la principale amélioration que l’on peut apporter concerne la
possibilité d’exporter le résultat de l’application en format électronique comme en Excel ou en
PDF. En effet pour la plupart des entreprises, les équipes qui font la gestion de stock ne sont
pas forcément ceux qui ont accès au plateforme Odoo, d’où la nécessité d’un document pour
faire passer les informations.
Du côté technique, ce qu’on peut améliorer dans le futur c’est la force de l’apprentissage
pour la prédiction, en moment l’apprentissage est uni varié c’est-à-dire qu’avec une seule
variable (facteur). On peut aussi améliorer l’aspect technique en combinant plusieurs modèles
pour l’apprentissage, mais le choix actuel est misé sur la rapidité de traitement des données.
- 87 -
Conclusion
Le stage que nous avons effectué auprès de la société Etech a été une expérience
enrichissante tant au niveau social qu’intellectuelle. Nous avons mis en pratique nos
connaissances acquises durant nos cinq années d’études en électronique, systèmes
informatiques et intelligence artificielle pour créer un module Odoo permettant de booster la
gestion de stock des entreprises utilisant l’ERP Odoo.
Sur le plan technique, des exigences ont aussi été imposées. Tout au long du projet, nous
avons utilisé la méthode d’analyse UML pour concevoir le système d’information adéquat et
de nombreuses recherches et expériences dans le domaine machine Learning pour obtenir un
modèle optimal à notre prédiction. Par ailleurs, nous avons fait usage d’Odoo qui est un
progiciel de gestion intégré, afin de pouvoir bénéficier de la richesse de ses fonctionnalités. Du
coup, les technologies suivantes ont été utilisées : le langage de programmation Python, XML
et JavaScript, la bibliothèque SKTIME sans compter l’environnement de développement
PyCharm
Travailler au sein de la société Etech était pour nous une fierté et une expérience
enrichissante. Enfin, nous espérons toujours une meilleure collaboration entre l’ISPM et Etech .
- 88 -
Curriculum vitæ
RAZAKAMANANTSOA Miantsa Tiana
Née le 18 Juin 1998 à la Clinique Ankadifotsy
Sexe : Masculin
Situation Maritale : En couple
Nationalité : Malagasy
Adresse : Lot II 10 A Manjakaray Antananarivo
E-mail : miantsamiantsarazakamanantsoa@gmail.com
Téléphone : +261 33 47 957 38 - +261 34 79 747 08
Permis: catégorie B
Formation
2023 Master en Informatique et Télécommunications
Parcours : Électronique, Systèmes Informatiques et Intelligence
Artificielle, à l’ISPM - Institut Supérieur Polytechnique de
Madagascar
- 89 -
Expérience professionnelle
- Depuis avril 2021 : Etech : Développeur Odoo
- 90 -
Compétences Linguistiques
Malagasy Langue maternelle
Français Niveau universitaire – Lu, parlé, écrit : Excellent
Niveau intermédiaire – Lu : Bon
Anglais
– Parlé, écrit : Moyen
Compétences en informatique
- Python Odoo
- C, C++ (Connaissance)
- C#
Langages
- Java
informatiques
- Visual Basic.NET
- Langage Web (HTML/CSS, JavaScript, PHP, NodeJs,…)
- SQL
- Théorie et pratique
Électronique
- Électronique embarquée (Arduino, Raspberry Pi,…)
Loisirs
- Jeux vidéo, billard
- Animation japonaise et Film
- Sport : Musculation
- Fan des sports mécaniques
- 91 -
BIBLIOGRAPHIE
- 92 -
B - Ouvrages :
[13] Aishwarya Singh,Build High Performance Times Series Models using Auto ARIMA
Python,2022
[14] Alexandre Pauchet, Technologie Web : Server Web et protocole HTTP, INSA Rouen,
2016
[15] Donato_TH, Times Seris Forecasting with Python,2022
[16] Guillaume Saint-Cirgue, Apprende le Machine Learning en une semaine,2019
[17] GoalKicker, Python Notes for Professionals,2019
[18] GoalKicker, Algorithms Notes for Professionals,2019
[19] JoSé2, Tout sur le Javascript, OpenClassroom, 2010
[20] M. Jia et al, Comparison Analysis of ARIMA and Machine Learning, 2022
[21] Parth Gajjar, Odoo 14 Development, 2020
[22] Raphaël Goetter, CSS avancées Vers HTML5 et CSS3., Éditions Eyrolles 2012
C - Webographie :
[23] /https://www.odoo.com/documentation/15.0/fr/ ,Octobre 2023
[24] https://www.sktime.net/en/v0.17.2/installation.html, Aout 2023
[25] https://www.sktime.net/en/v0.17.2/api_reference/auto_generated/sktime.forecasting.ar
ima.AutoARIMA.html , Aout 2023
[26] https://www.aeon-
toolkit.org/en/latest/api_reference/auto_generated/aeon.forecasting.arima.AutoARIMA.ht
ml, Aout 2023
[27] https://alkaline-
ml.com/pmdarima/modules/generated/pmdarima.arima.auto_arima.html, Novembre 2023
[28] https://jobphoning.com/dictionnaire/previsions-de-ventes#, Octobre 2023
[29] https://www.stocks-industriels.fr/quels-sont-les-problemes-lies-a-la-gestion-de-
stocks/, Octobre 2023
[30] https://www.cairn.info/revue-l-expansion-management-review-2010-3-page-46.htm,
Octobre 2023
[31] https://chat.openai.com/, Septembre 2023
- 93 -
Tables des matières
REMERCIEMENTS ................................................................................................................. i
AVANT PROPOS .................................................................................................................... ii
Liste des abréviations .............................................................................................................. iii
Liste des figures ...................................................................................................................... vii
Liste des tableaux .................................................................................................................... ix
Introduction ......................................................................................................................... - 1 -
Partie I : Présentation générale.......................................................................................... - 2 -
Présentation de l’ISPM .................................................................................. - 3 -
1.1. Historique ...................................................................................................................... - 3 -
1.2. Identité de l’ISPM ......................................................................................................... - 5 -
1.2.1 Situation actuelle ....................................................................................................... - 5 -
1.2.2 Logo .......................................................................................................................... - 5 -
1.2.3 Hira Faneva : « Ilay ISPM tena maminay » .............................................................. - 7 -
1.2.4 Hira Faneva 25ème anniversaire ................................................................................. - 7 -
1.3. Objectif et cursus de formation...................................................................................... - 8 -
1.4. Formations proposées par l’ISPM ................................................................................. - 9 -
1.5. La filière ESIIA ........................................................................................................... - 10 -
1.6. Organigramme de l’ISPM ........................................................................................... - 12 -
1.7. Particularités de l’ISPM............................................................................................... - 13 -
1.7.1 Recherches scientifiques sur les plans national et international .............................. - 13 -
1.7.2 Portes ouvertes et salon de l’ISPM ......................................................................... - 13 -
1.7.3 Supports pédagogiques............................................................................................ - 13 -
1.7.4 L’Examen Clinique ................................................................................................. - 13 -
1.7.5 Supports académiques ............................................................................................. - 14 -
Présentation d’Etech .................................................................................... - 15 -
2.1. Fiche d’identification................................................................................................... - 15 -
2.2. Historique .................................................................................................................... - 15 -
2.3. Valeurs ......................................................................................................................... - 18 -
2.4. Activités ....................................................................................................................... - 18 -
2.4.1 Activités principales ................................................................................................ - 18 -
2.5. Organisation ................................................................................................................ - 20 -
2.6. Ressources humaines ................................................................................................... - 21 -
2.7. Quelques références..................................................................................................... - 22 -
Présentation du projet .................................................................................. - 23 -
3.1. Généralité .................................................................................................................... - 23 -
3.1.2 Problématique ......................................................................................................... - 23 -
3.1.3 Solution ................................................................................................................... - 24 -
- 94 -
3.2. Objectif ........................................................................................................................ - 25 -
3.3. Domaines d’activités ................................................................................................... - 26 -
3.4. Moyens nécessaires à la réalisation du projet .............................................................. - 26 -
3.4.1 Moyens humains ..................................................................................................... - 26 -
3.4.2 Moyens matériels .................................................................................................... - 26 -
3.5. Conception................................................................................................................... - 26 -
- 95 -
5.3. Visualisation de la prédiction de vente ........................................................................ - 58 -
5.4. L’analyse de vente ....................................................................................................... - 60 -
5.5. Historique des apprentissages ...................................................................................... - 62 -
5.5.1 La vue liste .............................................................................................................. - 62 -
5.5.2 La vue formulaire .................................................................................................... - 63 -
5.6. La planification des apprentissages ............................................................................. - 63 -
5.7. La configuration de module de prédiction de vente .................................................... - 64 -
5.7.1 Paramétrage de l’apprentissage ............................................................................... - 65 -
5.7.2 Paramétrage du modèle AutoARIMA ..................................................................... - 65 -
Extraits de code ........................................................................................... - 68 -
6.1. Les modèles ................................................................................................................. - 68 -
6.1.1 Historiques d’apprentissage .................................................................................... - 68 -
6.1.2 Configuration .......................................................................................................... - 69 -
6.2. Les Vues ...................................................................................................................... - 72 -
6.2.1 Historiques d’apprentissage .................................................................................... - 72 -
6.2.2 Graphes de prédiction (vue qweb)........................................................................... - 75 -
Conclusion .......................................................................................................................... - 88 -
- 96 -
Lettre d’approbation des encadreurs
Lu et approuvé
-
----------
--------------------------------------
------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
------
Antananarivo, ……………………………………
L’encadreur Pédagogique
Cachet
Nom et Prénom
Antananarivo, ……………………………………
L’encadreur Professionnel
Cachet
Nom et Prénom
- 97 -
INSTITUT SUPÉRIEUR POLYTECHNIQUE DE MADAGASCAR
Presented by:
Mister RAZAKAMANANTSOA Miantsa Tiana
ABSTRACT
Our task was to create a module on the Odoo ERP to enable sales prediction of the native
module. To do this, we implemented an Auto ARIMA learning model in the Odoo system using
the SKTIME Python library, based on historical sales data. The module also enables systematic
learning, and for visualization of prediction results, we created a captioned graph in Chart.js.
Overall, our complete solution represents a significant step forward in enhancing the predictive
capabilities of Odoo ERP, combining technical expertise, advanced modeling and intuitive
visual tools to deliver a powerful, integrated sales forecasting solution.
- 98 -
INSTITUT SUPÉRIEUR POLYTECHNIQUE DE MADAGASCAR
Présenté par :
Monsieur RAZAKAMANANTSOA Miantsa Tiana
RÉSUMÉ
Notre travail était de créer un module sur l’ERP Odoo pour permettre la prédiction des
ventes du module natif. Pour ce faire, nous avons mis en place un modèle d’apprentissage Auto
ARIMA dans le système Odoo en utilisant la bibliothèque Python SKTIME, en se basant sur
l’historique des données de vente. Le module permet aussi l’apprentissage systématique et pour
la visualisation des résultats de prédiction, nous avons créé un graphe légendé sous Chart.js.
Dans l’ensemble, notre solution complète représente une avancée significative dans
l’amélioration des capacités prédictives de L’ERP Odoo, combinant expertise technique,
modélisation avancée et outils visuels intuitifs pour offrir une solution intégrée et puissante
dans le domaine de la prévision de vente.
- 99 -