Vous êtes sur la page 1sur 111

INSTITUT SUPÉRIEUR

POLYTECHNIQUE DE ETECH
MADAGASCAR

MÉMOIRE DE FIN D’ÉTUDES DU SECOND CYCLE EN VUE DE L’OBTENTION


DU DIPLÔME DE MASTER EN INFORMATIQUE ET TÉLÉCOMMUNICATIONS
Parcours : Électronique, Systèmes Informatiques et Intelligence Artificielle

Prédiction sur vente ODOO

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

L’ISPM ou Institut Supérieur Polytechnique de Madagascar privilégie tout aussi bien


l’enseignement pratique que théorique, aussi a-t-elle instauré l’obligation pour chaque étudiant
d’effectuer un stage pratique en entreprise avant l’obtention des diplômes. Ce système permet
aux étudiants de mettre en pratique ou même d’approfondir leur connaissance tout en ayant déjà
un aperçu de la vie professionnelle.

Nous, RAZAKAMANANTSOA Miantsa Tiana, avons choisi la société Etech pour


notre stage car elle répond à nos aspirations. Après une analyse des cas effectués auprès du
client et du chef de projet, le thème « Prédiction sur vente ODOO » nous a été confié. Notre
travail consistera à développer un module sur ce projet.
.

ii
Liste des abréviations
# 2D/3D 2/3 Dimensions

A AEE Agriculture Et Élevage


AJAX Asynchronous JavaScript And XML
AOO Analyse Orientée Objet
API Application Programming Interface
AR Auto Regressif
ARIMA AutoRegressive Integrated Moving Average

B BA Business Analyste
BU Business Unit

C CAA Commerce et Administration des Affaires


CNaPS Caisse Nationale de Prévoyance Sociale
COO Conception Orientée Objet
CSS Cascading Style Sheets
CC Centre de compétence
CODIR Comité de Direction
CP Chep de projet

D DP Directeur de Projet
DTJA Droit et Techniques Juridiques des Affaires

E EDI Environnement de Développement Integré


ERP Entreprise Resource Planning
ESN Entreprise de Services du Numérique
EMII Électromécanique et Informatique Industrielle
EMP Économie et Management de Projet

iii
Électronique, Systèmes Informatiques et Intelligence
ESIIA
Artificielle
École Supérieure de Sciences et Techniques de l’Information à
ESSTIM
Madagascar

F FIC Finances et Comptabilités

G GCA Génie Civil et Architecture

H HTML HyperText Markup Language

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

J JSON JavaScript Object Notation

L LDAP Lightweight Directory Access Protocol


LMD Licence-Master-Doctorat

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

P PDF Portable Document Format


PDO PHP Data Objects
PHP PHP: Hypertext Preprocessor
PIP Pharmacologie et Industries Pharmaceutiques
POO Programmation Orientée Objet
POOA Programmation Orientée Objet Avancée

R REST Representational State Transfer


RNA Réseaux de Neurones Artificiels
RAM Random Access Memory
RH Ressources humaines
RT Référent Technique

S SSD Solid State Drive


SGBDR Système de Gestion de Base de Données Relationnelles

v
SQL Structured Query Language

T TEE Tourisme et Environnement


TEH Tourisme et Hôtellerie
TL Tech Lead
TMS Transport Management System
TOPO Topographie

U UI User Interface
UML Unified Modeling Language
URL Uniform Resource Locator

W W3C World Wide Web Consortium

X XML eXtensible Markup Language

vi
Liste des figures

Figure 1 : Superstructure de l’ISPM .......................................................................... - 5 -


Figure 2 : Logo de l’ISPM ............................................................................................ - 6 -
Figure 3 : Cursus universitaire à l’ISPM ................................................................... - 9 -
Figure 4 : Organigramme de l’ISPM ........................................................................ - 12 -
Figure 5 : Etech en 2008 ............................................................................................. - 16 -
Figure 6 : Etech en 2020 ............................................................................................. - 17 -
Figure 7 : Situation géographique d’Etech ............................................................... - 17 -
Figure 8 : eTech ........................................................................................................... - 17 -
Figure 9 : Organisation agile ..................................................................................... - 21 -
Figure 10 : Organigramme de Etech ........................................................................... - 22 -
Figure 11 : Les références d’Etech .............................................................................. - 22 -
Figure 12 : Logo Odoo .................................................................................................. - 29 -
Figure 13 : Héritage modèle sur odoo ......................................................................... - 31 -
Figure 14 : Exemple de vue liste sur Odoo ................................................................. - 34 -
Figure 15 : Exemple de vue formulaire sur Odoo ...................................................... - 35 -
Figure 16 : Exemple de vue graphe sur Odoo ............................................................ - 35 -
Figure 17 : Exemple de vue kanban sur Odoo ........................................................... - 36 -
Figure 18 : Exemple de vue calendar sur Odoo ......................................................... - 36 -
Figure 19 : Exemple de vue pivot sur Odoo ............................................................... - 37 -
Figure 20 : Logo du Langage Python .......................................................................... - 39 -
Figure 21 : Logo du langage JavaScript ..................................................................... - 40 -
Figure 22 : Logo de PostgreSQL ................................................................................. - 41 -
Figure 23 : Machine Learning et Intelligence artificielle .......................................... - 42 -
Figure 24 : Ensemble tendance et saisonnalité série temporelle............................... - 45 -
Figure 25 : Logo SKTIME ........................................................................................... - 47 -
Figure 26 : Apercu interface Pycharm........................................................................ - 51 -
Figure 27 : Logo Pycharm ............................................................................................ - 52 -
Figure 28 : Configuration lanceur serveur Odoo....................................................... - 52 -
Figure 29 : Lanceur serveur Odoo .............................................................................. - 53 -
Figure 30 : Bouton lanceur serveur Odoo .................................................................. - 53 -
Figure 31 : Interface Jupiter Notebook Pycharm ...................................................... - 54 -

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 -

Partie II : Matériels et méthodes ..................................................................................... - 28 -


Outils et Langages Utilisés .......................................................................... - 29 -

Partie III : Résultats .......................................................................................................... - 55 -


Interfaces et fonctionnement ....................................................................... - 56 -
Extraits de code ........................................................................................... - 68 -

Partie IV : Discussion ........................................................................................................ - 77 -


Analyse et conception UML ........................................................................ - 78 -
Environnement de développement .............................................................. - 82 -
Approche qualitative du projet .................................................................... - 86 -

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

DOMAINE/GRADE MENTION REFERENCE ET DATE


Sciences et Biotechnologie Arrêté n°31172/2012-MESupReS
Technologie/Licence et du 5 décembre 2012
Master
Sciences et Génie Industriel Arrêté n°1949/2013-MESupReS
Technologie/Licence du 31 janvier 2013
Sciences et Génie Industriel Arrêté n°21909/2014-MESupReS
Technologie/Master du 11 juin 2014
Sciences et Génie Civil et Architecture Arrêté n°1949/2013-MESupReS
Technologie/Licence et du 31 janvier 2013
Master
Sciences et Informatique et Arrêté n°1949/2013-MESupReS
Technologie/Licence et Télécommunications du 31 janvier 2013
Master
Sciences de la Droit et Technique des Arrêté n°11566/2013-MESupReS
société/Licence et Master Affaires du 23 mai 2013

-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)

La détermination du fondateur et de ses collaborateurs d’aller toujours de l’avant a contribué


au développement rapide de l’Institut, d’où la formation de nouvelles filières. Son transfert à
Ambatomaro Antsobolo était donc nécessaire.

Voici l’ordre chronologique de la mise en place des filières à l’ISPM :

 1993 : Informatique de Gestion, Génie Logiciel et Intelligence Artificielle (IGGLIA) ;


 1994 : Électronique, Système Informatique et Intelligence Artificielle (ESIIA) ;
 1995 : Commerce et Administration des Affaires (CAA) ;
 1996 : Biotechnologie : la filière Industries Agro-Alimentaire (IAA) et la filière
