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();
    }
Note 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.

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