tutorials

Odoo Business Intelligence : développez vos tableaux de bords

Published on 23 September 2018

Bienvenue dans ce tutoriel sur “Comment mettre en œuvre des tableaux de bord“. Dans ce tutoriel nous allons apprendre comment partir de zéro jusqu’à l’obtention d’un tableau de bord.

Le contexte

Dans les projets de mise en œuvre des projets ERP Odoo, les reportings sont souvent implémentés à la fin par ce que lorsque le système a déjà les données les restituer n’est plus un problème. Cependant vu le  nombre pléthorique de rapports qui font souvent l’objet des requêtes clients, on se confronte donc à une problématique : faire plusieurs rapports basés sur presque les  mêmes tables donc juste certaines colonnes les diffèrent les uns des autres ; en plus pour la plupart des cas certains de ces  rapports sont souvent utilisés pour des analyses hors système pouvant permettre de prendre les décisions au sein des organisations.

Odoo à partir de sa version 8 a optimisé cette fonctionnalité afin de palier à ce problème.

Comme pré requis à ce tutoriel

  • Le langage python (niveau basique)
  • SGBD PostgreSQL (niveau moyen)
  • Langage XML (moyen)
  • Nouvelle API Open Object (niveau basique)

Nous rappelons que vous pouvez développer  un module odoo juste pour les tableaux de bords mais dans notre exemple nous allons supposer que vous avez déjà un module odoo  auquel vous aimerez ajouter votre tableau de bord.

Nous devons créer un répertoire « report »  et trois fichiers  à l’intérieur de ce dossier « report » :

  • Un fichier nom_module_report.py : c’est à l’intérieur de ce fichier que nous allons définir l’objet de notre tableau de bord odoo, les différents champs, et les requêtes sql.
  • Le fichier nom_module_view_report.xml : c’est à l’intérieur de ce fichier que nous allons définir les différentes formes graphiques (graphe, liste, etc.) sous les quels notre tableau de bord odoo apparaitra.
  • Le fichier __init__.py dans lequel nous allons importer notre fichier (nom_module_report.py)

Rendus à cette étape notre répertoire « report » existe déjà avec ses trois fichiers (nom_module_report.py, nom_module_view_report.xml et __init__.py), avant de finir avec le squelette de notre tableau de bord odoo il nous restera deux choses à savoir :

  • L’appel de notre répertoire « report » dans le fichier __init__.py principal du module.
  • L’appel de notre fichier nom_module_view_report.xml dans le fichier __openerp__.py .

Oups la première étape est achevée, nous avons déjà terminé le squelette de notre tableau de bord odoo.

Voici l’apparence de notre module

Nous voyons bien notre dossier report, le fichier __init__.py dans lequel nous avons importé le répertoire « report », le fichier __openerp__.py dans lequel nous avons importé le fichier « nom_module_view.xml » et les autres dossiers complémentaires du module à savoir nom_module.py qui gère les objets du module et le fichier nom_module_view.xml qui gère les vues du module.

Dans le cadre de ce tutoriel ce sont les fichiers contenus dans le répertoire « report » qui nous intéresse.

Voici l’apparence du répertoire « report »

Nous voyons bien nos trois fichiers initialement créés, le fichier nom_module_report.py est le fichier à l’intérieur duquel nous allons définir l’objet de notre tableau de bord odoo, les différents champs qui nous permettront d’effectuer les analyses et les requêtes SQL qui seront envoyées à la base de données. Ensuite le fichier nom_module_report_view.xml à l’intérieur duquel seront définies toutes les formes graphiques de notre tableau de bord odoo. Enfin nous avons notre fichier __init__.py à l’intérieur duquel nous allons appeler le fichier nom_module_report.py

Actuellement nous allons passer à la deuxième partie de ce tutoriel qui consiste à éditer nos fichiers nom_module_report.py et nom_module_report_view.xml.

  1. Le fichier nom_module_report.py

# -*- coding: utf-8 -*-

from openerp import tools

from openerp import models, fields, api 

class nommodulereport(models.Model):

     “”” definition du nom du modele de notre tableau de bord odoo”””

    _name = “nom.module.report”   

    “”” Description de notre objet”””

    _description = “Nom module”        

    “”” Definition des differents champs qui qui nous permettront d effectuer les analyses “””

    fields_1 = fields.Date(readonly=True)

    fields_2 = fields.Many2one(‘objet_2′, string=’FIELD 2’, readonly=True)

    fields_3 = fields.Float(string=’FIELD 3′, readonly=True)

    fields_4 = fields.Char(string=’FIELD 4′, readonly=True)

    fields_5 = fields.Many2one(‘objet_5′, string=’FIELD 5’, readonly=True)         

    “””Definition de  L’ordre de rangement des enregistrements/données sur le tableau de bord dans ce cas par ordre decroissant de fields_1″””

     _order = ‘fields_1 desc’  

      “”” Creation de la requete sql qui nous permettra de creer une vue sql qui stockera les données de la requete et les affichera lorsqu’on cliquera sur le menu

                du tableau de bord”””

      def init(self, cr):

          tools.sql.drop_view_if_exists(cr, ‘nom_module_report’)

          cr.execute(“””  CREATE view nom_module_report as

                SELECT

                               t.fields_1,

                               t.fields_2,

                               t.fields_3,

                               t.fields_4,

                               t.fields_5

                 FROM nom_module t

                               GROUP BY

                                               t.fields_1,

                                               t.fields_2,

                                               t.fields_3,

                                               t.fields_4,

                                               t.fields_5

                                               “””)