Pharmacologie et Industries Pharmaceutiques (PIP) ;
 1997 : Tourisme Et Environnement (TEE) ;
 1998 : Électromécanique et Informatique Industriel (EMII) ;
 1999 : Génie Civil et Architecture (GCA) ;
 2004 :
- Informatique Multimédia et Technologie de l’Information et de la
Communication et Intelligence Artificielle (IMTICIA) ;
- Finances et Comptabilité (FIC) ;
- Agriculture Et Élevage (AEE) ;
 2009 :
- Économie et Management de Projet (EMP) ;
- Droit et Techniques Juridiques des Affaires (DTJA) ;
- Tourisme et Hôtellerie (TEH) ;
- Industries Chimiques, Minières et Pétrolières (ICMP) ;

-4-
 2010 : Informatique, Statistiques Appliquées et Intelligence Artificielle (ISAIA).

La diversification des disciplines offre aujourd’hui aux étudiants un large choix


d’inscriptions. Actuellement, l’ISPM compte plus de deux mille étudiants issus des quatre coins
de l’île et même de l’étranger. Une centaine d’enseignants et d’enseignant-chercheurs assurent
la formation au sein de l’Institut.

1.2. Identité de l’ISPM

1.2.1 Situation actuelle


Actuellement, l’ISPM et son bureau administratif se trouvent à Ambatomaro Antsobolo,
dans un cadre plus étendu, propice aux études.

Figure 1 : Superstructure de l’ISPM


(Source : Brochure de l’ISPM)

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.

Les mots de RAHARINOSY Voajanahary : « Je me souviens très bien du moment où nous


(moi et Falimiamina) avons été primés lors de la première journée des portes ouvertes à
Antsahavola pour avoir créé ce logo en 1994. La direction avait lancé le concours pour une
durée de 1 mois. J’ai conçu la « Graduation Hat », le globe de façon légèrement incliné vers la
droite (synonyme d’universalité) et la poignée de main commerciale. Tandis que Falimiamina
a conçu le socle ISPM en texture de granite gris et vert, synonyme de quelque chose de solide
et durable disait-il avec tant d’enthousiasme. »

Figure 2 : Logo de l’ISPM


(Source : www.ispm-edu.com)

-6-
1.2.3 Hira Faneva : « Ilay ISPM tena maminay »

Ilay ISPM tena maminay


Tsy mba foinay tokoa rahatrizay
Toerana nanabeazana ny tenanay
Mba ho tena olom-banona mahay

Ho mendrika tokoa
Ho mafy orina avokoa
Ny "FAHAIZANA – FAMPANDROSOANA - FIHAVANANA"
Ho andry sy tokin’ny Tanindrazana

Ny fahaizana no ampinga ho enti-miady


Nampitaina, nozaraina sy nomena
Tsy handrarak’ilo fa ho tena kiady
Ho enti-mampandroso ity firenenay

Fa ny fihavanana firaisankina
No asandratray hatrany hatrany
Manoloana fifaliana fahoriana
Mandra-pialanay ety an-tany

Auteur : RABERANTO Rija / RJA


Compositeur : RABERANTO Rija (1ère promotion IGGLIA)

1.2.4 Hira Faneva 25ème anniversaire


E, deraina izao Andriamanitra
Fa na dia nandalo zava-tsarotra
Tsy mihemotra, tsy mba mikoro
Ny fianarantsika dia mijoro

-7-
Dimy amby roampolo taona ny Sekoly izao
Be ireo nandalo ka tafita tao
Tsy mifidifidy na manavaka
Fa ISPM dia tena miavaka

Ry tanora izay mitoetra ao izao


Maro anie ny soa izay ho azonao
Fa na lehilahy na vehivavy
Azo antoka tokoa ny hoavy

Dia mba katsaho ny Fahaizana


Ka hevero ny Fampandrosoana
Tanteraho anaty Fihavanana
Izay no tarigetran’ny fianarana

A/C : RAKOTOARIMANANA Johany (CAA 3 2003)

1.3. Objectif et cursus de formation

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)

1.4. Formations proposées par l’ISPM

Voici la liste des parcours par mention que l’ISPM offre :

 Mention Informatique et Télécommunications


 Informatique de Gestion, Génie Logiciel et Intelligence Artificielle (IGGLIA)
 Électronique, Systèmes Informatiques et Intelligence Artificielle (ESIIA)
 Informatique Multimédia, Technologie de l’Information et de la Communication et
Intelligence Artificielle (IMTICIA)
 Informatique, Statistiques Appliquées et Intelligence Artificielle (ISAIA)
 Mention Génie Industriel
 Électromécanique et Informatique Industrielle (EMII)
 Industries Chimiques, Minières et Pétrolières (ICMP)

-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.

1.5. La filière ESIIA

ESIIA (Électronique, Systèmes Informatiques et Intelligence Artificielle) est une filière


dont la finalité est la formation des étudiants dans l’informatique et l’électronique et d’une
manière générale dans les conceptions des logiciels et applications. Durant le premier cycle, les
étudiants de la filière ESIIA sont formés dans les disciplines suivantes :

 Informatique Scientifique, Algèbres Linéaires, Mathématiques Discrètes, Analyse


Mathématiques, Logique, Probabilités, Statistiques,
 Algorithmiques et programmation, Structures de Données, Turbo PASCAL, Turbo C,
JAVA, Visual Basic, C#, PHP, Technologies web, Programmation Orientée Objet
(POO)
 Réseaux informatiques,
 Base de données et MERISE,
 Électricité et Électronique, Structure des ordinateurs, Maintenance des systèmes
électroniques (MSE), Maintenance des systèmes informatiques (MSI), Automatique,

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

Figure 4 : Organigramme de l’ISPM


