# Manuel de NOALYSS

## Chapitre 6. Anonymement

git git@gitlab.com:noalyss/noalyss.git

git switch stable # ou unstable

git checkout -b mon_dev1

Corriger dans mon_dev1 , faites commit

puis simplement, générer les fichiers patchs que vous enverrez par email

git format-patch stable..mon_dev1

Ces patchs seront testés et intégrés dans la branche `stable` et `unstable` , éventuellement dans la branche "pre-release", s’il y en a une.

=== Nouvelle version

Quand la branche `unstable` est suffisamment mature et testée pour devenir la prochaine version, on créera à partir d’elle une branche appelée pre-release-xx où xx est le prochain numéro de version.

Tous les correctifs sur stable seront aussi intégrés sur cette branche en plus d'`unstable`.

Quand la nouvelle version sera publiée, la branche sera intégrée dans `stable` , re-testée et publiée. La branche pre-release sera alors effacée.

Note | Les corrections et développement sur cette branche seront aussi portés vers `unstable`

== Convention

=== Nommage

Les fichiers dans

==== include

sont destinés à être inclus et exécuter depuis le 1er script (route)

    <action>.inc.php

==== include/ajax

Appelé depuis une procédure javascript , le nom de fichier est

    ajax_<action>

=== include/database

mapping table, vues et object

    <table>_SQL.class.php

=== include/template

template , écran & code html

    <nom_class>-<nom-fonction>.php

=== Outil

Tout doit être documenté avec Doxygen https://www.doxygen.nl/

Tous les objets SQL doivent aussi être documentés https://www.postgresql.org/docs/current/sql-comment.html

La documentation doit être au format asciidoc , ou markdown dans le répertoire doc https://asciidoctor.org/

Utilisation de phpunit ou autre système (fichiers de test avec assert() ) pour faire des tests unitaires https://phpunit.de/index.html

== Déboggage

Afin de débugger, il suffit dans le fichier `noalyss/include/config.inc.php` d’ajouter

define ("DEBUGNOALYSS",2);

Le niveau de déboggage est :

0

  production, aucune erreur n’est affichée,

1

  les erreurs et les avertissements sont affichés,

2

  affichage comme le niveau 1 , mais en plus des informations sur la taille de l’écran (bande de couleur en haut), pour aider la mise au point des pages responsives , affichage des fichiers inclus, d’objets,…​

Pour le niveau 2 , on utilisera la classe \Noalyss\Dbg

Javascript

si on donne une valeur différente de 0 à DEBUGNOALYSS , en javascript on aura la variable `document.debug_noalyss=true`, et donc on peut faire. Cependant , il vaut mieux être économe en plaçant des info de déboggage. Il est recommandé de les supprimer après usage sauf si elles sont utiles pour aider des développements ultérieurs comme par exemple pour indiquer quel est le fichier ou la fonction appelée.

    if ( document.debug_noalyss) console.debug ('test')
    /*  ou  */
    document.debug_noalyss && console.debug ('test')

Affiche le nom du fichier inclus (à garder si possible)

    \Noalyss\Dbg::echo_file(__FILE__);

Si DEBUGNOALYSS est supérieur à 1 , affiche le contenu de `row` dans un élément cacheable

    if ( DEBUGNOALYSS>1) echo \Noalyss\Dbg::hidden_info("\$row", $row);

Si DEBUGNOALYSS est supérieur à 1, affiche l’utilisateur courant

     \Noalyss\Dbg::echo_var(1,sprintf("current user is [%s]",$cn->get_value("select current_setting('noalyss.user_login')")));

`\Noalyss\Dbg` contient les différentes fonctions pour afficher, il existe aussi la fonction `tracedebug` qui écrira dans un fichier (voir noalyss/lib/ac_common.php).

Note | l’utilisateur connecté, est sauvé dans la mémoire de la base de données et peut de ce fait être utilisé dans des triggers, voir postgresql : current_setting

== Principe : développement en MVC

Le développement en MVC est un développement qui suit les concepts Modèle Vue Contrôle. Il en existe 2 versions. Ici, je ne parlerai que de la première.

En pratique, je crée 3 répertoires de base /html et /include et /include/template, le premier contient les « contrôles » le second les «vues» et le troisième les « modèles ».

=== Contrôle

Un contrôle est une page php, qui en fonction de l’action demandé va inclure la page «modèle» qu’il faut.

Dans noalyss, cette page est :

do.php pour toutes les demandes de pages

export.php pour toutes les impressions (PDF, CSV, …)

ajax_misc.php pour l’ajax.[1]

Exemple : la page contrôle contient

    <?php

    if ( !isset ($_REQUEST['do']))  exit();

    $do=$_REQUEST['do'];

    if ( $do == 'auteur' ) {

        require_once('include/auteur.inc.php');

    }

    ?>

L’explication est assez simple, si la page n’est pas appelée avec une variable do, donnée par un POST ou GET alors, le traitement s’arrête. Sinon en fonction de la valeur de la variable, il va inclure le fichier vue. Par habitude, mes fichiers vues ont toujours l’extension .inc.php.

Dans noalyss, le fichier do.php va chercher la vue à intégrer dans la base de données, ce qui améliore la sécurité mais aussi une grande souplesse pour les menus. Facile d’en ajouter, d’en retirer, de les renommer…​

NOTE : Puisque le fichier à inclure est dans la base de données, si votre profil ne l’inclus pas, alors vous avez pas du tout accès à ce menu, cela s’étend aux impressions, il est possible d’empêcher les impressions. Les menus et profils se configurent dans [C1MENU]

=== Vue

Grâce à l’exemple vu dans Contrôle, vous avez compris ce qu’est le concept vue: c’est la présentation de votre action. Donc pour continuer l’exemple, dans le document include/auteur.inc.php, on aurait

    <?php

    require_once ('include/class_auteur.php');

    if ( ! isset($_REQUEST['sdo']) ) exit();

    $sdo=$_REQUEST['sdo'];

    if ( $sdo == 'add' ) {

        $auteur=new Auteur();

        $auteur->display_form();

    }

    ?>

Ici, comme dans contrôle, on vérifie qu’une action est bien demandée, si c’est la cas, on appelle un objet et on lui demande d’afficher quelque chose. Cet objet est ce qui est dans le concept MVC, un modèle. En fait, on dirait une espèce de sous-contrôle

=== Modèle

Eh oui, le dernier est donc le modèle. Ici ce sont deux classes, l’une va se charger de sauver, afficher, effacer les données et gère donc les relations avec la base de données et l’autre l’objet métier.

Le nom de ce fichier doit être

    <nom de la classe>-<fonction>.php

Ce n’est pas toujours le cas, et cette réécriture se fait au fur et à mesure.

Il est vraiment fastidieux de construire une chaîne de caractère contenant tout le code html, surtout quand on emploie aussi du javascript et des tableaux. La solution que j’ai trouvé, je l’ai trouvé en m’inspirant de l’idée de smarty. En fait, je crée un sous-répertoire dans `include` appelé `template`, et dedans je mets le code HTML de ce qui doit être affiché

    <?php
    class Auteur {
        function display_form() {

        ob_start();

        include  'template/auteur-display_form.php';

        $r=ob_get_contents();

        $ob_clean();

        return $r;

        }
    }

Exemple:

     Ici on inclus le fichier, comme il est en PHP, il sera
    interprété par PHP, il contient surtout du code HTML et des balises PHP,
    on peut aussi manipuler la chaîne retournée avec les fonctions de
    chaînes comme str_replace, strcmp,... Ce qui donne à cette méthode
    encore plus de souplesse.

Il est important de respecter la règle suivante: un minimum d’HTML dans le PHP et un minimum de PHP dans l’HTML. Il faudra alors utiliser beaucoup de variables avant d’utiliser les templates, il faudra aussi résister à la tentation de mettre de l’html dans la variable, ce qui n’est pas toujours possible.

Attention | les variables sont définies en-dehors du fichier template. Les IDE avertissent que ces variables ne sont définies. il suffit d’ajouter un block commentaire pour supprimer cet avertissement

Exemple

    <?php
    /**
     * @var $auteur string contient le nom de l'auteur
     */

Important | toutes les variables doivent être commentées, sauf les variables en une seule lettre (utilisée principalement pour les boucles).

== La documentation

J’utilise Doxygen https://www.doxygen.nl/ afin de générer le code ce sont les TAGS brief, param…​ Cela me permet de générer une documentation; cette documentation me permet de développer plus vite et de mieux vérifier la qualité du code.

Voir le résultat ici https://wiki.noalyss.eu/doc/classes.html

Il est recommandé de toujours documenter les variables , les fonctions, les fichiers et les classes.

Le fichier qui va router les demandes (en général index.php ) doit contenir l’explication pour le développement [2]

Exemple

    <?php
    // variable: $tot float total for the operation
    $tot=0;

Quand une variable est héritée d’un autre fichier, à la suite d’un include ou require, afin que NetBeans (ou PhpStorm) n’indique pas une erreur.

    <?php
    /**
     * @var $tot float total for the operation
     */

     $tot=$tot+1;

