# Manuel de NOALYSS

## Chapitre 44. Développement de widget

### 44.1. Définition

Un widget est un élément sur le tableau de bord qui affiche le suivi, des rapports, un agenda,…​

### 44.2. Développement

le nom code du widget , est toujours le même que celui du sous-répertoire dans noalyss/include/widget, que le nom du fichier principal et aussi, le nom de la CLASS.

| ce nom ne peut pas contenir d’autres caractères que des lettres et des soulignés, de préférence toujours en minuscule.

Par exemple: le widget avec le code event (voir table widget_dashboard) est le nom du sous-répertoire de noalyss/include/widget

| Les widgets doivent fonctionner dans le namespace `Noalyss/Widget`

### 44.3. Installation

Création d’un fichier appelé "install.php" dans le sous-répertoire noalyss/include/widget qui sera exécuté si le widget n’est pas encore dans la base de données. Quand l’utilisateur est sur le tableau de bord, qu’il clique sur "Personnaliser" puis "Ajouter", le programme va scanner le répertoire noalyss/include/widget à la recherche de fichiers install.php, il va vérifier que chaque fichier est dans la base de données ou l’insère s’il n’y est pas.

Le code du fichier install.php est simplement d’insérer le widget dans la base de données et éventuellement peut initialiser d’autres choses.

structure table WIDGET_DASHBOARD

  Contient tous les widgets ,

Colonne | Type de données | Description
--- | --- | ---
wd_id | int | clef primaire (valeur automatique)
wd_code | texte | code du widget (doit être unique , pas de souligné ou de caractères interdit, ce sera aussi le nom de la classe )
wd_description | texte | description du widget , ce qu’il fait
wd_parameter | int | égal à 0, s’il n’y a pas de paramètre, à 1 s’il existe un paramètre (voir Paramètre)

Exemple

    <?php
    global $cn;

    $cn->exec_sql("insert into widget_dashboard (wd_code,wd_description,wd_parameter,wd_name) values ($1,$2,$3,$4)",
    array (
        'event'
        ,'Affiche les 10 actions en retards, celles à venir , les 10 prochaines factures client ou fournisseurs, ou celles en retard '
        ,1
        ,'10 actions ou factures'
        )
    );

### 44.4. Ajax

Tous les appels Ajax appellent "html/ajax_misc.php" , la requête doit contenir :

- la variable op : "widget"

- la variable w : chaîne qui est le code du widget (nom du sous-répertoire de include/widget)

le fichier Ajax.php du sous-répertoire NOALYSS_INCLUDE/widget/(w)/Ajax.php sera appelé

### 44.5. Application

La classe s’appelle toujours "nom-du-widget.php" , elle est dérivée de widget et doit avoir les fonctions

- display : affichage du widget

- input : affichage de la description et permet son activation (visible dans la box )

- input-parameter : si des paramètres doivent être sauvées, les paramètres sont par utilisateur et par widget activés,

- display_parameter

#### 44.5.1. Paramètres

Certains widgets peuvent être paramétrés, et il est possible d’ajouter plusieurs fois le même widget

Exemple mini-report : choix du mini-report à afficher,

Pour cela, il faut ajouter certaines fonctions :

##### input_parameter() : création du FORM

création d’un FORM dont le DOMID sera le code widget (wd_code) suivi de "_param"

exemple pour mini_report, on utilise la fonction `Widget→make_form` , qui enveloppe le code transmis dans une balise FORM, construisant ainsi le code HTML d’un FORM qui sera envoyé correctement en Ajax. Les paramètres passés seront sauvés dans `user_widget` et pourront être récupérés dans un tableau associatif avec `Widget→get_parameter`.

        function input_parameter() {

            $select=new \ISelect('simple_report');
            $select->value=$this->db->make_array("select fr_id, fr_label from form_definition order by 2");
            $this->make_form($select->input());
        }

##### display_parameter : affichage des paramètres

Les paramètres sont toujours sauvés "brut" , comme une chaîne URL par la fonction `Widget→make_form()`, il faut donc pouvoir l’afficher, en la travaillant avec `parse_str`, pour cela il faut appeler `Widget→get_parameter()`, le résultat doit être dans un SPAN avec la classe "widget_param".

Exemple pour mini_report

        function display_parameter() {
            $aParam=$this->get_parameter();
            $name = $this->db->get_value("select fr_label from form_definition where fr_id=$1",[$aParam['simple_report']]);
            echo " ";
            echo span(_("Rapport") ." ".h($name),' class="widget_param"');

        }

(1) renvoie les paramètres dans un tableau associatif

#### 44.5.2. function display

Toujours commencer par un DIV (id=code_widget+uw_id), Widget::open_div et Widget::close_div

Puis avoir un titre et un bouton "Agrandissement", avec la fonction Widget::button_zoom ou utiliser la fonction `Widget→title()`

Example

    echo HtmlInput::title_box('titre du widget', uniqid(), 'custom', $this->button_zoom(), 'n');

    // ou plus simplement

    echo $this->title('Titre du widget');