(Source : Enseignant à l'ISPM)
1.7. Particularités 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.

1.7.1 Recherches scientifiques sur les plans national et international

Les étudiants et les enseignant-chercheurs à l’ISPM font des recherches scientifiques


d’ordres national et international et les publient dans des journaux internationaux et dans des
« proceedings » des conférences internationales prestigieuses. Un extrait de la liste de ces
publications est disponible sur http://ispm-edu.com/publications.php.

1.7.2 Portes ouvertes et salon de l’ISPM


L’année académique se divise en deux semestres. À chaque semestre ont lieu deux examens
dont un « Mid-Term » et un « Final-Exam ». Le deuxième semestre se démarque par
l’organisation des « portes ouvertes » et un salon de l’ISPM. Ces évènements sont une occasion
pour les étudiants de montrer, au grand public leurs projets effectués dans le cadre des
recherches personnelles en équipe.

1.7.3 Supports pédagogiques

L’ISPM met à la disposition de ses étudiants :


 Deux laboratoires informatiques pour un total de cent vingt ordinateurs,
 Un laboratoire expérimental pour le département biotechnologie,
 Un laboratoire de travaux pratiques en électricité et électronique,
 Un atelier de travaux pratiques pour les étudiants en mécanique,
 Divers appareils topographiques.

1.7.4 L’Examen Clinique

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.1. Fiche d’identification

Etech est une ESN (Entreprise au Service du Numérique) basée à Madagascar,


spécialisée dans le développement de projets digitaux et de la sous-traitance offshore. Elle fait
partie du groupe ArkeUp Paris et compte actuellement plus de 500 ingénieurs et experts en
informatique.
L’Etech se trouve dans l’Immeuble Aquamad, Route du Pape, Morarano Antananarivo. Sa boite
postale est le BP 8515 Antananarivo 101 – Madagascar. On peut également la joindre à partir
du numéro téléphone +261 20 22 536 04 ou de l’adresse mail etech@etechconsulting-mg.com.
Son site web est le www.etechconsulting-mg.com.

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.

Figure 5 : Etech en 2008


(Source : Brochure de Etech)

- 16 -
Figure 6 : Etech en 2020
(Source : Brochure de Etech)

 Implantations géographiques

Figure 7 : Situation géographique d’Etech


(Source : Brochure de Etech)
 Logo

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

2.4.1 Activités principales


La société Etech est spécialisée dans le domaine du développement d’applications
informatiques et utilise des technologies variées afin de répondre aux besoins et exigences de
ses clients et collaborateurs. En ce sens, l’entreprise réalise :
 L’audit et l’analyse des besoins,
 Les spécifications et la conception de base de données,
 La conception graphique : de la création à l’intégration,

- 18 -
 Le développement,
 Le déploiement,
 La maintenance et le support des applications.

Les savoir-faire métiers

 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

Depuis sa création jusqu’à maintenant, Etech a développé des partenariats significatifs


notamment avec :
- Le leader mondial des OpenERP : ODOO (Etech est certifié « Odoo Gold Partner »),
- Le géant américain CISCO,
- Google Cloud Platform,
- Xamarin,
- SensioLabs,
- Google for Work.

2.5. Organisation

En qualité d’ESN, Etech est constamment confronté à l’émergence de nouveaux


marchés et d’offres innovantes qui redéfinissent les segments de clients, entraînant une
concurrence intense.
Fort de son leadership pluridisciplinaire et de son expertise métier, Etech se développe
rapidement et de manière maitrisée, que ce soit en termes d’effectifs ou de compétences.
Préserver la proximité et l’agilité au sein des équipes inter-projets est devenu essentiel,
conduisant ainsi à l’adoption d’une nouvelle structure plus agile et flexible.
Dans un contexte d’évolution continue, Etech a opté pour une approche agile en
procédant à une réorganisation de ses entités. Deux nouvelles sociétés, AEGE et BeePeeOo,
ont été créées au début du second trimestre 2022 pour accroître la flexibilité.
Parallèlement, Etech a également adopté une structure en Business Unit (BU), incluant
les Centres de compétences (CC). Cette configuration confère à la BU une autonomie
substantielle sous la direction d’un directeur dédié. L’approche vise à centraliser les
compétences technologiques pour stimuler la rentabilité. Les BU, avec cette intégration des
Centres de compétences, conservent leur autonomie tout en étant soumises à une gouvernance
transparente assurée par les structures transverses.

- 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)

2.6. Ressources humaines

Le Comité de direction se compose des membres suivants :


Tableau 2 : Comité de direction de Etech

Président Directeur Général Monsieur Pierre-Paul ARDILE


Directeur Financier et Projets spéciaux Monsieur RAMAROSAHA Ravo Fy
Directeur des Opérations et Projets Monsieur RAVELOSON Hery Nandrianina
Directeur BizzDev Monsieur Roland ARDILE
Directeur du département TOPO Monsieur Pierre-Marie
Représentant institutionnel CODIR
Monsieur RAKOTONDRAMANANA Hery Zo
Marketing & Communication
Directeur Administratif et Financier Madame RAZAFIMANJATO Fanjatiana
Directeur des Ressources Humaines Madame RASOLO Miarana Dina
(Source : Newsletter Etech)

- 21 -
L’organigramme d’Etech :

Figure 10 : Organigramme de Etech


(Source : Newsletter Etech)

2.7. Quelques références

Figure 11 : Les références d’Etech


(Source : www.etechconsulting-mg.com)

- 22 -
Présentation du projet

3.1. Généralité

Ce projet a été effectué au sein d’Etech situé à Anosivavaka au première étage de


l’immeuble AQUAMAD. Nous avons été assignés dans l’équipe Appwork qui utilise la
technologie Odoo durant l’accomplissement de ce projet et on a aussi été affecté dans des
projets différents parmi lesquels des projets en cours et d’autres en création. Avant de prendre
part à ces projets et pour avoir les compétences requises à la réalisation de celui-ci, nous avons
eu une formation complète sur Odoo et les aux outils qui y sont liés durant quatre mois
successives.

3.1.2 Problématique

En réponse aux demandes des clients, les entreprises commerciales s’adaptent et


ajustent leurs stratégies pour répondre aux attentes du marché, mais surtout pour éviter les
pertes liées aux stockage. Parfois les stratégies appliquées ne sont pas efficaces et ne permettent
pas de déterminer la fréquence d’approvisionnement et les quantités à réapprovisionner ; ce qui
peut provoquer des problèmes au niveau de la gestion de stock.
Pour les entreprises qui utilisent Odoo pour la gestion de leurs stocks bien qu’il existe déjà des
modules consacrés à cela, il est difficile de prévoir à quel moment il y aura hausse ou baisse sur
la vente pour éviter les problèmes ci-dessous.

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

Manque de visibilité dans la chaine d’approvisionnement

Un manque de transparence et de suivi dans la chaine d’approvisionnement peut


entrainer des retards de livraison et des problèmes de gestion de stocks

Inefficacité dans la prévision de la demande

Une mauvaise estimation de la demande future peut entrainer des surstocks ou des sous-
stock.

Coûts de stockage élevés

Les couts associés au stockage, tels que les loyers d’entrepôts, l’assurances, la
maintenance, peuvent grever les marges bénéficiaires

Obsolescence des produits

Les produits qui ne se vendent pas peuvent devenir obsolètes ce qui entraine des pertes
financières.

Gestion manuelle des stocks

La gestion manuelle des stocks peut être sujette à des erreurs humaines, ce qui peut
entrainer des problèmes de précision.

Complexité de la chaine d’approvisionnement

Les chaines d’approvisionnement complexes avec de nombreux fournisseurs peuvent


rendre difficile la gestion efficace des stocks.

Fluctuations saisonnières de la demande

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

Dans le domaine technique et sur le monde du Business, ce projet a été créé


spécifiquement sur le plateforme Odoo pour promouvoir ses différentes possibilités et pour
inciter aux entreprises qui n’utilisent pas encore Odoo qu’Odoo est une des meilleures solutions
pour faciliter la gestion des leurs entreprises.

- 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.

3.4. Moyens nécessaires à la réalisation du projet

3.4.1 Moyens humains


Lors de la réalisation du projet des participants se collaborent pour mieux fonctionner :
Chef de projet : RAKOTONDRANIVO Santatra
Développeur : RAZAKAMANANTSOA Miantsa Tiana

3.4.2 Moyens matériels

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

Marque Processeur RAM SSD Système


d’exploitation
Lenovo Intel® Core i5 12 Go 256 Go Windows 10
(Source : Auteur)

3.5. Conception

Pour la conception du projet nous avons adopté les techniques suivantes :

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

Odoo, anciennement OpenERP et Tiny ERP est initialement un progiciel open-source


de gestion intégré fondé en 2004 comprenant de très nombreux modules permettant de
simplifier la gestion d’entreprise dans son ensemble. Le logiciel est utilisé par plus de deux
millions d’utilisateurs pour gérer leurs entreprises à travers le monde. Odoo est le système ERP
open-source le plus populaire.

Figure 12 : Logo Odoo


(Source : www.odoo.com/fr_FR/page/brand-assets)

4.1.1 Architecture d’Odoo

Un système Odoo est basé sur une architecture 3-tiers :


- Un serveur de base de données PostgreSQL qui peut contenir plusieurs bases de
données ;
- Un serveur d’applications contenant les objets de gestion, le moteur de workflow, le
générateur d’édition, etc ;
- Un serveur de présentation qui permet à l’utilisateur de se connecter à Odoo avec
n’importe quel navigateur Web

- 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

# Fields attribute for table


name = fields.Char(string="Name")

Héritage et extension

Odoo fournit trois façons d’hériter un modèle :


- Création à partir des modèles existants (ajout des nouvelles informations sans impacter
l’original)
- Extension d’un modèle défini en replaçant l’ancienne version dans un nouveau module
- Délégation d’une partie des champs d’un modèle en les stockant dans un autre modèle