== Fichiers importants

Les fichiers à inclure sont dans la table menu_ref, cette table est accèdée à travers la table profile_menu qui décrit l’interface de l’utilisateur, ce qui automatiquement empêche un utilisateur d’accèder à un menu auquel il n’a pas accès.

Le répertoire include contient les fichiers à inclure, les noms de fichiers suivent la logique suivant :

noalyss\include/constant.php

  contient les variables globales, les constantes, l’autoloader.

noalyss\include/config.inc.php

  contient le paramétrage de NOALYSS, surtout l’accès aux bases de données.

noalyss\include\ajax

  Action ajax, le nom de fichier commence par ajax, contient le contenu de la variable op, c’est cette variable qui va indiquer le fichier à include.[3]

fichier à inclure

  le nom de fichier termine par inc.php,

fichier ORM

  correspondant à une table NOM_TABLE dans la base de données:class_NOM_TABLE_sql.class.php,

fichier d’object

  le nom se termine par .class.php

noalyss/log

  répertoire des logs, voir fonction record_log

noalyss\include\template

  ici vous avez les modèles, ce sont des fichiers contenant surtout du code HTML.

En résumé :

Les contrôleurs sont do.php, export.php, ajax.php

Les modèles sont dans include/template

et les vues sont dans le répertore include

== La partie base de données

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

    <?php

    /* 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`.

    <?php
    /* 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 class Database

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 ce script, 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');

=== 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 Table_Data_SQL qui est dérivée de Data_SQL

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

    <?php
    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);
        }
    }

=== Les tests unitaires

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

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

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

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

= Développement de widget

== Définition

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

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

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

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

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

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

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

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

=== 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();(1)
            $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

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

=== Exemple complet

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

= Développement d’extension (plugin)

== L’API

Toute la documentation se trouve sur http://wiki.noalyss.eu/doc/; seules les classes nous intéressent. La documentation est générée à partir du code avec Doxygen. Le but de cet article n’est pas de revisiter la documentation technique mais de la mettre en oeuvre afin d’écrire une extension ou plugin.

== Installation de l’extension

Les extensions se trouvent toujours dans un sous-répertoire de `/noalyss/include/ext`, pour notre plugin que nous appelerons DUMMY, le répertoire correspondant sera `/noalyss/include/ext/dummy`. La première étape est donc de décompresser le plugin dans le répertoire `/noalyss/include` et vérifier si on a bien `/noalyss/include/ext/DUMMY` ensuite l’activer.

Le plus simple est de retrouver le fichier dummy.php, si le chemin est `/chemin/ext/dummy/dummy.php` alors /chemin/ext est l’endroit où les plugins doivent être décompressés. Le chemin quand on ajoute le plugin dans le menu [C1MENU] est donné dans le wiki , pour chaque plugin, on donne le paramètre "chemin" qui est en fait le chemin à partir de /ext/

== Comment l’activer

Grâce à l’accès direct allez sur [C1MENU], puis ajoutez plugin, les champs sont les mêmes, il faut ajouter ce plugin dans le profil des utilisateurs qui doivent l’utiliser (CFGPRO)

Pour la version 6.8 et plus haut, il suffit d’aller dans C0PLG et cochez qui peut utiliser le plugin qui se trouvera dans le module "Extension". Avec [C1MENU], on peut placer l’extension dans un autre module.

=== Explication des champs

- Label, est le nom de menu de votre extension

- Code est utilisé pour inclure le fichier du plugin, il correspond au champs caché plugin_code

- Fichier est le chemin complet vers l’extension

Pour notre extension, les valeurs suivantes sont données

- Label : Mon dummy à moi

- code : dum

- Fichier : dummy/dummy.php

Vous sauvez, cliquer sur Extension et vous verrez apparaître un nouveau plugin appelé "Mon dummy à moi"; si vous cliquez dessus, la page ext/dummy/dummy.php sera exécutée; voyez le code du fichier noalyss/html/extension.php pour comprendre.

=== Tutoriel vidéo

Installation d’un plugin sur Noalyss

=== Exemple de base

Dans les plugins de base de NOALYSS, il y a skel qui est le squelette d’un plugin. Vous pouvez l’utiliser comme base.

https://gitlab.com/noalyss/noalyss-plugins/-/tree/stable/skel?ref_type=heads

=== Connection à la base de données

Certaines valeurs doivent toujours être passées à chaque page, par exemple gDossier qui est l’identifiant du dossier. Pour se connecter c’est assez facile, il faut utiliser la classe Database et la classe Dossier.

Donc on écrit dans dummy.php

      echo "L' identifiant de mon dossier est ".dossier::id()."<br>";
      echo "Son nom réel est ".DOMAIN."dossier".dossier::id()."<br>";
      echo "Son nom est ".dossier::name()."<br>";
     // Je me connecte à présent à ce dossier
      $cn_db=new Database(dossier::id());
      // On peut aussi se connecter ainsi (développement plus récent)
      $cn= Dossier::connect();

Je veux afficher toutes les fiches qui concernent le matériel à amortir, donc j’ai besoin de savoir ce que vaut son FICHE_DEF_REF:FRD_ID dans constant.php; la FICHE_TYPE_XX n’existe pas, je vois dans la table fiche_def_ref qu’il s’agit de "7 Matériel à amortir"

Pour avoir toutes les fiches,

      $fiche= new Fiche($cn_db);
      $aFicheMateriel=$fiche->getByDef(7);

Pour chaque fiche, je veux afficher son nom, son prix, le nombre d’années à amortir et la date d’achat. Je peux en trouver les valeurs dans la table attr_def ou le fichier constant.php,

Donc cela devient

      for ($i=0; $i < count($aFicheMateriel);$i++) {
        echo "<ul>
         echo "<li> ";
         echo "Nom";
         echo $aFicheMateriel[$i]->strAttribut(ATTR_DEF_NAME);
         echo "</li>";
         echo "<li> ";
         echo "Prix achat";
         echo $aFicheMateriel[$i]->strAttribut(ATTR_DEF_PRIX_ACHAT);
         echo "</li>";
         echo "<li> ";
         echo "Durée amortissement";
         echo $aFicheMateriel[$i]->strAttribut(8);
         echo "</li>";
         echo "<li> ";
         echo "Date de début";
         echo $aFicheMateriel[$i]->strAttribut(10);
         echo "</li>";
         echo "</ul>
      }

=== Soumettre des requêtes

Uniquement pour l’exercice, nous allons ajouter un FORM. Les données nécessaires dans le FORM sont toujours au minimum: l’id du dossier, le code du plugin.

Dans le FORM, on demandera juste à afficher le solde de chaque élément. On aura alors le code suivant, on utilisera la technique des templates

      $year=new IText('year');

      $str_year=$year->input();

      $str_submit=HtmlInput::submit('year_left','Appliquer');

      require_once('template1.php');

    template1.php

      <FORM METHOD="GET" ACTION="extension.php">

      <?=dossier::hidden()?>

      <?=HtmlInput::extension()?>

      Solde pour l'année : <?=$str_year?>

      <?=$str_submit?>

      </form>

Puis dans le début du fichier noalyss/include/ext/dummy/dummy.php, on ajoutera un test pour savoir un FORM a été soumis et on affichera une boîte de dialogue.

    $http= new HttpInput();(1)
     if (isset($http->get('year_left','number'))){ (2)

        alert('Vous avez demandé le nombre d\'années restantes');

     }

(1) permet de retrouver des variables passées par get , post ou request (voir documentation code^) (2) remplace `$_GET['year_left']`, HttpInput vérifie aussi le type de données et peut donner une valeur par défaut si cette donnée n’est pas dans $_GET

== Plugin plus avancé

Ma première extension, intégrer un fichier de client dans une catégorie de fiche, ce fichier est en CSV. Le code est simple et compréhensible, normalement on devrait avoir une meilleure gestion des erreurs, vérifier les attaques SQL Inject,…​ Ce code n’est là QUE pour expliquer le concept. On n’a pas utilisé plusieurs pages, ni de templates

Tout d’abord, il faut se connecter à la base de données

     // se connecter au dossier courant

     $cn=Dossier::connect();

Dans extension.php on vérifie la sécurité, en ajoutez une dans l’extension n’est en général pas nécessaire mais vous pourriez avoir votre propre système de sécurité si votre extension est fort complexe

En premier lieu, il est nécessaire de choisir dans quelle catégorie de fiche je veux intégrer les enregistrements. Donc on utilise un petit form

     echo '<form METHOD="get" action="extension.php">';

     echo dossier::hidden();

     // Ceci vous permet de revenir ici (voir extension.php). Cet élément caché permet d'include cette page-ci

     // Donc si votre plugin contient plusieurs pages, vous allez devoir ajouter une seconde variable pour

     // inclure la page que vous voulez (voir méthode de développement de PhpCompta )

     echo HtmlInput::extension();

     echo "Choix de la catégorie de fiche";

     $select_cat=new ISelect('fd_id');

     $select_cat->value=$cn->make_array('select fd_id,fd_label from fiche_def where frd_id='.

         FICHE_TYPE_CLIENT);

     echo $select_cat->input();

     echo HtmlInput::submit('display_prop','Afficher les propriétés');

     echo '</FORM>';

Il faut remarquer 2 choses dans ce FORM, primo, on utilise les objets HtmlInput et ISelect, secundo on doit avoir absolument en variables cachées, le n° de dossier sur lequel on est connecté, le code de l’extension, qui permettra à extension.php d’include le bon fichier. On utilise ici le protocole GET puisqu’on interroge, le protocole POST est réservé aux sauvegardes, c’est une convention assez répandue. La différence, est que les requêtes GET se voient dans l’URL, les requêtes POST ne sont jamais dans l’url.

L’utilisateur soumet le FORM, donc la feuille se recharge et on arrive à cette partie du code

On choisit d’afficher les propriétés avant de confirmer l’import

     if ( isset($_GET['display_prop'])){
        $http=new HttpInput();
         $a=new Fiche($cn);

         $prop=$a->toArray($http->get('fd_id'));

         foreach ($prop as $key=>$value)     echo "Index : $key valeur $value <br/>";

         echo '<form method="POST" action="extension.php"  enctype="multipart/form-data">';

         echo dossier::hidden();

         echo HtmlInput::extension();

         echo HtmlInput::hidden('fd_id',$http->get('fd_id');

         $file=new IFile('fichier_csv');

         echo $file->input();

         echo HtmlInput::submit('start_import','Démarrez importation');

         echo '</form>';

         exit;

     }

Voilà, si l’utilisateur clique sur le bouton SUBMIT, l’importation va démarrer. Dans notre exemple, on imaginera que le fichier CSV n’a que 4 champs "nom client","prenom client", "numero client","adresse client"

Le code qui suit est très simplifié.

     if ( isset($_POST['start_import'])){
    $http=new HttpInput();
         $fd_id=$http->post('fd_id');

         $tmp_file=$_FILE['fichier_csv']['tmp_name'];

         if ( ! is_uploaded_file($tmp_file))

             die 'Je ne peux charger ce fichier';

         // on ouvre le fichier

         $f=fopen($tmp_file,'r');

         // On récupère les propriétés de cette catégorie de fiche

         $client=new Fiche($cn);

         // $array contient toutes les valeurs nécessaires à Fiche::insert,

         $array=$client->toArray($http->post('fd_id'));

         while ( $data=fgetcsv($f)) {

             // remarque : on a éliminé les traitements d'erreur

             // On  remet tous les attributs (propriétés) à vide

             foreach(array_keys($array) as $key) $array[$key]="";

             // Nom et prénom

             $array['av_text1']=$data[0].' '.$data[1];

             // Numéro de client

             $array['av_text30']=$data[2];

             // Adresse

             $array['av_text14']=$data[3];

             // Quickcode

             $array['av_text23']="CLI".$data[2];

             $client->insert($fd_id,$array);

         }

         exit;

     }

Voici le fichier client.txt

     "Nom client1","Prénom","C1","Rue de la boite,55"

     "Nom client2","Prénom","C2","Rue du couvercle,55"

     "Nom client3","Prénom","C3","Rue de la chaussure,55"

     "Nom client4","Prénom","C4","Rue de la couleur,55"

Si vous vérifiez dans VW_CLIENT, vous verrez que toutes vos fiches ont été ajoutées. Dans l’exemple, il fatraitement d’erreur plus élaboré; le fait que si une fiche echoue , l’opération est annulée (Database::rollback) ou alors création d’un fichier avec les enregistrements "ratés"…​

== Ajax

Afin d’utiliser des fonctions avec ajax, prototype.js devrait être utilisé.Vous devez appeler le fichier ajax.php, ce fichier dans html va simplement vérfier la sécurité et appeler le fichier ajax.php du répertoire où se trouve le plugin avec tous les arguments donnés.

Exemple

dans

dummy/javascript.js, vous avez

    function show_detail(pop_id){
        $('detail_invoice_content').innerHTML=loading();
        showIPopup('detail_invoice');
        try {
        var gDossier=$('gDossier').value;
        var phpsessid=$('phpsessid').value;
        var code=$('code').value;
        var obj={"op_id":pop_id,"gDossier":gDossier,"phpsessid":phpsessid,"code":code,'act':'detail_invoice'};
        var queryString=encodeJSON(obj);
        var action=new Ajax.Request ( 'ajax.php',
                  {
                     method:'get',
                     parameters:queryString,
                     onFailure:show_detail_error,
                     onSuccess:show_detail_success
                   }
                   );
        } catch (e){alert('show_detail'+e.message);}

     }

et dans dummy/ajax.php

    <?php
    // Met correctement la langue

    set_language();
    //retrouve le dossier courant et s y connecte

    $gDossier=dossier::id();
    $cn=new Database($gDossier);

    // action

    $action=(isset($_REQUEST['act']))?$_REQUEST['act']:'sh';

    // Véridfie la sécurité

    require_once ('class_user.php');
    $User=new User(new Database());
    $User->Check();

    /* Suivant l action demandé, on executera tel ou tel partie de code

    /* Show the document */
    if ( $action == 'sh') {
    /*

    * Votre code

    */}
    /* remove the document */
    if ( $action == 'rm' ) {
    /*votre code et la réponse

    */

        header('Content-type: text/xml; charset=UTF-8');
        header ('<?xml version="1.0" encoding="UTF-8"?>');
        echo '<answer>';
        echo '<ctl>detail_invoice</ctl>';
        echo '<html>'.escape_xml($html).'</html>';
        echo '</answer>';
    }
    ?>