Ce DIV doit avoir comme classe box et widget-box , le widget-box permet de numéroter les boites.

#### 44.5.3. Exemple complet

| Toute la documentation du code source est maintenue avec Doxygen, ici on a un exemple.

    /*!
     * \file
     * \brief display the next invoice to be paid or late for customer or supplier
     */
    namespace Noalyss\Widget;
    /*!
     * \class
     * \brief display the next invoice to be paid or late for customer or supplier
     */
    class Invoice extends Widget
    {
        /**
         * @brief return the constant array Tiers
         * @return array
         */
        static function getConstantTiers() : array
        {
            return ['S' => _("Fournisseurs"), "C" => _("Clients")];;
        }
        /**
         * @brief return the constant array Limit
         * @return array
         */
        static function getConstantLimit() :array {
            return  ['P' => _("Prochaines factures"), "R" => "facture en retard",'T'=>_("Aujourd'hui")];
        }

        /**
         * @brief let choice what to display
         * @return void
         */
        function input_parameter()
        {
            $tiers = new \ISelect('tiers');
            $aTiers=Invoice::getConstantTiers();
            $tiers->value=[];
            foreach ($aTiers as $key=>$value) {
                $tiers->value[]=['value'=>$key,'label'=>$value];
            }
            $time_limit = new \ISelect('time_limit');
            $aLimit=Invoice::getConstantLimit();
            $time_limit->value=[];
            foreach ($aLimit as $key=>$value) {
                $time_limit->value[]=['value'=>$key,'label'=>$value];
            }

            $input = _("Factures ") . $tiers->input() . " " . _("échéance") . " " . $time_limit->input();
            $this->make_form($input);

        }

        /**
         * @brief display the parameter
         * @return void
         */
        function display_parameter()
        {
            $aParam = $this->get_parameter();
            $aTiers =Invoice::getConstantTiers();
            $aLimit = Invoice::getConstantLimit();
            echo '<span class="widget_param">'.$aTiers[$aParam['tiers']] . " " . $aLimit[$aParam["time_limit"]].'</span>';
        }

        /**
         * @brief display the widget
         * @return void
         * @throws \Exception
         */
        function display()
        {
            $this->open_div();
            $aParam = $this->get_parameter();
            $aTiers = Invoice::getConstantTiers();
            $aLimit = Invoice::getConstantLimit();
            $title = $aTiers[$aParam['tiers']] . " " . $aLimit[$aParam["time_limit"]];

            $this->title($title);

            $acc_ledger = new \Acc_Ledger($this->db, 0);

            $ledger_type = 'ACH';
            if ($aParam['tiers'] == 'C') {
                $ledger_type = 'VEN';
            }

            switch ($aParam['time_limit']) {
                case 'P':
                    $array = $acc_ledger->get_operation_date(date('d.m.Y'), $ledger_type, '>');
                    break;
                case 'R':
                    $array = $acc_ledger->get_operation_date(date('d.m.Y'), $ledger_type, '<');
                    break;
                case 'T':
                    $array = $acc_ledger->get_operation_date(date('d.m.Y'), $ledger_type, '=');
                    break;
            }
            include "invoice-display.php";
            $this->close_div();

        }

Voir aussi "Paramètres"

1. Voir annexe : comment contribuer ou le wiki
1. souvent latin-1 pour Excel et unicode pour libreOffice
1. vous pouvez aussi utiliser directement les postes comptables, certains postes sont si rarement utilisés qu’on peut décider de ne pas créer de fiche comme par exemple le capital souscrit
1. Voir annexe : comment contribuer ou le wiki
1. A la condition que l’administrateur lui a envoyé le QRCode à scanner
1. C’est l’accès direct AD
2. c’est le nombre avant la catégorie
1. https://wiki.noalyss.eu
1. Vérifie que vous pouvez encore déduire une facture passée pour la TVA et l’impôt
1. https://wiki.noalyss.eu
2. le 31 décembre mais cela pourrait être une autre date
3. Pour imprimer les bilans il y a aussi l’extension "Bilan Interne" ou un rapport avancé
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
2. https://wiki.noalyss.eu
3. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
2. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
3. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Il existe aussi les actifs inversés, charges inversées…​
2. pour extourner il faut entrer une date valide. Une date valide est une date qui est dans une période non fermée et dans une période du dossier
3. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
4. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Il faut d’abord créer la nouvelle année.
1. extrait de compte
2. extrait de compte
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. ces fichiers ont l’extension ods ou odt
1. PHP4 existait déjà, cependant on est toujours en retard sur les versions PHP afin d’être plus compatible, la partie orienté objet était très basique
2. Pour l’ajax, il existe plusieurs fichiers, ajax_misc.php est en général utilisé,ajax.php est utilisé pour les plugins.
3. NOALYSS n’est pas à 100% documenté, on l’améliore à chaque version
4. voir noalyss/html/ajax_misc.php.
5. paramètrer avec la variable $_ENV['TMP']
6. sous linux il s’agit de /tmp
7. static function test_me()