- 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.

Les méthodes communes à l’ORM

Les méthodes communes à l’ORM sont :


- create() : crée un nouvel enregistrement et prend comme paramètre un dictionnaire dont
les clés sont les champs du modèle et les valeurs des clés sont les valeurs à insérer dans
la base. Elle retourne l’enregistrement nouvellement crée.
>>> self.create({'name':'New Name'})
res.partner(78)

- write() : met à ajours un enregistrement existant et a le même paramètre que create().

- 31 -
- browse() : met une liste d’ID comme argument et retourne un recordset.
>>>self.browse([7, 18, 12])
res.partner(7, 18, 12)

- search() : a pour paramètre un domaine et retourne un recordset qui satisfait le critère


du domaine.
>>> self.search([('is_company', '=', True), ('customer', '=', True)])
res.partner(7, 18, 12, 14, 17, 19, 8, 31, 26, 16, 13, 20, 30, 22, 29,
15, 23, 28)

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

=, != Est égal à ou différent à


in, not in Vérifie si la valeur est parmi la liste dans l’opérande droit
<= Est inférieur à, inférieur ou égal à
>, >= Est supérieur à, supérieur ou égal à
like, not like Vérifie si l’opérande droit est contenu dans la valeur
like, not ilike Même principe que like mais n’est sensible à la casse
Correspond à un modèle valeur. Si la valeur contient un _ (tiret bas)
like, =ilike cela correspond à un seul caractère tandis que % coïncide à plusieurs
caractères
Même principe que = sauf qu’il retourne True si l’opérande droit est
=?
vide
(Source : https://learnopenerp.blogspot.com/2021/08/list-of-search-domain-operators-odoo.html )
Les champs

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

Type Description Exemple


Char Pour les chaines de caractères name = fields.Char(‘Name’)
Text Pour les chaines de caractères note = fields.Text(‘Note’)
multi-lignes
Selection Une liste de sélection state = fields.Selection( [(‘drat’, ‘Draft’),
(‘done’, ‘Done’)], ‘State’)
Html Comme le champs Text mais signature = fields.Html(‘Signature’)
avec les fonctionnalités Html
Binary Pour les binaires comme les image = fields.Binary(‘Image’)
images et documents
Date Pour les dates date_to = fields.Date(‘Date to’)
Datetime Pour les dates avec heures date_end = fields.Datetime(‘Date end’)
Integer Pour les nombres entiers number = fields.Integer(‘Number’)
Float Pour les nombres décimaux qty = fields.Float(‘Quantity’)
Monetary Pour stocker des montants avec price = fields.Monetary(‘Price’)
devise
(Source : www.cybrosys.com/blog/field-types-and-widgets-in-odoo-16)
Les champs relationnels sont des champs qui font références à des enregistrements appartenant
à d’autre Modèle, parfois à lui-même. Il y a trois types de champs relationnels : many2one,
one2many et many2many
- Many2one :
o Un champ Many2one ajoute une colonne dans la table du Modèle en stockant
l’ID de l’enregistrement qui lui est lié.
- One2many :
o C’est l’inverse du champs Many2one. Bien qu’ils soient ajoutés comme tous
les autres champs dans les modèles, il n’a pas de représentation spécifique dans
la base de données.
- Many2many :
o Comme One2many, ce type de champs n’ajoute non plus de colonne dans la
table. Par contre, il va être représenté par une table intermédiaire comportant

- 33 -
deux colonnes qui va stocker les ID des modèles en relation, cela est effectué
automatiquement par Odoo.

Les modèles abstraits

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.

4.1.3 Les vues


Odoo utilise le langage XML pour manipuler les vues. Il fournit plusieurs types de
Vues, notamment :
- List : permet d’afficher la liste des données d’un modèle

Figure 14 : Exemple de vue liste sur Odoo


(Source : Auteur)

- 34 -
- Form : affichage détaillé d’un enregistrement d’un modèle

Figure 15 : Exemple de vue formulaire sur Odoo


(Source : Auteur)

- Graph : affichage des graphes

Figure 16 : Exemple de vue graphe sur Odoo


(Source : Auteur)

- 35 -
- Kanban : affichage des données d’un modèle d’un ticket

Figure 17 : Exemple de vue kanban sur Odoo


(Source : Auteur)
- Calendar : affichage des calendriers

Figure 18 : Exemple de vue calendar sur Odoo


(Source : Auteur)

- 36 -
- Pivot : vue tableau croisé dynamique

Figure 19 : Exemple de vue pivot sur Odoo


(Source : Auteur)
Les vues sont eux aussi des instances d’un modèle (ir.ui.view).Chaque vue est alors
stockée dans la base de données.

La vue List

Voici un exemple de création d’une vue List.


<?xml version="1.0" encoding="utf-8"?>
<record id="customer_view_tree" model="ir.ui.view">
<field name="name">customer_view_tree</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<tree string="_tree">
<field name="name"/>
<field name="customer"/>
<field name="supplier"/>
</tree>
</field>
</record>

La balise record indique qu’on va ajouter un enregistrement dans le modèle spécifié


dans l’attribut model c’est-à-dire ir.ui.view.Tandis que les balises field spécifient le champ et
la valeur à insérer dans le champ.

- 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 :

<record id="customer_view_form" model="ir.ui.view">


<field name="name">customer_view_form</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<form string="customer_form">
<sheet>
<group>
<field name="name"/>
<field name="customer"/>
<field name="supplier"/>
</group>
</sheet>
</form>
</field>
</record>

- 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.

Figure 20 : Logo du Langage Python


(Source : www.liblogo.com/img-logo/)

- 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.

Figure 21 : Logo du langage JavaScript


(Source : https://upload.wikimedia.org/)

- 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.

Figure 22 : Logo de PostgreSQL


(Source : https://cdn.icon-icons.com/)

4.5. Notion de Machine Learning

Le machine Learning (apprentissage automatique en français) est une branche de


l’intelligence artificielle (IA) qui se concentre sur le développement de modèles permettant aux
ordinateurs d’apprendre à partir de données et d’améliorer leurs performances sur des taches
spécifiques sans être explicitement programmés. Le machine Learning repose sur le concept
que les ordinateurs peuvent identifier des modèles dans les données et prendre des décisions
basées sur ces modèles.

- 41 -
Figure 23 : Machine Learning et Intelligence artificielle
(Source : https://user.oc-static.com/)

4.5.1 Apprentissage à partir des données

Le machine Learning consiste à enseigner aux machines à partir de données


d’entrainement. Ces données peuvent inclure des exemples étiquetés (supervisés), des données
non étiquetées (non supervisées) ou une combinaison des deux

4.5.2 Modèles et algorithmes

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.

4.5.3 Types d’apprentissage :

- 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.

4.5.5 Sur apprentissage et sous-apprentissage :


Le sur apprentissage se produit lorsque le modèle s'adapte trop bien aux données
d'entraînement mais ne généralise pas bien sur de nouvelles données. Le sous-apprentissage se
produit lorsque le modèle est trop simple pour capturer les structures des données.

4.5.6 Utilisations courantes

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.

4.5.7 Apprentissage profond (Deep Learning)

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.

Le machine learning est devenu un domaine majeur de la technologie, alimentant de


nombreuses applications dans notre vie quotidienne et dans les entreprises, grâce à sa capacité
à analyser des données, à tirer des conclusions et à prendre des décisions basées sur ces données.
Il continue d'évoluer rapidement avec des avancées constantes dans les algorithmes et les
infrastructures de calcul.

4.6. AutoARIMA

L'AutoARIMA (Auto-AutoRegressive Integrated Moving Average) est un algorithme


d'apprentissage automatique utilisé pour modéliser et prévoir les séries temporelles. Il s'agit
d'une extension de l'ARIMA (AutoRegressive Integrated Moving Average) traditionnel, mais
avec une composante "auto" qui signifie qu'il peut automatiquement sélectionner les ordres (p,
d, q) optimaux pour le modèle ARIMA sans intervention humaine

- 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.

4.6.1 Séries temporelles

Les séries temporelles recouvrent un large éventail de phénomènes de la vie réelle et se


retrouvent dans de nombreux domaines.
Mathématiquement une série temporelle c’est une série de données indexée par le
temps.
Les séries temporelles sont essentielles pour la prévision et la prise de décision dans de
nombreux domaines. Elles sont couramment utilisées pour prédire les ventes, la demande de
produits, les prix des actions, les phénomènes météorologiques, etc. Une analyse appropriée
des séries temporelles peut fournir des informations précieuses pour améliorer la planification
et la gestion.
Une série temporelle peut être décomposée en 3 composantes :
- Une tendance (Tt)
- Une saisonnalité (St)
- Un résidu ou erreur (Rt)
Mathématiquement, on peut donc traduire une série temporelle par Xt=Tt + St + Rt

La tendance

La tendance correspond à un comportement croissant ou décroissant d’une série au


cours du temps. Elle reflète souvent un phénomène de croissance ou de décroissance sur le
long terme.

- 44 -
La saisonnalité

La saisonnalité reflète la présence d’un phénomène périodique qui se répète au long


de la série temporelle.
De nombreuse données présentent des saisonnalités, en particulier les données
météorologique (évolution de la température au cours du temps).
Certaines séries temporelles présentent à la fois une tendance et une saisonnalité, c’est
le cas du trafic aérien mondial. On observe à la fois une croissance du trafic aérien tout en
remarquant une différence forte entre le trafic hivernal et estival.

Figure 24 : Ensemble tendance et saisonnalité série temporelle


(Source : https://datascientest.com/)
Le résidu

Le résidu du modèle correspond à la partie de la série temporelle que la


décomposition ne permet pas d’expliquer. On ne peut pas décomposer intégralement une
série temporelle uniquement selon une tendance et une saisonnalité.
Idéalement le résidu du modèle est stationnaire, c’est à dire que le processus restant
n’évolue pas avec le temps (moyenne et variance constante). Si le résidu de notre série
temporelle n’est pas stationnaire, cela signifie que certaines composantes temporelles ne sont
pas expliquées dans le modèles.

4.6.2 Sélection des ordres manuelle vs automatique

Dans la modélisation ARIMA traditionnelle, vous devrez souvent essayer différentes


combinaisons d'ordres (p, d, q) en fonction de votre connaissance du domaine, de l'analyse des

- 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 automatise cette sélection en examinant de manière exhaustive ou


heuristique un large éventail de combinaisons d'ordres pour trouver la meilleure configuration.

4.6.3 Recherche automatisée

L'AutoARIMA utilise des techniques de recherche automatisée, telles que la recherche


en grille ou l'optimisation bayésienne, pour explorer différentes combinaisons d'ordres.

Il évalue la performance de chaque combinaison en ajustant le modèle ARIMA


correspondant aux données d'entraînement et en utilisant des métriques d'erreur pour comparer
les prévisions du modèle avec les données réelles.

4.6.4 Sélection du modèle optimal

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).

4.7.2 Concept clés

Sktime cherche à fournir un cadre unifié pour de multiples tâches d'apprentissage


automatique de séries temporelles. Cela rend (espérons-le) les fonctionnalités de sktime
intuitives pour les utilisateurs et permet aux développeurs d'étendre le cadre plus facilement.
Mais les données de séries temporelles et les cas d'utilisation scientifique correspondants
peuvent prendre de multiples formes. Il est donc important de disposer d'un ensemble de
concepts et d'une terminologie communs

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

La fonctionnalité de sktime pour chaque tâche d'apprentissage est centrée sur la


fourniture d'un ensemble d'artefacts de code qui correspondent à une interface commune pour
un objectif scientifique donné. Par exemple, sktime comprend une interface commune pour les
classes "forecaster" conçues pour prédire les valeurs futures d'une série temporelle.
L'interface de sktime prend actuellement en charge :
- Classification de séries temporelles où les données de séries temporelles pour
une instance donnée sont utilisées pour prédire une classe cible catégorique.
- Régression de séries temporelles où les données de séries temporelles pour une
instance donnée sont utilisées pour prédire une valeur cible continue.
- Regroupement de séries temporelles : l'objectif est de découvrir des groupes
constitués d'instances ayant des séries temporelles similaires
- Prévision : l'objectif est de prédire les valeurs futures de la série d'entrée.
- L'annotation des séries temporelles qui se concentre sur la détection des
valeurs aberrantes, la détection des anomalies, la détection des points de
changement et la segmentation.

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.

4.7.3 Prise en main rapide

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)

Régression des séries temporelles


from sktime.datasets import load_covid_3month
from sktime.regression.distance_based import
KNeighborsTimeSeriesRegressor
from sklearn.metrics import mean_squared_error

X_train, y_train = load_covid_3month(split="train")


y_train = y_train.astype("float")
X_test, _ = load_covid_3month(split="test")
regressor = KNeighborsTimeSeriesRegressor()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
mean_squared_error(y_test, y_pred)

Regroupement de séries temporelles


from sklearn.model_selection import train_test_split
from sktime.clustering.k_means import TimeSeriesKMeans
from sktime.clustering.utils.plotting._plot_partitions import
plot_cluster_algorithm
from sktime.datasets import load_arrow_head

X, y = load_arrow_head()
X_train, X_test, y_train, y_test = train_test_split(X, y)

k_means = TimeSeriesKMeans(n_clusters=5, init_algorithm="forgy",


metric="dtw")
k_means.fit(X_train)
plot_cluster_algorithm(k_means, X_test, k_means.n_clusters)

- 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

PyCharm est un environnement de développement intégré (abrégé EDI en français ou


en anglais : IDE (Integrated Development Environment)) utilisé pour programmer en Python.
Il offre l'analyse de code, un débogueur graphique, la gestion des tests unitaires,
l'intégration de logiciel de gestion de versions, et supporte le développement web avec Django.
Il est développé par l'entreprise tchèque JetBrains. Il est multiplateforme et fonctionne
sous Windows, Mac OS X et Linux.

Figure 26 : Apercu interface Pycharm


(Source : Auteur)

- 51 -
Figure 27 : Logo Pycharm
(Source : https://upload.wikimedia.org/ )

4.8.1 Configuration d’un serveur Odoo sur Pycharm

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.

Figure 28 : Configuration lanceur serveur Odoo


(Source : Auteur)
Sur ce champs Script path il faut spécifier le chemin du fichier Python odoo-bin pour que
Pycharm puisse l’executer.

- 52 -
Puis cliquer sur OK.

4.8.2 Lancement du serveur Odoo

La nouvelle configuration sera ajoutée à la liste des configurations à exécuter.

Figure 29 : Lanceur serveur Odoo


(Source : Auteur)
Pour lancer le serveur Odoo, il suffit de choisir la configuration Odoo et cliquer sur Run,
c’est-à-dire le bouton.

Figure 30 : Bouton lanceur serveur Odoo


(Source : Auteur)

4.8.3 Jupiter Notebook

Jupyter Notebook est un environnement interactif pour l'exécution de code Python en


mode cellulaire. Il permet de créer des documents interactifs appelés "notebooks" qui
combinent du code, du texte, des graphiques et d'autres éléments.
Jupyter Notebook est largement utilisé pour la science des données, l'apprentissage
automatique, la visualisation de données, l'éducation et la documentation de code.
Il nous a été très utile lors de l’apprentissage des différents modèles pour l’obtention du
modèle le plus optimale.

- 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

Le module présente au total sept pages d’interface :


- Page d’authentification Odoo
- Page d’accueil Odoo
- Page de visualisation prédiction vente
- Page d’analyse vente
- Page pour l’historique des apprentissages
- Page pour la planification des apprentissages
- Page pour la configuration du module de prédiction de vente

Le logo de notre module Odoo est le suivant :

Figure 32 : Logo module prédiction sur vente Odoo


(Source : Auteur)

5.1. Authentification sur Odoo

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.

Dans notre environnement, nous utilisons l’authentification de base et l’utilisateur doit


juste insérer son Courriel ainsi que son mot de passe dans la page d’authentification.
L’authentification permet d’identifier l’utilisateur interne sur Odoo pouvant lui permettre
d’accéder au back Office.

- 56 -
Figure 33 : Authentification sur Odoo
(Source : Auteur)

5.2. Accueil sur Odoo

Après l’authentification, l’utilisateur accède à l’interface principale d’Odoo, c’est-à-dire


l’interface avec la liste des applications installées et auxquels l’utilisateur accès.

Figure 34 : Page d’accueil Odoo


(Source : Auteur)

- 57 -
Dans notre cas, le module « prédiction de vente » est déjà installé

Figure 35 : Information simple module Odoo


(Source : Auteur)
Dans le cas d’une nouvelle installation, aller dans la liste des applications et rechercher
« forecasting », puis installer

Figure 36 : Liste module Odoo


(Source : Auteur)

Figure 37 : Bouton d’installation module Odoo


(Source : Auteur)

5.3. Visualisation de la prédiction de vente

Sélectionner le module « Prédiction de vente » dans l’accueil Odoo

Figure 38 : Module Prédiction de vente parmi les autres


(Source : Auteur)

- 58 -
A l’ouverture du module, on peut déjà voir par défaut le graphe de la prédiction de vente par
jour.

Figure 39 : Graphe de résultat de la prédiction


(Source : Auteur)
Nous avons utilisé les graphes dans notre module pour visualiser les données de la prédiction
pour faciliter la lecture des valeurs réel (en vert) par rapport à la valeur prédite (en bleu), et
aussi pour être le plus proche des fonctionnalités natifs d’Odoo.

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 :

Figure 40 : Bouton filtre chronologique de la prédiction


(Source : Auteur)

- 59 -
Prenons exemple en appuyant sur le bouton « MOIS », on obtient le graphe qui suit :

Figure 41 : Résultat de la prédiction en fonction du mois


(Source : Auteur)
On peut détailler les informations sur le graphe comme suit :
- Axe des abscisses (x) : Indice chronologique en fonction du temps (jour, semaine, mois,
année). On prédit un pas vers le futur (couleur bleu), c’est-à-dire que si on fait la
prédiction en fonction du jour, le jour suivant la dernière vente effectué est prédite ; si
on fait la prédiction en fonction de la semaine, la semaine qui suit la dernière vente est
prédite et ainsi de suite pour le mois et l’année.
- Axe des ordonnées (y) : Représente les valeurs réelles et prédite en fonction de la
variable d’apprentissages. Sur le graphe ci-dessus, la variable d’apprentissage est « Le
prix total de vente », il est possible de changer cette variable dans la section paramétrage
de notre module.

5.4. L’analyse de vente

La vue est accessible en appuyant sur le bouton « Analyse de vente »

Figure 42 : Menu analyse de vente


(Source : Auteur)
Cette vue est issue du module « vente » natif d’odoo.

- 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.

Figure 43 : Filtre et groupe article par quantité commandée


(Source : Auteur)
Dans la vue ci-dessous, après avoir fait une mesure sur la « quantité commandée » et
après avoir regrouper par « article » par exemple on peut voir les articles les plus commandés
dans le vente d’odoo.

Figure 44 : Graphe article le plus commandé


(Source : Auteur)

- 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.

5.5. Historique des apprentissages

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 »

Figure 45 : Menu historiques d’apprentissage


(Source : Auteur)

5.5.1 La vue liste


On peut voir la liste des historiques d’apprentissage effectués avec la date de
l’apprentissage, le statut de chaque type de chronologie ainsi que les éventuelles erreurs.

Figure 46 : Liste des historiques d’apprentissage


(Source : Auteur)

- 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 »

Figure 47 : Vue formulaire d’un historique d’apprentissage


(Source : Auteur)

5.6. La planification des apprentissages

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.

Figure 48 : Menu planification des apprentissages


(Source : Auteur)

- 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

Figure 49 : Vue formulaire pour la planification des apprentissages


(Source : Auteur)

5.7. La configuration de module de prédiction de vente

Pour le paramétrage du module en question, nous avons utilisé le modèle


« res.config.settings » d’odoo.
Le menu pour y accéder est le suivant :

Figure 50 : Menu Configuration du module


(Source : Auteur)

- 64 -
Dans cette section, on a le paramétrage de l’apprentissage et celui du modèle statistique
utilisé pour l’apprentissage « AutoARIMA »

5.7.1 Paramétrage de l’apprentissage

Figure 51 : Paramètre de l’apprentissage


(Source : Auteur)
- Le bouton à gauche pour lancer manuellement l’apprentissage
- A droite pour choisir la variable utilisée dans l’apprentissage, par défaut « le Prix total »
mais on peut aussi choisir d’autre valeur.

Figure 52 : Sélection variable d’apprentissage


(Source : Auteur)

5.7.2 Paramétrage du modèle AutoARIMA

AutoARIMA possède plusieurs paramètres pour chaque type et comportement de série


temporelle, ces paramètres sont modifiables pour réajuster et pour optimiser la performance de
prédiction de notre modèle.
Ici, les paramètres modifiables sont :
- seasonal (Boolean): S'il faut ajuster un ARIMA saisonnier. La valeur par défaut
est True. Notez que si seasonal est True et sp == 1, seasonal sera mis à False.
- stationary (Boolean) : Si la série temporelle est stationnaire et si d doit être
fixé à zéro.
- sp : La période pour la différenciation saisonnière, sp, fait référence au nombre
de périodes dans chaque saison. Par exemple, sp est égal à 4 pour des données

- 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.

Voici un extrait de vue pour le paramétrage du modèle AutoARIMA

Figure 53 : Paramétrage du modèle d’apprentissage


(Source : Auteur)

- 67 -
Extraits de code

Le projet étant un module odoo, les codes sont répartis en plusieurs niveaux, nous allons
en citer quelques extraits.

6.1. Les modèles

6.1.1 Historiques d’apprentissage


# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from ..fields import JobSerialized

class SalePredictionModel(models.Model):
_name = 'sale.prediction.model'
_description = "Machine learning model"
_order = 'prediction_date'

prediction_date = fields.Datetime(string="Prediction date")


prediction_day_view = fields.Text("Prediction Day",
compute="_compute_predicted_view")
prediction_week_view = fields.Text("Prediction Week",
compute="_compute_predicted_view")
prediction_month_view = fields.Text("Prediction Month",
compute="_compute_predicted_view")
prediction_year_view = fields.Text("Prediction Year",
compute="_compute_predicted_view")
prediction_day_status = fields.Selection([('predicted', 'Predicted'),
('none', 'None')],

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

PREDICTION_KEY = ['predict_day', 'predict_week', 'predict_month',


'predict_year']

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})

def _sanitize_data(self, df, periode=''):


df = df.dropna()
if periode == "df_day":
df = df.resample('D').sum()
elif periode == "df_week":

- 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

def _get_forecasting_horizon(self, df, periode=''):


prediction_index = None
if periode == "df_day":
prediction_index = df[-1:].index.shift(1, freq='D')
elif periode == "df_week":
prediction_index = df[-1:].index.shift(1, freq='W')
elif periode == "df_month":
prediction_index = df[-1:].index.shift(1, freq='M')
elif periode == "df_year":
prediction_index = df[-1:].index.shift(1, freq='Y')
fh = ForecastingHorizon(prediction_index, is_relative=False)
return fh

def _model_to_base64(self, forecaster_model):


filename = 'autoarima_model.pkl'
joblib.dump(forecaster_model, filename)
base64_model = base64.b64encode(open(filename, "rb").read())
decoded_model = base64.b64decode(base64_model)
loaded_model = joblib.load(BytesIO(decoded_model))
self.env['sale.prediction.model'].create(
{'prediction_date': datetime.datetime.now(),
'predicted_model_day': base64_model})

6.2. Les Vues

6.2.1 Historiques d’apprentissage


<odoo>
<record id="sale_prediction_model_view_tree" model="ir.ui.view">
<field name="name">sale.prediction.model.view.tree</field>
<field name="model">sale.prediction.model</field>
<field name="arch" type="xml">
<tree create="false" edit="false">
<field name="prediction_date" string="Date de l'apprentissage"/>
<field name="training_column" string="Valeur à prédire"/>
<field name="prediction_day_status" widget="badge" decoration-
warning="prediction_day_status == 'none'"
decoration-success="prediction_day_status == 'predicted'"
string="Statut prédiction jour"/>
<field name="prediction_week_status" widget="badge" decoration-
warning="prediction_week_status == 'none'"
decoration-success="prediction_week_status == 'predicted'"
string="Statut prédiction semaine"/>
<field name="prediction_month_status" widget="badge" decoration-
warning="prediction_month_status == 'none'"
decoration-success="prediction_month_status == 'predicted'"
string="Statut prédiction mois"/>
<field name="prediction_year_status" widget="badge" decoration-
warning="prediction_year_status == 'none'"
decoration-success="prediction_year_status == 'predicted'"
string="Statut prédiction année"/>

- 72 -
<field name="error" string="Erreur d'apprentissage"/>
</tree>
</field>
</record>

<record id="sale_prediction_model_view_form" model="ir.ui.view">


<field name="name">sale.prediction.model.view.form</field>
<field name="model">sale.prediction.model</field>
<field name="arch" type="xml">
<form create="false" edit="false">
<sheet>
<group>
<group>
<field name="prediction_date" string="Date de
l'apprentissage"/>
<field name="training_column" string="Valeur à prédire"/>
</group>
<group>
<field name="error" string="Erreur d'apprentissage"/>
</group>
</group>
<notebook>
<page string="Prédiction en Jour">
<field name="prediction_day_view"/>
</page>
<page string="Prédiction en Semaine">
<field name="prediction_week_view"/>
</page>
<page string="Prédiction en Mois">
<field name="prediction_month_view"/>
</page>
<page string="Prédiction en Année">
<field name="prediction_year_view"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- action -->
<record id="sale_prediction_report_action" model="ir.actions.act_window">
<field name="name">Graphe prédiction de vente</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.prediction.report</field>
<field name="view_mode">forecast</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>

<record id="sale_prediction_model_action" model="ir.actions.act_window">

- 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

7.1. Analyse de l’existant

7.1.1 Analyse des besoins

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.

7.1.2 Intérêt d’utilisation D’Odoo

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.

Digramme de cas d’utilisation

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.

Figure 54 : Diagramme de cas d’utilisation


(Source : Auteur)
Diagramme d’activité

Le diagramme d'activité est un diagramme comportemental d'UML, permettant de


représenter le déclenchement d'événements en fonction des états du système et de modéliser
son comportement (multiprocessus).
Nous allons voir ci-dessous le diagramme d’activité afin de mieux visualiser le
processus

- 79 -
Figure 55 : Diagramme d’activité
(Source : Auteur)
Diagramme de séquence

Le diagramme de séquence permet de restructurer le diagramme précèdent en mettant


en évidence l’ordre des actions qu’un objet ou un acteur effectue sur un axe de temps.

Figure 56 : Diagramme de séquence


(Source : Auteur)
Diagramme de classe

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

Le module issu de ce projet comportera deux parties distinctes : la partie prédiction,


apprentissage AutoARIMA et la partie Back-office sur Odoo. Dans la partie apprentissage et
prédiction, nous pourrons voir l’aspect technique et l’essence même de ce projet. Tandis que
dans la partie back-office Odoo nous trouverons les fonctionnalités utilisateur qui permettront
de visualiser et de paramétrer le module.
Le module en question a été conçu pour la version 15 d’Odoo avec quelques
dépendances Python. Bien qu’il soit immédiatement opérationnel ; il nécessite le socle Odoo
pour fonctionner. Nous allons détailler dans les rubriques suivants la mise en place de
l’environnement Odoo.

8.1. Mise en place de Odoo 15

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.

8.2. Installation de Python

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

Puis, procéder à l’installation de PostgreSQL 13. Ajouter le répertoire bin de


PostgreSQL (par défaut : C: \ Program Files \ PostgreSQL \ 13 \ bin) au PATH de variables
d’environnement. Puis, créer un utilisateur postgres avec un mot de passe à l’aide de l’interface
utilisateur :
- Ouvrir pgAdmin 4
- Double-cliquer sur le serveur pour créer une connexion
- Sélectionner Édition Nouvel objet ‣ Nouveau rôle de connexion
- Entrer le nom d’utilisateur dans le champ Nom du rôle (par exemple, odoo)
- Ouvrir l'onglet Définition et entrer le mot de passe (par exemple, odoo)
- Cliquer sur OK.
L'utilisateur et le mot de passe doivent être transmis à Odoo à l'aide des options -w et -r ou du
fichier de configuration.

8.4. Installation des dépendances Python

Sous Windows, il faut installer certaines dépendances manuellement, peaufiner le


fichier conditions.txt. Puis, exécuter pip pour installer les dépendances restantes.

8.4.1 Dépendances Odoo


Par défaut sur odoo , les dépendances python sont dans un fichier requirements.txt,
pour installer ces dépendances, il suffit de lancer la commande suivante dans le répertoire
Odoo :

Figure 58 : Installation des dépendances odoo


(Source : Auteur)

8.4.2 Dépendances SKTIME

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)

8.5. Création d’une nouvelle base de données sur Odoo

Figure 60 : Vue création base de données Odoo


(Source : Auteur)
Pour initialiser cette base de données avec le schéma de données Odoo, exécuter Odoo
sur la base de données vide en utilisant l'option –d. Cela prendra quelques minutes pour
initialiser une base de données et se terminera par un message de journal INFO : « Modules
chargés ». Ensuite, le serveur sera prêt à écouter les demandes du client.

- 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

9.1. Définition de la qualité

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.

9.2. L’importance du projet

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.

9.3. Qualité technique du projet

9.3.1 Qualité externe


La qualité externe est la qualité visuelle de l’interface ainsi que sa facilité d’utilisation ;
cela inclut le design général d’Odoo.

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

La qualité interne est la capacité du produit à assumer sa fonction principale et son


niveau de performance. Cette qualité peut être indiquée par la capacité fonctionnelle, la fiabilité,
la performance, la maintenabilité, la portabilité.

La fonction principale du module, qui est la prédiction de vente est opérationnelle.


La capacité à traiter les données et la performance de l’apprentissage sont satisfaites.
Concernant la performance de l’ensemble du module, lest traitements de données sont
conçu de façon optimale pour ne pas corrompre les taches en parallèles dans l’environnement
Odoo.L’utilisation de l’architecture MVC : Model View Controller (Modèle Vue Contrôleur)
dans le natif Odoo rend encore plus fluide le module au moment de la visualisation des données
prédites.

9.3.3 Futures améliorations

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

L’application permet de prédire la future vente et d’optimiser la gestion de stock dans


une entreprise commerciale. De plus avec la possibilité qu’offre odoo , il est aussi possible de
planifier l’apprentissage des modèles afin de mettre à jour la prédiction. A présent, le module
est en phase de qualification interne et sera proposé d’ici là aux clients en mode garantie.

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

2018 Licence en Informatique et Télécommunications


 Parcours : Électronique, Systèmes Informatiques et Intelligence
Artificielle, à l’ISPM - Institut Supérieur Polytechnique de
Madagascar

2015 Baccalauréat (Madagascar) – Série D

- 89 -
Expérience professionnelle
- Depuis avril 2021 : Etech : Développeur Odoo

- 2021 : STEM4GOOD : Mentoring,Conseiller

- 2020 : HAMAC Agence Marketing : Concepteur développeur de


système électronique
Expérience
professionnelles - 2018 : TELMA Madagascar : Création d’une application de recherche de
statut de message via ElasticSearch

- 2017 : TechZara : Concours de création application

- 2017 : Entreprise DFY : Concepteur développeur de système


électronique

- 2020 : Hijery : Outil d’aide à la circulation des personnes avec un


handicap visuel
- 2019 : Solfa Generator : Génération Solfa d’un instrument joué
Projet de - 2018 : Fanorona Électronique : Plateforme électronique avec intelligence
recherche à artificielle pour le jeu Fanorona – 1er Prix (vote des enseignants)
l’ISPM - 2017 : Intelligent Device Control : Système et application Android de
gestion des appareils d’une maison
- 2016 : Wireless Light Control : Système et application Android de
gestion des lumières d’une maison – 1er Prix (vote du public)

- Mini projet 2018 : Logiciel de sécurisation de fichier Windows +


Application Web pour partage de fichier (Zara-ao)
- Site web : www.afham.mg
Expérience - Participation au Mini-Hackathon TechZara 2017
personnelle - Réalisation de circuit de contrôle et application Android (Entreprise
DFY)
- Circuit électronique + Application Android pour contrôle à distance
(voiture téléguidé, maison, portail,…)

- 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,…)