Commentaires:

Notre vue SQL a été définit  sur  la base de la requête « select » dans une seule table, je voudrai vous rassurer qu’il est possible de définir une vue sql pointant sur plusieurs tables, y compris les jointures ; le tout dépend de ce que vous voulez obtenir.

  1. Le fichier nom_module_report_view.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<openerp>

<data>

<!– definition de la vue graph qui nous permet de definir les champs en ligne, colonne et de type valeur –>

    <record id=”view_nom_module_report_graph” model=”ir.ui.view”>

         <field name=”name”>nom.module.report.graph</field>

         <field name=”model”>nom.module.report</field>

         <field name=”arch” type=”xml”>

             <graph string=”Titre de la vue graphe” type=”pivot”>

                 <field name=”fields_2″ type=”row”/>

                 <field name=”fields_5″ type=”col”/>

                 <field name=”fields_3″ type=”measure”/>

             </graph>

         </field>

    </record>

<!–  defintion des vues filtres qui permettent d’obetenir des favoris sur les filtres –>

    <record id=”filter_fields_2″ model=”ir.filters”>

        <field name=”name”>Par Fields 2</field>

        <field name=”model_id”>nom.module.report</field>

        <field name=”domain”>[]</field>

        <field name=”context”>{‘group_by’: [‘fields_2’]}</field>

    </record>

 <record id=”filter_fields_5″ model=”ir.filters”>

        <field name=”name”>Par Fields 5</field>

        <field name=”model_id”>nom.module.report</field>

        <field name=”domain”>[]</field>

        <field name=”context”>{‘group_by’: [‘fields_5’]}</field>

    </record>

 <!–  definiton de la vue recherche qui nous permettra d’afficher tous les champs avec les differentes options possibles en fonction des filtres –>

    <record id=”view_nom_module_report_search” model=”ir.ui.view”>

        <field name=”name”>nom.module.report.search</field>

        <field name=”model”>nom.module.report</field>

        <field name=”arch” type=”xml”>

            <search string=”Titre de la vue recherche”>

                <field name=”fields_1″/>

                                                               <field name=”fields_3″/>    

                                                               <field name=”fields_4″/>

                <group expand=”1″ string=”Group By”>

                    <filter string=”Fields 2″ name=”fields_2″ context=”{‘group_by’:’fields_2′}”/>

                                                                              <filter string=”Fields 5″ name=”fields_5″ context=”{‘group_by’:’fields_5′}”/>

                </group>

            </search>

        </field>

    </record>

<!–          definition de l’action qui nous permettra d appeler notre tableau de bord à partir d’un menu –>

    <record id=”action_nom_module_report” model=”ir.actions.act_window”>

        <field name=”name”>Titre de l action</field>

        <field name=”res_model”>nom.module.report</field>

        <field name=”view_type”>form</field>

        <field name=”view_mode”>graph</field>

        <field name=”context”>{‘search_default_current’:1}</field>

        <field name=”search_view_id” ref=”view_nom_module_report_search”/>

        <field name=”help”>Texte indicatif pour l utilisation du tableau de bord odoo de nom_module_report</field>

    </record>

</data>

</openerp>

Commentaires

Dans notre fichier nous avons créé quatre vues :

  • Une vue de type graphe

La vue graphe nous permet de décrire le tableau de bord odoo. Tout tableau de bord odoo est caractérisé par les lignes, les colonnes et les valeurs. Lors de la navigation graphique du tableau de bord vous avez le choix de definir les colonnes et les lignes mais odoo vous propose de le faire dans le code afin que c’apparaisse automatiquement à vous de voir.

Dans notre exemple :

Fields_2 est définit comme ligne et field_5 comme colonne, fields_3 est définit comme valeur. Par défaut tous les champs de types integer, float sont définis comme valeur.

<field name=”fields_2″ type=”row”/>

                 <field name=”fields_5″ type=”col”/>

                 <field name=”fields_3″ type=”measure”/>

  • Une vue de type filtre pour gérer les favoris

Tous les champs définis dans cette vue seront affichés comme favoris sur l’interface du tableau de bord odoo

  • Une vue de type search pour afficher l’ensemble du tableau de bord odoo

Ici nous affichons généralement tous les champs, il faut remarquer que l’attribut « Group By » est utilisé pour les champs qui feront l’objet de regroupement sur le tableau de bord. Tous les champs déclarés à l’intérieur de cet attribut seront précédés de l’attribut « Group By » graphiquement.

  • Une vue de type action qui sera liée au menu qui affichera notre tableau de bord

 

 

Merci nous sommes ouverts à toute remarque permettant d’améliorer ce travail.

 

Leave a comment


Articles in relation