== Les données

Si votre extension nécessite de sauver ses propres données, il faut impérativement les mettres dans un schéma séparé. Prévoyez une table version, afin d’appliquer des mises à jour si nécessaire et un fichier install.php afin de créer les schémas nécessaire

exemple

    create schema plugin_tva;

    create table version (val integer);

== Comment faire un rapport en PDF

Si vous décidez d’ajouter un menu qui renvoit un PDF.

Tout d’abord comme dans le développement des plugins, il faut d’abord ajouter un menu dans les menu et les [menu/cfgpro[profils.

Les menus de type impression ne sont jamais affichés, ils ne servent qu’à la sécurité et commence toujours par `CSV:`,`PDF:`,…​ voir [C1MENU]

Le code , vous devez créér une nouvelle classe depuis la classe PDF (en mode portrait) ou la classe PDFLand en mode paysage

Exemple

    require_once('class_pdf.php');

    class Mon_Impression_PDF extends PDF
    {

        function header()
        {
            parent::header();

        }

        function export()
        {

        }
    }

La fonction header : est ce qui est affiché comme en tête sur chaque page, La fonction footer : est ce qui est affiché comme en pied de page sur chaque page,

La fonction la plus importante est export qui remplira le listing.

Il y a peu de fonctions à connaître : Cell, export , SetFillColor…​

Voici par exemple le morceau de code pour le listing dans amortissements

    class Amortissement_Material_PDF extends PDF
    {

        function header()
        {
            parent::header();
            $this->setFont('DejaVu', 'B', 14);
            $this->Cell(190, 10, _('Amortissement : Liste de biens'), 1, 2, 'C');
            $this->ln();
            $this->col_size=array('qcode'=>20, 'name'=>35,'desc'=>80, 'date.purch'=>20, 'year.purch'=>20,  '#amort'=>10,'amount.purch'=>30, 'amount.amort'=>30, '%'=>20, 'amount.remain'=>20,'amount.delta'=>20);

            $this->setFont('DejaVu', 'B', 7);
            $this->Cell($this->col_size['qcode'], 8, _('QCode'));
            $this->Cell($this->col_size['name'], 8, _('Nom'));
            $this->Cell($this->col_size['date.purch'], 8, _('Date achat'));
            $this->Cell($this->col_size['year.purch'], 8, _('Année achat'));
            $this->Cell($this->col_size['#amort'], 8, _('Nbre'), 0, 0, 'R');
            $this->Cell($this->col_size['amount.purch'], 8, _('Montant'), 0, 0, 'R');
            $this->Cell($this->col_size['amount.amort'], 8, _('A amortir'), 0, 0, 'R');
            $this->Cell($this->col_size['amount.delta'], 8, _('A amortir'), 0, 0, 'R');
            $this->Ln();
        }

        function export()
        {
            global  $cn;
            $this->SetFont('DejaVu', '', 7);
            $ret=$cn->get_array("select * from amortissement.v_amortissement_summary where a_visible='Y' order by a_start,a_date");
            bcscale(2);
            for ($i=0;$i<count($ret);$i++)
            {
                if ($i%2==0)
                {
                    $this->SetFillColor(220, 221, 255);
                    $fill=1;
                }
                else
                {
                    $this->SetFillColor(0, 0, 0);
                    $fill=0;
                }
                $this->Cell($this->col_size['qcode'], 8, $ret[$i]['quick_code'], 0, 0, 'L', $fill);
                $this->Cell($this->col_size['name'], 8, $ret[$i]['vw_name'], 0, 0, 'L', $fill);
                $this->Cell($this->col_size['date.purch'], 8, format_date($ret[$i]['a_date']), 0, 0, 'L', $fill);
                $this->Cell($this->col_size['year.purch'], 8, $ret[$i]['a_start'], 0, 0, 'C', $fill);
                $this->Cell($this->col_size['#amort'], 8, round($ret[$i]['a_nb_year']), 0, 0, 'R', $fill);
                $this->Cell($this->col_size['amount.purch'], 8, nb($ret[$i]['a_amount']), 0, 0, 'R', $fill);
                $this->Cell($this->col_size['amount.amort'], 8, nb($ret[$i]['amort_done']), 0, 0, 'R', $fill);
                $delta=bcsub($ret[$i]['a_amount'],$ret[$i]['amort_done']);
                $this->Cell($this->col_size['amount.delta'], 8, nb($delta), 0, 0, 'R', $fill);

            $this->Ln();
            }

            $this->Output('listing-amort.pdf', 'I');
        }

    }

Il est conseillé de travailler avec des vues plutôt qu’avec des requêtes SQL directes, plus facile de réutiliser une vue que de dupliquer à plusieurs endroits une requête SQL, surtout pour la maintenance si vous décidez de changer la requête ou la structure de la base de données, avec une vue, vous retrouverez plus vite les endroits à modifier.

Il y a des tutoriaux dans noalyss/doc/fpdf et tfpdf, vous pouvez les lire en ligne sur le site de fpdf

= Annexe

== Comment contribuer

Nul besoin d’être informaticien pour nous aider, il y a beaucoup de façons de contribuer

=== Faites nous connaitre

Afin d’avoir une communauté importante, condition pour que le projet survive, il est très important de promouvoir NOALYSS, n’hésitez pas à le faire connaître.

Pour vous aider, vous pouvez distribuer ce flier https://gitlab.com/noalyss/noalyss-documentation/-/blob/main/document/Flier-1.pdf?ref_type=heads

=== Voter

Pensez à voter pour ce projet sur https://gitlab.com/noalyss

=== Les news

N’hésitez pas à parler de ce projet, soit dans votre journal soit en recopiant les annonces sur les sites de nouvelles

=== La documentation

La documentation est toujours la bienvenue, ce manuel et le wiki servent à cela, n’hésitez pas à ajouter ou corriger. Des liens intéressants sont toujours les bienvenus

https://wiki.noalyss.eu Wiki

https://forum.noalyss.eu Forum

https://manuel-fr.noalyss.eu manuel

https://gitlab.com/noalyss/noalyss-documentation source de ce manuel

Astuce | Il y a aussi des tuto sur Youtube, et une chaîne https://www.youtube.com/@noalyss11

=== Les forums, les Mailing Listes ou liste de discussion

Aidez les autres, faites des suggestions pour améliorer NOALYSS, Relevez des bogues sont aussi des contributions très appréciées.

N’hésitez pas à vous inscrire sur les Listes de discussions afin de participer ou de se mettre au courant des discussions, c’est l’endroit où on peut poser des questions, suggérer des changements, avertir de bugs…

Elles se trouvent sur http://savannah.nongnu.org/mail/?group=noalysssavannah

- Discussion générale concerne les bugs, les idées, les demandes d’aide, les annonces …. Avant de poster votre premier email en écrivant à noalyss-generale@nongnu.org , une courte présentation est la bienvenue.

- Message des commits contient tous les messages des commits, les changements de code, s’adresse uniquement aux développeurs mais vous permet aussi de suivre le développement.

Important | il faut être inscrit sur la liste de diffusion pour pouvoir y envoyer des messages, si on s’inscrit, le mieux est d’envoyer un message pour se présenter, 2 lignes suffisent. Pour s’abonner, suivez le lien et donner votre adresse email ainsi que votre surnom (ou nom)

=== Développer

Développer des plugins ou des nouvelles fonctionnalités est facile, nous vous aiderons si vous en avez besoin. Mantis contient les tâches prévues ainsi que les bugs. Si vous souhaitez ajouter ou modifier quelque chose, le mieux est d’en parler avant.

=== Donation

Il est aussi possible de faire des donations pour soutenir notre travail (https://www.noalyss.eu/?page_id=532)

=== Autres

- Traduction dans une autre langue

- Créer des packages pour les différentes distribution Linux (Ubuntu, Debian, Mageia,…​)

== Liste des Accès Directs

Code d’Accès- AD | Usage
--- | ---
ACCESS | Accueil
ACH | Nouvel achat ou dépense
ACHISTO | Historique achat
ADM | Suivi administration, banque
ADV | Menu avancé
ANC | Module comptabilité analytique
ANCBC2 | Balance double croisées des imputations analytiques
ANCBCC | Lien entre comptabilité et Comptabilité analytique
ANCBS | Balance simple des imputations analytiques
ANCGL | Grand livre d’plan analytique
ANCGR | Balance par groupe
ANCGROUP | Groupe analytique
ANCHOP | Historique des imputations analytiques
ANCIMP | Impression compta. analytique
ANCKEY | Clef Analytique
ANCODS | OD analytique
ANCTAB | Tableau lié à la comptabilité
C0ACT | Personnalisation des actions dans le suivi
C0CARD | Attributs de fiche
C0DEV | Configuration des devises
C0DOC | Config. modèle de document
C0ETS | Permet d’ajouter des état pour les documents utilisés dans le suivi (à faire, à suivre…​)
C0JRN | Configuration des journaux
C0MENU | Configuration des menus par défaut
C0OPT1 | configure les options pour les fiches dans le suivi
C0PAY | Config. des méthodes de paiement
C0PCMN | Configuration du plan comptable
C0PLG | Gestion des extensions (plugins).
C0PROFL | Configuration profil des utilisateurs
C0PST | Config. poste comptable de base
C0SEC | configuration de la sécurité
C0TAG | Configuration des étiquettes(tags) ou dossiers, on l’appele tag ou dossier suivant la façon dont vous utilisez cette fonctionnalité. Vous pouvez en ajouter, en supprimer ou les modifier
C0TVA | Configuration de la tva, à adapter suivant vos déclarations TVA
C0ETS | Etat des actions
C1MENU | Configuration des menus et des extensions
[CARD] | Fiche
CARDBAL | Balance par catégorie de fiche
CCARD | Catégorie de fiches, configuration, ajout
CMCARD | Gestion des modèles de fiches
COMPANY | Paramètre societe
COMPTA | Module comptabilité
CUST | Suivi client
DASHBOARD | Tableau de bord
DIVPARM | Paramètres divers
EXT | Extensions (plugins)
FIHISTO | Historique financier
FIN | Nouvel extrait bancaire
FOLLOW | Suivi, courrier, devis
FORECAST | Prévision
FREC | Rapprochement bancaire
FSALDO | Solde des comptes en banques, caisse…​
GESTION | Module gestion
HIST | Historique
JSSEARCH | Recherche
LET | Lettrage
LETACC | lettrage par poste comptable
LETCARD | Lettrage par fiche
LOGOUT | Sortie
MENUACH | Menu achat
MENUFIN | Menu Financier
MENUODS | Menu opérations diverses
MOD | Menu
NCOL | Apparence et couleurs
ODHISTO | Historique opérations diverses
ODS | Nouvelle opérations diverses
OPCL | Ecriture d’ouverture et de clôture
OTAX | Taxe supplémentaire
P0BAL | Impression des balances comptables
P0BIL | Impression de bilan
P0BLG | Impression Balance âgée
PCUR01 | Impression des devises
P0GRL | Impression du grand livre
P0JRN | Impression historique
P0PST | Impression du détail d’un poste comptable
P0RAP | Impression des rapprochements
P0RPO | Impression de rapport
P0TVA | Impression des résumés TVA
P1TVA | Impression détail TVA
PARAM | Module paramètre
PERIODE | Gestion des périodes
PLANANC | Plan analytique
PREDOP | Gestion des opérations prédéfinies
PREFERENCE | Préférences
PRINT | Menu impression
REPORT | Création de rapport
SEARCH | Recherche
STOCK | Stock
STOCK_INV | Inventaire des stocks
SUPPL | Suivi fournisseur
VEHISTO | Historique des ventes
VEN | Nouvelle vente ou recette
VENMENU | Menu ventes et recettes
VERIFBIL | Vérification de la comptabilité

== Backup et restaure

=== Procédure de sauvegarde en ligne de commande

Faire un backup de toutes vos bases de données , dans un terminal tapez

    sudo -i -u postgres

    pg_dumpall > noalyss_backup.dmp

Le fichier noalyss_backup.dmp est créé et doit être copié et conservé (sur un disque dur externe , une clef USB …​) Dans les distributions Ubuntu ou dérivées, il se trouve dans /var/lib/postgresql/ ; qui est le répertoire "HOME" de postgresql

Important | Sauvez aussi le fichier noalyss/include/link:/config.inc.php

=== Procédure de sauvegarde d’un dossier

- Se connecter comme administrateur sur NOALYSS

- Allez dans Administration → Dossier

- Cliquer sur "Backup" en regard du dossier que vous voulez sauvegarder

- Sauvegarder le fichier .bin en lieu sûr

==== Procédure de restauration

Restaurez votre backup ,

    sudo -i -u postgres

    psql <  noalyss_backup.dmp

Les données , les utilisateurs et les mots de passe seront comme à l’origine .

=== Procédure de restauration d’un dossier

- Se connecter en tant qu’Administrateur

- Aller dans Administration→Restaure

- Donner un nom au dossier, sinon le nom du fichier .bin restauré sera utilisé

- Cliquer sur la coche Dossier, si vous voulez utiliser les données de votre sauvegarde

- ou cliquer sur Modèle, si seul la structure du dossier, sans les opérations, vous intéresse

- Par le bouton "Parcourir", sélectionner votre sauvegarde .bin

- Lancer la restauration.

note : si vous obtenez le message d’erreur suivant : "Problème lors de la restauration xx(un numéro d’ordre) Restauration :dossier yy"

- Vérifier les log d’Apache, la taille de votre dossier n’est peut-être pas adaptée à votre configuration d’Apache.

- Si c’est le cas, il faudra éditer php.ini

- et augmenter les valeurs post_max_size et upload_max_filesize,

- sauver la nouvelle configuration

- redémarrer le serveur.

Pour plus d’informations http://www.commentcamarche.net/forum/affich-15360322-php-ini-modifier-taille-de-fichier-upload

=== Procédure de restauration manuelle d’un dossier

1. Se connecter comme administrateur sur NOALYSS

2. Allez dans Administration → Dossier

3. Créez un nouveau dossier basé sur le modèle vide:

4. Aller dans Administration→Dossier→Ajout Dossier

5. En cliquant sur le combo modèle choisissez Aucun modèle (dossier vide devant être restauré manuellement).:IMPORTANT: ce dossier sera celui dans lequel on restaurera.

6. Avec pgadmin3 , restaurer le backup dans ce dossier comme dans l’étape 4 , le nom de dossier est dossierXX XX est le nombre dans la colonne de gauche

=== Problème de restauration par l’interface

Il peut arriver que vous obteniez un message d’erreur du type "Problème lors de la restauration XX Restauration :MONDOSSIER_YY" lors de la restauration par l’interface, il est conseillé de le restaurer manuellement

Si vous voulez le faire par l’interface , pour corriger : cela est vraisemblablement dû à des valeurs post_max_size (8M par défaut) et upload_max_filesize (2M par défaut) trop petites dans le fichier php.ini. Il faut les modifier en éditant le fichier en tant qu’administrateur.

Sous Ubuntu ou Linux Mint, on le trouve dans /etc/php/NumeroVersionPHP/apache2/

Il faut ensuite redémarrer le serveur :

    sudo /etc/init.d/apache2 restart

ou

    sudo service apache2 restart

ou encore

    sudo systemctl restart apache2.service

avec systemd

== Export PDF

Pour l’export ancgl des pièces transformées en PDF et la Facturation

=== 1. ImageMagick

ImageMagick est installé , il faut faire attention d’avoir dans le fichier /etc/ImageMagick-6/policy.xml (à partir ubuntu 16.04)

Installation d’imageMagick

    apt install imagemagick

      <policy domain="coder" rights="read|write" pattern="EPHEMERAL" />
      <policy domain="coder" rights="read|write" pattern="URL" />
      <policy domain="coder" rights="read|write" pattern="HTTPS" />
      <policy domain="coder" rights="read|write" pattern="MVG" />
      <policy domain="coder" rights="read|write" pattern="MSL" />
      <policy domain="coder" rights="read|write" pattern="TEXT" />
      <policy domain="coder" rights="read|write" pattern="SHOW" />
      <policy domain="coder" rights="read|write" pattern="WIN" />
      <policy domain="coder" rights="read|write" pattern="PLT" />
      <policy domain="path" rights="read|write" pattern="@*" />
      <policy domain="coder" rights="read|write" pattern="PS" />
      <policy domain="coder" rights="read|write" pattern="EPS" />
      <policy domain="coder" rights="read|write" pattern="PDF" />
      <policy domain="coder" rights="read|write" pattern="XPS" />

=== 2. PdfTK

(Ubuntu 18.04) Si vous utilisez pdftk , il faudra corriger la configuration, le snap empêche son exécution, Pour vérifier

    type pdftk
    pdftk est haché (/snap/bin/pdftk)

L’erreur est

    Sorry, home directories outside of /home are not currently supported.
    See https://forum.snapcraft.io/t/11209 for details.

Solutions :

1. vous le recompilez, (source https://www.pdflabs.com/docs/install-pdftk-on-redhat-or-centos/)

2. ou vous utilisez une autre distro plus permissive

3. ou vous activez apparmor et www-data (propriétaire du service http) doit avoir son propre "home", qui sera utilisé , dans ce cas, il faudra travailler dans /home/www-data/tmp et changer la variable $_ENV['TMP']

==== Compilation de pdftk

Ubuntu 18.04

    sudo apt install default-jdk-headless ant libcommons-lang3-java libbcprov-java

    git clone https://gitlab.com/pdftk-java/pdftk.git
    cd pdftk
    mkdir lib
    ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar
    ant jar

    cp build/jar/pdftk.jar  /usr/local/bin

    cat <<EOF > /usr/local/bin/pdftk
    #!/bin/bash
    # Start PDFTK
    /usr/bin/java -cp /usr/share/java/commons-lang3.jar:/usr/share/java/bcprov.jar:/usr/local/lib/pdftk.jar com.gitlab.pdftk_java.pdftk $@
    EOF

    chmod a+x /usr/local/bin/pdftk

Et config.inc.php

    $pdftk="/usr/local/bin/pdftk";

=== 3. Apache

Avec Systemd, apache utilise un répertoire temporaire privé et donc l’appel pour convertir les fichiers en PDF et les estampiller ne fonctionne plus.

Pour changer cela , il faut avoir dans /etc/systemd/system/multi-user.target.wants/apache2.service

    PrivateTmp=false

=== 4. Conversion de document

On utilise libreOffice pour convertir des documents en PDF avec Unoconv (libreOffice)

Dans le fichier config.inc.php, on doit avoir

    define ('GENERATE_PDF','YES');
    define ('OFFICE','unoconv ');

Plus d’information https://docs.moodle.org/38/en/Universal_Office_Converter_(unoconv)

== Les notes de version

=== Note de version 9.3 Août 2024

Personnalisation du tableau de bord, les éléments affichables (appelés widget ) peuvent être facilement développés et sont modulables

TVA : ajout d’un code TVA alphanumérique , afin de permettre une saisie plus rapide des codes TVA

Menu Détail TVA : pour avoir le détail des opérations utilisées avec un code TVA,

Annonce : possibilité d’ajouter une annonce en créant une page nommée ads.html dans le répertoire noalyss/html

Vérification des numéros de TVA

Changement de certains code pour les "Accès Direct"

Amélioration pour la personnalisation des attributs des fiches

Amélioration pour l’activation des extensions (plugins) dans C0EXT

=== Note de version 9.2 27 février 2024

Amélioration du suivi c’est-à-dire tout les événements d’une société , suivi client, administration, document interne…​

Corrections de bugs cosmétiques, apparence

Adaptation pour PHP8.1, PHP8.2 , PHP8.3

Renforcement des mots de passe

==== Suivi

Amélioration présentation,

Plusieurs fichiers peuvent être sélectionnés en une fois.

Les fichiers sont affichés avec le commentaire qui a été ajouté à ce moment

L’action peut être imprimée depuis le menu de l’explorateur internet

Depuis le détail suivi, on peut consulter le suivi.

Possibilité de sauver les recherches dans le suivi , ce qui permet de retrouver rapidement ce dont on a souvent besoin.

==== Comptabilité

Réécriture du menu de l’ouverture des comptes , AD: OPCL

Ajout de la clôture des comptes en fin d’année, (France)

Dans la balance, il y a un avertissement si le solde ne correspond pas au type de poste comptable, exemple : un actif avec un solde créditeur.

Dans opérations diverses, amélioration pour indiquer le débit / crédit

Choix du type de comptabilité : ouverture des comptes chaque année ou non, avec adaptation des impressions de bilan et balance. (AD : COMPANY)

Corrections de bugs cosmétiques, apparence. Recherche grâce au code TVA , on peut aussi le sauver dans un filtre pour retrouver facilement toutes les opérations utilisant ce code-là.

==== Configuration

===== Paramètre

Les numéros de pièces peuvent être : suggérer, automatique ou manuel.

Manuel : l’utilisateur doit lui-même décider du numéro de pièce

Automatique : la pièce est automatiquement numérotée, seul les utilisateurs qui en ont le droit peuvent la changer

Suggérer : la pièce est proposée et tous les utilisateurs peuvent la changer.

===== Sécurité

Afin d’améliorer la sécurité , il est maintenant possible de bloquer le numéro de pièces et d’empêcher le changement depuis COMPANY ou depuis la sécurité des utilisateurs dans les actions C0SEC ,

==== Renforcement des mots de passe.

Le mot de passe doit obligatoirement :

- avoir au moins 8 caractères

- inclure au moins 1 chiffre

- inclure au moins 1 majuscule

- inclure au moins 1 caractères qui ne soit ni une lettre ni un chiffre (virgule, point-virgule, souligné, plus,…​)

==== Développement

===== NOALYSS

https://gitlab.com/noalyss , la branche stable peut être utilisée directement. Unstable , par contre est destiné au développement et à l’intégration des patch

===== Manuel

https://gitlab.com/noalyss/noalyss-documentation

Utilisation d’asciidoc comme format

===== NOALYSS Extension

Pour les extensions standards, le dépôt git fonctionne aussi avec deux branches : stable pour ce qui peut être utilisé et unstable qui est destiné au développement.

==== Extension

===== Rapports avancés

Possibilité de télécharger des rapports à générer , il suffit simplement de cliquer sur Nouveau rapport , choisir l’onglet Téléchargement et sélectionner les rapports que l’on souhaite installer

===== Facturation

Vous pouvez directement transformer la facture en PDF et la télécharger

===== Amortissement

Calcul du prorata en jour (ou mois), même pour des exercices différents d’un an.

Lors de l’ajout de matériel, il est proposé de calculer le nombre de jours.

=== Note de version 9.1 26 février 2023 .1. Taxe additionnelle Possibilité d’ajouter une taxe additionnelle OTAX. Cette taxe est un peu spéciale , elle doit être calculée en plus de la TVA sur le montant hors taxe des articles, comme en Polynésie. Pour ajouter cette taxe, il faut la configurer et décider quels journaux peuvent l’exister.

2. Texte formaté::

Les commentaires et la description dans le suivi utilise peuvent être formatés (gras, souligné,…), ce qui améliore la présentation de vos commentaires et description dans le suivi

3. Ergonomie::

Dans l’historique , on peut voir quelles sont les opérations qui ont une imputation analytique.

L’exercice comptable est un texte libre, ce qui est pratique si on a des exercices à cheval sur deux années, on peut les appeler par exemple 2206-2306 , si elle commence au 1 juin 22 jusqu’au 31 mai 2023 lieu de seulement 2023.

Pour la saisie des dates, on peut utiliser les points , tirets, barres pour séparer les jours , les mois et les années, et l’année peut être donnée sur 2 décimales, cela sera corrigé automatiquement dans le champs de saisie en quittant ce champs.

Ajout des couleurs pour distinguer les différents dossiers (apparence).

Nouvelle icône outils pour chercher une fiche ou en créer une nouvelle.

Possibilité d’agrandir la zone de description et d’ajouter une note lors de saisie d’opérations comptables.

Possibilité de personnaliser le code TVA.

Journaux peuvent être configurés pour utiliser ou non les quantités lors de saisie comptable (journaux d’achat et de vente).

Transformation d’un événement en facture ou note de frais, à configurer dans C0ACT.

4. Autres::

- Correction incompatibilité PHP 8.1 & PHP 8.2.

- Export en PDF d’ANCBCC (Balance croisée comptabilité et comptabilité analytique).

- Nombre maximum de journaux 1295 pour chaque catégorie (achat , vente, opérations diverses, journal financier)

- Mode maintenance en créant un fichier nommé dans le répertoire de « block.html » qui avertira les utilisateurs qu’ils ne peuvent pas utiliser leur dossier pour le moment, et les empêchera de se connecter.

=== Note de version 9.0 30 août 2021

Version majeure de Noalyss

- Ajout des devises étrangères

- Ajout des extensions spécifiques aux smartphones

- Importante réécriture du code

- Amélioration des tests avec PHPUNIT

- Commentaires et texte dans le suivi avec formatage de texte

- Possibilité d’agrandir le libellé d’une opération comptable :

- Le résumé de l’opération pour vente et achat a été déplacé à droite

- Les journaux peuvent être configurés pour que les opérations n’aient pas de colonne pour la quantité *Possibilité d’ajouter une note , depuis la saisie d’une opération, pour les opérations de vente , d’achat ou d’opérations diverses *Modernisation du menu contact, en cliquant sur l’e-mail , il sera proposéd’envoyer un e-mail ,pour le téléphone et le mobile, il sera proposé de choisir l’application pour passer un appel. Dans la colonne e-mail, on peut avoir plusieurs e-mails séparés par une virgule

- Les commentaires , ainsi que les descriptions supportent maintenant la mise en forme du texte

- Depuis l’extension TOOLS [4] , il est possible de mettre une étiquette sur plusieurs opérations en une seule fois

=== Note de version 8.1 février 2021

Menu

  Ouverture par défaut d’un menu choisi

Sécurité

  Sécurité renforcé, en utilisant une clef de session

C0ACT

  Ajout des liens de vidéo-conférence

=== Note de version 8.0 novembre 2020

Etiquette

- Possibilité d’interdire la création d’étiquettes dans C0SEC.

- Possibilité de regrouper les étiquettes.

- Ajout de couleur sur les étiquettes.

- Recherche sur les étiquettes pour les opérations et les actions .Action

- Suivi et amélioration de la recherche.

- Suivi à la création d’une action, on peut lui attribuer des contacts et des étiquettes.

- Actions modulables : on peut personnaliser les actions (C0ACT) en ajoutant ou en retirant des éléments.

- Suivi action, les ‘’autres fiches’’ peuvent avoir des options, les exporter au format CSV.

Fiches concernées

- Possiblité d’ajouter des options aux fiches concernées (C0OPT1).

- Possiblité d’ajouter des éléments de type date, texte, numéro et choix.

- Possiblité de choisir les options de fiches par type de documents (C0ACT)

- Choix des attributs pour la recherche dans CFGATCARD .Recherche de fiches

- Possiblité de rendre une fiche active ou inactive selon son utilité.

- Si le nombre de fiches dépasse le maximum affichable, on peut passer à la page suivante. .Opérations définies

- Réécriture des opérations prédéfinies : présentation plus moderne, on peut modifier et en rajouter. .Sélection par plage

- Possibilité de sélectionner plusieurs éléments en 2clics pour les cases à cocher. .Impression

- Changement et extensions des balises

=== Note de version 7.1 septembre 2019

Résumé TVA (P0TVA)

Création d’un module qui permet d’avoir rapidement le résumé de des codes TVA , par journal et par type de journal. Ce module permet d’avoir en un coup d’œil les totaux pour la TVA tels qu’ils devraient être dans la déclaration TVA. Si cela ne correspond pas, c’est qu’il existe des opérations enregistrées dans les opérations diverses , par exemple : les amendes TVA sont en général saisies comme une opération diverse. Ce module peut facilement être retrouvé dans l’accès direct avec son code P0TVA ou par le navigateur.

Amélioration Comptabilité Analytique* *

L’accent a été mis sur la comptabilité.

Effacer les détails* * Il existe un bouton pour effacer en une fois la répartition de la comptabilité analytique.

Historique

Les opérations avec une opération ont un petit symbole dans l’historique.

Société

On peut changer les postes qui peuvent utiliser la comptabilité analytique, normalement il s’agit que des classes 6 (Charges) et 7 (Produits).

Journaux négatifs (note de crédit)

Pour aider à l’encodage des notes de crédit (Vente et Achat : COMPTA/VENMENU/VEN et COMPTA/MENUACH/ACH. Il y a un paramètre dans le paramétrage du journal ( PARAM/C0JRN) afin d’indiquer que les écritures à enregistrer sont toujours négatives dans ce journal (exemple notes de crédit). C’est seulement un avertissement et cela ne bloque pas l’encodage. Dans C0JRN.

Moyen de paiement

Dans les CSV et PDF , les moyens de paiement sont indiqués , exemple ici avec la fiche BQ (Banque).

=== Note de version 7.0 mars 2018

- La version 6.0 est sortie il y a déjà 6 ans, en janvier 2012, depuis lors énormément de choses ont changées , l’interface, les thèmes, les fonctionnalités …. Aujourd’hui , nous publions la version 7 de Noalyss , celle-ci est une version majeure , interface plus moderne, responsive, *

- http://wiki.noalyss.eu/doku.php?id=…​

=== Note de version 6.9.1 janvier 2016

La structure des fichiers a changé pour pouvoir plus facilement développer et concentrer les personnalisations dans Noalyss/include/config.inc.php

Nouveautés

- Montants sur 4 décimales pour les achats et les ventes, les différents montants calculés (TVA, Non déductible…​) sont arrondis sur 2 décimales.

- Ajout des menus administration , mise à jour et informations systèmes

Bug et améliorations :

*La liste complète peut être obtenue sur le site http://bug.noalyss.eu/http://bug.noalyss.eu]

=== Note de version 6.9 novembre 2015

Nouveautés:

- Balance âgées

- Pense-bête partageable

- Email de l’utilisateur

- Sécurité nouveaux droits

- Ajout d’événement depuis le tableau de bord

- Ajout des derniers événements sur le tableau de bord

Améliorations:

- Amélioration sérieuse des thèmes

- Zoom du pense-bête

- Zoom du calendrier

- Possibilité de voir votre calendrier en mode liste

- Extourne possible à la confirmation de l’encodage d’une opération

- Partie administration de l’application

- P0BAL ajout du solde quand les niveaux sont utilisés

- ergonomie apparition d’un bouton « retour haut de page »

- Le code des fiches peut contenir des points, double-point, souligné ou trait d’union

=== Note de version 6.7.2 janvier 2014

Changement de nom, PhpCompta devient NOALYSS

Corrections:

- Passage à CSS3 & HTML5, compatibilité avec IE 9

- Correction impression journaux, export en CSV et PDF

- Recherche dans la gestion sur base d’un profil

=== Note de version 6.7 novembre 2013

Dernière version de PhpCompta

Nouveautés :

- Possibilité d’ajouter des tags aux actions. Pour mieux classer les documents et le suivi

- Navigateur pour retrouver plus facilement le menu à utiliser

- Favoris pour conserver les menus les plus utilisés

- Date de paiement ajoutée aux opérations d’achat ou de vente, pour se conformer à la nouvelle méthode de calcul de la TVA

=== Note de version 6.6 juin 2013

Nouveautés

- Fonctionne en mode hébergé avec une seule base de données

- Minimum de lignes à afficher par journal

- Correction des opérations prédéfinies

- Mise en évidence des opérations lettrées.

- Filtrage simple de certains tableau (balance, dossier…​)

- Nouveau logo

- Nom des documents générés contient le numéro de pièce justificative.

- Ajout d’une description pour les catégories de fiches

- Ajout du quickcode dans le plan comptable

Améliorations

- Amélioration des longues lignes dans les PDF

- Meilleure navigation avec la touche tabulation quand on encode des opérations

- Avertissement plus visible en cas où la TVA calculée et celle donnée sont différentes.

- Affichage des opérations en retard de paiement ou les actions en retard dans le tableau de bord

=== Note de version 6.5 (Juillet 2012)

Nouveautés

- Gestion du multidépôt,, l’historique des mouvements de dépôts, inventaires

- Ajout Etat Document,

- Nouveaux style d’attribut : Fiche ou sélection, permet de faire correspondre des fiches entres elles, exemple : stock et marchandises, contact et sociétés

- Génération de document : nouveau champs disponibles sont

- ACOMPTE : acompte déduit lorsqu’on utilise le mode de paiement lors d’un achat et d’une vente.

- ATTRx Donne la valeur de l’attribut x de la marchandise ou du service vendu ou acheté

- BENEFATTRx Donne la valeur de l’attribut x du mode de paiement

- CUSTATTRx Donne la valeur de l’attribut x du client ou du fournisseur

Améliorations

- Action – Gestion : possibilité de lier plusieurs autres actions et des opérations comptables, possibilité d’ajouter des commentaires, amélioration de la recherche et sécurité

- Numéro de pièce pour les actions gestions

- encodage des opérations financières par date d’extrait ou d’opérations

- Export PDF : retour à la ligne si les commentaires sont trop longs

Notes :
Réécriture complète du menu Fiche, c’était du vieux code illisible. Ce module a été divisé en 2, l’un pour ajouter, déplacer, modifier des fiches, voir leur liste, résumé, historique…​ L’autre pour configurer les catégories de fiches.
Dans le tableau d’accueil, on voit l’action dont la date de rappel est la date du jour et qui appartient à l’un des profils auxquels vous avez accès ; le tableau d’accueil montre aussi les dernières opérations, elles sont filtrées par l’accès de l’utilisateur aux journaux.

=== Note de version 6.0 (Décembre 2011)

Nouveautés

- Menu complètement configurable, de ce fait, les plugins peuvent apparaître dans n’importe quel menu, sous-menu…​

- Sécurité renforcée, basée sur le profil qui est l’ensemble des menus accessibles à l’utilisateur

- Export du Grand Livre Analytique en CSV

- Les différents configuration de menus sont rassemblé dans des profils, le nombre de profils par dossier est illimité, ils sont configurés dans C0PROFL.

- Accès direct vous permet d’aller directement à l’endroit que vous souhaitez en donnant le code du menu, pendant la frappe, les menus possibles apparaissent (auto-complete).

- Compte alphanumérique, NOALYSS peut utiliser des postes comptables alphanumériques, si le poste comptable est calculé automatiquement alors par défaut NOALYSS créera un poste comptable en ajoutant le nom de la fiche à la classe de base.

- Compte de TVA qui augmente au débit et au crédit, pour certains cas particuliers.

- Nouveau thème dont la police est plus grande

- Dans catégorie fiche, il est possible d’avoir les balances ou l’historique de toutes les fiches

- Possibilité d’éditer les détails dans les journaux achats et ventes, à changer dans COMPANY

Améliorations

- Comptabilité analytique : lors de l’imputation, la valeur qui reste à affecter est directement calculé.

- A l’enregistrement de l’opération, il est présenté un résumé de l’opération qui vient d’être enregistrée.

- Les réconciliations se font dans une fenêtre interne (avant c’était un popup)

- Comptabilité analytique : recherche de fiche dans une fenêtre interne

- Tri apparaissent dans certains menu (sécurité → utilisateurs (SECUSER), administration → utilisateur, …)

- réconciliation n’utilise plus une fenêtre extérieure (popup)

- Possibilité de changer le type d’un document dans le suivi

- Résumé de l’opération enregistrée au lieu d’un simple lien vers le détail de l’opération

- En cas de rapprochement, même avec plusieurs opérations, il y aura un lettrage automatique.

- Amélioration des lettrages multiples (1 à n)

- Mode de paiement se font dorénavant par journaux et non plus par type de journaux

=== Note de version 5.6 (mai 2011)

Nouveautés

- Comptabilité analytique : groupe

- Amélioration ergonomie comptabilité analytique

- Compta analytique → financier

- Le grand livre analytique

- Liaison compta analytique → compta générale

- Balance : uniquement les comptes non soldés pour les fiches et les postes comptables

- Voir le tiers dans les historiques

Bugs corrigés

- Problème de date en comptabilité analytique : synchro

- CA : bug dans la balance double

- CA Opération diverses

- Problème export CSV historique sans le signe moins pour financier

- Impossibilité de réinitialiser le mot de passe

=== Note de version 5.5 (1 mars 2011)

Nouveautés

- Date dans les détails

- Balance avec des niveaux

- Lettrage dans le grand livre

Bugs :

- Export CSV de l’historique pour les financiers

- Génération de facture

- Moyen de paiement incorrect

- On ne voyait que les Xiers dossiers dans l’administration

=== Note de version 5.4 (février 2011)

Nouveautés

- Adaptation pour les dossiers contenant plusieurs années

- Contrepartie pour les dépenses non admises et les dépenses du gérants configurable par fiche

- 2 nouvelles sortes d’attribut : les postes et les cards, le premier pour les postes comptables et le second pour les fiches

- Export CSV de tout historique : depuis la recherche, la liste des opérations de tous les journaux.

- Modification d’une fiche dans un popup html

- Depuis le détail d’une fiche, on peut en avoir la balance

- La partie gestion, pour les clients, les fournisseurs et les administrations, il y a en plus, les balances

- Prévisions peuvent être faites à cheval sur plusieurs années

Amélioration

Amélioration pour les dossiers contenant plusieurs années : balance, bilan, rapport et historique peuvent changer d’année, les détails des opérations permettent de changer d’exercice,…​

=== Note de version 5.3 (décembre 2010)

Nouveautés

- Possibilité de réouvrir des périodes fermées

- Changement de la date de l’opération dans le détail opérations

- Ajout de commentaire possible dans le détail des opérations

- Ajout d’une limite de dates dans les prévisions

- Ajout de couleur dans les prévisions

- Ajout de l’export de l’historique d’un compte ou d’une fiche, en csv ou en pdf depuis une fenêtre « pop me up »

- Déplacement du menu période dans le menu Paramètre

- Audit des personnes se connectant ou essayant de se connecter

- Ajout d’un captcha (optionnel)

Améliorations

- Traitement des fiches plus rapide

- Apparence des montants

- Apparence des fiches, détail et historique

- Support Postgresql 9

=== Note de version 5.2 (août 2010)

Mise à jour

- modifier vos journaux de banque pour utiliser une fiche de banque

- Les notes de frais doivent utiliser les tags commençant par BENEF_*

Changements

- Ajout balance par catégorie de fiche

- Quand on demande le détail d’une opération, on peut l’imprimer et voir tous les détails de cette opération si on clique sur popme up. Les détails pour les opérations analytiques ne sont visible que dans le popup.

- En cliquant sur un numéro interne, on a le détail de l’opération mais à l’intérieur de la page et non plus dans un popup

- Dans les détails d’opérations, on a aussi des liens vers les historiques par fiche ou par poste comptable, si on clique sur une fiche ou sur un poste comptable

- Depuis les impressions → balances et impression → poste, on a les détails des opérations ainsi que dans impression → poste

- Pour les balances, on peut choisir les journaux : adapté à ceux en ayant vraiment beaucoup

- Depuis les lettrages, on peut aussi accéder aux détails d’une opération

- Le menu Grand Livre devient le menu Historique

- Il est possible d’ajouter des détails aux catégories de fiche ainsi que leur type c’est-à-dire soit du texte soit des nombres soit une date, soit une zone. La longueur peut-être définie mais limitée à 22 caractères, sauf les dates et les zones dont les tailles sont fixes

- Impression - Rapprochement

- confirmation quand effacement d’un Plan Analytique (comptabilité analytique → Plan Analytique)

- Déplacement de fiche : les attributs manquant sont ajoutés !

- Dans les balances, on peut choisir plusieurs journaux ou plusieurs cat. de journal. Les données sont filtrées en plus d’après la sécurité

- Dans impression → poste, on peut filtrer les opérations suivant qu’elles sont lettrées ou non.

- Après avoir sauvé une opération, vous pouvez avoir le détail de l’opération en cliquant sur le numéro interne qui s’affiche

- Les journaux FIN doivent être attachés à un compte en banque et uniquement un A propos du mode de paiement : on ne change rien mais il faut que dans la doc, il est précisé qu’il faut paramétrer le moyen de paiement comme le journal FIN

- Ajout bouton "ajoutez ligne" pour les OD en CA

- Ajout bouton "ajoutez ligne" pour les prévisions

- Ajout l’impression pour les lettrages par poste comptables

- Les historiques des fiches et postes comptables (impression → poste et impression et catégorie → historique) ont un solde progressif

- La recherche peut se faire dans plusieurs journaux à la fois

- Les balances peuvent être faites pour plusieurs journaux ou par catégorie de journal

- Amélioration de la vérification de la comptabilité (Avancé → Vérification)

- La date par défaut quand on encode une nouvelle écriture, est la date de la dernière écriture du journal choisi.

- Pour les opérations de banque, on peut choisir de numéroter chaque opération, ou de donner à chacune le même numéro d’extrait (relevé bancaire)

- Rapprochement bancaire : dans le cas où on encode directement la méthode de paiement, on peut retrouver les opérations concernées et leur donner comme numéro de pièce le numéro d’extrait de compte (= numéro du relevé bancaire, numéro du relevé visa,numéro du relevé de la caisse)

=== Note de version 5.1 (mai 2010)

1. Plan comptable est maintenant alphanumérique, la numérotation automatique ne fonctionne pas si le poste comptable contient autre chose que des chiffres.

2. Cependant il n’est pas encore permis d’y mettre aucune chose que des chiffres Document : dans la liste des documents, on a dorénavant ceux qui en dépendent indirectement Exemple

   - Document A en relation avec Document B

   - Document C en relation avec Document B

   - Avant dans les documents liés, on ne voyait que le document B dans la liste des documents liés de A

   - Avec la nouvelle version, on voit dans la liste du document A, le document B &C

3.Lettrage

- La réconciliation ou rapprochement fait correspondre une ou plusieurs opérations comptables

- Le lettrage lui, agit à un niveau plus bas en faisant correspondre, une ligne d’opération comptable à une autre mais uniquement entre poste comptable identique.

- Typiquement, il s’agit d’un débit qui correspond à un crédit

4 TVA : Se choisit maintenant dans un popup au lieu d’une liste select

5 Impression :

- nouveau menu Catégorie, vous permet de visualiser par catégorie de fiche avec l’historique des opérations ou simplement le résumé.

- nouveau (contribution) une nouvelle possibilité est d’imprimer le grand livre * nouveau : support complet de l’Unicode pour les impressions

- Les impressions de journaux d’achat et de vente sont classés par numéro de pièces justificatives, sans tenir compte du préfixe. Dès lors la centralisation est considérée comme obsolète et sera supprimée.

6 Écriture directe (re) devient Opérations Diverses
7 Ajout du lettrage dans la plupart des impressions
8 Extension : vérification du chemin
9 Dans paramètre→journaux : amélioration de la présentation de la numérotation des pièces justificatives.
10 Fiche : possibilité de déplacer les fiches dans une autre catégorie, attention les attributs n’existant pas dans la catégorie cible seront supprimés
11 Amélioration de l’esthétique
12 A cause de php 5.3, on n’utilise plus PHPSESSID mais plutôt un cookie
13 Les banques utilisent des n° de PJ, chaque opération sera donc la PJ suivi du n° d’opération

- exemple PJ = FIN1

- opération 1 = FIN1001

- opération 2 = FIN1002

- opération 3 = FIN1003

il est préférable d’avoir un préfixe différent pour chaque banque, il est plus facile d’utiliser un journal par compte en banque
14. Pour le pense bête, changement cosmétique
15. Opérations Diverses fonctionne comme les autres journaux : soit on spécifie la période soit la période est déduite de la date
16. La calculatrice est dans un bouton
17. Possibilité d’avoir la date de la période ou vide pour les achat, ventes, opérations diverses et banque, à changer dans paramètre→société : suggérer date

=== Note de version 5.0 (janvier 2010)

- Ajout d’une fonctionnalité d’Auto Completion : dans les champs où sont entrés le quick code d’une fiche, la recherche se fait sur le quick-code et le nom

- Protection contre les doubles encodages dans les opérations comptables,

- Ajout d’une recherche avancée :Pour chaque journal, dans "voir opération", il y a dorénavant une recherche avancée. La période ne doit plus être choisie dans les journaux comptable mais peut-être déduite, cela dépend d’un paramètre dans"Paramètre→Société".

- Le module gestion ne permet plus d’encoder des factures mais est axé vers un meilleur suivi pour les clients, fournisseurs et administration.

- Chaque action du suivi, peut contenir plusieurs documents générés, la liste des documents générés est plus complète et contient en autre bons de commande (client ou fournisseur) et bordereau de livraison

- Calendrier

- pour récapituler le suivi.

- Création d’un tableau de bord plus complet.

- Remplacement du module Budget qui n’était pas vraiment utilisable par le module Prévision.

- Module Plugin (Extension) afin d’ajouter facilement des extensions au système.

=== Note de version 4.3 (février 2009)

La nouvelle version de NOALYSS vient de sortir, en plus de la correction de certains bugs, cette version contient une réécriture complète de la partie sécurité, un support pour les non assujetti à la TVA, ainsi que la numérotation automatique des pièces justificatives avec préfixe et évidemment un contrôle pour que le numéro de pièce soit unique. Pour la génération des documents, deux nouveaux tags sont apparus :

- pj reprend le n° de pièce justificative

- user reprend le nom de la personne qui a généré le document

=== Note de version 4.2 novembre 2008

1.Le mode strict : dans paramètre → société, on peut activer le mode strict ; dans ce mode-là, il n’est plus possible de créer une opération antérieure à la dernière entrée d’un journal. Ce qui implique que les opérations doivent être encodées dans l’ordre chronologique. De plus, il n’est plus possible d’effacer une opération. 2. La génération de note de frais : quand vous faites une dépense vous pourrez demander à générer une note de frais 3. Pour les factures et les dépenses, il est dorénavant possible d’indiquer directement si l’opération est payée et comment, avant de l’utiliser la première fois, il est impératif d’aller dans paramètre→divers→Moyen de paiement et de paramétrer correctement en complétant les données : journal où le paiement sera sauvegardée, la fiche de paiement par défaut ou la catégorie de fiche à utiliser)S’il n’y a pas de fiche par défaut, il faudra à chaque facture ou dépense indiquer la fiche de la catégorie indiquée.

Il existe donc aussi une nouvelle catégorie de fiche : compte Administrateur ou salarié. Ainsi que 2 nouveaux tags pour la génération de document CUST_BANQUE_NO et CUST_BANQUE_NAME. Il y a quelques exemples NOALYSS/contrib/documentâtes

Note | Les notes de version entre 2003 et 2008 ont été volontairement omises

=== Première version 31 juillet 2003 Serveur de comptabilité entièrement web based

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
2. C’est l’accès direct AD
3. c’est le nombre avant la catégorie
4. https://wiki.noalyss.eu
5. Vérifie que vous pouvez encore déduire une facture passée pour la TVA et l’impôt
6. https://wiki.noalyss.eu
7. le 31 décembre mais cela pourrait être une autre date
8. Pour imprimer les bilans il y a aussi l’extension "Bilan Interne" ou un rapport avancé
9. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
10. https://wiki.noalyss.eu
11. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
12. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
13. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
14. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
15. Il existe aussi les actifs inversés, charges inversées…​
16. 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
17. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
18. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
19. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
20. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
21. Il faut d’abord créer la nouvelle année.
22. extrait de compte
23. extrait de compte
24. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins
25. 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
2. NOALYSS n’est pas à 100% documenté, on l’améliore à chaque version
3. voir noalyss/html/ajax_misc.php.
4. Plugins standards de NOALYSS, https://gitlab.com/noalyss/noalyss-plugins