- Microsoft Office : Word, PowerPoint


Logiciels - Adobe Photoshop : Moyen
- ISIS PROTEUS : Moyen

Loisirs
- Jeux vidéo, billard
- Animation japonaise et Film
- Sport : Musculation
- Fan des sports mécaniques

- 91 -
BIBLIOGRAPHIE

A - Cours dispensés à l’ISPM :


[1] ALPHONSE LAZA Rijamamy, Algèbres Linéaires (Année universitaire 2015 - 2016)
[2] ALPHONSE LAZA Rijamamy, Probabilité - Statistiques (Année universitaire 2015 -
2016)
[3] ANDRIAMIFIDISOA Ramamonjy, Cryptographie et Codage (Année universitaire
2018 – 2019)
[4] ANDRIANTSARAFARA Bruno, Gestion des processus Informatique (Année
universitaire 2018 - 2019)
[5] RABOANARY Heriniaina Andry, Algorithmes Avancées (Année universitaire 2018
-2019)
[6] RABOANARY Julien Amédée, Intelligence Artificielle (Année universitaire 2020 -
2021)
[7] RABOANARY NARINDRA Lova Haingotiana, Architecture Backend (Année
universitaire 2020 - 2021)
[8] RABOANARY Roland, Réseaux de Neurones Artificielle (Année universitaire 2018 -
2019)
[9] RABOANARY Tantely Mahefatiana, Technologies web (Année universitaire 2017 -
2018)
[10] RAJAONERA Christiano, Administration Linux (Année universitaire 2020 - 2021)
[11] RANDRIANOROVELO Michel André, Structure des ordinateurs (Année
universitaire 2015 - 2016)
[12] RASANDIMANANA Tanjona Tsihoarana, Informatiques Scientifiques (Année
universitaire 2015 - 2016)

