# Manuel de NOALYSS

## Chapitre 47. La partie base de données

### 47.1. Les mises à jour

Depuis 2005, dans NOALYSS, il y a une table `version` qui contient les informations sur les patch de base de données qui ont été appliqués. Quand le fichier do.php est exécuté, il vérifie si DBVERSION contenu dans constant.php correspond à la version actuelle.

    /* Ficher do.php */
    if (DBVERSION < dossier::get_version($cn))
    {
        echo '<h2 class="error" style="font-size:12px">' .
         _("Attention: la version de base de donnée est supérieure à la version du programme, vous devriez
     mettre à jour") . '</h2>';
    }
    if (DBVERSION > dossier::get_version($cn))
    {
        echo '<h2 class="error" style="font-size:12px">' . _("Votre base de données n'est pas à jour") . '   ';
        $a = _("cliquez ici pour appliquer le patch");
        $base = dirname($_SERVER['REQUEST_URI']) . '/admin/setup.php';
        echo '<a hreF="' . $base . '">' . $a . '</a></h2>';
    }

Dans le cas où DBVERSION n’est pas la valeur contenue dans la base de donnée, do.php vous propose d’appliquer le patch sur vos bases de données. Voici la fonction qui applique les patch SQL pour la base de données. Ces fichiers sont dans `noalyss/include/sql/patch`.

    /* fichier setup.php */
    //----------------------------------------------------------------------
    // Upgrade the folders
    //----------------------------------------------------------------------

    for ($e=0;$e < $MaxDossier;$e++) {
       $db_row=Database::fetch_array($Resdossier,$e);
      echo "<h3>Patching ".$db_row['dos_name'].'</h3>';

      $name=$cn->format_name($db_row['dos_id'],'dos');

      if ( $cn->exist_database($name)> 0 )
      {
        $db=new Database($db_row['dos_id'],'dos');
        $db->apply_patch($db_row['dos_name']);
        Dossier::synchro_admin($db_row['dos_id']);

      } else
      {
          echo_warning(_("Dossier inexistant")." $name");
      }
     }

La fonction qui applique le patch est `Database::apply_patch` voir https://wiki.noalyss.eu/doc/class_database.html

Tous les patchs pour la base de données se trouve dans `/noalyss/include/sql/patch/` et sont numérotés dans l’ordre d’exécution. Chaque patch commence par

    begin;

et termine par

    insert into version (val,v_description) values (..version.,'.description..');

    commit;

Ainsi, si le script échoue, la mise à jour s’arrête et annule toute ce qui a été fait dans le script contenant l’erreur, la base de données reste ainsi dans un état cohérent. Une fois l’erreur corrigée dans votre base de données, ce script ainsi que ceux qui suivent seront appliqués quand vous appelerez à nouveau noalyss/admin/setup.php (ou noalyss/html/install.php).

Le nombre dans la table `version` est le nombre du script moins un, exemple : le script upgrade199.sql, correspond à la 200 dans la table `version`

    /* upgrade199.sql */

    insert into version (val,v_description) values (200,'Widget and improve menu');

### 47.2. Accèder aux données : ORM

Pour accèder aux tables ou aux vues, pour les SQL complexes , nous créons une classe qui va hériter de https://wiki.noalyss.eu/doc/class_table___data___s_q_l.html qui est dérivée de https://wiki.noalyss.eu/doc/class_data___s_q_l.html

     et qui
    va nous permettre de faire la même chose en très peu de ligne de code.

Cette classe fournit entre-autres les fonctions suivantes qui peuvent être surchargée

insert

  pour insérer une ligne dans la base de données

delete

  pour insérer une ligne dans la base de données

update

  pour mettre à jour une ligne dans la base de données

verify

  à surcharger, vérifie que les données sont conformes

setp

  setter paramètre : nom de la colonne, valeur retourne l’objet

getp

  getter paramètre : nom de la colonne , retourne la valeur de cette colonne

toString

  affiche le contenu de l’objet

from_array

  transforme un tableau en un objet

seek

  recherche dans la table sur base d’une condition

next

  retourne l’objet suivant (après seek)

check

  contrôle des valeurs

Voici tout le code à taper par table, exemple pour la table stock_change.

Le fichier sera nommé table_sql.class.php , il sera dans un répertoire `/database/` et la classe se nommera table_SQL

    class Stock_Change_SQL extends Noalyss_SQL
    {
        // Le contructeur obligatoire
        function __construct($p_id = -1)
        {
            // Façon dont les dates sont utilisées
            $this->date_format="DD.MM.YYYY";
            // Nom de la table
            $this->table = "public.stock_change";
            // nom de la clef primaire
            $this->primary_key = "c_id";

            // Structure de la table, à gauche le nom logique utilisable
            // avec les getters/setters (setp/getp) et à droite le nom de la
            // colonne
            $this->name = array(
                "id" => "c_id",
                "c_comment" => "c_comment",
                "c_date" => "c_date",
                "tech_date"=>"tech_date",
                "tech_user"=>"tech_user",
                "r_id"=>"r_id"
            );
            // Type de données
            $this->type = array(
                "c_id" => "numeric",
                "c_comment" => "text",
                "c_date" => "date",
                "tech_date"=>"date",
                "tech_user"=>"text",
                "r_id"=>"numeric"
            );
            // Les colonnes qui ne peuvent pas être changée ni par insert ni par
            // update parce leurs valeurs sont données automatiquement
            // exemple : la clef primaire qui est un numéro de séquence
            //automatiquement donné
            $this->default = array(
                "c_id" => "auto",
                "tech_date" => "auto"
            );
            global $cn;

            parent::__construct($cn, $p_id);
        }
    }

### 47.3. Les tests unitaires

#### 47.3.1. test-me

Les fonctions info et test_me qui sont très utiles lors des phases de déboggages. Je crée une simple page test-classe.php et j’appelle la classe; dans la fonction test_me (de la classe) je mets tout ce que je souhaite tester.

exemple :

        static function test_me()
        {
            $cn=new Database(dossier::id());
            $obj=new Periode($cn);
            $obj->set_jrn(1);
            $obj->display_form_periode();
        }

| ces tests ne sont pas ajoutés à NOALYSS mais servent de base pour les scénarios ou PHPUNIT

#### 47.3.2. PHPUNIT

Il faut tout d’abord un fichier bootstrap qui contient le path correct pour php ainsi que les variables comme $g_user ou $cn, l’inclusion de `noalyss/include/config.inc.php` et de `noalyss/include/constant.php`

#### 47.3.3. Scenario

Vous pouvez enregistrer ce que vous soumettez, il faut dans `config.inc.php`, ajouter

       define ('LOGINPUT',true);

Ensuite créer le fichier dans `noalyss/html/authorized_debug` , le contenu n’a pas d’importance, ce fichier peut être vide.

Ensuite, aller dans votre dossier de test et faites une action (une vente, un achat…​), vous devez ouvrir le fichier test.php avec comme paramètre le dossier (exemple `http://localhost/noalyss/html/test.php?gDossier=14`) ce que vous venez de faire a été sauvé dans le répertoire défini par `$_ENV['TMP']`, (sous linux il s’agit de /tmp )avec un nom ressemblant à scenario-<nombre>.php

Vous devez d’abord copier ce fichier dans le répertoire noalyss/scenario , de préférence avec un nom plus parlant.

Si vous pointez votre browser sur noalyss/html/test.`php (après avoir créé le fichier authorized_debug) en cliquant sur le lien avec le nom de fichier vous pourrez rejouer l’action.

| Vous pouvez améliorer la description en changeant l’annotation `//@description: <CODE>`

L’objectif étant de pouvoir tester et de rejouer facilement les actions que vous avez faites. Cela permet de débogguer plus facilement en particulier les parties ajax.

1. Voir annexe : comment contribuer ou le wiki
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. 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. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
1. Pour l’ajax, il existe plusieurs fichiers, ajax_misc.php est en général utilisé,ajax.php est utilisé pour les pluging