noalyss-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Noalyss-commit] [noalyss] 44/119: Fix: predefined operation with overfl


From: Dany De Bontridder
Subject: [Noalyss-commit] [noalyss] 44/119: Fix: predefined operation with overflow for details
Date: Mon, 26 Oct 2020 18:27:15 -0400 (EDT)

sparkyx pushed a commit to branch master
in repository noalyss.

commit 47cb4285d9eef2791e0ebb0c2d492dc35616a16a
Author: Dany De Bontridder <danydb@noalyss.eu>
AuthorDate: Fri Oct 2 18:23:37 2020 +0200

    Fix: predefined operation with overflow for details
    
    Follow Up : operation detail moved from Follow_up to Follow_Up_Detail
    Add Option for Follow Up
    Add option for contact in follow up
    rename cfgcat to  cfgaction
    rewriting of cfgcatdoc
---
 html/ajax_misc.php                                 |  58 +------
 html/js/scripts.js                                 |  28 ++-
 include/cat_document.inc.php                       |  90 ----------
 include/cfg_action.inc.php                         |  44 +++++
 .../class/action_document_type_mtable.class.php    | 190 ++++++++++++++++++++
 include/class/document_option.class.php            |  88 ++++++++++
 include/class/document_type.class.php              |  42 +----
 include/class/follow_up.class.php                  | 111 +-----------
 include/class/follow_up_detail.class.php           |   5 +
 include/class/operation_predef_mtable.class.php    |   2 +-
 include/class/pre_op_advanced.class.php            |   5 +-
 include/database/contact_option_ref_sql.class.php  |  66 +++++++
 include/lib/manage_table_sql.class.php             |  13 +-
 include/template/detail-action.php                 | 151 ++++------------
 include/template/document_mod_change.php           |  87 ----------
 include/template/follow_up_detail_display.php      | 191 +++++++++++++++++++++
 include/template/predf_ledger_detail.php           |   2 +-
 sql/upgrade.sql                                    |  91 ++++++++++
 18 files changed, 771 insertions(+), 493 deletions(-)