- 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 -

Partie II : Matériels et méthodes ..................................................................................... - 28 -


Outils et Langages Utilisés .......................................................................... - 29 -
4.1. Odoo ............................................................................................................................ - 29 -
4.1.1 Architecture d’Odoo................................................................................................ - 29 -
4.1.2 ORM ........................................................................................................................ - 30 -
4.1.3 Les vues ................................................................................................................... - 34 -
4.2. Le langage Python ....................................................................................................... - 39 -
4.3. Le langage JavaScript .................................................................................................. - 40 -
4.4. PostgreSQL.................................................................................................................. - 41 -
4.5. Notion de Machine Learning ....................................................................................... - 41 -
4.5.1 Apprentissage à partir des données ......................................................................... - 42 -
4.5.2 Modèles et algorithmes ........................................................................................... - 42 -
4.5.3 Types d’apprentissage : ........................................................................................... - 42 -
4.5.4 Evaluation des modèles ........................................................................................... - 43 -
4.5.5 Sur apprentissage et sous-apprentissage : ............................................................... - 43 -
4.5.6 Utilisations courantes .............................................................................................. - 43 -
4.5.7 Apprentissage profond (Deep Learning) ................................................................. - 43 -
4.6. AutoARIMA ................................................................................................................ - 43 -
4.6.1 Séries temporelles ................................................................................................... - 44 -
4.6.2 Sélection des ordres manuelle vs automatique ........................................................ - 45 -
4.6.3 Recherche automatisée ............................................................................................ - 46 -
4.6.4 Sélection du modèle optimal ................................................................................... - 46 -
4.6.5 Prévision .................................................................................................................. - 46 -
4.7. SKTIME ...................................................................................................................... - 46 -
4.7.1 Installation ............................................................................................................... - 47 -
4.7.2 Concept clés ............................................................................................................ - 47 -
4.7.3 Prise en main rapide ................................................................................................ - 49 -
4.8. Pycharm ....................................................................................................................... - 51 -
4.8.1 Configuration d’un serveur Odoo sur Pycharm ...................................................... - 52 -
4.8.2 Lancement du serveur Odoo ................................................................................... - 53 -
4.8.3 Jupiter Notebook ..................................................................................................... - 53 -

Partie III : Résultats .......................................................................................................... - 55 -


Interfaces et fonctionnement ....................................................................... - 56 -
5.1. Authentification sur Odoo ........................................................................................... - 56 -
5.2. Accueil sur Odoo ......................................................................................................... - 57 -

- 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 -

Partie IV : Discussion ........................................................................................................ - 77 -


Analyse et conception UML........................................................................ - 78 -
7.1. Analyse de l’existant ................................................................................................... - 78 -
7.1.1 Analyse des besoins ................................................................................................ - 78 -
7.1.2 Intérêt d’utilisation D’Odoo .................................................................................... - 78 -
7.1.3 Modélisation du système ......................................................................................... - 79 -
Environnement de développement .............................................................. - 82 -
8.1. Mise en place de Odoo 15 ........................................................................................... - 82 -
8.2. Installation de Python .................................................................................................. - 82 -
8.3. Installation de PostgreSQL .......................................................................................... - 83 -
8.4. Installation des dépendances Python ........................................................................... - 83 -
8.4.1 Dépendances Odoo .................................................................................................. - 83 -
8.4.2 Dépendances SKTIME ............................................................................................ - 83 -
8.5. Création d’une nouvelle base de données sur Odoo .................................................... - 84 -
Approche qualitative du projet .................................................................... - 86 -
9.1. Définition de la qualité ................................................................................................ - 86 -
9.2. L’importance du projet ................................................................................................ - 86 -
9.3. Qualité technique du projet.......................................................................................... - 86 -
9.3.1 Qualité externe ........................................................................................................ - 86 -
9.3.2 Qualité interne ......................................................................................................... - 87 -
9.3.3 Futures améliorations .............................................................................................. - 87 -

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

Theme: Odoo sales prediction

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.

Keywords : ERP, AutoARIMA, Time series, Python, SKTIME, PostgreSQL


Number of pages : 111
Number of figures : 60
Number of tables : 05

- 98 -
INSTITUT SUPÉRIEUR POLYTECHNIQUE DE MADAGASCAR

Thème : Prédiction sur vente Odoo

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.

Mots-clés : ERP, AutoARIMA, Série temporelle, Python, SKTIME, PostgreSQL


Nombre de pages : 111
Nombre de figures : 60
Nombre de tableaux : 05

- 99 -

Vous aimerez peut-être aussi