diff --git a/html/ajax_misc.php b/html/ajax_misc.php
index 2e2e258..3ac6686 100644
--- a/html/ajax_misc.php
+++ b/html/ajax_misc.php
@@ -257,7 +257,11 @@ $path = array(
     // payment_method
     "payment_method"=>"ajax_payment_method",
     // update list of predefined operation if ledger changes
-    "up_predef"=>"ajax_update_predef"
+    "up_predef"=>"ajax_update_predef",
+    // cfgaction type of document
+    "cfgaction"=>'ajax_cfgaction',
+    // list options for multiple contact
+    "contact_option_list"=>'ajax_contact_option_list'
 )    ;
 
 if (array_key_exists($op, $path)) {
@@ -388,58 +392,8 @@ EOF;
 </data>
 EOF;
                break;
-       /* rem a cat of document */
-       case 'rem_cat_doc':
-               require_once NOALYSS_INCLUDE.'/class/document_type.class.php';
-               // if user can not return error message
-                $message="";
-               if ($g_user->check_action(PARCATDOC) == 0)
-               {
-                       $html = "nok";
-                        $message=_('Action non autorisée');
-                       header('Content-type: text/xml; charset=UTF-8');
-                       echo <<<EOF
-<?xml version="1.0" encoding="UTF-8"?>
-<data>
-<dtid>$html</dtid>
-<message>$message</message>                                
-</data>
-EOF;
-                       return;
-               }
-               // remove the cat if no action
-               $count_md = $cn->get_value('select count(*) from 
document_modele where md_type=$1', array($dt_id));
-               $count_a = $cn->get_value('select count(*) from action_gestion 
where ag_type=$1', array($dt_id));
+       
 
-               if ($count_md != 0 || $count_a != 0)
-               {
-                    $message=_('Des actions dépendent de cette catégorie');
-                       $html = "nok";
-                       header('Content-type: text/xml; charset=UTF-8');
-                       echo <<<EOF
-<?xml version="1.0" encoding="UTF-8"?>
-<data>
-<dtid>$html</dtid>
-<message>$message</message>                                
-</data>
-EOF;
-                       exit;
-               }
-               $cn->exec_sql('delete from document_type where dt_id=$1', 
array($dt_id));
-               $html = $dt_id;
-               header('Content-type: text/xml; charset=UTF-8');
-               echo <<<EOF
-<?xml version="1.0" encoding="UTF-8"?>
-<data>
-<dtid>$html</dtid>
-<message>$message</message>                                
-</data>
-EOF;
-               return;
-               break;
-       case 'mod_cat_doc':
-               require_once NOALYSS_TEMPLATE.'/document_mod_change.php';
-               break;
        case 'dsp_tva':
                $cn = Dossier::connect();
             // Filter the VAT 
diff --git a/html/js/scripts.js b/html/js/scripts.js
index 3bd5e75..f590702 100644
--- a/html/js/scripts.js
+++ b/html/js/scripts.js
@@ -26,7 +26,25 @@
 var ask_reload = 0;
 var tag_choose = '';
 var aDraggableElement = new Array();
-
+/**
+ * return undefined if nothing is found , otherwise return the DOM elemnt
+ * @param {type} p_name_dom
+ * @param {type} name_child
+ * @returns {undefined}
+ */
+function in_child(p_element,name_child) {
+    var element=p_element
+    if ( typeof p_element !== "object" ) {
+      element=document.getElementById(p_element);
+        
+    }
+    if ( ! element ) return undefined;
+    for ( var e=0; e < element.childElementCount;e++) {
+        if ( element.childNodes[e].id == name_child) {
+            return element.childNodes[e];
+        }
+    }
+}
 /**
  * callback function when we just need to update a hidden div with an info
  * message
@@ -2115,7 +2133,13 @@ function view_action(ag_id, dossier, modify)
                         });
                         $(id).innerHTML = code_html;
                         if (ctl_txt == 'ok') {
-                            compute_all_ledger();
+                            // compute detail
+                            var detail=in_child(id,"follow_up_detail");
+                            if (detail) {   
+                              compute_all_ledger();
+                            }
+                                             
+                            
                         }
                         code_html.evalScripts();
                     } catch (e) {
diff --git a/include/cat_document.inc.php b/include/cat_document.inc.php
deleted file mode 100644
index fe3a7b3..0000000
--- a/include/cat_document.inc.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-/*
- *   This file is part of NOALYSS.
- *
- *   NOALYSS is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   NOALYSS is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with NOALYSS; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-// Copyright Author Dany De Bontridder danydb@aevalys.eu
-
-/*!\file
- * \brief this file is included to perform modification on category of document
- * table document_type
- */
-
-// show list of document
-if (!defined('ALLOWED'))
-    die('Appel direct ne sont pas permis');
-require_once NOALYSS_INCLUDE.'/class/document_type.class.php';
-
-global $http;
-
-if (isset($_POST['add']))
-{
-    $catDoc=new Document_Type($cn);
-    try
-    {
-        $cat=$http->post('cat');
-        $prefix=$http->post('prefix');
-        $catDoc->insert($cat, $prefix);
-    }
-    catch (Exception $exc)
-    {
-        echo $exc->getMessage();
-        error_log($exc->getTraceAsString());
-    }
-}
-if (isset($_POST['save']))
-{
-    try
-    {
-        $dt_id=$http->post("dt_id", "number");
-        $name=
-        $prefix=
-        $catDoc=new Document_Type($cn, $dt_id);
-        $catDoc->get();
-        $catDoc->dt_value=trim($http->post("dt_name"));;
-        $catDoc->dt_prefix=trim($http->post("dt_prefix"));
-        if ($catDoc->dt_value=="")
-        {
-            alert(_("Le nom ne peut pas être vide"));
-        }
-        else
-        {
-            $catDoc->update();
-        }
-        if ($_POST['seq']!=0&&isNumber($_POST['seq'])==1)
-        {
-            $catDoc->set_number($_POST['seq']);
-        }
-    }
-    catch (Exception $exc)
-    {
-        alert ($exc->getMessage());
-        error_log($exc->getTraceAsString());
-    }
-}
-$aList=Document_Type::get_list($cn);
-$addCat=new IText('cat');
-$addPrefix=new IText('prefix');
-$str_addCat=$addCat->input();
-$str_addPrefix=$addPrefix->input();
-$str_submit=HtmlInput::submit('add', _('Ajout'));
-echo '<div class="content">';
-require_once NOALYSS_TEMPLATE.'/list_category_document.php';
-
-echo '</div>';
-?>
diff --git a/include/cfg_action.inc.php b/include/cfg_action.inc.php
new file mode 100644
index 0000000..77a29ba
--- /dev/null
+++ b/include/cfg_action.inc.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   NOALYSS is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   NOALYSS is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with NOALYSS; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+// Copyright Author Dany De Bontridder danydb@aevalys.eu
+
+/*!\file
+ * \brief this file is included to perform modification on category of 
document (= action)
+ * table document_type
+ */
+
+// show list of document
+if (!defined('ALLOWED'))     die('Appel direct ne sont pas permis');
+require_once NOALYSS_INCLUDE."/class/action_document_type_mtable.class.php";
+echo '<div class="content">';
+$doc_type=new Document_type_SQL($cn);
+$action_document_type=new Action_Document_Type_MTable($doc_type);
+
+$action_document_type->set_callback("ajax_misc.php");
+$action_document_type->add_json_param("op", "cfgaction");
+
+$action_document_type->create_js_script();
+$action_document_type->display_table("order by dt_value");
+?>
+</div>
+
+
+ 
\ No newline at end of file
diff --git a/include/class/action_document_type_mtable.class.php 
b/include/class/action_document_type_mtable.class.php
new file mode 100644
index 0000000..b6fb263
--- /dev/null
+++ b/include/class/action_document_type_mtable.class.php
@@ -0,0 +1,190 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2019) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/* @file
+ * @brief  display and allow to update , add , delete document_type for the 
follow up
+ * 
+ */
+require_once NOALYSS_INCLUDE."/lib/manage_table_sql.class.php";
+require_once NOALYSS_INCLUDE."/database/document_type_sql.class.php";
+
+/**
+ * @class 
+ * @brief display , modify and add document_type for follow up
+ * @see include/ajax/ajax_cfgaction.php
+ * @see include/cfg_action.inc.php
+ */
+class Action_Document_Type_MTable extends Manage_Table_SQL
+{
+
+    private $other; //!< Other value 
+
+    public function __construct(Document_type_SQL $doc_type)
+    {
+        parent::__construct($doc_type);
+        $this->set_order(["dt_id", "dt_prefix", "dt_value",]);
+        $this->set_property_updatable("dt_id", false);
+        $this->set_property_visible("dt_id", false);
+        $this->set_property_updatable("dt_value", true);
+        $this->set_property_updatable("dt_prefix", true);
+        $this->set_col_label("dt_value", _("Nom"));
+        $this->set_col_label("dt_prefix", _("Préfixe document"));
+        $this->other=array();
+    }
+
+    /**
+     * 
+      @code
+      table    "public.document_type"
+      ctl_id   "dtr"
+      gDossier "74"
+      op       "cfgaction"
+      p_id     "28"
+      action   "save"
+      ctl      "tbl5f785d403b123"
+      dt_prefix        "ABO.HEB"
+      dt_value "Abonnements+PhpCompta"
+      seq      "0"
+      det_op   "1"
+      det_contact_mul  "1"
+      update   "OK"
+      @endcode
+     * 
+     * 
+     *       
+     */
+    public function from_request()
+    {
+        $http=new HttpInput();
+        $this->table->dt_value=$http->request('dt_value');
+        $this->table->dt_prefix=$http->request('dt_prefix');
+        $this->other['detail_operation']=$http->request("detail_operation", 
"string", 0);
+        $this->other['contact_multiple']=$http->request("det_contact_mul", 
"string", 0);
+        $this->other['make_invoice']=$http->request("make_invoice", "string", 
0);
+        $this->other['seq']=$http->request("seq", "string", 0);
+    }
+
+    /**
+     * 
+     */
+    public function check()
+    {
+        $table=$this->get_table();
+        $error=0;
+        if (empty(trim($table->dt_value)))
+        {
+            $this->set_error("dt_value", _("Nom ne peut être vide"));
+            $error++;
+        }
+        if (empty(trim($table->dt_prefix)))
+        {
+            $this->set_error("dt_prefix", _("Préfixe ne peut être vide"));
+            $error++;
+        }
+        // Check doublon
+        if ($table->cn->get_value('select count(*) from document_type where 
upper(dt_value)=upper($1) and dt_id <> $2',
+                        [$table->dt_value, $table->dt_id])>0)
+        {
+            $this->set_error("dt_value", _("Doublon, ce nom existe déjà "));
+            $error++;
+        }
+        // Check doublon
+        if ($table->cn->get_value('select count(*) from document_type where 
upper(dt_prefix)=upper($1) and dt_id <> $2',
+                        [$table->dt_prefix, $table->dt_id])>0)
+        {
+            $this->set_error("dt_value", _("Doublon, ce préfixe existe déjà 
"));
+            $error++;
+        }
+        if ($error>0)
+            return false;
+        return true;
+    }
+
+    /**
+     * 
+     * @throws Exception
+     */
+    function delete()
+    {
+        $table=$this->get_table();
+        try
+        {
+            // remove the cat if no action
+            $count_md=$table->cn->get_value('select count(*) from 
document_modele where md_type=$1',
+                    array($table->dt_id));
+            $count_a=$table->cn->get_value('select count(*) from 
action_gestion where ag_type=$1', array($table->dt_id));
+
+            if ($count_md!=0||$count_a!=0)
+            {
+                throw new Exception(_('Des actions dépendent de cette 
catégorie'), 1300);
+            }
+            $table->delete();
+        }
+        catch (Exception $exc)
+        {
+            if ($exc->getCode()!=1300)
+            {
+                record_log("ADTM01".$exc->getTrace());
+            }
+            throw new Exception($exc->getMessage());
+        }
+    }
+
+    /**
+     * @brief display the box for adding, the name for p_id , are in the form 
+     */
+    function input()
+    {
+        parent::input();
+        require NOALYSS_TEMPLATE."/action_document_type_mtable_input.php";
+    }
+
+    /**
+     * save
+     */
+    function save()
+    {
+        parent::save();
+        $cn=Dossier::connect();
+        $object_sql=$this->get_table();
+        // restart sequence
+        if ($this->other['seq']!=0)
+        {
+            $doc_type=new Document_type($cn, $object_sql->dt_id);
+            $doc_type->set_number($this->other['seq']);
+        }
+        // Save detail operation
+        $cn->exec_sql("insert into document_option 
(do_code,document_type_id,do_enable) values ($1,$2,$3) 
+            on conflict on constraint document_option_un
+            do update set do_enable=$3", ["detail_operation", 
$object_sql->dt_id, $this->other['detail_operation']]);
+
+        // Save contact_multiple
+        $cn->exec_sql("insert into document_option 
(do_code,document_type_id,do_enable) values ($1,$2,$3) 
+            on conflict on constraint document_option_un
+            do update set do_enable=$3 ", ["contact_multiple", 
$object_sql->dt_id, $this->other['contact_multiple']]);
+        
+        // Save make invoice
+        $cn->exec_sql("insert into document_option 
(do_code,document_type_id,do_enable) values ($1,$2,$3) 
+            on conflict on constraint document_option_un
+            do update set do_enable=$3 ", ["make_invoice", $object_sql->dt_id, 
$this->other['make_invoice']]);
+    }
+
+}
diff --git a/include/class/document_option.class.php 
b/include/class/document_option.class.php
new file mode 100644
index 0000000..5d68874
--- /dev/null
+++ b/include/class/document_option.class.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2020) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief 
+ */
+
+/**
+ * @class
+ * @brief
+ */
+class Document_Option
+{
+
+    /**
+     * returns true if the operation_detail is enable, otherwise false
+     * 
+     * @param int $p_document_type Document_Type.dt_id
+     * @return boolean
+     */
+    static function is_enable_operation_detail($p_document_type)
+    {
+        $display_operation=false;
+        $cn=Dossier::connect();
+        if ($cn->get_value("select do_enable from document_option where 
document_type_id=$1 and do_code = $2",
+                        [$p_document_type, 'detail_operation'])=='1')
+        {
+            $display_operation=true;
+        }
+        return $display_operation;
+    }
+
+    /**
+     * returns true if the operation_detail is enable, otherwise false
+     * 
+     * @param int $p_document_type Document_Type.dt_id
+     * @return boolean
+     */
+    static function is_enable_contact_multiple($p_document_type)
+    {
+        $return=false;
+        $cn=Dossier::connect();
+        if ($cn->get_value("select do_enable from document_option where 
document_type_id=$1 and do_code = $2",
+                        [$p_document_type, 'contact_multiple'])=='1')
+        {
+            $return=true;
+        }
+        return $return;
+    }
+
+    /**
+     * returns true if the operation_detail is enable, otherwise false
+     * 
+     * @param int $p_document_type Document_Type.dt_id
+     * @return boolean
+     */
+    static function is_enable_make_invoice($p_document_type)
+    {
+        $return=false;
+        $cn=Dossier::connect();
+        if ($cn->get_value("select do_enable from document_option where 
document_type_id=$1 and do_code = $2",
+                        [$p_document_type, 'make_invoice'])=='1')
+        {
+            $return=true;
+        }
+        return $return;
+    }
+
+}
diff --git a/include/class/document_type.class.php 
b/include/class/document_type.class.php
index 8f0d2fb..9462026 100644
--- a/include/class/document_type.class.php
+++ b/include/class/document_type.class.php
@@ -23,7 +23,9 @@
  * \brief  class for the table document_type
  */
 
-/** \brief class for the table document_type
+/** \
+ *@brief class for the table document_type , a document_type is a kind of 
action in the follow up
+ * 
  * < dt_id pk document_type
  * < dt_value value
  */
@@ -91,40 +93,10 @@ class Document_type
                return $array;
        }
 
-       function insert($p_value, $p_prefix)
-       {
-               $sql = "insert into document_type(dt_value,dt_prefix) values 
($1,$2)";
-               try
-               {
-                       if ($this->db->count_sql('select * from document_type 
where upper(dt_value)=upper(trim($1))', array($p_value)) > 0)
-                               throw new Exception('Nom en double');
-                       if (strlen(trim($p_value)) > 0)
-                               $this->db->exec_sql($sql, array($p_value, 
$p_prefix));
-               }
-               catch (Exception $e)
-               {
-                      record_log($e);
-                       alert(j(_("Impossible d'ajouter [$p_value] ") . 
$e->getMessage()));
-               }
-       }
-
-       /**
-        * Update
-        */
-       function update()
-       {
-               try
-               {
-                       $this->db->exec_sql("update document_type set 
dt_value=$1,dt_prefix=$2 where dt_id=$3", array($this->dt_value,
-                               $this->dt_prefix, $this->dt_id));
-               }
-               catch (Exception $e)
-               {
-                      record_log($e);
-                       alert(" Erreur " . $e->getMessage());
-               }
-       }
-
+        /**
+         * Restart the increment of the document
+         * @param type $p_int
+         */
        function set_number($p_int)
        {
                try
diff --git a/include/class/follow_up.class.php 
b/include/class/follow_up.class.php
index 48ad1e2..3aa0b6d 100644
--- a/include/class/follow_up.class.php
+++ b/include/class/follow_up.class.php
@@ -31,6 +31,7 @@ require_once NOALYSS_INCLUDE.'/class/fiche.class.php';
 require_once NOALYSS_INCLUDE.'/class/document.class.php';
 require_once NOALYSS_INCLUDE.'/class/document_type.class.php';
 require_once NOALYSS_INCLUDE.'/class/document_modele.class.php';
+require_once NOALYSS_INCLUDE.'/class/document_option.class.php';
 require_once NOALYSS_INCLUDE.'/lib/user_common.php';
 require_once NOALYSS_INCLUDE.'/class/follow_up_detail.class.php';
 require_once NOALYSS_INCLUDE.'/lib/inum.class.php';
@@ -152,7 +153,7 @@ class Follow_Up
      *
      * \return string containing the html code
      */
-    function Display($p_view, $p_gen, $p_base, $retour="")
+    function display($p_view, $p_gen, $p_base, $retour="")
     {
         global $g_user;
         if ($p_view=='UPD')
@@ -175,6 +176,8 @@ class Follow_Up
         {
             throw new Exception('class_action'.__LINE__.'Follow_Up::Display 
error unknown parameter'.$p_view);
         }
+        
+       
         // Compute the widget
         // Date
         $date=new IDate();
@@ -428,108 +431,9 @@ class Follow_Up
         $text=new IText();
         $num=new INum();
 
-        /* TVA */
-        $itva=new ITva_Popup($this->db);
-        $itva->in_table=true;
-        $aCard=array();
-        /* create aArticle for the detail section */
-        
$article_count=(count($this->aAction_detail)==0)?MAX_ARTICLE:count($this->aAction_detail);
-        /* Compute total */
-        $tot_item=0;
-        $tot_vat=0;
-        for ($i=0; $i<$article_count; $i++)
-        {
-            /* fid = Icard  */
-            $icard=new ICard();
-            $icard->jrn=0;
-            $icard->table=0;
-            $icard->noadd="no";
-            $icard->extra='all';
-            $icard->name="e_march".$i;
-            
$tmp_ad=(isset($this->aAction_detail[$i]))?$this->aAction_detail[$i]:false;
-            $icard->readOnly=$readonly;
-            $icard->value='';
-            $aCard[$i]=0;
-            if ($tmp_ad)
-            {
-                $march=new Fiche($this->db);
-                $f=$tmp_ad->get_parameter('qcode');
-                if ($f!=0)
-                {
-                    $march->id=$f;
-                    $icard->value=$march->get_quick_code();
-                    $aCard[$i]=$f;
-                }
-            }
-            $icard->set_dblclick("fill_ipopcard(this);");
-            // name of the field to update with the name of the card
-            $icard->set_attribute('label', "e_march".$i."_label");
-            // name of the field to update with the name of the card
-            $icard->set_attribute('typecard', $icard->extra);
-            $icard->set_attribute('ipopup', 'ipopcard');
-            $icard->set_function('fill_data');
-            $icard->javascript=sprintf(' 
onchange="fill_data_onchange(\'%s\');" ', $icard->name);
-
-            $aArticle[$i]['fid']=$icard->search().$icard->input();
-
-            $text->javascript=' 
onchange="clean_tva('.$i.');compute_ledger('.$i.')"';
-            $text->css_size="100%";
-            $text->name="e_march".$i."_label";
-            $text->id="e_march".$i."_label";
-            $text->size=40;
-            $text->value=($tmp_ad)?$tmp_ad->get_parameter('text'):"";
-            $text->readOnly=$readonly;
-            $aArticle[$i]['desc']=$text->input();
-
-            $num->javascript=' 
onchange="format_number(this,4);clean_tva('.$i.');compute_ledger('.$i.')"';
-            $num->name="e_march".$i."_price";
-            $num->id="e_march".$i."_price";
-            $num->size=8;
-            $num->readOnly=$readonly;
-            $num->value=($tmp_ad)?$tmp_ad->get_parameter('price_unit'):0;
-            $aArticle[$i]['pu']=$num->input();
-
-            $num->name="e_quant".$i;
-            $num->id="e_quant".$i;
-            $num->size=8;
-            $num->value=($tmp_ad)?$tmp_ad->get_parameter('quantity'):0;
-            $aArticle[$i]['quant']=$num->input();
-
-            $itva->name='e_march'.$i.'_tva_id';
-            $itva->id='e_march'.$i.'_tva_id';
-            $itva->value=($tmp_ad)?$tmp_ad->get_parameter('tva_id'):0;
-            $itva->readOnly=$readonly;
-            $itva->js=' 
onchange="format_number(this);clean_tva('.$i.');compute_ledger('.$i.')"';
-            $itva->set_attribute('compute', $i);
-
-            $aArticle[$i]['tvaid']=$itva->input();
-
-            $num->name="e_march".$i."_tva_amount";
-            $num->id="e_march".$i."_tva_amount";
-            $num->value=($tmp_ad)?$tmp_ad->get_parameter('tva_amount'):0;
-            $num->javascript=" onchange=\"compute_ledger('".$i." ')\"";
-            $num->size=8;
-            $aArticle[$i]['tva']=$num->input();
-            $tot_vat=bcadd($tot_vat,$num->value);
-
-            $num->name="tvac_march".$i;
-            $num->id="tvac_march".$i;
-            $num->value=($tmp_ad)?$tmp_ad->get_parameter('total'):0;
-            $num->size=8;
-            $aArticle[$i]['tvac']=$num->input();
-            $tot_item=bcadd($tot_item,$num->value);
-
-            $aArticle[$i]['hidden_htva']=HtmlInput::hidden('htva_march'.$i, 0);
-            $aArticle[$i]['hidden_tva']=HtmlInput::hidden('tva_march'.$i, 0);
-            $aArticle[$i]['ad_id']=($tmp_ad)?HtmlInput::hidden('ad_id'.$i, 
$tmp_ad->get_parameter('id')):HtmlInput::hidden('ad_id'.$i, 0);
-        }
-
         /* Add the needed hidden values */
         $r.=dossier::hidden();
 
-        /* add the number of item */
-        $Hid=new IHidden();
-        $r.=$Hid->input("nb_item", $article_count);
         $r.=HtmlInput::request_to_hidden(array("closed_action", 
"remind_date_end", "remind_date", "sag_ref", "only_internal", "state", "qcode", 
"ag_dest_query", "action_query", "tdoc", "date_start", "date_end", "hsstate", 
"searchtag"));
         $a_tag=$this->tag_get();
         $menu=new Default_Menu();
@@ -671,9 +575,10 @@ class Follow_Up
             $this->ag_remind_date /* 13 */
                 )
         );
-
+        $http=new HttpInput();
+        $nb_item=$http->post("nb_item","number",0);
         /* insert also the details */
-        for ($i=0; $i<$_POST['nb_item']; $i++)
+        for ($i=0; $i<$nb_item; $i++)
         {
             $act=new Follow_Up_Detail($this->db);
             $act->from_array($_POST, $i);
@@ -861,7 +766,7 @@ class Follow_Up
      *
      * \return true on success otherwise false
      */
-    function Update()
+    function update()
     {
 
         // if ag_id == 0 nothing to do
diff --git a/include/class/follow_up_detail.class.php 
b/include/class/follow_up_detail.class.php
index fdb39ab..0967d99 100644
--- a/include/class/follow_up_detail.class.php
+++ b/include/class/follow_up_detail.class.php
@@ -233,6 +233,11 @@ class Follow_Up_Detail
         if 
(trim($this->ad_total_amount)==""||isNumber($this->ad_total_amount)==0) 
$this->ad_total_amount=0;
         if (trim($this->ad_tva_id)=="" || isNumber($this->ad_tva_id)==0) 
$this->ad_tva_id=0;
     }
+    
+    public static function display(Follow_Up $p_follow_up,$p_view)
+    {
+         require NOALYSS_TEMPLATE."/follow_up_detail_display.php";
+    }
     /*!\brief
      *\param
      *\return
diff --git a/include/class/operation_predef_mtable.class.php 
b/include/class/operation_predef_mtable.class.php
index ceae85b..a425c3e 100644
--- a/include/class/operation_predef_mtable.class.php
+++ b/include/class/operation_predef_mtable.class.php
@@ -67,7 +67,7 @@ class Operation_Predef_MTable extends Manage_Table_SQL
         // create our own "Append button"
         $this->set_append_row(false);
         $this->set_dialog_box("prdfop");
-        
$this->set_dialogbox_style(["position"=>"absolute","top"=>"5%","width:auto","min-width"=>"80%"]);
+        
$this->set_dialogbox_style(["position"=>"fixed","top"=>"5%","width:auto","min-width"=>"80%"]);
     }
 
     /**
diff --git a/include/class/pre_op_advanced.class.php 
b/include/class/pre_op_advanced.class.php
index b870ef1..e1e45ec 100644
--- a/include/class/pre_op_advanced.class.php
+++ b/include/class/pre_op_advanced.class.php
@@ -191,8 +191,8 @@ class Pre_Op_Advanced extends Pre_operation_detail
         $ret.=HtmlInput::hidden('jrn_type', "ODS");
         $info = Icon_Action::infobulle(0);
         $info_poste = Icon_Action::infobulle(9);
-        if ($g_user->check_action(FICADD) == 1)
-                $ret.=$f_add_button->input();
+        if ($g_user->check_action(FICADD) == 1)                 
$ret.=$f_add_button->input();
+        $ret.='<div class="fieldset" style="overflow:auto;height:400px">';
         $ret.='<table id="quick_item" style="width:100%">';
         $ret.='<tr>' .
                         '<th style="text-align:left">Quickcode' . $info . 
'</th>' .
@@ -287,6 +287,7 @@ class Pre_Op_Advanced extends Pre_operation_detail
                 // If readonly == 1 then show CA
         }
         $ret.='</table>';
+        $ret.="</div>";
         $ret.=Html_Input_Noalyss::ledger_add_item("M");
         return $ret;
     }
diff --git a/include/database/contact_option_ref_sql.class.php 
b/include/database/contact_option_ref_sql.class.php
new file mode 100644
index 0000000..5e39060
--- /dev/null
+++ b/include/database/contact_option_ref_sql.class.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Autogenerated file 
+ *   This file is part of NOALYSS.
+ *
+ *   NOALYSS is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   NOALYSS is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with NOALYSS; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2020) Author Dany De Bontridder <danydb@noalyss.eu>
+
+require_once NOALYSS_INCLUDE.'/lib/noalyss_sql.class.php';
+require_once NOALYSS_INCLUDE.'/class/database.class.php';
+
+/**
+ * class_contact_option_ref_sql.php
+ *
+ * @file
+ * @brief abstract of the table public.contact_option_ref */
+class Contact_option_ref_SQL extends Noalyss_SQL
+{
+
+    function __construct(Database $p_cn, $p_id=-1)
+    {
+        $this->table="public.contact_option_ref";
+        $this->primary_key="cor_id";
+        /*
+         * List of columns
+         */
+        $this->name=array(
+            "cor_id"=>"cor_id"
+            , "cor_label"=>"cor_label"
+            , "cor_type"=>"cor_type"
+            , "cor_value_select"=>"cor_value_select"
+        );
+        /*
+         * Type of columns
+         */
+        $this->type=array(
+            "cor_id"=>"numeric"
+            , "cor_label"=>"text"
+            , "cor_type"=>"numeric"
+            , "cor_value_select"=>"text"
+        );
+
+
+        $this->default=array(
+            "cor_id"=>"auto"
+        );
+
+        $this->date_format="DD.MM.YYYY";
+        parent::__construct($p_cn, $p_id);
+    }
+
+}
diff --git a/include/lib/manage_table_sql.class.php 
b/include/lib/manage_table_sql.class.php
index 2078430..0c7d3e6 100644
--- a/include/lib/manage_table_sql.class.php
+++ b/include/lib/manage_table_sql.class.php
@@ -61,6 +61,7 @@
  * @see sorttable.js
  * 
  */
+require_once NOALYSS_INCLUDE."/lib/http_input.class.php";
 
 class Manage_Table_SQL
 {
@@ -258,7 +259,7 @@ class Manage_Table_SQL
     }
 
     /**
-     * This function can be overrided to check the data before 
+     * @brief This function can be overrided to check the data before 
      * inserting , updating or removing, above an example of an overidden 
check.
      * 
      * Usually , you get the row of the table (get_table) , you check the 
conditions
@@ -268,7 +269,8 @@ class Manage_Table_SQL
      * 
      * @see set_error get_error count_error
      * @return boolean
-     * @code 
+     * 
+@code 
 function check()
     {
         global $cn;
@@ -292,7 +294,7 @@ function check()
         if ( $is_error > 0 ) return false;
         return true;
     }    
-     * @endcode
+@endcode
      */
     function check()
     {
@@ -776,6 +778,7 @@ function check()
     function from_request()
     {
         $nb=count($this->a_order);
+        $http=new HttpInput();
         for ($i=0; $i<$nb; $i++)
         {
             
@@ -783,7 +786,7 @@ function check()
             if 
($this->get_property_visible($key)==TRUE&&$this->get_property_updatable($key)
                     ==TRUE)
             {
-                $v=HtmlInput::default_value_request($this->a_order[$i], "");
+                $v=$http->request($this->a_order[$i],"string","");
                 $this->table->$key=strip_tags($v);
             }
         }
@@ -1094,7 +1097,7 @@ function check()
 
             ob_start();
 
-            echo HtmlInput::title_box("Donnée", 
$this->dialog_box,"close","","y");
+            echo HtmlInput::title_box(_("Donnée"), 
$this->dialog_box,"close","","y");
             printf('<form id="frm%s_%s" method="POST" 
onsubmit="%s.save(\'frm%s_%s\');return false;">',
                     $this->object_name, $this->table->get_pk_value(),
                     $this->object_name, $this->object_name,
diff --git a/include/template/detail-action.php 
b/include/template/detail-action.php
index 0ecc3bd..5155590 100644
--- a/include/template/detail-action.php
+++ b/include/template/detail-action.php
@@ -7,7 +7,7 @@ $uniq=uniqid("tab",TRUE);
 
 
     <table>
-                       <tr class="highlight">
+        <tr class="highlight">
             <TD>
            <?php echo _('N° document')?>
             </TD>
@@ -57,6 +57,7 @@ $uniq=uniqid("tab",TRUE);
           echo _('Pas de catégorie de contact');
       endif;
   endif;
+  
             ?>
           </td>
           </Tr>
@@ -65,7 +66,7 @@ $uniq=uniqid("tab",TRUE);
              <?php echo $spcontact->input(); ?>
           </td>
           </Tr>
-          <?php if ($this->ag_id > 0 ): ?>
+          <?php if ($this->ag_id > 0 && 
Document_Option::is_enable_contact_multiple($this->dt_id)): ?>
           <tr>
               <td>
                   <?php echo _('Autres concernés')?>
@@ -280,132 +281,52 @@ echo '</span>';
 <?php endif; ?>
   </div>
 </div>
-<?php if ( $p_view !='READ'  ) :?>
-<input type='button' class="button" class="noprint" value="<?php echo 
_('Montrer articles');?>" id="toggleButton" onclick='toggleShowDetail()'>
-<?php endif; ?>
-<?php
-/**
- * check if there card to show,
- */
-$show_row=0;
-for ($i=0;$i<count($aArticle);$i++) :
-       if ( ($aCard[$i] != 0 && $p_view == 'READ') || $p_view != 'READ'){ 
$show_row=1;break;}
-endfor;
+<?php 
+/**********************************************************************************************************************
+ * START BLOCK Display Detail of follow up
+ *
+ 
**********************************************************************************************************************/
 ?>
 <?php
-/*
- * display detail if there card or if we are in UPDATE or NEW mode
- */
-if ($show_row !=0 ) :
+// Display detail if detail_operation is set
+if ( $this->ag_id > 0 && 
Document_Option::is_enable_operation_detail($this->dt_id)) 
Follow_Up_Detail::display($this,$p_view);
 
-       ?>
-<div id="fldDetail" class="myfieldset" style='padding-bottom:  
100px;display:block;top:2px'>
-   <LEGEND> <?php echo _('Détail')?>
-</LEGEND>
-<?php // hidden fields
-$show_row=0;
-for ($i=0;$i<count($aArticle);$i++) :
-       echo $aArticle[$i]['ad_id'];
-       echo $aArticle[$i]['hidden_tva'];
-       echo $aArticle[$i]['hidden_htva'];
-       if ( ($aCard[$i] != 0 && $p_view == 'READ') || $p_view != 'READ'){ 
$show_row=1;}
-endfor;
 ?>
-    <div>
-<table style="width:100%" id="art" >
-<tr>
-  <th><?php echo _('Fiche')?></th>
-  <th><?php echo _('Description')?></th>
-  <th><?php echo _('prix unitaire')?></th>
-<th><?php echo _('quantité')?></th>
-<th><?php echo _('Code TVA')?></th>
-<th><?php echo _('Montant TVA')?></th>
-<th><?php echo _('Montant TVAC')?></th>
+<?php 
+/**********************************************************************************************************************
+ * END BLOCK Display Detail of follow up
+ 
**********************************************************************************************************************/
+?>
+
+<div style="clear:both"></div>    
 
-</tr>
-<?php for ($i=0;$i<count($aArticle);$i++): ?>
-<?php
-if ( ($aCard[$i] != 0 && $p_view == 'READ') || $p_view != 'READ'):
-       $show_row++;
-       ?>
-<TR>
-<TD><?php echo $aArticle[$i]['fid'] ?></TD>
-<TD><?php echo $aArticle[$i]['desc'] ?></TD>
-<TD class="num"><?php echo $aArticle[$i]['pu'] ?></TD>
-<TD class="num"><?php echo $aArticle[$i]['quant'] ?></TD>
-<TD class="num"><?php echo $aArticle[$i]['tvaid'] ?></TD>
-<TD class="num"><?php echo $aArticle[$i]['tva'] ?></TD>
-<TD class="num"><?php echo $aArticle[$i]['tvac'] ?></TD>
-</TR>
-<?php endif; ?>
-<?php endfor; ?>
-</table>
-    </div>
-    <?php if ($p_view != "READ" ): ?>
-<script language="JavaScript">
-if ( $('e_march0') && $('e_march0').value =='') { toggleShowDetail();}
-function toggleShowDetail() {
-       try {var detail=g('fldDetail');
-       var but=g('toggleButton');
-       if (detail.style.display=='block' ) { but.value="<?php echo _("Montrer 
les détails")?>";detail.style.display='none';}
-       else { but.value="<?php echo _("Cacher les 
détails")?>";detail.style.display='block';} }
-       catch (error)  {alert(error);}
-       }
-</script>    
-<?php endif; ?>
-<?php if ( $show_row != 0 ): ?>
-<div>
   
-    <div style=" float:right;margin-right: 2px" id="sum">
-    <br><span style="text-align: right;" class="highlight" id="htva"><?php 
echo bcsub($tot_item,$tot_vat) ?></span>
-     <br><span style="text-align: right" class="highlight" id="tva"><?php echo 
$tot_vat?></span>
-    <br><span style="text-align: right" class="highlight" id="tvac"><?php echo 
$tot_item?></span>
- </div>
 
-    <div  style="float:right;margin-right: 230px" >
-    <br>Total HTVA
-    <br>Total TVA
-    <br>Total TVAC
- </div>
+<div class="myfieldset" id="div_action_attached_doc">
+  <legend>
+     <?php echo _('Pièces attachées')?>
+  </legend>
+    <div class="noprint">
+        <?php 
+/**********************************************************************************************************************
+ * start BLOCK generate document
+ 
**********************************************************************************************************************/
+?>
 
- <?php if ( ! $readonly ) :  ?>
-    <div style="float:right" >
-    <input name="act" id="act_bt" class="smallbutton" value="<?php echo 
_('Actualiser')?>" onclick="compute_all_ledger();" type="button">
-     <input type="button" class="smallbutton" onclick="gestion_add_row()" 
value="<?php echo _("Ajouter une ligne")?>">
-     </div>
-     
-<?php endif; ?> 
-    <?php if ($p_view != 'READ' && $str_select_doc != '') : ?>
+ <?php if ($p_view != 'READ' && $str_select_doc != '') : ?>
          <?php echo _('Document à générer')?>
   </legend>
   <?php echo $str_select_doc;
  echo $str_submit_generate;
 
 endif; ?>
-    <legend>
-</div>
-<?php if ( $this->ag_id != 0 && ! $readonly) : ?>
-     <div >
-         <p>
-         <?php
-            $query=  
http_build_query(array('gDossier'=>Dossier::id(),'ag_id'=>$this->ag_id,'create_invoice'=>1,'ac'=>$menu->get('code_invoice')));
-            echo HtmlInput::button_anchor(_("Transformer en 
facture"),"do.php?".$query,"create_invoice", '  target="_blank" ',"button");
-         ?>
-         </p>
-      </div>
-     <?php endif; ?>
-<?php endif; ?>
-</div>
-<?php endif; ?>
-
-<div style="clear:both"></div>    
-
-
-
-<div class="myfieldset" id="div_action_attached_doc">
-  <legend>
-     <?php echo _('Pièces attachées')?>
-  </legend>
+  
+<?php 
+/**********************************************************************************************************************
+ * end BLOCK generate document
+ 
**********************************************************************************************************************/
+?>
+    </div>
   <div class="print">
       <table>
   <?php
@@ -483,7 +404,7 @@ Document créé le <?php echo $this->ag_timestamp ?> par 
<?php echo $this->ag_ow
 <?php endif; ?>
 
 </div>
-<script>compute_all_ledger()</script>
+
 <script>
   $('related_action_tab<?php echo $uniq?>').onclick=function() {
       $('related_action_tab<?php echo $uniq?>').className='tabs_selected';
diff --git a/include/template/document_mod_change.php 
b/include/template/document_mod_change.php
deleted file mode 100644
index ba492c9..0000000
--- a/include/template/document_mod_change.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/*
- *   This file is part of NOALYSS.
- *
- *   NOALYSS is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   NOALYSS is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with NOALYSS; if not, write to the Free Software
- *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-// Copyright Author Dany De Bontridder danydb@aevalys.eu
-
-/**\file
- * \brief this file respond to an ajax request to modify a type of document
- */
-require_once NOALYSS_INCLUDE.'/class/document_type.class.php';
-echo HtmlInput::title_box(_('Type de document'),'change_doc_div');
-
-$doc_type=new Document_type($cn,$dt_id);
-$doc_type->get();
-?>
-<form method="POST" id="cat_doc_f" 
onsubmit="cat_doc_change_record('cat_doc_f');">
-       <?php echo 
HtmlInput::request_to_hidden(array("ac","gDossier","dt_id"))?>
-<table>
-<tr>
-  <td> <?php echo _('Nom')?>
-  </td>
-  <td>
-         <?php 
-         $name=new IText('dt_name',$doc_type->dt_value);
-         echo $name->input();
-         ?>
-  </td>
-</tr>
-
-<tr>
-  <td><?php echo _('Préfixe')?>
-  </td>
-  <td>
-         <?php 
-         $prefix=new IText('dt_prefix',$doc_type->dt_prefix);
-         echo $prefix->input();
-         ?>
-  </td>
-</tr>
-
-<tr>
-  <td><?php echo _('numéro actuel')?>
-  </td>
-  <td>
-       <?php 
-       $ret= $cn->get_array("select last_value,is_called from 
seq_doc_type_".$doc_type->dt_id) ;
-
-    $last=$ret[0]['last_value'];
-             /*!
-                  *\note  With PSQL sequence , the last_value column is 1 when 
before   AND after the first call, to make the difference between them
-                  * I have to check whether the sequence has been already 
called or not */
-    if ($ret[0]['is_called']=='f' ) $last--;
-       echo $last;
-       ?>
-  </td>
-  <tr>
-  <td><?php echo _('Prochain numéro')?>
-         <?php echo 
-               Icon_Action::infobulle(15);
-       ?>
-  </td>
-   <td>
-         <?php 
-         $seq=new INum('seq',0);
-         echo $seq->input();
-         ?>
-  </td>
-</tr>
-
-</table>
-
-  <?php echo HtmlInput::submit("save",_('Sauver'));?>
-</form>
\ No newline at end of file
diff --git a/include/template/follow_up_detail_display.php 
b/include/template/follow_up_detail_display.php
new file mode 100644
index 0000000..2732290
--- /dev/null
+++ b/include/template/follow_up_detail_display.php
@@ -0,0 +1,191 @@
+<?php
+/*
+ *   This file is part of NOALYSS.
+ *
+ *   PhpCompta is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   PhpCompta is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with PhpCompta; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+// Copyright (2002-2020) Author Dany De Bontridder <danydb@noalyss.eu>
+
+/**
+ * @file
+ * @brief Called from Follow_Up_Detail for displaying detail
+ * @see Follow_Up_Detail::display
+ */
+// Number of articles
+$article_count=(count($p_follow_up->aAction_detail)==0)?MAX_ARTICLE:count($p_follow_up->aAction_detail);
+// total item and vat
+$tot_item=0;
+$tot_vat=0;
+$text=new IText();
+$num=new INum();
+$itva=new ITva_Popup();
+$readonly=$p_view;
+
+// default menu for invoice
+$menu=new Default_Menu();
+?>
+<div id="follow_up_detail">
+    <?php echo HtmlInput::hidden("nb_item", $article_count); ?>
+
+    <table style="width:100%"  id="sold_item">
+        <tr>
+            <th><?php echo _('Fiche') ?></th>
+            <th><?php echo _('Description') ?></th>
+            <th><?php echo _('prix unitaire') ?></th>
+            <th><?php echo _('quantité') ?></th>
+            <th><?php echo _('Code TVA') ?></th>
+            <th><?php echo _('Montant TVA') ?></th>
+            <th><?php echo _('Montant TVAC') ?></th>
+
+        </tr>
+        <?php
+        for ($i=0; $i<$article_count; $i++):
+            /* fid = Icard  */
+            $icard=new ICard();
+            $icard->jrn=0;
+            $icard->table=0;
+            $icard->noadd="no";
+            $icard->extra='all';
+            $icard->name="e_march".$i;
+            
$tmp_ad=(isset($p_follow_up->aAction_detail[$i]))?$p_follow_up->aAction_detail[$i]:$readonly;
+            $icard->readOnly=$readonly;
+            $icard->value='';
+            $aCard[$i]=0;
+            if ($tmp_ad)
+            {
+                $march=new Fiche($p_follow_up->db);
+                $f=$tmp_ad->get_parameter('qcode');
+                if ($f!=0)
+                {
+                    $march->id=$f;
+                    $icard->value=$march->get_quick_code();
+                    $aCard[$i]=$f;
+                }
+            }
+            $icard->set_dblclick("fill_ipopcard(this);");
+            // name of the field to update with the name of the card
+            $icard->set_attribute('label', "e_march".$i."_label");
+            // name of the field to update with the name of the card
+            $icard->set_attribute('typecard', $icard->extra);
+            $icard->set_attribute('ipopup', 'ipopcard');
+            $icard->set_function('fill_data');
+            $icard->javascript=sprintf(' 
onchange="fill_data_onchange(\'%s\');" ', $icard->name);
+
+            $aArticle[$i]['fid']=$icard->search().$icard->input();
+
+            $text->javascript=' 
onchange="clean_tva('.$i.');compute_ledger('.$i.')"';
+            $text->css_size="100%";
+            $text->name="e_march".$i."_label";
+            $text->id="e_march".$i."_label";
+            $text->size=40;
+            $text->value=($tmp_ad)?$tmp_ad->get_parameter('text'):"";
+            $text->readOnly=$readonly;
+            $aArticle[$i]['desc']=$text->input();
+
+            $num->javascript=' 
onchange="format_number(this,4);clean_tva('.$i.');compute_ledger('.$i.')"';
+            $num->name="e_march".$i."_price";
+            $num->id="e_march".$i."_price";
+            $num->size=8;
+            $num->readOnly=$readonly;
+            $num->value=($tmp_ad)?$tmp_ad->get_parameter('price_unit'):0;
+            $aArticle[$i]['pu']=$num->input();
+
+            $num->name="e_quant".$i;
+            $num->id="e_quant".$i;
+            $num->size=8;
+            $num->value=($tmp_ad)?$tmp_ad->get_parameter('quantity'):0;
+            $aArticle[$i]['quant']=$num->input();
+
+            $itva->name='e_march'.$i.'_tva_id';
+            $itva->id='e_march'.$i.'_tva_id';
+            $itva->value=($tmp_ad)?$tmp_ad->get_parameter('tva_id'):0;
+            $itva->readOnly=$readonly;
+            $itva->js=' 
onchange="format_number(this);clean_tva('.$i.');compute_ledger('.$i.')"';
+            $itva->set_attribute('compute', $i);
+
+            $aArticle[$i]['tvaid']=$itva->input();
+
+            $num->name="e_march".$i."_tva_amount";
+            $num->id="e_march".$i."_tva_amount";
+            $num->value=($tmp_ad)?$tmp_ad->get_parameter('tva_amount'):0;
+            $num->javascript=" onchange=\"compute_ledger('".$i." ')\"";
+            $num->size=8;
+            $aArticle[$i]['tva']=$num->input();
+            $tot_vat=bcadd($tot_vat, $num->value);
+
+            $num->name="tvac_march".$i;
+            $num->id="tvac_march".$i;
+            $num->value=($tmp_ad)?$tmp_ad->get_parameter('total'):0;
+            $num->size=8;
+            $aArticle[$i]['tvac']=$num->input();
+            $tot_item=bcadd($tot_item, $num->value);
+
+            $aArticle[$i]['hidden_htva']=HtmlInput::hidden('htva_march'.$i, 0);
+            $aArticle[$i]['hidden_tva']=HtmlInput::hidden('tva_march'.$i, 0);
+            $aArticle[$i]['ad_id']=($tmp_ad)?HtmlInput::hidden('ad_id'.$i, 
$tmp_ad->get_parameter('id')):HtmlInput::hidden('ad_id'.$i,
+                            0);
+            ?>
+
+            <TR>
+                <TD><?php echo $aArticle[$i]['fid'] ?></TD>
+                <TD><?php echo $aArticle[$i]['desc'] ?></TD>
+                <TD class="num"><?php echo $aArticle[$i]['pu'] ?></TD>
+                <TD class="num"><?php echo $aArticle[$i]['quant'] ?></TD>
+                <TD class="num"><?php echo $aArticle[$i]['tvaid'] ?></TD>
+                <TD class="num"><?php echo $aArticle[$i]['tva'] ?></TD>
+                <TD class="num"><?php echo $aArticle[$i]['tvac'] ?>
+                    <?php echo $aArticle[$i]['hidden_tva']; ?>
+                    <?php echo $aArticle[$i]['hidden_htva']; ?>
+                    <?php echo $aArticle[$i]['ad_id']; ?>
+                </TD>
+            </TR>
+            <?php
+        endfor;
+        ?>
+    </table>
+    <div>
+
+        <div style=" float:right;margin-right: 2px" id="sum">
+            <br><span style="text-align: right;" class="highlight" 
id="htva"><?php echo bcsub($tot_item, $tot_vat) ?></span>
+            <br><span style="text-align: right" class="highlight" 
id="tva"><?php echo $tot_vat ?></span>
+            <br><span style="text-align: right" class="highlight" 
id="tvac"><?php echo $tot_item ?></span>
+        </div>
+
+        <div  style="float:right;margin-right: 230px" >
+            <br>Total HTVA
+            <br>Total TVA
+            <br>Total TVAC
+        </div>
+
+    </div>
+    <div id="d_add_rows">
+    <?php echo Html_Input_Noalyss::ledger_add_item("O"); ?>
+        
+    <?php echo HtmlInput::button('actualiser', _('Recalculer'), ' 
onClick="compute_all_ledger();"'); ?>
+    </div>
+    <script>compute_all_ledger()</script>    
+    <?php
+    if (Document_Option::is_enable_make_invoice($p_follow_up->dt_id)):
+        ?>
+        <p id="follow_up_detail_invoice">
+            <?php
+            $query=http_build_query(array('gDossier'=>Dossier::id(), 
'ag_id'=>$p_follow_up->ag_id, 'create_invoice'=>1, 
'ac'=>$menu->get('code_invoice')));
+            echo HtmlInput::button_anchor(_("Transformer en facture"), 
"do.php?".$query, "create_invoice",
+                    '  target="_blank" ', "button");
+            ?>
+        </p>
+        <?php
+    endif;
+    ?>
\ No newline at end of file
diff --git a/include/template/predf_ledger_detail.php 
b/include/template/predf_ledger_detail.php
index d46eff8..2174ea1 100644
--- a/include/template/predf_ledger_detail.php
+++ b/include/template/predf_ledger_detail.php
@@ -8,7 +8,7 @@
 <?php echo $str_add_button?>
 </fieldset>
 
-<div class="fieldset">
+<div class="fieldset" style="overflow:auto;height:400px">
 <h1 class="fiedset"><?php echo $f_legend_detail?></h1>
 
 <table id="sold_item" width="100%" border="0">
diff --git a/sql/upgrade.sql b/sql/upgrade.sql
index 8dac206..1dae36d 100644
--- a/sql/upgrade.sql
+++ b/sql/upgrade.sql
@@ -49,3 +49,94 @@ LANGUAGE plpgsql;
 ALTER TABLE public.user_sec_action_profile drop CONSTRAINT 
user_sec_action_profile_ua_right_check;
 ALTER TABLE public.user_sec_action_profile ADD CONSTRAINT 
user_sec_action_profile_ua_right_check check (ua_right in ('R','W','X','O'));
 
+-- extension CRM : definition des options qu'on peut ajouter
+-- public.document_option_ref definition
+
+-- Drop table
+
+-- DROP TABLE public.document_option_ref;
+
+CREATE TABLE public.document_option_ref (
+       do_id bigserial NOT NULL,
+       do_code varchar(20) NOT NULL, -- Code of the option to add
+       document_type_id int8 NULL, -- FK to document_type
+       CONSTRAINT document_option_ref_pk PRIMARY KEY (do_id)
+);
+COMMENT ON TABLE public.document_option_ref IS 'Reference of option of 
document_type';
+
+-- Column comments
+
+COMMENT ON COLUMN public.document_option_ref.do_code IS 'Code of the option to 
add';
+COMMENT ON COLUMN public.document_option_ref.document_type_id IS 'FK to 
document_type';
+
+
+-- public.document_option_ref foreign keys
+
+ALTER TABLE public.document_option_ref ADD CONSTRAINT document_option_ref_fk 
FOREIGN KEY (document_type_id) REFERENCES document_type(dt_id) ON UPDATE 
CASCADE ON DELETE CASCADE;
+
+
+-- Drop table
+
+CREATE TABLE public.contact_option_ref (
+       cor_id bigserial NOT NULL,
+       cor_label varchar NOT NULL, -- Label de l'option
+       cor_type int4 NOT NULL DEFAULT 0, -- 0 text , 1 select ,2 nombre , 3 
date
+       cor_value_json json NULL, -- json object if cor_type is a select
+       document_option_id int8 NOT NULL, -- FK to document_option
+       CONSTRAINT contact_option_ref_pk PRIMARY KEY (cor_id),
+       CONSTRAINT contact_option_ref_fk FOREIGN KEY (document_option_id) 
REFERENCES document_option(do_id) ON UPDATE CASCADE ON DELETE CASCADE
+);
+COMMENT ON TABLE public.contact_option_ref IS 'Option for the contact';
+
+-- Column comments
+
+COMMENT ON COLUMN public.contact_option_ref.cor_label IS 'Label de l''option';
+COMMENT ON COLUMN public.contact_option_ref.cor_type IS '0 text , 1 select ,2 
nombre , 3 date';
+COMMENT ON COLUMN public.contact_option_ref.cor_value_json IS 'json object if 
cor_type is a select';
+COMMENT ON COLUMN public.contact_option_ref.document_option_id IS 'FK to 
document_option';
+
+
+CREATE TABLE public.action_person_option (
+       ap_id bigserial NOT NULL,
+       ap_value varchar NULL, -- Value of the option
+       contact_option_ref_id int8 NOT NULL,
+       action_person_id int8 NOT NULL,
+       CONSTRAINT action_person_option_pk PRIMARY KEY (ap_id),
+       CONSTRAINT action_person_option_fk FOREIGN KEY (action_person_id) 
REFERENCES action_person(ap_id) ON UPDATE CASCADE ON DELETE CASCADE,
+       CONSTRAINT contact_option_ref_fk FOREIGN KEY (contact_option_ref_id) 
REFERENCES contact_option_ref(cor_id) ON UPDATE CASCADE ON DELETE CASCADE
+);
+COMMENT ON TABLE public.action_person_option IS 'option for each contact';
+
+-- Column comments
+
+COMMENT ON COLUMN public.action_person_option.ap_value IS 'Value of the 
option';
+
+-- renomme le menu
+update menu_ref set me_description = 'Configuration des documents dans le 
suivi' ,me_file='cfg_action.inc.php' ,
+me_description_etendue ='Vous permet d''ajouter de nouveaux type de documents 
pour le suivi (bordereau de livraison, devis..)',me_code='CFGACTION',
+me_menu='Document Suivi'
+where me_code='CFGCATDOC';
+
+
+ALTER TABLE public.document_option ADD do_activate int NOT NULL DEFAULT 1;
+COMMENT ON COLUMN public.document_option.do_activate IS '1 the option is 
activated, 0 is inativated';
+
+ALTER TABLE public.document_option ADD CONSTRAINT document_option_un UNIQUE 
(do_code,document_type_id);
+ALTER TABLE public.document_option RENAME COLUMN do_activate TO do_enable;
+
+-- ajoute un menu pour les options de contacts
+INSERT INTO public.menu_ref 
(me_code,me_menu,me_file,me_url,me_description,me_parameter,me_javascript,me_type,me_description_etendue)
 VALUES 
+('CFGCONTACT','Contact','contact_option_ref.inc.php',NULL,'Configure les 
options pours les contacts multiples',NULL,NULL,'ME',NULL)
+;
+
+INSERT INTO public.profile_menu 
(me_code,me_code_dep,p_id,p_order,p_type_display,pm_default,pm_id_dep) VALUES 
+('CFGCONTACT','DIVPARM',1,85,'E',0,56)
+;
+
+-- contact option globale pour toutes les actions
+ALTER TABLE public.contact_option_ref DROP COLUMN document_option_id;
+
+-- on utilise un varchar pour stocker les possibilités
+ALTER TABLE public.contact_option_ref DROP COLUMN cor_value_json;
+ALTER TABLE public.contact_option_ref ADD cor_value_select varchar NULL;
+COMMENT ON COLUMN public.contact_option_ref.cor_value_select IS 'Select 
values';
\ No newline at end of file



reply via email to

[Prev in Thread] Current Thread [Next in Thread]