From 76efc0484011cdff3b63b46425602cc2a4679b3f Mon Sep 17 00:00:00 2001
From: jfefe
Date: Wed, 13 Mar 2013 22:01:34 +0100
Subject: [PATCH 001/194] Show number with dot to avoid error when update
extrafield
---
htdocs/core/class/extrafields.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php
index de828e8a237..4e18cd6c983 100755
--- a/htdocs/core/class/extrafields.class.php
+++ b/htdocs/core/class/extrafields.class.php
@@ -646,7 +646,7 @@ class ExtraFields
}
elseif ($type == 'price')
{
- $out=' '.$langs->getCurrencySymbol($conf->currency);
+ $out=' '.$langs->getCurrencySymbol($conf->currency);
}
elseif ($type == 'select')
{
From ae180f06a03572412189f94445a5bead7d1135cf Mon Sep 17 00:00:00 2001
From: jfefe
Date: Sat, 16 Mar 2013 00:53:46 +0100
Subject: [PATCH 002/194] Fix : document module option was not saved
---
htdocs/admin/propal.php | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/htdocs/admin/propal.php b/htdocs/admin/propal.php
index 6c18da0e240..755ca681c73 100644
--- a/htdocs/admin/propal.php
+++ b/htdocs/admin/propal.php
@@ -162,10 +162,34 @@ if ($action == 'setdefaultduration')
}
}
-/*if ($action == 'setusecustomercontactasrecipient')
+// Define constants for submodules that contains parameters (forms with param1, param2, ... and value1, value2, ...)
+if ($action == 'setModuleOptions')
{
- dolibarr_set_const($db, "PROPALE_USE_CUSTOMER_CONTACT_AS_RECIPIENT",$_POST["value"],'chaine',0,'',$conf->entity);
-}*/
+ $post_size=count($_POST);
+
+ $db->begin();
+
+ for($i=0;$i < $post_size;$i++)
+ {
+ if (array_key_exists('param'.$i,$_POST))
+ {
+ $param=GETPOST("param".$i,'alpha');
+ $value=GETPOST("value".$i,'alpha');
+ if ($param) $res = dolibarr_set_const($db,$param,$value,'chaine',0,'',$conf->entity);
+ if (! $res > 0) $error++;
+ }
+ }
+ if (! $error)
+ {
+ $db->commit();
+ $mesg = "".$langs->trans("SetupSaved")." ";
+ }
+ else
+ {
+ $db->rollback();
+ $mesg = "".$langs->trans("Error")." ";
+ }
+}
From 5f1141675c4347562c39db9423d88d99cd21aae8 Mon Sep 17 00:00:00 2001
From: jfefe
Date: Sat, 16 Mar 2013 01:10:21 +0100
Subject: [PATCH 003/194] Add constants into config of ODT document for propal
: can choose wich ODT will be used on creation and when close to bill or not.
---
.../doc/doc_generic_proposal_odt.modules.php | 32 ++++++++++++++++++-
htdocs/langs/fr_FR/propal.lang | 3 ++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
index 0f9e64c1fe2..54cf9efb2cc 100644
--- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
+++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
@@ -106,6 +106,9 @@ class doc_generic_proposal_odt extends ModelePDFPropales
$texte.= ' ';
$texte.= ' ';
$texte.= ' ';
+ $texte.= ' ';
+ $texte.= ' ';
+ $texte.= ' ';
$texte.= '';
// List of directories area
@@ -143,8 +146,35 @@ class doc_generic_proposal_odt extends ModelePDFPropales
$texte.= '
';
// Scan directories
- if (count($listofdir)) $texte.=$langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).' ';
+ if (count($listofdir))
+ {
+ $texte.=$langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).' ';
+
+ // Model for creation
+ $liste=ModelePDFPropales::liste_modeles($this->db);
+ $texte.= '';
+ $texte.= '';
+ $texte.= ''.$langs->trans("DefaultModelPropalCreate").' ';
+ $texte.= '';
+ $texte.= $form->selectarray('value2',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT);
+ $texte.= " ";
+
+ $texte.= '';
+ $texte.= ''.$langs->trans("DefaultModelPropalToBill").' ';
+ $texte.= '';
+ $texte.= $form->selectarray('value3',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL);
+ $texte.= " ";
+ $texte.= '';
+
+ $texte.= ''.$langs->trans("DefaultModelPropalCreate").' ';
+ $texte.= '';
+ $texte.= $form->selectarray('value4',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED);
+ $texte.= " ";
+ $texte.= '
';
+ }
+
+
$texte.= '';
diff --git a/htdocs/langs/fr_FR/propal.lang b/htdocs/langs/fr_FR/propal.lang
index 5a4c05f0d6d..5d5d1b2043c 100644
--- a/htdocs/langs/fr_FR/propal.lang
+++ b/htdocs/langs/fr_FR/propal.lang
@@ -97,4 +97,7 @@ TypeContact_propal_external_CUSTOMER=Contact client suivi propale
DocModelAzurDescription=Modèle de propositions commerciales complet (logo...)
DocModelJauneDescription=Modèle de proposition Jaune
Numbershort=N°
+DefaultModelPropalCreate=Modèle par défaut à la création
+DefaultModelPropalToBill=Modèle lors de la cloture d'une proposition commerciale (à facturer)
+DefaultModelPropalClosed=Modèle lors de la cloture d'une proposition commerciale (non facturée)
From 8a3fae31e1850e9c3120f0715cfc5f1c9cc5fb01 Mon Sep 17 00:00:00 2001
From: jfefe
Date: Sat, 16 Mar 2013 01:13:44 +0100
Subject: [PATCH 004/194] When create a propal, select model document chosen by
defaut in module config
---
htdocs/comm/propal.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index e17940379bf..11a78523189 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -1331,7 +1331,7 @@ if ($action == 'create')
print ''.$langs->trans("DefaultModel").' ';
print '';
$liste=ModelePDFPropales::liste_modeles($db);
- print $form->selectarray('model',$liste,$conf->global->PROPALE_ADDON_PDF);
+ print $form->selectarray('model',$liste,($conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT?$conf->global->PROPALE_ADDON_PDF_ODT_DEFAULT:$conf->global->PROPALE_ADDON_PDF));
print " ";
// Project
From 65a9edd5a7795642a120c8827daa53e40ba7379b Mon Sep 17 00:00:00 2001
From: jfefe
Date: Sat, 16 Mar 2013 01:52:56 +0100
Subject: [PATCH 005/194] Fix : lang
---
.../modules/propale/doc/doc_generic_proposal_odt.modules.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
index 54cf9efb2cc..959d9b29cd9 100644
--- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
+++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
@@ -166,7 +166,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales
$texte.= "";
$texte.= '';
- $texte.= ''.$langs->trans("DefaultModelPropalCreate").' ';
+ $texte.= ''.$langs->trans("DefaultModelPropalClosed").' ';
$texte.= '';
$texte.= $form->selectarray('value4',$liste,$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED);
$texte.= " ";
From 71bb4149cc250800623a32bd910088123796d1e2 Mon Sep 17 00:00:00 2001
From: jfefe
Date: Sat, 16 Mar 2013 02:08:07 +0100
Subject: [PATCH 006/194] New : Automatic creation of the document to the
closing of the propale depending on the model selected in the configuration
---
htdocs/comm/propal/class/propal.class.php | 29 +++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php
index 66f6bb3874d..a7cc2f71c2b 100644
--- a/htdocs/comm/propal/class/propal.class.php
+++ b/htdocs/comm/propal/class/propal.class.php
@@ -1634,6 +1634,20 @@ class Propal extends CommonObject
$this->db->rollback();
return -2;
}
+
+ if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+ {
+ // Define output language
+ $outputlangs = $langs;
+ if (! empty($conf->global->MAIN_MULTILANGS))
+ {
+ $outputlangs = new Translate("",$conf);
+ $newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ //$ret=$object->fetch($id); // Reload to get new records
+ propale_pdf_create($this->db, $this, $conf->global->PROPALE_ADDON_PDF_ODT_TOBILL?$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL:$this->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
+ }
// Appel des triggers
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
@@ -1646,6 +1660,21 @@ class Propal extends CommonObject
}
else
{
+
+ if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE))
+ {
+ // Define output language
+ $outputlangs = $langs;
+ if (! empty($conf->global->MAIN_MULTILANGS))
+ {
+ $outputlangs = new Translate("",$conf);
+ $newlang=(GETPOST('lang_id') ? GETPOST('lang_id') : $this->client->default_lang);
+ $outputlangs->setDefaultLang($newlang);
+ }
+ //$ret=$object->fetch($id); // Reload to get new records
+ propale_pdf_create($this->db, $this, $conf->global->PROPALE_ADDON_PDF_ODT_CLOSED?$conf->global->PROPALE_ADDON_PDF_ODT_CLOSED:$this->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
+ }
+
// Appel des triggers
include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
$interface=new Interfaces($this->db);
From be8a95a22b6ad7bb9bd4e64f19ff14235aaa75a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Mon, 25 Mar 2013 13:03:37 +0400
Subject: [PATCH 007/194] =?UTF-8?q?Mise=20=C3=A0=20jour=20des=20tables=20f?=
=?UTF-8?q?acture=5Ffourn=5Fdet=20et=20product=5Ffournisseur=5Fprice.=20Aj?=
=?UTF-8?q?out=20d'un=20champ=20pour=20la=20gestion=20de=20la=20TVA=20NPR?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
htdocs/install/mysql/tables/llx_facture_fourn_det.sql | 1 +
htdocs/install/mysql/tables/llx_product_fournisseur_price.sql | 1 +
2 files changed, 2 insertions(+)
diff --git a/htdocs/install/mysql/tables/llx_facture_fourn_det.sql b/htdocs/install/mysql/tables/llx_facture_fourn_det.sql
index 325950a4e46..f0452c9b40e 100644
--- a/htdocs/install/mysql/tables/llx_facture_fourn_det.sql
+++ b/htdocs/install/mysql/tables/llx_facture_fourn_det.sql
@@ -43,6 +43,7 @@ create table llx_facture_fourn_det
product_type integer DEFAULT 0,
date_start datetime DEFAULT NULL, -- date debut si service
date_end datetime DEFAULT NULL, -- date fin si service
+ info_bits integer DEFAULT 0, -- TVA NPR ou non
fk_code_ventilation integer DEFAULT 0 NOT NULL,
import_key varchar(14)
)ENGINE=innodb;
diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
index c368691e5ac..01789ff8edd 100644
--- a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
+++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql
@@ -37,6 +37,7 @@ create table llx_product_fournisseur_price
charges double(24,8) DEFAULT 0,
unitcharges double(24,8) DEFAULT 0,
tva_tx double(6,3) NOT NULL,
+ recuperableonly integer NOT NULL DEFAULT 0,
fk_user integer,
import_key varchar(14) -- Import key
)ENGINE=innodb;
From 6cfedfff9fb205dd5ec78f4e5a54d1532862a5b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Mon, 25 Mar 2013 17:18:10 +0400
Subject: [PATCH 008/194] TVA NPR : add info_bits property in class
FactureFournisseur
---
htdocs/fourn/class/fournisseur.facture.class.php | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php
index 60bdf26a8ab..525e8fb832b 100644
--- a/htdocs/fourn/class/fournisseur.facture.class.php
+++ b/htdocs/fourn/class/fournisseur.facture.class.php
@@ -389,7 +389,7 @@ class FactureFournisseur extends CommonInvoice
{
$sql = 'SELECT f.rowid, f.description, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.tva_tx, f.tva';
$sql.= ', f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2 ';
- $sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type';
+ $sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type, f.info_bits';
$sql.= ', p.rowid as product_id, p.ref as product_ref, p.label as label, p.description as product_desc';
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det as f';
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON f.fk_product = p.rowid';
@@ -430,6 +430,7 @@ class FactureFournisseur extends CommonInvoice
$this->lines[$i]->total_ttc = $obj->total_ttc;
$this->lines[$i]->fk_product = $obj->fk_product;
$this->lines[$i]->product_type = $obj->product_type;
+ $this->lines[$i]->info_bits = $obj->info_bits;
$i++;
}
@@ -1104,6 +1105,7 @@ class FactureFournisseur extends CommonInvoice
$pu_ttc = $tabprice[5];
$total_localtax1 = $tabprice[9];
$total_localtax2 = $tabprice[10];
+ $info_bits = empty($info_bits) ? 0 : $info_bits;
if ($idproduct)
{
@@ -1133,6 +1135,7 @@ class FactureFournisseur extends CommonInvoice
if ($idproduct) $sql.= ", fk_product = ".$idproduct;
else $sql.= ", fk_product = null";
$sql.= ", product_type = ".$product_type;
+ $sql.= ", infos_bits = ".$infos_bits;
$sql.= " WHERE rowid = ".$id;
dol_syslog(get_class($this)."::updateline sql=".$sql);
From b2b0d1616defca62e833381cbcbe95ec15991f6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Mon, 25 Mar 2013 17:32:22 +0400
Subject: [PATCH 009/194] TVA NPR : add fourn_tva_npr property in class
ProductFournisseur
---
htdocs/fourn/class/fournisseur.product.class.php | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php
index 7399c454cee..40e19664681 100644
--- a/htdocs/fourn/class/fournisseur.product.class.php
+++ b/htdocs/fourn/class/fournisseur.product.class.php
@@ -48,6 +48,7 @@ class ProductFournisseur extends Product
var $product_fourn_id; // supplier id
var $fk_availability; // availability delay
var $fourn_unitprice;
+ var $fourn_tva_npr;
/**
@@ -147,7 +148,7 @@ class ProductFournisseur extends Product
* @param float $remise Discount regarding qty (amount)
* @return int <0 if KO, >=0 if OK
*/
- function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $availability, $ref_fourn, $tva_tx, $charges=0, $remise_percent=0, $remise=0)
+ function update_buyprice($qty, $buyprice, $user, $price_base_type, $fourn, $availability, $ref_fourn, $tva_tx, $charges=0, $remise_percent=0, $remise=0, $newnpr=0)
{
global $conf,$mysoc;
@@ -188,6 +189,7 @@ class ProductFournisseur extends Product
$sql.= " tva_tx = ".$tva_tx.",";
$sql.= " fk_availability = ".$availability.",";
$sql.= " entity = ".$conf->entity.",";
+ $sql.= " recuperableonly = ".$newnpr.",";
$sql.= " charges = ".$charges;
$sql.= " WHERE rowid = ".$this->product_fourn_price_id;
// TODO Add price_base_type and price_ttc
@@ -218,7 +220,7 @@ class ProductFournisseur extends Product
{
// Add price for this quantity to supplier
$sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price(";
- $sql.= "datec, fk_product, fk_soc, ref_fourn, fk_user, price, quantity, remise_percent, remise, unitprice, tva_tx, charges, unitcharges, fk_availability, entity)";
+ $sql.= "datec, fk_product, fk_soc, ref_fourn, fk_user, price, quantity, remise_percent, remise, unitprice, tva_tx, charges, unitcharges, fk_availability, entity, recuperableonly)";
$sql.= " values('".$this->db->idate($now)."',";
$sql.= " ".$this->id.",";
$sql.= " ".$fourn->id.",";
@@ -233,6 +235,7 @@ class ProductFournisseur extends Product
$sql.= " ".$charges.",";
$sql.= " ".$unitCharges.",";
$sql.= " ".$availability.",";
+ $sql.= " ".$newnpr.",";
$sql.= $conf->entity;
$sql.=")";
@@ -316,6 +319,7 @@ class ProductFournisseur extends Product
$this->product_id = $obj->fk_product; // deprecated
$this->fk_product = $obj->fk_product;
$this->fk_availability = $obj->fk_availability;
+ $this->fourn_tva_npr = $obj->recuperableonly;
return 1;
}
else
@@ -346,7 +350,7 @@ class ProductFournisseur extends Product
$sql = "SELECT s.nom as supplier_name, s.rowid as fourn_id,";
$sql.= " pfp.rowid as product_fourn_pri_id, pfp.ref_fourn, pfp.fk_product as product_fourn_id,";
- $sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.unitcharges";
+ $sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.unitcharges, pfp.recuperableonly";
$sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
$sql.= ", ".MAIN_DB_PREFIX."societe as s";
$sql.= " WHERE pfp.entity IN (".getEntity('product', 1).")";
@@ -381,6 +385,7 @@ class ProductFournisseur extends Product
$prodfourn->fourn_name = $record["supplier_name"];
$prodfourn->fk_availability = $record["fk_availability"];
$prodfourn->id = $prodid;
+ $prodfourn->fourn_tva_npr = $record["recuperableonly"];
if (!isset($prodfourn->fourn_unitprice))
{
@@ -501,4 +506,4 @@ class ProductFournisseur extends Product
}
-?>
\ No newline at end of file
+?>
From aaaa5242d6a2b05102b8d6ca7475c487c428df7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Mon, 25 Mar 2013 17:42:48 +0400
Subject: [PATCH 010/194] TVA NP : update price calculation
---
htdocs/product/class/product.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index c92b94b0b6e..a8803d6e5e8 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -1002,7 +1002,7 @@ class Product extends CommonObject
else
{
$price = price2num($newprice,'MU');
- $price_ttc = price2num($newprice) * (1 + ($newvat / 100));
+ $price_ttc = ( $newnpr != 1 ) ? price2num($newprice) * (1 + ($newvat / 100)) : $price;
$price_ttc = price2num($price_ttc,'MU');
if ($newminprice!='' || $newminprice==0)
From 6a342507122bc2bdf464867586a6d7e85ae87a84 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur
Date: Mon, 25 Mar 2013 17:54:54 +0100
Subject: [PATCH 011/194] Rewrite module manager. Next step.
---
htdocs/core/menus/standard/eldy.lib.php | 164 +++++++++++------------
htdocs/core/menus/standard/eldy_menu.php | 19 +--
htdocs/theme/eldy/style.css.php | 33 +++++
3 files changed, 126 insertions(+), 90 deletions(-)
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index f7e5143344a..61aaec75fc1 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -455,7 +455,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
// Setup
$newmenu->add("/admin/index.php?mainmenu=home&leftmenu=setup", $langs->trans("Setup"), 0, 1, '', $mainmenu, 'setup');
- if ($leftmenu=="setup")
+ if (empty($leftmenu) || $leftmenu=="setup")
{
$warnpicto='';
if (empty($conf->global->MAIN_INFO_SOCIETE_NOM) || empty($conf->global->MAIN_INFO_SOCIETE_COUNTRY))
@@ -475,7 +475,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/admin/ihm.php?mainmenu=home", $langs->trans("GUISetup"),1);
if (! in_array($langs->defaultlang,array('en_US','en_GB','en_NZ','en_AU','fr_FR','fr_BE','es_ES','ca_ES')))
{
- if ($leftmenu=="setup") $newmenu->add("/admin/translation.php", $langs->trans("Translation"),1);
+ if (empty($leftmenu) || $leftmenu=="setup") $newmenu->add("/admin/translation.php", $langs->trans("Translation"),1);
}
$newmenu->add("/admin/boxes.php?mainmenu=home", $langs->trans("Boxes"),1);
$newmenu->add("/admin/delais.php?mainmenu=home",$langs->trans("Alerts"),1);
@@ -490,11 +490,11 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
// System tools
$newmenu->add("/admin/tools/index.php?mainmenu=home&leftmenu=admintools", $langs->trans("SystemTools"), 0, 1, '', $mainmenu, 'admintools');
- if (preg_match('/^admintools/',$leftmenu))
+ if (empty($leftmenu) || preg_match('/^admintools/',$leftmenu))
{
$newmenu->add('/admin/system/dolibarr.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('InfoDolibarr'), 1);
- if ($leftmenu=='admintools_info') $newmenu->add('/admin/system/modules.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Modules'), 2);
- if ($leftmenu=='admintools_info') $newmenu->add('/admin/triggers.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Triggers'), 2);
+ if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/system/modules.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Modules'), 2);
+ if (empty($leftmenu) || $leftmenu=='admintools_info') $newmenu->add('/admin/triggers.php?mainmenu=home&leftmenu=admintools_info', $langs->trans('Triggers'), 2);
$newmenu->add('/admin/system/os.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoOS'), 1);
$newmenu->add('/admin/system/web.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoWebServer'), 1);
$newmenu->add('/admin/system/phpinfo.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoPHP'), 1);
@@ -517,7 +517,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
if (empty($user->societe_id))
{
$newmenu->add("/admin/tools/index.php?mainmenu=home&leftmenu=modulesadmintools", $langs->trans("ModulesSystemTools"), 0, 1, '', $mainmenu, 'modulesadmintools');
- if ($leftmenu=="modulesadmintools" && $user->admin)
+ if ((empty($leftmenu) || $leftmenu=="modulesadmintools") && $user->admin)
{
$langs->load("products");
$newmenu->add("/product/admin/product_tools.php?mainmenu=home&leftmenu=modulesadmintools", $langs->trans("ProductVatMassChange"), 1, $user->admin);
@@ -527,7 +527,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
}
$newmenu->add("/user/home.php?leftmenu=users", $langs->trans("MenuUsersAndGroups"), 0, 1, '', $mainmenu, 'users');
- if ($leftmenu=="users")
+ if (empty($leftmenu) || $leftmenu=="users")
{
$newmenu->add("/user/index.php", $langs->trans("Users"), 1, $user->rights->user->user->lire || $user->admin);
$newmenu->add("/user/fiche.php?action=create", $langs->trans("NewUser"),2, $user->rights->user->user->creer || $user->admin);
@@ -561,11 +561,11 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$langs->load("commercial");
$newmenu->add("/comm/prospect/list.php?leftmenu=prospects", $langs->trans("ListProspectsShort"), 1, $user->rights->societe->lire, '', $mainmenu, 'prospects');
- if ($leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=-1", $langs->trans("LastProspectDoNotContact"), 2, $user->rights->societe->lire);
- if ($leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=0", $langs->trans("LastProspectNeverContacted"), 2, $user->rights->societe->lire);
- if ($leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=1", $langs->trans("LastProspectToContact"), 2, $user->rights->societe->lire);
- if ($leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=2", $langs->trans("LastProspectContactInProcess"), 2, $user->rights->societe->lire);
- if ($leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=3", $langs->trans("LastProspectContactDone"), 2, $user->rights->societe->lire);
+ if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=-1", $langs->trans("LastProspectDoNotContact"), 2, $user->rights->societe->lire);
+ if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=0", $langs->trans("LastProspectNeverContacted"), 2, $user->rights->societe->lire);
+ if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=1", $langs->trans("LastProspectToContact"), 2, $user->rights->societe->lire);
+ if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=2", $langs->trans("LastProspectContactInProcess"), 2, $user->rights->societe->lire);
+ if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&stcomm=3", $langs->trans("LastProspectContactDone"), 2, $user->rights->societe->lire);
$newmenu->add("/societe/soc.php?leftmenu=prospects&action=create&type=p", $langs->trans("MenuNewProspect"), 2, $user->rights->societe->creer);
//$newmenu->add("/contact/list.php?leftmenu=customers&type=p", $langs->trans("Contacts"), 2, $user->rights->societe->contact->lire);
@@ -624,7 +624,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/categories/fiche.php?action=create&type=1", $langs->trans("NewCategory"), 1, $user->rights->categorie->creer);
}
}
- //if ($leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
+ //if (empty($leftmenu) || $leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
}
}
@@ -643,12 +643,12 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/comm/propal/index.php?leftmenu=propals", $langs->trans("Prop"), 0, $user->rights->propale->lire, '', $mainmenu, 'propals');
$newmenu->add("/comm/propal.php?action=create&leftmenu=propals", $langs->trans("NewPropal"), 1, $user->rights->propale->creer);
$newmenu->add("/comm/propal/list.php?leftmenu=propals", $langs->trans("List"), 1, $user->rights->propale->lire);
- if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=0", $langs->trans("PropalsDraft"), 2, $user->rights->propale->lire);
- if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=1", $langs->trans("PropalsOpened"), 2, $user->rights->propale->lire);
- if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=2", $langs->trans("PropalStatusSigned"), 2, $user->rights->propale->lire);
- if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=3", $langs->trans("PropalStatusNotSigned"), 2, $user->rights->propale->lire);
- if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=4", $langs->trans("PropalStatusBilled"), 2, $user->rights->propale->lire);
- //if ($leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=2,3,4", $langs->trans("PropalStatusClosedShort"), 2, $user->rights->propale->lire);
+ if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=0", $langs->trans("PropalsDraft"), 2, $user->rights->propale->lire);
+ if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=1", $langs->trans("PropalsOpened"), 2, $user->rights->propale->lire);
+ if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=2", $langs->trans("PropalStatusSigned"), 2, $user->rights->propale->lire);
+ if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=3", $langs->trans("PropalStatusNotSigned"), 2, $user->rights->propale->lire);
+ if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=4", $langs->trans("PropalStatusBilled"), 2, $user->rights->propale->lire);
+ //if (empty($leftmenu) || $leftmenu=="propals") $newmenu->add("/comm/propal/list.php?leftmenu=propals&viewstatut=2,3,4", $langs->trans("PropalStatusClosedShort"), 2, $user->rights->propale->lire);
$newmenu->add("/comm/propal/stats/index.php?leftmenu=propals", $langs->trans("Statistics"), 1, $user->rights->propale->lire);
}
@@ -659,12 +659,12 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/commande/index.php?leftmenu=orders", $langs->trans("CustomersOrders"), 0, $user->rights->commande->lire, '', $mainmenu, 'orders');
$newmenu->add("/societe/societe.php?leftmenu=orders", $langs->trans("NewOrder"), 1, $user->rights->commande->creer);
$newmenu->add("/commande/liste.php?leftmenu=orders", $langs->trans("List"), 1, $user->rights->commande->lire);
- if ($leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=0", $langs->trans("StatusOrderDraftShort"), 2, $user->rights->commande->lire);
- if ($leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=1", $langs->trans("StatusOrderValidated"), 2, $user->rights->commande->lire);
- if ($leftmenu=="orders" && ! empty($conf->expedition->enabled)) $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=2", $langs->trans("StatusOrderOnProcessShort"), 2, $user->rights->commande->lire);
- if ($leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=3", $langs->trans("StatusOrderToBill"), 2, $user->rights->commande->lire); // The translation key is StatusOrderToBill but it means StatusDelivered. TODO We should renamed this later
- if ($leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=4", $langs->trans("StatusOrderProcessed"), 2, $user->rights->commande->lire);
- if ($leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=-1", $langs->trans("StatusOrderCanceledShort"), 2, $user->rights->commande->lire);
+ if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=0", $langs->trans("StatusOrderDraftShort"), 2, $user->rights->commande->lire);
+ if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=1", $langs->trans("StatusOrderValidated"), 2, $user->rights->commande->lire);
+ if (empty($leftmenu) || $leftmenu=="orders" && ! empty($conf->expedition->enabled)) $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=2", $langs->trans("StatusOrderOnProcessShort"), 2, $user->rights->commande->lire);
+ if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=3", $langs->trans("StatusOrderToBill"), 2, $user->rights->commande->lire); // The translation key is StatusOrderToBill but it means StatusDelivered. TODO We should renamed this later
+ if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=4", $langs->trans("StatusOrderProcessed"), 2, $user->rights->commande->lire);
+ if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=-1", $langs->trans("StatusOrderCanceledShort"), 2, $user->rights->commande->lire);
$newmenu->add("/commande/stats/index.php?leftmenu=orders", $langs->trans("Statistics"), 1, $user->rights->commande->lire);
}
@@ -686,10 +686,10 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
$newmenu->add("/contrat/fiche.php?&action=create&leftmenu=contracts", $langs->trans("NewContract"), 1, $user->rights->contrat->creer);
$newmenu->add("/contrat/liste.php?leftmenu=contracts", $langs->trans("List"), 1, $user->rights->contrat->lire);
$newmenu->add("/contrat/services.php?leftmenu=contracts", $langs->trans("MenuServices"), 1, $user->rights->contrat->lire);
- if ($leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=0", $langs->trans("MenuInactiveServices"), 2, $user->rights->contrat->lire);
- if ($leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=4", $langs->trans("MenuRunningServices"), 2, $user->rights->contrat->lire);
- if ($leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=4&filter=expired", $langs->trans("MenuExpiredServices"), 2, $user->rights->contrat->lire);
- if ($leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=5", $langs->trans("MenuClosedServices"), 2, $user->rights->contrat->lire);
+ if (empty($leftmenu) || $leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=0", $langs->trans("MenuInactiveServices"), 2, $user->rights->contrat->lire);
+ if (empty($leftmenu) || $leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=4", $langs->trans("MenuRunningServices"), 2, $user->rights->contrat->lire);
+ if (empty($leftmenu) || $leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=4&filter=expired", $langs->trans("MenuExpiredServices"), 2, $user->rights->contrat->lire);
+ if (empty($leftmenu) || $leftmenu=="contracts") $newmenu->add("/contrat/services.php?leftmenu=contracts&mode=5", $langs->trans("MenuClosedServices"), 2, $user->rights->contrat->lire);
}
// Interventions
@@ -758,7 +758,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$langs->load("orders");
if (! empty($conf->facture->enabled)) $newmenu->add("/commande/liste.php?leftmenu=orders&viewstatut=-3", $langs->trans("MenuOrdersToBill2"), 0, $user->rights->commande->lire, '', $mainmenu, 'orders');
- // if ($leftmenu=="orders") $newmenu->add("/commande/", $langs->trans("StatusOrderToBill"), 1, $user->rights->commande->lire);
+ // if (empty($leftmenu) || $leftmenu=="orders") $newmenu->add("/commande/", $langs->trans("StatusOrderToBill"), 1, $user->rights->commande->lire);
}
// Donations
@@ -766,8 +766,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$langs->load("donations");
$newmenu->add("/compta/dons/index.php?leftmenu=donations&mainmenu=accountancy",$langs->trans("Donations"), 0, $user->rights->don->lire, '', $mainmenu, 'donations');
- if ($leftmenu=="donations") $newmenu->add("/compta/dons/fiche.php?action=create",$langs->trans("NewDonation"), 1, $user->rights->don->creer);
- if ($leftmenu=="donations") $newmenu->add("/compta/dons/liste.php",$langs->trans("List"), 1, $user->rights->don->lire);
+ if (empty($leftmenu) || $leftmenu=="donations") $newmenu->add("/compta/dons/fiche.php?action=create",$langs->trans("NewDonation"), 1, $user->rights->don->creer);
+ if (empty($leftmenu) || $leftmenu=="donations") $newmenu->add("/compta/dons/liste.php",$langs->trans("List"), 1, $user->rights->don->lire);
//if ($leftmenu=="donations") $newmenu->add("/compta/dons/stats.php",$langs->trans("Statistics"), 1, $user->rights->don->lire);
}
@@ -776,36 +776,36 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$langs->load("trips");
$newmenu->add("/compta/deplacement/index.php?leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("TripsAndExpenses"), 0, $user->rights->deplacement->lire, '', $mainmenu, 'tripsandexpenses');
- if ($leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/fiche.php?action=create&leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("New"), 1, $user->rights->deplacement->creer);
- if ($leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/list.php?leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("List"), 1, $user->rights->deplacement->lire);
- if ($leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("Statistics"), 1, $user->rights->deplacement->lire);
+ if (empty($leftmenu) || $leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/fiche.php?action=create&leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("New"), 1, $user->rights->deplacement->creer);
+ if (empty($leftmenu) || $leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/list.php?leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("List"), 1, $user->rights->deplacement->lire);
+ if (empty($leftmenu) || $leftmenu=="tripsandexpenses") $newmenu->add("/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses&mainmenu=accountancy", $langs->trans("Statistics"), 1, $user->rights->deplacement->lire);
}
// Taxes and social contributions
if (! empty($conf->tax->enabled))
{
$newmenu->add("/compta/charges/index.php?leftmenu=tax&mainmenu=accountancy",$langs->trans("MenuTaxAndDividends"), 0, $user->rights->tax->charges->lire, '', $mainmenu, 'tax');
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/sociales/index.php?leftmenu=tax_social",$langs->trans("MenuSocialContributions"),1,$user->rights->tax->charges->lire);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/sociales/charges.php?leftmenu=tax_social&action=create",$langs->trans("MenuNewSocialContribution"), 2, $user->rights->tax->charges->creer);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/charges/index.php?leftmenu=tax_social&mainmenu=accountancy&mode=sconly",$langs->trans("Payments"), 2, $user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/sociales/index.php?leftmenu=tax_social",$langs->trans("MenuSocialContributions"),1,$user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/sociales/charges.php?leftmenu=tax_social&action=create",$langs->trans("MenuNewSocialContribution"), 2, $user->rights->tax->charges->creer);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/charges/index.php?leftmenu=tax_social&mainmenu=accountancy&mode=sconly",$langs->trans("Payments"), 2, $user->rights->tax->charges->lire);
// VAT
if (empty($conf->global->TAX_DISABLE_VAT_MENUS))
{
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/index.php?leftmenu=tax_vat&mainmenu=accountancy",$langs->trans("VAT"),1,$user->rights->tax->charges->lire, '', $mainmenu, 'tax_vat');
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/fiche.php?leftmenu=tax_vat&action=create",$langs->trans("NewPayment"),2,$user->rights->tax->charges->creer);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/reglement.php?leftmenu=tax_vat",$langs->trans("Payments"),2,$user->rights->tax->charges->lire);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/clients.php?leftmenu=tax_vat", $langs->trans("ReportByCustomers"), 2, $user->rights->tax->charges->lire);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/quadri_detail.php?leftmenu=tax_vat", $langs->trans("ReportByQuarter"), 2, $user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/index.php?leftmenu=tax_vat&mainmenu=accountancy",$langs->trans("VAT"),1,$user->rights->tax->charges->lire, '', $mainmenu, 'tax_vat');
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/fiche.php?leftmenu=tax_vat&action=create",$langs->trans("NewPayment"),2,$user->rights->tax->charges->creer);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/reglement.php?leftmenu=tax_vat",$langs->trans("Payments"),2,$user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/clients.php?leftmenu=tax_vat", $langs->trans("ReportByCustomers"), 2, $user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/tva/quadri_detail.php?leftmenu=tax_vat", $langs->trans("ReportByQuarter"), 2, $user->rights->tax->charges->lire);
global $mysoc;
//Local Taxes
if($mysoc->country_code=='ES' && (isset($mysoc->localtax2_assuj) && $mysoc->localtax2_assuj=="1"))
{
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/index.php?leftmenu=tax_vat&mainmenu=accountancy",$langs->transcountry("LT2",$mysoc->country_code),1,$user->rights->tax->charges->lire);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/fiche.php?leftmenu=tax_vat&action=create",$langs->trans("NewPayment"),2,$user->rights->tax->charges->creer);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/reglement.php?leftmenu=tax_vat",$langs->trans("Payments"),2,$user->rights->tax->charges->lire);
- if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/clients.php?leftmenu=tax_vat", $langs->trans("ReportByCustomers"), 2, $user->rights->tax->charges->lire);
- //if (preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/quadri_detail.php?leftmenu=tax_vat", $langs->trans("ReportByQuarter"), 2, $user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/index.php?leftmenu=tax_vat&mainmenu=accountancy",$langs->transcountry("LT2",$mysoc->country_code),1,$user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/fiche.php?leftmenu=tax_vat&action=create",$langs->trans("NewPayment"),2,$user->rights->tax->charges->creer);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/reglement.php?leftmenu=tax_vat",$langs->trans("Payments"),2,$user->rights->tax->charges->lire);
+ if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/clients.php?leftmenu=tax_vat", $langs->trans("ReportByCustomers"), 2, $user->rights->tax->charges->lire);
+ //if (empty($leftmenu) || preg_match('/^tax/i',$leftmenu)) $newmenu->add("/compta/localtax/quadri_detail.php?leftmenu=tax_vat", $langs->trans("ReportByQuarter"), 2, $user->rights->tax->charges->lire);
}
}
@@ -816,8 +816,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
if (! empty($conf->comptabilite->enabled) && ($conf->global->MAIN_FEATURES_LEVEL >= 2))
{
$newmenu->add("/compta/ventilation/index.php?leftmenu=ventil",$langs->trans("Dispatch"),0,$user->rights->compta->ventilation->lire, '', $mainmenu, 'ventil');
- if ($leftmenu=="ventil") $newmenu->add("/compta/ventilation/liste.php",$langs->trans("ToDispatch"),1,$user->rights->compta->ventilation->lire);
- if ($leftmenu=="ventil") $newmenu->add("/compta/ventilation/lignes.php",$langs->trans("Dispatched"),1,$user->rights->compta->ventilation->lire);
+ if (empty($leftmenu) || $leftmenu=="ventil") $newmenu->add("/compta/ventilation/liste.php",$langs->trans("ToDispatch"),1,$user->rights->compta->ventilation->lire);
+ if (empty($leftmenu) || $leftmenu=="ventil") $newmenu->add("/compta/ventilation/lignes.php",$langs->trans("Dispatched"),1,$user->rights->compta->ventilation->lire);
}
// Compta expert
@@ -834,29 +834,29 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
// Bilan, resultats
$newmenu->add("/compta/resultat/index.php?leftmenu=ca&mainmenu=accountancy",$langs->trans("Reportings"),0,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire, '', $mainmenu, 'ca');
- if ($leftmenu=="ca") $newmenu->add("/compta/resultat/index.php?leftmenu=ca",$langs->trans("ReportInOut"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
- if ($leftmenu=="ca") $newmenu->add("/compta/resultat/clientfourn.php?leftmenu=ca",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/resultat/index.php?leftmenu=ca",$langs->trans("ReportInOut"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/resultat/clientfourn.php?leftmenu=ca",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
/* On verra ca avec module compabilite expert
- if ($leftmenu=="ca") $newmenu->add("/compta/resultat/compteres.php?leftmenu=ca","Compte de resultat",2,$user->rights->compta->resultat->lire);
- if ($leftmenu=="ca") $newmenu->add("/compta/resultat/bilan.php?leftmenu=ca","Bilan",2,$user->rights->compta->resultat->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/resultat/compteres.php?leftmenu=ca","Compte de resultat",2,$user->rights->compta->resultat->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/resultat/bilan.php?leftmenu=ca","Bilan",2,$user->rights->compta->resultat->lire);
*/
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/index.php?leftmenu=ca",$langs->trans("ReportTurnover"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/index.php?leftmenu=ca",$langs->trans("ReportTurnover"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
/*
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/cumul.php?leftmenu=ca","Cumule",2,$user->rights->compta->resultat->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/cumul.php?leftmenu=ca","Cumule",2,$user->rights->compta->resultat->lire);
if (! empty($conf->propal->enabled)) {
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/prev.php?leftmenu=ca","Previsionnel",2,$user->rights->compta->resultat->lire);
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/comp.php?leftmenu=ca","Transforme",2,$user->rights->compta->resultat->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/prev.php?leftmenu=ca","Previsionnel",2,$user->rights->compta->resultat->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/comp.php?leftmenu=ca","Transforme",2,$user->rights->compta->resultat->lire);
}
*/
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/casoc.php?leftmenu=ca",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
- if ($leftmenu=="ca") $newmenu->add("/compta/stats/cabyuser.php?leftmenu=ca",$langs->trans("ByUsers"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/casoc.php?leftmenu=ca",$langs->trans("ByCompanies"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/stats/cabyuser.php?leftmenu=ca",$langs->trans("ByUsers"),2,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
// Journaux
//if ($leftmenu=="ca") $newmenu->add("/compta/journaux/index.php?leftmenu=ca",$langs->trans("Journaux"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
//journaux
- if ($leftmenu=="ca") $newmenu->add("/compta/journal/sellsjournal.php?leftmenu=ca",$langs->trans("SellsJournal"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
- if ($leftmenu=="ca") $newmenu->add("/compta/journal/purchasesjournal.php?leftmenu=ca",$langs->trans("PurchasesJournal"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/journal/sellsjournal.php?leftmenu=ca",$langs->trans("SellsJournal"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
+ if (empty($leftmenu) || $leftmenu=="ca") $newmenu->add("/compta/journal/purchasesjournal.php?leftmenu=ca",$langs->trans("PurchasesJournal"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire);
}
}
@@ -889,17 +889,17 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$newmenu->add("/compta/prelevement/index.php?leftmenu=withdraw&mainmenu=bank",$langs->trans("StandingOrders"),0,$user->rights->prelevement->bons->lire, '', $mainmenu, 'withdraw');
- //if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/demandes.php?status=0&mainmenu=bank",$langs->trans("StandingOrderToProcess"),1,$user->rights->prelevement->bons->lire);
+ //if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/demandes.php?status=0&mainmenu=bank",$langs->trans("StandingOrderToProcess"),1,$user->rights->prelevement->bons->lire);
- if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/create.php?mainmenu=bank",$langs->trans("NewStandingOrder"),1,$user->rights->prelevement->bons->creer);
+ if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/create.php?mainmenu=bank",$langs->trans("NewStandingOrder"),1,$user->rights->prelevement->bons->creer);
- if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/bons.php?mainmenu=bank",$langs->trans("WithdrawalsReceipts"),1,$user->rights->prelevement->bons->lire);
- if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/liste.php?mainmenu=bank",$langs->trans("WithdrawalsLines"),1,$user->rights->prelevement->bons->lire);
- if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/rejets.php?mainmenu=bank",$langs->trans("Rejects"),1,$user->rights->prelevement->bons->lire);
- if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/stats.php?mainmenu=bank",$langs->trans("Statistics"),1,$user->rights->prelevement->bons->lire);
+ if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/bons.php?mainmenu=bank",$langs->trans("WithdrawalsReceipts"),1,$user->rights->prelevement->bons->lire);
+ if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/liste.php?mainmenu=bank",$langs->trans("WithdrawalsLines"),1,$user->rights->prelevement->bons->lire);
+ if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/rejets.php?mainmenu=bank",$langs->trans("Rejects"),1,$user->rights->prelevement->bons->lire);
+ if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/stats.php?mainmenu=bank",$langs->trans("Statistics"),1,$user->rights->prelevement->bons->lire);
- //if ($leftmenu=="withdraw") $newmenu->add("/compta/prelevement/config.php",$langs->trans("Setup"),1,$user->rights->prelevement->bons->configurer);
+ //if (empty($leftmenu) || $leftmenu=="withdraw") $newmenu->add("/compta/prelevement/config.php",$langs->trans("Setup"),1,$user->rights->prelevement->bons->configurer);
}
// Gestion cheques
@@ -960,7 +960,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$newmenu->add("/categories/fiche.php?action=create&type=0", $langs->trans("NewCategory"), 1, $user->rights->categorie->creer);
}
- //if ($leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
+ //if (empty($leftmenu) || $leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
}
// Stocks
@@ -968,10 +968,10 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$langs->load("stocks");
$newmenu->add("/product/stock/index.php?leftmenu=stock", $langs->trans("Stocks"), 0, $user->rights->stock->lire, '', $mainmenu, 'stock');
- if ($leftmenu=="stock") $newmenu->add("/product/stock/fiche.php?action=create", $langs->trans("MenuNewWarehouse"), 1, $user->rights->stock->creer);
- if ($leftmenu=="stock") $newmenu->add("/product/stock/liste.php", $langs->trans("List"), 1, $user->rights->stock->lire);
- if ($leftmenu=="stock") $newmenu->add("/product/stock/valo.php", $langs->trans("EnhancedValue"), 1, $user->rights->stock->lire);
- if ($leftmenu=="stock") $newmenu->add("/product/stock/mouvement.php", $langs->trans("Movements"), 1, $user->rights->stock->mouvement->lire);
+ if (empty($leftmenu) || $leftmenu=="stock") $newmenu->add("/product/stock/fiche.php?action=create", $langs->trans("MenuNewWarehouse"), 1, $user->rights->stock->creer);
+ if (empty($leftmenu) || $leftmenu=="stock") $newmenu->add("/product/stock/liste.php", $langs->trans("List"), 1, $user->rights->stock->lire);
+ if (empty($leftmenu) || $leftmenu=="stock") $newmenu->add("/product/stock/valo.php", $langs->trans("EnhancedValue"), 1, $user->rights->stock->lire);
+ if (empty($leftmenu) || $leftmenu=="stock") $newmenu->add("/product/stock/mouvement.php", $langs->trans("Movements"), 1, $user->rights->stock->mouvement->lire);
}
// Expeditions
@@ -979,9 +979,9 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$langs->load("sendings");
$newmenu->add("/expedition/index.php?leftmenu=sendings", $langs->trans("Shipments"), 0, $user->rights->expedition->lire, '', $mainmenu, 'sendings');
- if ($leftmenu=="sendings") $newmenu->add("/expedition/fiche.php?action=create2&leftmenu=sendings", $langs->trans("NewSending"), 1, $user->rights->expedition->creer);
- if ($leftmenu=="sendings") $newmenu->add("/expedition/liste.php?leftmenu=sendings", $langs->trans("List"), 1, $user->rights->expedition->lire);
- if ($leftmenu=="sendings") $newmenu->add("/expedition/stats/index.php?leftmenu=sendings", $langs->trans("Statistics"), 1, $user->rights->expedition->lire);
+ if (empty($leftmenu) || $leftmenu=="sendings") $newmenu->add("/expedition/fiche.php?action=create2&leftmenu=sendings", $langs->trans("NewSending"), 1, $user->rights->expedition->creer);
+ if (empty($leftmenu) || $leftmenu=="sendings") $newmenu->add("/expedition/liste.php?leftmenu=sendings", $langs->trans("List"), 1, $user->rights->expedition->lire);
+ if (empty($leftmenu) || $leftmenu=="sendings") $newmenu->add("/expedition/stats/index.php?leftmenu=sendings", $langs->trans("Statistics"), 1, $user->rights->expedition->lire);
}
}
@@ -1037,7 +1037,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$newmenu->add("/categories/fiche.php?action=create&type=1", $langs->trans("NewCategory"), 1, $user->rights->categorie->creer);
}
- //if ($leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
+ //if (empty($leftmenu) || $leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
}
}
@@ -1141,13 +1141,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
{
$newmenu->add("/categories/fiche.php?action=create&type=3", $langs->trans("NewCategory"), 1, $user->rights->categorie->creer);
}
- //if ($leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
+ //if (empty($leftmenu) || $leftmenu=="cat") $newmenu->add("/categories/liste.php", $langs->trans("List"), 1, $user->rights->categorie->lire);
}
$newmenu->add("/adherents/index.php?leftmenu=export&mainmenu=members",$langs->trans("Exports"),0,$user->rights->adherent->export, '', $mainmenu, 'export');
- if (! empty($conf->export->enabled) && $leftmenu=="export") $newmenu->add("/exports/index.php?leftmenu=export",$langs->trans("Datas"),1,$user->rights->adherent->export);
- if ($leftmenu=="export") $newmenu->add("/adherents/htpasswd.php?leftmenu=export",$langs->trans("Filehtpasswd"),1,$user->rights->adherent->export);
- if ($leftmenu=="export") $newmenu->add("/adherents/cartes/carte.php?leftmenu=export",$langs->trans("MembersCards"),1,$user->rights->adherent->export);
+ if (! empty($conf->export->enabled) && (empty($leftmenu) || $leftmenu=="export")) $newmenu->add("/exports/index.php?leftmenu=export",$langs->trans("Datas"),1,$user->rights->adherent->export);
+ if (empty($leftmenu) || $leftmenu=="export") $newmenu->add("/adherents/htpasswd.php?leftmenu=export",$langs->trans("Filehtpasswd"),1,$user->rights->adherent->export);
+ if (empty($leftmenu) || $leftmenu=="export") $newmenu->add("/adherents/cartes/carte.php?leftmenu=export",$langs->trans("MembersCards"),1,$user->rights->adherent->export);
// Type
$newmenu->add("/adherents/type.php?leftmenu=setup&mainmenu=members",$langs->trans("MembersTypes"),0,$user->rights->adherent->configurer, '', $mainmenu, 'setup');
diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php
index f920a905983..eb050232366 100644
--- a/htdocs/core/menus/standard/eldy_menu.php
+++ b/htdocs/core/menus/standard/eldy_menu.php
@@ -136,32 +136,36 @@ class MenuManager
foreach($this->menu->liste as $key => $val) // $val['url','titre','level','enabled'=0|1|2,'target','mainmenu','leftmenu'
{
print '';
- print '';
+ print ' ';
if ($val['enabled'] == 1)
{
$relurl=dol_buildpath($val['url'],1);
print ''.$val['titre'].' '."\n";
-
+ // Search submenu fot this entry
+ $tmpmainmenu=$val['mainmenu'];
+ $tmpleftmenu='all';
$submenu=new Menu();
- $res=print_left_eldy_menu($this->db,$this->menu_array,$this->menu_array_after,$this->tabMenu,$submenu,1,$val['mainmenu'],$val['leftmenu']);
+ $res=print_left_eldy_menu($this->db,$this->menu_array,$this->menu_array_after,$this->tabMenu,$submenu,1,$tmpmainmenu,$tmpleftmenu);
$nexturl=dol_buildpath($submenu->liste[0]['url'],1);
$canonrelurl=preg_replace('/\?.*$/','',$relurl);
$canonnexturl=preg_replace('/\?.*$/','',$nexturl);
//var_dump($canonrelurl);
//var_dump($canonnexturl);
+ print '';
}
if ($val['enabled'] == 2)
{
@@ -169,7 +173,6 @@ class MenuManager
}
print ' ';
print ' '."\n";
- print 'wwwwwww';
}
}
diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php
index c3e3d58d5e6..665f58b0b89 100644
--- a/htdocs/theme/eldy/style.css.php
+++ b/htdocs/theme/eldy/style.css.php
@@ -2519,6 +2519,39 @@ div.dolEventError h1, div.dolEventError h2 {
}
+
+
+/* ============================================================================== */
+/* JMobile */
+/* ============================================================================== */
+
+.ui-body-c .ui-link {
+ color: #111 !important;
+}
+.ui-li-divider {
+ background: #eee !important;
+}
+.ui-bar-b {
+ border: 1px solid #ccc !important;
+ background: #aaa !important;
+ font-weight: bold !important;
+ color: #444 !important;
+ text-shadow: 0 1px 1px #fff !important;
+ background-image: -webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#aaa)) !important;
+ background-image: -webkit-linear-gradient(top,#fdfdfd,#aaa) !important;
+ background-image: -moz-linear-gradient(top,#fdfdfd,#aaa) !important;
+ background-image: -ms-linear-gradient(top,#fdfdfd,#aaa) !important;
+ background-image: -o-linear-gradient(top,#fdfdfd,#aaa) !important;
+ background-image: linear-gradient(top,#fdfdfd,#aaa) !important;
+}
+.ui-bar-b .ui-link {
+ border: none;
+ font-weight: bold !important;
+ color: #444 !important;
+ text-shadow: 0 1px 1px #fff !important;
+}
+
+
close();
?>
From bbbc4ad8c44af76b01a622e0a8a032b7cb557e27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Tue, 26 Mar 2013 07:57:19 +0400
Subject: [PATCH 012/194] TVA NPR: add parameter in function call. Accept * tva
---
htdocs/fourn/facture/fiche.php | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/htdocs/fourn/facture/fiche.php b/htdocs/fourn/facture/fiche.php
index b726d39231a..62cb5334b93 100644
--- a/htdocs/fourn/facture/fiche.php
+++ b/htdocs/fourn/facture/fiche.php
@@ -502,13 +502,14 @@ elseif ($action == 'addline')
$label.= $_POST['np_desc'];
$tvatx=get_default_tva($object->thirdparty, $mysoc, $product->id, $_POST['idprodfournprice']);
+ $npr = get_default_npr($object->thirdparty, $mysoc, $product->id, $_POST['idprodfournprice']);
$localtax1tx= get_localtax($tvatx, 1, $mysoc,$object->thirdparty);
$localtax2tx= get_localtax($tvatx, 2, $mysoc,$object->thirdparty);
$remise_percent=GETPOST('remise_percent');
$type = $product->type;
- $result=$object->addline($label, $product->fourn_pu, $tvatx, $localtax1tx, $localtax2tx, $_POST['qty'], $idprod, $remise_percent);
+ $result=$object->addline($label, $product->fourn_pu, $tvatx, $localtax1tx, $localtax2tx, $_POST['qty'], $idprod, $remise_percent, '', '', 0, $npr);
}
if ($idprod == -1)
@@ -520,7 +521,9 @@ elseif ($action == 'addline')
}
else
{
- $tauxtva = price2num($_POST['tauxtva']);
+ $npr = preg_match('/\*/', $_POST['tauxtva']) ? 1 : 0 ;
+ $tauxtva = str_replace('*','',$_POST["tauxtva"]);
+ $tauxtva = price2num($tauxtva);
$localtax1tx= get_localtax($tauxtva, 1, $mysoc,$object->thirdparty);
$localtax2tx= get_localtax($tauxtva, 2, $mysoc,$object->thirdparty);
$remise_percent=GETPOST('remise_percent');
@@ -538,14 +541,14 @@ elseif ($action == 'addline')
$price_base_type = 'HT';
//$desc, $pu, $txtva, $qty, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $price_base_type='HT', $type=0)
- $result=$object->addline($_POST['dp_desc'], $ht, $tauxtva, $localtax1tx, $localtax2tx, $_POST['qty'], 0, $remise_percent, $datestart, $dateend, 0, 0, $price_base_type, $type);
+ $result=$object->addline($_POST['dp_desc'], $ht, $tauxtva, $localtax1tx, $localtax2tx, $_POST['qty'], 0, $remise_percent, $datestart, $dateend, 0, $npr, $price_base_type, $type);
}
else
{
$ttc = price2num($_POST['amountttc']);
$ht = $ttc / (1 + ($tauxtva / 100));
$price_base_type = 'HT';
- $result=$object->addline($_POST['dp_desc'], $ht, $tauxtva,$localtax1tx, $localtax2tx, $_POST['qty'], 0, $remise_percent, $datestart, $dateend, 0, 0, $price_base_type, $type);
+ $result=$object->addline($_POST['dp_desc'], $ht, $tauxtva,$localtax1tx, $localtax2tx, $_POST['qty'], 0, $remise_percent, $datestart, $dateend, 0, $npr, $price_base_type, $type);
}
}
}
@@ -1739,7 +1742,7 @@ else
print '';
// VAT
- print ''.vatrate($object->lines[$i]->tva_tx).'% ';
+ print ''.vatrate($object->lines[$i]->tva_tx, true, $object->lines[$i]->info_bits).'% ';
// Unit price
print ''.price($object->lines[$i]->pu_ht,'MU').' ';
From 148ad65150ca44f2a4a9c8d930a1ad0ed42665da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Tue, 26 Mar 2013 08:11:06 +0400
Subject: [PATCH 013/194] TVA NPR : deduplicate line. Remove tva npr from
journal lines
---
htdocs/compta/journal/purchasesjournal.php | 9 +++++----
htdocs/compta/journal/sellsjournal.php | 7 ++++---
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/htdocs/compta/journal/purchasesjournal.php b/htdocs/compta/journal/purchasesjournal.php
index f1977f9f01a..96d5fd8bf86 100755
--- a/htdocs/compta/journal/purchasesjournal.php
+++ b/htdocs/compta/journal/purchasesjournal.php
@@ -97,9 +97,9 @@ $sql = "SELECT f.rowid, f.facnumber, f.type, f.datef, f.libelle,";
$sql.= " fd.total_ttc, fd.tva_tx, fd.total_ht, fd.tva as total_tva, fd.product_type,";
$sql.= " s.rowid as socid, s.nom as name, s.code_compta_fournisseur,";
$sql.= " p.rowid as pid, p.ref as ref, p.accountancy_code_buy,";
-$sql.= " ct.accountancy_code_buy as account_tva";
+$sql.= " ct.accountancy_code_buy as account_tva, ct.recuperableonly";
$sql.= " FROM ".MAIN_DB_PREFIX."facture_fourn_det fd";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_tva ct ON fd.tva_tx = ct.taux AND ct.fk_pays = '".$idpays."'";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_tva ct ON fd.tva_tx = ct.taux AND fd.info_bits = ct.recuperableonly AND ct.fk_pays = '".$idpays."'";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product p ON p.rowid = fd.fk_product";
$sql.= " JOIN ".MAIN_DB_PREFIX."facture_fourn f ON f.rowid = fd.fk_facture_fourn";
$sql.= " JOIN ".MAIN_DB_PREFIX."societe s ON s.rowid = f.fk_soc" ;
@@ -142,7 +142,8 @@ if ($result)
$tabfac[$obj->rowid]["lib"] = $obj->libelle;
$tabttc[$obj->rowid][$compta_soc] += $obj->total_ttc;
$tabht[$obj->rowid][$compta_prod] += $obj->total_ht;
- $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva;
+ if($obj->recuperableonly != 1)
+ $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva;
$tabcompany[$obj->rowid]=array('id'=>$obj->socid,'name'=>$obj->name);
$i++;
@@ -238,4 +239,4 @@ print "";
llxFooter();
$db->close();
-?>
\ No newline at end of file
+?>
diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php
index c3cb58526ad..1e35607b1bb 100755
--- a/htdocs/compta/journal/sellsjournal.php
+++ b/htdocs/compta/journal/sellsjournal.php
@@ -99,12 +99,12 @@ $sql = "SELECT f.rowid, f.facnumber, f.type, f.datef, f.ref_client,";
$sql.= " fd.product_type, fd.total_ht, fd.total_tva, fd.tva_tx, fd.total_ttc,";
$sql.= " s.rowid as socid, s.nom as name, s.code_compta, s.client,";
$sql.= " p.rowid as pid, p.ref as pref, p.accountancy_code_sell,";
-$sql.= " ct.accountancy_code_sell as account_tva";
+$sql.= " ct.accountancy_code_sell as account_tva, ct.recuperableonly";
$sql.= " FROM ".MAIN_DB_PREFIX."facturedet fd";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product p ON p.rowid = fd.fk_product";
$sql.= " JOIN ".MAIN_DB_PREFIX."facture f ON f.rowid = fd.fk_facture";
$sql.= " JOIN ".MAIN_DB_PREFIX."societe s ON s.rowid = f.fk_soc";
-$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_tva ct ON fd.tva_tx = ct.taux AND ct.fk_pays = '".$idpays."'";
+$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_tva ct ON fd.tva_tx = ct.taux AND fd.info_bits = ct.recuperableonly AND ct.fk_pays = '".$idpays."'";
$sql.= " WHERE f.entity = ".$conf->entity;
$sql.= " AND f.fk_statut > 0";
if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2)";
@@ -149,7 +149,8 @@ if ($result)
if (! isset($tabtva[$obj->rowid][$compta_tva])) $tabtva[$obj->rowid][$compta_tva]=0;
$tabttc[$obj->rowid][$compta_soc] += $obj->total_ttc;
$tabht[$obj->rowid][$compta_prod] += $obj->total_ht;
- $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva;
+ if($obj->recuperableonly != 1)
+ $tabtva[$obj->rowid][$compta_tva] += $obj->total_tva;
$tabcompany[$obj->rowid]=array('id'=>$obj->socid, 'name'=>$obj->name, 'client'=>$obj->client);
$i++;
}
From 28999af70b4986854a4fb524a556db981078f60e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20de=20Chateauvieux?=
Date: Tue, 26 Mar 2013 08:47:17 +0400
Subject: [PATCH 014/194] TVA NPR : set function get_default_npr
---
htdocs/core/lib/functions.lib.php | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index 835e5a36ee1..6bb524d28e1 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -3047,8 +3047,32 @@ function get_default_tva($thirdparty_seller, $thirdparty_buyer, $idprod=0, $idpr
* @param int $idprod Id product
* @return float 0 or 1
*/
-function get_default_npr($thirdparty_seller, $thirdparty_buyer, $idprod)
+function get_default_npr($thirdparty_seller, $thirdparty_buyer, $idprod+0, $idprodfournprice=0)
{
+ global $db;
+ if($idprodfournprice>0)
+ {
+ $sql = "SELECT pfp.recuperableonly";
+ $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp";
+ $sql.= " WHERE rowid = ".$idprodfournprice;
+ dol_syslog(get_class($this)."::get_default_npr sql=".$sql, LOG_DEBUG);
+
+ $resql = $this->db->query($sql);
+ if ($resql)
+ {
+ $record = $this->db->fetch_array($resql);
+ if(isset($record['recuperableonly']))
+ return $record['recuperableonly'];
+ }
+
+ }
+ elseif( $idprod > 0 )
+ {
+ $prod = new Product($db);
+ $prod->fetch($idprod);
+ return $prod->tva_npr;
+ }
+
return 0;
}
From 26d2e3d928b46998599e0ee2f90d8d9dcbdd9d80 Mon Sep 17 00:00:00 2001
From: simnandez
Date: Tue, 26 Mar 2013 15:48:12 +0100
Subject: [PATCH 015/194] Fix: [ bug #777 ] Withdrawal receipt set Credited
---
htdocs/compta/paiement/class/paiement.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/compta/paiement/class/paiement.class.php b/htdocs/compta/paiement/class/paiement.class.php
index abf8e76f988..00741aad4d4 100644
--- a/htdocs/compta/paiement/class/paiement.class.php
+++ b/htdocs/compta/paiement/class/paiement.class.php
@@ -442,7 +442,7 @@ class Paiement extends CommonObject
}
// Add link 'company' in bank_url between invoice and bank transaction (for each invoice concerned by payment)
- if (! $error)
+ if (! $error && $label != '(WithdrawalPayment)')
{
$linkaddedforthirdparty=array();
foreach ($this->amounts as $key => $value) // We should have always same third party but we loop in case of.
From 2c56a1c8dc4e63e2cb6ca08971c16791badd561e Mon Sep 17 00:00:00 2001
From: BENKE Charles
Date: Tue, 26 Mar 2013 16:49:02 +0100
Subject: [PATCH 016/194] Update mysql.class.php
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Create Table 'type' not supported on recent mysql databases, need to use 'engine' instead
---
htdocs/core/db/mysql.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/db/mysql.class.php b/htdocs/core/db/mysql.class.php
index 386624132f7..1143372bb98 100644
--- a/htdocs/core/db/mysql.class.php
+++ b/htdocs/core/db/mysql.class.php
@@ -931,7 +931,7 @@ class DoliDBMysql
$sql .= ",".implode(',',$sqluq);
if($keys != "")
$sql .= ",".implode(',',$sqlk);
- $sql .=") type=".$type;
+ $sql .=") engine=".$type;
dol_syslog($sql,LOG_DEBUG);
if(! $this -> query($sql))
From 33a82c396eca23d4ebc236fd914188b32f0b212a Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:12:00 +0100
Subject: [PATCH 017/194] Fix: broken feature for use hooks with
dol_move_uploaded_file method
---
htdocs/core/class/fileupload.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/class/fileupload.class.php b/htdocs/core/class/fileupload.class.php
index 8afb5f39f42..c5e83017940 100644
--- a/htdocs/core/class/fileupload.class.php
+++ b/htdocs/core/class/fileupload.class.php
@@ -436,7 +436,7 @@ class FileUpload
{
file_put_contents($file_path, fopen($uploaded_file, 'r'), FILE_APPEND);
} else {
- dol_move_uploaded_file($uploaded_file, $file_path, 1);
+ dol_move_uploaded_file($uploaded_file, $file_path, 1, 0, 0, 0, 'userfile');
}
}
else
From dff74667c275e24669f031e3d4a986a5e5dbd848 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:29:40 +0100
Subject: [PATCH 018/194] Fix: broken features due to the removal of the
trigger FILE_UPLOAD !
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index c257b00e56d..d95bd707868 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -663,7 +663,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
}
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('filename' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From 4fe94b800bea6baa9dfe57e0cb635030e3275705 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:43:48 +0100
Subject: [PATCH 019/194] Fix: missing parameter
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index d95bd707868..7557fa8322d 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -663,7 +663,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
}
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('dest_files' => $dest_files, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From b694451ab28e287fd7b46bf0856233407301f252 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur
Date: Tue, 26 Mar 2013 17:45:07 +0100
Subject: [PATCH 020/194] Use engine instead of type
---
htdocs/core/db/mysqli.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php
index 7d9d67f839c..2180546dc39 100644
--- a/htdocs/core/db/mysqli.class.php
+++ b/htdocs/core/db/mysqli.class.php
@@ -925,7 +925,7 @@ class DoliDBMysqli
$sql .= ",".implode(',',$sqluq);
if($keys != "")
$sql .= ",".implode(',',$sqlk);
- $sql .=") type=".$type;
+ $sql .=") engine=".$type;
dol_syslog($sql,LOG_DEBUG);
if(! $this -> query($sql))
From a701cbd77c97745ad540fcb2f724fca1f90d1503 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:47:37 +0100
Subject: [PATCH 021/194] Fix: wrong var name
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index 7557fa8322d..d083751d819 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -663,7 +663,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
}
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('dest_files' => $dest_files, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('dest_file' => $dest_file, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From 61826b04d80b531b80d0901a66649d8057937486 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:12:00 +0100
Subject: [PATCH 022/194] Fix: broken feature for use hooks with
dol_move_uploaded_file method
---
htdocs/core/class/fileupload.class.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/class/fileupload.class.php b/htdocs/core/class/fileupload.class.php
index 8afb5f39f42..c5e83017940 100644
--- a/htdocs/core/class/fileupload.class.php
+++ b/htdocs/core/class/fileupload.class.php
@@ -436,7 +436,7 @@ class FileUpload
{
file_put_contents($file_path, fopen($uploaded_file, 'r'), FILE_APPEND);
} else {
- dol_move_uploaded_file($uploaded_file, $file_path, 1);
+ dol_move_uploaded_file($uploaded_file, $file_path, 1, 0, 0, 0, 'userfile');
}
}
else
From e9a8457d7ed2b75f7801cb4b9699dd2e5a506d13 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:29:40 +0100
Subject: [PATCH 023/194] Fix: broken features due to the removal of the
trigger FILE_UPLOAD !
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index 351b3fed386..cc756621172 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -649,7 +649,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('filename' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From b5d13dc6e6938554c43265de5899cc97fd5aca00 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:43:48 +0100
Subject: [PATCH 024/194] Fix: missing parameter
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index cc756621172..34fb66fb5ea 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -649,7 +649,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('dest_files' => $dest_files, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From e75c609a0a80451530ba217c933baa8214c548d1 Mon Sep 17 00:00:00 2001
From: Regis Houssin
Date: Tue, 26 Mar 2013 17:47:37 +0100
Subject: [PATCH 025/194] Fix: wrong var name
---
htdocs/core/lib/files.lib.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php
index 34fb66fb5ea..23bf990ae69 100644
--- a/htdocs/core/lib/files.lib.php
+++ b/htdocs/core/lib/files.lib.php
@@ -649,7 +649,7 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable
$hookmanager->initHooks(array('fileslib'));
- $parameters=array('dest_files' => $dest_files, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
+ $parameters=array('dest_file' => $dest_file, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite);
$reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object);
}
From 19ae4a75d62767c3566853eee88ee76a1afb5e70 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur
Date: Tue, 26 Mar 2013 20:57:24 +0100
Subject: [PATCH 026/194] Qual: More robust function to run jobs
---
htdocs/cron/card.php | 6 +-
htdocs/cron/class/cronjob.class.php | 169 +++++++++++++++++++---------
2 files changed, 117 insertions(+), 58 deletions(-)
diff --git a/htdocs/cron/card.php b/htdocs/cron/card.php
index fb936b58f3f..13ccb27cb0b 100644
--- a/htdocs/cron/card.php
+++ b/htdocs/cron/card.php
@@ -123,9 +123,9 @@ if ($action=='add') {
// Save parameters
if ($action=='update') {
$object->id=$id;
- $object->jobtype=GETPOST('jobtype','alpha');
- $object->label=GETPOST('label','alpha');
- $object->command=GETPOST('command','alpha');
+ $object->jobtype=GETPOST('jobtype');
+ $object->label=GETPOST('label');
+ $object->command=GETPOST('command');
$object->classesname=GETPOST('classesname','alpha');
$object->priority=GETPOST('priority','int');
$object->objectname=GETPOST('objectname','alpha');
diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php
index 078ee98ad8e..b43f4ed9bd4 100644
--- a/htdocs/cron/class/cronjob.class.php
+++ b/htdocs/cron/class/cronjob.class.php
@@ -834,9 +834,12 @@ class Cronjob extends CommonObject
{
global $langs, $conf;
+ $error=0;
+ $now=dol_now();
+
$langs->load('cron');
- if (empty($userlogin)) {
+ if (empty($userlogin)) {
$this->error="User login is mandatory";
dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
return -1;
@@ -845,27 +848,59 @@ class Cronjob extends CommonObject
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
$user=new User($this->db);
$result=$user->fetch('',$userlogin);
- if ($result<0) {
+ if ($result<0)
+ {
$this->error="User Error:".$user->error;
dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
return -1;
- }else {
- if (empty($user->id)) {
+ }
+ else
+ {
+ if (empty($user->id))
+ {
$this->error=" User user login:".$userlogin." do not exists";
dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
return -1;
}
}
- dol_syslog(get_class($this)."::run_jobs userlogin:$userlogin", LOG_DEBUG);
+ dol_syslog(get_class($this)."::run_jobs jobtype=".$this->jobtype." userlogin=".$userlogin, LOG_DEBUG);
- $error=0;
- $now=dol_now();
- if ($this->jobtype=='method') {
+ // Increase limit of time. Works only if we are not in safe mode
+ $ExecTimeLimit=600;
+ if (!empty($ExecTimeLimit))
+ {
+ $err=error_reporting();
+ error_reporting(0); // Disable all errors
+ //error_reporting(E_ALL);
+ @set_time_limit($ExecTimeLimit); // Need more than 240 on Windows 7/64
+ error_reporting($err);
+ }
+ if (!empty($MemoryLimit))
+ {
+ @ini_set('memory_limit', $MemoryLimit);
+ }
+
+
+ // Update last run date (to track launch)
+ $this->datelastrun=$now;
+ $this->lastoutput='';
+ $this->lastresult='';
+ $this->nbrun=$this->nbrun+1;
+ $result = $this->update($user);
+ if ($result<0) {
+ dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
+ return -1;
+ }
+
+ // Run a method
+ if ($this->jobtype=='method')
+ {
// load classes
$ret=dol_include_once("/".$this->module_name."/class/".$this->classesname,$this->objectname);
- if ($ret===false) {
+ if ($ret===false)
+ {
$this->error=$langs->trans('CronCannotLoadClass',$file,$this->objectname);
dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
return -1;
@@ -873,7 +908,8 @@ class Cronjob extends CommonObject
// Load langs
$result=$langs->load($this->module_name.'@'.$this->module_name);
- if ($result<0) {
+ if ($result<0)
+ {
dol_syslog(get_class($this)."::run_jobs Cannot load module langs".$langs->error, LOG_ERR);
return -1;
}
@@ -883,66 +919,89 @@ class Cronjob extends CommonObject
// Create Object for the call module
$object = new $this->objectname($this->db);
-
- //Update launch start date
- $this->datelastrun=$now;
- $this->nbrun=$this->nbrun+1;
- $result = $this->update($user);
- if ($result<0) {
- dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
- return -1;
- }
-
-
$params_arr = array();
- $params_arr=explode(", ",$this->params);
- if (!is_array($params_arr)) {
+ $params_arr = explode(", ",$this->params);
+ if (!is_array($params_arr))
+ {
$result = call_user_func(array($object, $this->methodename), $this->params);
- }else {
+ }
+ else
+ {
$result = call_user_func_array(array($object, $this->methodename), $params_arr);
}
- if ($result===false) {
+ if ($result===false)
+ {
dol_syslog(get_class($this)."::run_jobs ".$object->error, LOG_ERR);
return -1;
- }else {
+ }
+ else
+ {
$this->lastoutput=var_export($result,true);
$this->lastresult=var_export($result,true);
}
- } elseif ($this->jobtype=='command') {
- dol_syslog(get_class($this)."::run_jobs system:".$this->command, LOG_DEBUG);
- $output_arr=array();
-
- //Update launch start date
- $this->datelastrun=$now;
- $this->nbrun=$this->nbrun+1;
- $result = $this->update($user);
- if ($result<0) {
- dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
- return -1;
- }
-
- exec($this->command, $output_arr,$retval);
-
- dol_syslog(get_class($this)."::run_jobs output_arr:".var_export($output_arr,true), LOG_DEBUG);
-
- $this->lastoutput='';
- if (is_array($output_arr) && count($output_arr)>0) {
- foreach($output_arr as $val) {
- $this->lastoutput.=$val."\n";
- }
- }
- $this->lastresult=$retval;
}
-
- //Update result date
- $this->datelastresult=$now;
+
+ // Run a command line
+ if ($this->jobtype=='command')
+ {
+ $command=escapeshellcmd($this->command);
+ $command.=" 2>&1";
+ dol_mkdir($conf->cronjob->dir_temp);
+ $outputfile=$conf->cronjob->dir_temp.'/cronjob.'.$userlogin.'.out';
+
+ dol_syslog(get_class($this)."::run_jobs system:".$command, LOG_DEBUG);
+ $output_arr=array();
+
+ $execmethod=(empty($conf->global->MAIN_EXEC_USE_POPEN)?1:2); // 1 or 2
+ if ($execmethod == 1)
+ {
+ exec($command, $output_arr, $retval);
+ }
+ if ($execmethod == 2)
+ {
+ $ok=0;
+ $handle = fopen($outputfile, 'w');
+ if ($handle)
+ {
+ dol_syslog("Run command ".$command);
+ $handlein = popen($command, 'r');
+ while (!feof($handlein))
+ {
+ $read = fgets($handlein);
+ fwrite($handle,$read);
+ $output_arr[]=$read;
+ }
+ pclose($handlein);
+ fclose($handle);
+ }
+ if (! empty($conf->global->MAIN_UMASK)) @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
+ }
+ }
+
+ dol_syslog(get_class($this)."::run_jobs output_arr:".var_export($output_arr,true), LOG_DEBUG);
+
+
+ // Update with result
+ $this->lastoutput='';
+ if (is_array($output_arr) && count($output_arr)>0)
+ {
+ foreach($output_arr as $val)
+ {
+ $this->lastoutput.=$val."\n";
+ }
+ }
+ $this->lastresult=$retval;
+ $this->datelastresult=dol_now();
$result = $this->update($user);
- if ($result<0) {
+ if ($result < 0)
+ {
dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR);
return -1;
- }else {
+ }
+ else
+ {
return 1;
}
From 8c053b2f8d254ac13fccb79b5a3c701517134511 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur
Date: Tue, 26 Mar 2013 21:18:01 +0100
Subject: [PATCH 027/194] Debug module cron
---
htdocs/cron/list.php | 62 +++++++++++++-------------
htdocs/langs/en_US/cron.lang | 25 +++++++++++
htdocs/theme/amarok/img/play.png | Bin 0 -> 836 bytes
htdocs/theme/auguria/img/play.png | Bin 0 -> 836 bytes
htdocs/theme/bureau2crea/img/play.png | Bin 0 -> 836 bytes
htdocs/theme/cameleo/img/play.png | Bin 0 -> 836 bytes
htdocs/theme/eldy/img/play.png | Bin 0 -> 836 bytes
7 files changed, 56 insertions(+), 31 deletions(-)
create mode 100644 htdocs/theme/amarok/img/play.png
create mode 100644 htdocs/theme/auguria/img/play.png
create mode 100644 htdocs/theme/bureau2crea/img/play.png
create mode 100644 htdocs/theme/cameleo/img/play.png
create mode 100644 htdocs/theme/eldy/img/play.png
diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php
index 5e972f0e55b..db36cc5d59b 100644
--- a/htdocs/cron/list.php
+++ b/htdocs/cron/list.php
@@ -146,9 +146,9 @@ print $langs->trans('CronWaitingJobs');
print "
";
if (count($object->lines)>0) {
-
+
print '';
- print '';
+ print ' ';
$arg_url='&page='.$page.'&status='.$status.'&search_label='.$search_label;
print_liste_field_titre($langs->trans("CronLabel"),$_SERVEUR['PHP_SELF'],"t.label","",$arg_url,'',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("CronTask"),'','',"",$arg_url,'',$sortfield,$sortorder);
@@ -161,15 +161,15 @@ if (count($object->lines)>0) {
print_liste_field_titre($langs->trans("CronLastResult"),$_SERVEUR['PHP_SELF'],"t.lastresult","",$arg_url,'',$sortfield,$sortorder);
print_liste_field_titre($langs->trans("CronLastOutput"),$_SERVEUR['PHP_SELF'],"t.lastoutput","",$arg_url,'',$sortfield,$sortorder);
print ' ';
-
+
print ' ';
-
+
print '
';
diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang
index c64c74f1f58..e6930cd0b08 100644
--- a/htdocs/langs/en_US/cron.lang
+++ b/htdocs/langs/en_US/cron.lang
@@ -1,5 +1,22 @@
# Dolibarr language file - en_US - cron
CHARSET=UTF-8
+Module2310Name=Cron
+Module2310Desc=Scheduled task management
+
+#
+# About page
+#
+About = About
+CronAbout = About Cron
+CronAboutPage = Cron about page
+
+#
+# Right
+#
+Permission23101 = Read Scheduled task
+Permission23102 = Create/update Scheduled task
+Permission23103 = Delete Scheduled task
+Permission23104 = Execute Scheduled task
#
# Admin
@@ -12,6 +29,14 @@ FileToLaunchCronJobs=Command to launch cron jobs
CronExplainHowToRunUnix=On Unix environement you should use crontab to run Command line each minutes
CronExplainHowToRunWin=On Microsoft(tm) Windows environement you can use Scheduled task tools to run Command line each minutes
+
+#
+# Menu
+#
+CronListActive= List of active jobs
+CronListInactive= List of disabled jobs
+
+
#
# Page list
#
diff --git a/htdocs/theme/amarok/img/play.png b/htdocs/theme/amarok/img/play.png
new file mode 100644
index 0000000000000000000000000000000000000000..6de3e256ba63c72c88e3ad9929da735574d84ee1
GIT binary patch
literal 836
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
Date: Tue, 26 Mar 2013 23:32:22 +0100
Subject: [PATCH 028/194] Add inforamtion on Project into ODT project
---
.../pdf/doc_generic_project_odt.modules.php | 707 +++++++++++++-----
.../doctemplates/project/template_project.odt | Bin 25790 -> 28586 bytes
2 files changed, 508 insertions(+), 199 deletions(-)
diff --git a/htdocs/core/modules/project/pdf/doc_generic_project_odt.modules.php b/htdocs/core/modules/project/pdf/doc_generic_project_odt.modules.php
index 7ba6defaa3b..a1aa87366d9 100644
--- a/htdocs/core/modules/project/pdf/doc_generic_project_odt.modules.php
+++ b/htdocs/core/modules/project/pdf/doc_generic_project_odt.modules.php
@@ -1,36 +1,49 @@
* Copyright (C) 2012 Juanjo Menent
- * Copyright (C) 2013 Florian Henry
- *
- * This program 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 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 this program. If not, see .
- * or see http://www.gnu.org/
- */
+* Copyright (C) 2013 Florian Henry
+*
+* This program 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 3 of the License, or
+* (at your option) any later version.
+*
+* This program 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 this program. If not, see .
+* or see http://www.gnu.org/
+*/
/**
* \file htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php
- * \ingroup commande
+ * \ingroup project
* \brief File of class to build ODT documents for third parties
- */
+*/
require_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
+require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
+require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
+require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
+if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
+if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
+if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php';
+if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
+if (! empty($conf->fournisseur->enabled)) require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
+if (! empty($conf->fournisseur->enabled)) require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
+if (! empty($conf->contrat->enabled)) require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
+if (! empty($conf->ficheinter->enabled)) require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
+if (! empty($conf->deplacement->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/deplacement/class/deplacement.class.php';
+if (! empty($conf->agenda->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
/**
@@ -88,64 +101,129 @@ class doc_generic_project_odt extends ModelePDFProjects
}
- /**
- * Define array with couple substitution key => substitution value
- *
- * @param Object $object Main object to use as data source
- * @param Translate $outputlangs Lang object to use for output
- * @return array Array of substitution
- */
- function get_substitutionarray_object($object,$outputlangs)
- {
- global $conf;
- dol_syslog(get_class($this)."::get_substitutionarray_object object=".var_export($object,true), LOG_DEBUG);
- return array(
- 'object_id'=>$object->id,
- 'object_ref'=>$object->ref,
- 'object_title'=>$object->title,
- 'object_description'=>$object->description,
- 'object_date_creation'=>dol_print_date($object->date_c,'day'),
- 'object_date_modification'=>dol_print_date($object->date_m,'day'),
- 'object_date_start'=>dol_print_date($object->date_start,'day'),
- 'object_date_end'=>dol_print_date($object->date_end,'day'),
- 'object_note_private'=>$object->note_private,
- 'object_note_public'=>$object->note_public,
- 'object_public'=>$object->public,
- 'object_statut'=>$object->getLibStatut()
- );
- }
+ /**
+ * Define array with couple substitution key => substitution value
+ *
+ * @param Object $object Main object to use as data source
+ * @param Translate $outputlangs Lang object to use for output
+ * @return array Array of substitution
+ */
+ function get_substitutionarray_object($object,$outputlangs)
+ {
+ global $conf;
- /**
- * Define array with couple substitution key => substitution value
- *
- * @param array $line Array of lines
- * @param Translate $outputlangs Lang object to use for output
- * @return array Return a substitution array
- */
- function get_substitutionarray_lines($line,$outputlangs)
- {
- global $conf;
+ return array(
+ 'object_id'=>$object->id,
+ 'object_ref'=>$object->ref,
+ 'object_title'=>$object->title,
+ 'object_description'=>$object->description,
+ 'object_date_creation'=>dol_print_date($object->date_c,'day'),
+ 'object_date_modification'=>dol_print_date($object->date_m,'day'),
+ 'object_date_start'=>dol_print_date($object->date_start,'day'),
+ 'object_date_end'=>dol_print_date($object->date_end,'day'),
+ 'object_note_private'=>$object->note_private,
+ 'object_note_public'=>$object->note_public,
+ 'object_public'=>$object->public,
+ 'object_statut'=>html_entity_decode($object->getLibStatut())
+ );
+ }
+
+ /**
+ * Define array with couple substitution key => substitution value
+ *
+ * @param array $task Task Object
+ * @param Translate $outputlangs Lang object to use for output
+ * @return array Return a substitution array
+ */
+ function get_substitutionarray_tasks($task,$outputlangs)
+ {
+ global $conf;
+
+ return array(
+ 'task_ref'=>$task->ref,
+ 'task_fk_project'=>$task->fk_project,
+ 'task_projectref'=>$task->projectref,
+ 'task_projectlabel'=>$task->projectlabel,
+ 'task_label'=>$task->label,
+ 'task_description'=>$task->description,
+ 'task_fk_parent'=>$task->fk_parent,
+ 'task_duration'=>$task->duration,
+ 'task_progress'=>$task->progress,
+ 'task_public'=>$task->public,
+ 'task_date_start'=>dol_print_date($task->date_start,'day'),
+ 'task_date_end'=>dol_print_date($task->date_end,'day')
+ );
+ }
+
+ /**
+ * Define array with couple substitution key => substitution value
+ *
+ * @param array $contact Contact array
+ * @param Translate $outputlangs Lang object to use for output
+ * @return array Return a substitution array
+ */
+ function get_substitutionarray_project_contacts($contact,$outputlangs)
+ {
+ global $conf;
+
+ return array(
+ 'projcontacts_id'=>$contact['id'],
+ 'projcontacts_rowid'=>$contact['rowid'],
+ 'projcontacts_role'=>$contact['libelle'],
+ 'projcontacts_lastname'=>$contact['lastname'],
+ 'projcontacts_firstname'=>$contact['firstname'],
+ 'projcontacts_fullcivname'=>$contact['fullname'],
+ 'projcontacts_socname'=>$contact['socname'],
+ 'projcontacts_email'=>$contact['email']
+ );
+ }
+
+ /**
+ * Define array with couple substitution key => substitution value
+ *
+ * @param array $file file array
+ * @param Translate $outputlangs Lang object to use for output
+ * @return array Return a substitution array
+ */
+ function get_substitutionarray_project_file($file,$outputlangs)
+ {
+ global $conf;
+
+ return array(
+ 'projfile_name'=>$file['name'],
+ 'projfile_date'=>dol_print_date($file['date'],'day'),
+ 'projfile_size'=>$file['size']
+ );
+ }
+
+ /**
+ * Define array with couple substitution key => substitution value
+ *
+ * @param array $refdetail Reference array
+ * @param Translate $outputlangs Lang object to use for output
+ * @return array Return a substitution array
+ */
+ function get_substitutionarray_project_reference($refdetail,$outputlangs)
+ {
+ global $conf;
+
+ return array(
+ 'projref_type'=>$refdetail['type'],
+ 'projref_ref'=>$refdetail['ref'],
+ 'projref_date'=>dol_print_date($refdetail['date'],'day'),
+ 'projref_socname'=>$refdetail['socname'],
+ 'projref_amountht'=>price($refdetail['amountht'],0,$outputlangs),
+ 'projref_amountttc'=>price($refdetail['amountttc'],0,$outputlangs),
+ 'projref_status'=>$refdetail['status']
+ );
+ }
+
- return array(
- 'line_ref'=>$line->ref,
- 'line_fk_project'=>$line->fk_project,
- 'line_projectref'=>$line->projectref,
- 'line_projectlabel'=>$line->projectlabel,
- 'line_label'=>$line->label,
- 'line_description'=>$line->description,
- 'line_fk_parent'=>$line->fk_parent,
- 'line_duration'=>$line->duration,
- 'line_progress'=>$line->progress,
- 'line_public'=>$line->public,
- 'line_date_start'=>dol_print_date($line->date_start,'day'),
- 'line_date_end'=>dol_print_date($line->date_end,'day')
- );
- }
/**
* Return description of a module
*
- * @param Translate $langs Lang object to use for output
+ * @param Translate $langs Lang object to use for output
* @return string Description
*/
function info($langs)
@@ -173,7 +251,9 @@ class doc_generic_project_odt extends ModelePDFProjects
{
$tmpdir=trim($tmpdir);
$tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
- if (! $tmpdir) { unset($listofdir[$key]); continue; }
+ if (! $tmpdir) {
+ unset($listofdir[$key]); continue;
+ }
if (! is_dir($tmpdir)) $texttitle.=img_warning($langs->trans("ErrorDirNotFound",$tmpdir),0);
else
{
@@ -184,19 +264,19 @@ class doc_generic_project_odt extends ModelePDFProjects
$texthelp=$langs->trans("ListOfDirectoriesForModelGenODT");
// Add list of substitution keys
$texthelp.=' '.$langs->trans("FollowingSubstitutionKeysCanBeUsed").' ';
- $texthelp.=$langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
+ $texthelp.=$langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
$texte.= $form->textwithpicto($texttitle,$texthelp,1,'help','',1);
$texte.= '';
+ $texte.= '';
// Scan directories
if (count($listofdir)) $texte.=$langs->trans("NumberOfModelFilesFound").': '.count($listoffiles).' ';
@@ -210,7 +290,7 @@ class doc_generic_project_odt extends ModelePDFProjects
$texte.= '';
/*$texte.= '';
- $texte.= '';
+ $texte.= ' ';
$texte.= ' ';
$texte.= ' ';
$texte.= ' ';*/
@@ -232,7 +312,7 @@ class doc_generic_project_odt extends ModelePDFProjects
function write_file($object,$outputlangs,$srctemplatepath)
{
global $user,$langs,$conf,$mysoc;
-
+
if (empty($srctemplatepath))
{
dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
@@ -247,7 +327,7 @@ class doc_generic_project_odt extends ModelePDFProjects
$outputlangs->load("dict");
$outputlangs->load("companies");
$outputlangs->load("projects");
-
+
if ($conf->projet->dir_output)
{
// If $object is id instead of object
@@ -284,7 +364,7 @@ class doc_generic_project_odt extends ModelePDFProjects
$newfiletmp=preg_replace('/\.odt/i','',$newfile);
$newfiletmp=preg_replace('/template_/i','',$newfiletmp);
$newfiletmp=preg_replace('/modele_/i','',$newfiletmp);
- $newfiletmp=$objectref.'_'.$newfiletmp;
+ $newfiletmp=$objectref.'_'.$newfiletmp;
//$file=$dir.'/'.$newfiletmp.'.'.dol_print_date(dol_now(),'%Y%m%d%H%M%S').'.odt';
$file=$dir.'/'.$newfiletmp.'.odt';
//print "newdir=".$dir;
@@ -293,66 +373,59 @@ class doc_generic_project_odt extends ModelePDFProjects
//print "conf->societe->dir_temp=".$conf->societe->dir_temp;
dol_mkdir($conf->projet->dir_temp);
-
-
- // List of all contact
- $usecontact=false;
- $arrayidcontact=$object->liste_contact(-1,'internal');
- if (count($arrayidcontact) > 0)
- {
- $usecontact=true;
- $result=$object->fetch_contact($arrayidcontact[0]['id']);
- }
-
- $socobject=$object->thirdparty;
-
- // Make substitution
- $substitutionarray=array(
- '__FROM_NAME__' => $this->emetteur->nom,
- '__FROM_EMAIL__' => $this->emetteur->email,
- );
- complete_substitutions_array($substitutionarray, $langs, $object);
-
- // Open and load template
+
+ $socobject=$object->thirdparty;
+
+ // Make substitution
+ $substitutionarray=array(
+ '__FROM_NAME__' => $this->emetteur->nom,
+ '__FROM_EMAIL__' => $this->emetteur->email,
+ );
+ complete_substitutions_array($substitutionarray, $langs, $object);
+
+ // Open and load template
require_once ODTPHP_PATH.'odf.php';
$odfHandler = new odf(
- $srctemplatepath,
- array(
- 'PATH_TO_TMP' => $conf->projet->dir_temp,
- 'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
- 'DELIMITER_LEFT' => '{',
- 'DELIMITER_RIGHT' => '}'
+ $srctemplatepath,
+ array(
+ 'PATH_TO_TMP' => $conf->projet->dir_temp,
+ 'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
+ 'DELIMITER_LEFT' => '{',
+ 'DELIMITER_RIGHT' => '}'
)
);
// After construction $odfHandler->contentXml contains content and
// [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
// [!-- BEGIN lines --]*[!-- END lines --]
- //print html_entity_decode($odfHandler->__toString());
- //print exit;
+ //print html_entity_decode($odfHandler->__toString());
+ //print exit;
- // Make substitutions into odt of user info
+
+
+
+ // Make substitutions into odt of user info
$tmparray=$this->get_substitutionarray_user($user,$outputlangs);
- //var_dump($tmparray); exit;
- foreach($tmparray as $key=>$value)
- {
- try {
- if (preg_match('/logo$/',$key)) // Image
- {
- //var_dump($value);exit;
- if (file_exists($value)) $odfHandler->setImage($key, $value);
- else $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
- }
- else // Text
- {
- $odfHandler->setVars($key, $value, true, 'UTF-8');
- }
- }
- catch(OdfException $e)
- {
- }
- }
- // Make substitutions into odt of mysoc
- $tmparray=$this->get_substitutionarray_mysoc($mysoc,$outputlangs);
+ //var_dump($tmparray); exit;
+ foreach($tmparray as $key=>$value)
+ {
+ try {
+ if (preg_match('/logo$/',$key)) // Image
+ {
+ //var_dump($value);exit;
+ if (file_exists($value)) $odfHandler->setImage($key, $value);
+ else $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
+ }
+ else // Text
+ {
+ $odfHandler->setVars($key, $value, true, 'UTF-8');
+ }
+ }
+ catch(OdfException $e)
+ {
+ }
+ }
+ // Make substitutions into odt of mysoc
+ $tmparray=$this->get_substitutionarray_mysoc($mysoc,$outputlangs);
//var_dump($tmparray); exit;
foreach($tmparray as $key=>$value)
{
@@ -372,8 +445,8 @@ class doc_generic_project_odt extends ModelePDFProjects
{
}
}
-
- // Make substitutions into odt of thirdparty
+
+ // Make substitutions into odt of thirdparty
$tmparray=$this->get_substitutionarray_thirdparty($socobject,$outputlangs);
foreach($tmparray as $key=>$value)
{
@@ -392,75 +465,312 @@ class doc_generic_project_odt extends ModelePDFProjects
{
}
}
-
- // Replace tags of object + external modules
- $tmparray=$this->get_substitutionarray_object($object,$outputlangs);
- complete_substitutions_array($tmparray, $outputlangs, $object);
- foreach($tmparray as $key=>$value)
- {
- try {
- if (preg_match('/logo$/',$key)) // Image
- {
- if (file_exists($value)) $odfHandler->setImage($key, $value);
- else $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
- }
- else // Text
- {
- $odfHandler->setVars($key, $value, true, 'UTF-8');
- }
- }
- catch(OdfException $e)
- {
- }
- }
-
- // Replace tags of lines
- try
- {
- $listlines = $odfHandler->setSegment('lines');
-
- $taskstatic = new Task($this->db);
-
- // Security check
- $socid=0;
- if (!empty($object->fk_soc)) $socid = $object->fk_soc;
-
- $tasksarray=$taskstatic->getTasksArray(0, 0, $object->id, $socid, 0);
-
- foreach ($tasksarray as $task)
- {
- $tmparray=$this->get_substitutionarray_lines($task,$outputlangs);
- complete_substitutions_array($tmparray, $outputlangs, $object, $task, "completesubstitutionarray_lines");
- foreach($tmparray as $key => $val)
- {
- try
- {
- $listlines->setVars($key, $val, true, 'UTF-8');
- }
- catch(OdfException $e)
- {
- }
- catch(SegmentException $e)
- {
- }
- }
- $listlines->merge();
- }
- $odfHandler->mergeSegment($listlines);
- }
- catch(OdfException $e)
- {
- $this->error=$e->getMessage();
- dol_syslog($this->error, LOG_WARNING);
- return -1;
- }
- // Write new file
+ // Replace tags of object + external modules
+ $tmparray=$this->get_substitutionarray_object($object,$outputlangs);
+ complete_substitutions_array($tmparray, $outputlangs, $object);
+ foreach($tmparray as $key=>$value)
+ {
+ try {
+ if (preg_match('/logo$/',$key)) // Image
+ {
+ if (file_exists($value)) $odfHandler->setImage($key, $value);
+ else $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
+ }
+ else // Text
+ {
+ $odfHandler->setVars($key, $value, true, 'UTF-8');
+ }
+ }
+ catch(OdfException $e)
+ {
+ }
+ }
+
+ // Replace tags of lines for tasks
+ try
+ {
+ $listlines = $odfHandler->setSegment('tasks');
+
+ $taskstatic = new Task($this->db);
+
+ // Security check
+ $socid=0;
+ if (!empty($object->fk_soc)) $socid = $object->fk_soc;
+
+ $tasksarray=$taskstatic->getTasksArray(0, 0, $object->id, $socid, 0);
+
+
+
+ foreach ($tasksarray as $task)
+ {
+ $tmparray=$this->get_substitutionarray_tasks($task,$outputlangs);
+ //complete_substitutions_array($tmparray, $outputlangs, $object, $task, "completesubstitutionarray_lines");
+ foreach($tmparray as $key => $val)
+ {
+ try
+ {
+ $listlines->setVars($key, $val, true, 'UTF-8');
+ }
+ catch(OdfException $e)
+ {
+ }
+ catch(SegmentException $e)
+ {
+ }
+ }
+ $listlines->merge();
+ }
+ $odfHandler->mergeSegment($listlines);
+ }
+ catch(OdfException $e)
+ {
+ $this->error=$e->getMessage();
+ dol_syslog($this->error, LOG_WARNING);
+ return -1;
+ }
+
+ // Replace tags of project files
+ try
+ {
+ $listlines = $odfHandler->setSegment('projectfiles');
+
+ $upload_dir = $conf->projet->dir_output.'/'.dol_sanitizeFileName($object->ref);
+ $filearray=dol_dir_list($upload_dir,"files",0,'','\.meta$','name',SORT_ASC,1);
+
+
+ foreach ($filearray as $filedetail)
+ {
+ //dol_syslog(get_class($this).'::ee $filedetail'.var_export($filedetail,true));
+ $tmparray=$this->get_substitutionarray_project_file($filedetail,$outputlangs);
+
+ foreach($tmparray as $key => $val)
+ {
+ try
+ {
+ $listlines->setVars($key, $val, true, 'UTF-8');
+ }
+ catch(OdfException $e)
+ {
+ }
+ catch(SegmentException $e)
+ {
+ }
+ }
+ $listlines->merge();
+ }
+ $odfHandler->mergeSegment($listlines);
+ }
+ catch(OdfException $e)
+ {
+ $this->error=$e->getMessage();
+ dol_syslog($this->error, LOG_WARNING);
+ return -1;
+ }
+
+ // Replace tags of lines for contacts
+ $sourcearray=array('internal','external');
+ $contact_arrray=array();
+ foreach ($sourcearray as $source) {
+ $contact_temp=$object->liste_contact(-1,$source);
+ if ((is_array($contact_temp) && count($contact_temp) > 0))
+ {
+ $contact_arrray=array_merge($contact_arrray,$contact_temp);
+ }
+ }
+ if ((is_array($contact_arrray) && count($contact_arrray) > 0))
+ {
+ try
+ {
+ $listlines = $odfHandler->setSegment('projectcontacts');
+
+ foreach ($contact_arrray as $contact)
+ {
+ if ($contact['source']=='internal') {
+ $objectdetail=new User($this->db);
+ $objectdetail->fetch($contact['id']);
+ $contact['socname']=$mysoc->name;
+ } elseif ($contact['source']=='external') {
+ $objectdetail=new Contact($this->db);
+ $objectdetail->fetch($contact['id']);
+
+ $soc=new Societe($this->db);
+ $soc->fetch($contact['socid']);
+ $contact['socname']=$soc->name;
+ }
+ $contact['fullname']=$objectdetail->getFullName($outputlangs,1);
+
+ $tmparray=$this->get_substitutionarray_project_contacts($contact,$outputlangs);
+ complete_substitutions_array($tmparray, $outputlangs, $contact, $contact, "completesubstitutionarray_lines");
+ foreach($tmparray as $key => $val)
+ {
+ try
+ {
+ $listlines->setVars($key, $val, true, 'UTF-8');
+ }
+ catch(OdfException $e)
+ {
+ }
+ catch(SegmentException $e)
+ {
+ }
+ }
+ $listlines->merge();
+ }
+ $odfHandler->mergeSegment($listlines);
+ }
+ catch(OdfException $e)
+ {
+ $this->error=$e->getMessage();
+ dol_syslog($this->error, LOG_WARNING);
+ return -1;
+ }
+ }
+
+ //List of referent
+
+ $listofreferent=array(
+ 'propal'=>array(
+ 'title'=>"ListProposalsAssociatedProject",
+ 'class'=>'Propal',
+ 'test'=>$conf->propal->enabled),
+ 'order'=>array(
+ 'title'=>"ListOrdersAssociatedProject",
+ 'class'=>'Commande',
+ 'test'=>$conf->commande->enabled),
+ 'invoice'=>array(
+ 'title'=>"ListInvoicesAssociatedProject",
+ 'class'=>'Facture',
+ 'test'=>$conf->facture->enabled),
+ 'invoice_predefined'=>array(
+ 'title'=>"ListPredefinedInvoicesAssociatedProject",
+ 'class'=>'FactureRec',
+ 'test'=>$conf->facture->enabled),
+ 'order_supplier'=>array(
+ 'title'=>"ListSupplierOrdersAssociatedProject",
+ 'class'=>'CommandeFournisseur',
+ 'test'=>$conf->fournisseur->enabled),
+ 'invoice_supplier'=>array(
+ 'title'=>"ListSupplierInvoicesAssociatedProject",
+ 'class'=>'FactureFournisseur',
+ 'test'=>$conf->fournisseur->enabled),
+ 'contract'=>array(
+ 'title'=>"ListContractAssociatedProject",
+ 'class'=>'Contrat',
+ 'test'=>$conf->contrat->enabled),
+ 'intervention'=>array(
+ 'title'=>"ListFichinterAssociatedProject",
+ 'class'=>'Fichinter',
+ 'disableamount'=>1,
+ 'test'=>$conf->ficheinter->enabled),
+ 'trip'=>array(
+ 'title'=>"ListTripAssociatedProject",
+ 'class'=>'Deplacement',
+ 'disableamount'=>1,
+ 'test'=>$conf->deplacement->enabled),
+ 'agenda'=>array(
+ 'title'=>"ListActionsAssociatedProject",
+ 'class'=>'ActionComm',
+ 'disableamount'=>1,
+ 'test'=>$conf->agenda->enabled)
+ );
+
+ //Inser refenrence
+ try
+ {
+ $listlines = $odfHandler->setSegment('projectrefs');
+
+ foreach ($listofreferent as $keyref => $valueref)
+ {
+ $title=$valueref['title'];
+ $classname=$valueref['class'];
+ $qualified=$valueref['test'];
+ if ($qualified)
+ {
+ $elementarray = $object->get_element_list($keyref);
+ if (count($elementarray)>0 && is_array($elementarray))
+ {
+ $var=true;
+ $total_ht = 0;
+ $total_ttc = 0;
+ $num=count($elementarray);
+ for ($i = 0; $i < $num; $i++)
+ {
+ $ref_array=array();
+ $ref_array['type']=$langs->trans($classname);
+
+ $element = new $classname($this->db);
+ $element->fetch($elementarray[$i]);
+ $element->fetch_thirdparty();
+
+ //Ref object
+ $ref_array['ref']=$element->ref;
+
+ //Date object
+ $dateref=$element->date;
+ if (empty($dateref)) $dateref=$element->datep;
+ if (empty($dateref)) $dateref=$element->date_contrat;
+ $ref_array['date']=$dateref;
+
+ //Soc object
+ if (is_object($element->thirdparty)) {
+ $ref_array['socname']=$element->thirdparty->name;
+ } else {
+ $ref_array['socname']='';
+ }
+
+ //Amount object
+ if (empty($valueref['disableamount'])) {
+ if (!empty($element->total_ht)) {
+ $ref_array['amountht']=$element->total_ht;
+ $ref_array['amountttc']=$element->total_ttc;
+ }else {
+ $ref_array['amountht']=0;
+ $ref_array['amountttc']=0;
+ }
+ }else {
+ $ref_array['amountht']='';
+ $ref_array['amountttc']='';
+ }
+
+ $ref_array['status']=html_entity_decode($element->getLibStatut(0));
+
+ $tmparray=$this->get_substitutionarray_project_reference($ref_array,$outputlangs);
+
+ foreach($tmparray as $key => $val)
+ {
+ try
+ {
+ $listlines->setVars($key, $val, true, 'UTF-8');
+ }
+ catch(OdfException $e)
+ {
+ }
+ catch(SegmentException $e)
+ {
+ }
+ }
+ $listlines->merge();
+ }
+
+ }
+ }
+ $odfHandler->mergeSegment($listlines);
+ }
+ }
+ catch(OdfException $e)
+ {
+ $this->error=$e->getMessage();
+ dol_syslog($this->error, LOG_WARNING);
+ return -1;
+ }
+
+ // Write new file
//$result=$odfHandler->exportAsAttachedFile('toto');
$odfHandler->saveToDisk($file);
if (! empty($conf->global->MAIN_UMASK))
- @chmod($file, octdec($conf->global->MAIN_UMASK));
+ @chmod($file, octdec($conf->global->MAIN_UMASK));
$odfHandler=null; // Destroy object
@@ -477,5 +787,4 @@ class doc_generic_project_odt extends ModelePDFProjects
}
}
-
-?>
+?>
\ No newline at end of file
diff --git a/htdocs/install/doctemplates/project/template_project.odt b/htdocs/install/doctemplates/project/template_project.odt
index fcf5f52d80126f4af6bd2ecb629f5721a5b606f1..ff34277a48c52325be4902df3ed9b9a9bf6056ad 100755
GIT binary patch
delta 25734
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
YEBHMoc>k&wU=K;QqC+@z_*44-0RNeJwg3PC
delta 22888
zcmbTd1#nzVlcp0a)|DA}BMQG^ip7bp*
z70-vwgy&zn-_AjL0hUZJK6bEJBxuuLz%}R=yc`cnsRS#9xu`2<&8p2AqlCplSiIAc8NrK9DiIVDznsh!nNlm6`8_n$lxY=CPmWFAmfsTW6QnuX9LclgsTIy)LWEo9}W>@QIP26+bi2m@Z4e
z%aA~lcoVBJwP3-5T>bMVK-59h6yb)6`B#)HkN7VSOZ3XI|EPc{Ab0Nl!a|w+-Wd;6
zbmdI^f^Y=g^ZC%e2;KMuLgsV8zO;jbm!P7IjA(JwXJT@}0_-=W-~Kwg#X
zy7{3?m47($-SQKr!c9sNPCRQnBy~~(VBM??oKRZth)#ch6{0+vfXI>)LjHO+J28f(
zd_p$jvZ0a_1hGQAWb=!ln^c0r_dv>306qNj60r#L@p8o(g#>cTM2O*Q!O=OzZ%jp4
z(&eY7w-2fhbvX(SDx7&u!ypf$07gCmp_u^*OZ+#RkES6(G%xd-eRI!uiIS2UfZXyT
zHG0qt7{n}^T!LuCCe#I!knxRY-&8~_
zY|7jvgpU2rO;_ZuAxiAxqNQZ17blAU#vnO`5&tjpgV22o)9?L7q%
zv;+5v5Ypezu&tb8C32slEQsJ6@KB)111q~!;RhV*;tMi?;9}ltwcB#$-jg{gJ#ELN
zM@s^=_}P44?w7_YNA0f-Cye8BI*Cs+!WlY(3N{aaExg$FU5M}yp2Pk3ziUqdlJ`np
zw;-qFU2eTS@cu(od%Y_duD02txjy|yhhb#I1BN*_5*
zoxN=>;?Ly?>?`1D!@4n|Q<&+)J}_px9E+aOl+3};*a~-?rcJ9XR*mCHtv_D!W(Q@+
z#$gVY;QKu~lYwz^jBTT0pd?VCT3=Vk_%x6CaB6o^AGSS=JG|Mb_sso0tg@w&wi>99iLJdH4z&(jjFWwi
z3-ybaf<`9z>AwR-VKiaT4zOCCKX%ep*FPqtsiq*E2~$kKXGe``phuk@4E6h0+vG*-pr5GC@0F*J?&`d>AlAXxn(CJ}v28!l=o;)k1
zFH(>4G}B&oBg&}XqjBoGN)B-Dy{g_&C^&zT4^P^AJkXmFM#8fz&P$apz2DrK1nk&b
zPUyVFHo>eb74cZ0?5x^`$No;^q>9fUkj;+QQgEQ;Q+*i$?asd-Q1O0{hT-w}GC^qm
z7r;^TMSjK2ARynx{Zak=yQa6bH`!pSQAx+rxp&32TOuE
z?jn3}HXv50<0OIJ*|{%p<~!mVyDCk%cw%w;_v2mB=sP^v<;H-&gc!j>78O%Wg@92_
zb6z>DtN|q_X~-Z{_fI#%sp21yX~R}VD8Awaj5ULJWlTs+b1NCe6q~r;bA1%M-KVL$
zqGsW=JwPabC{i8d#Wlkn7Li~z@(&WIW=t2
z$Am7Z14*23p=@Cx#;&Lp=v*gR!biD=r&9DafHb;!)eJa2vw&wr
zQ>+0M&AoY3TO0i*e$=>hq^(+M+Y6_r6Ss{yMDQd#Dz*!D(eOwB96OrU@A=HF>IEb_AIXDE8WVr$-a=<>L)(a@hDy^mD5@@7r|7G*Kxi$O#>
z?gsDFvT75Jin<;a#dlWZ_kgX%s(|QFX9C;L<>SKSMzeNo1kK0go?RU+ppJp-E+mJy
zll}qO6JT(g@ZK3*<&o}q)TjuxI(ZyYl=pwQj&sd#n{Mc#4|3tHeZ6DSJ;Kgp{8MqH
zxStyVH}dCDl=&u@!qg?h@T0n4pWuY;-q?qGbQ|8@U%g^Ttb>@1*?u$7n%_Ew&Quh
zPENX`HVnZ&-1co^VA-BUd<2ICZ|#h)7f4xw{X_#L;aANV!5Tq5x7^r7hA#eczmI1n
zS_gz$V69dj*6L~#fS5zN!yf@F3|>#2jt1BGkzF$6wy`M;p+x7SANPw0E{jT=r&Y(K
zz1}^PJ|B2E&+SL%&X;
zb70&p_aN{3pw~(pE0;MugO`pj-ePxqWBGn`0}&H^JU{h!J%4yVDOD}_s}JuOi@K`R
z=8eMJ*tS1izfMF1dO4YSukbeLFx08e{xxa8s{V)!3M}oM1_L}!5)Y~qGIV=-B6a_E
zI(3ckh5h_ZPasm~7sG>3UxMP17o?p4$*{*!7TgQ2O_?qLO3oaC9)mBmENh@p8>eck
z2q?5%UO7237f)eJL#s&Tvv@LUT@rt#>-sd%n=v<+IrTFYRlr0Wb7n6xU@_5$`9#rv
z*u-(Q1eXCof=CU&cy>XbDq0&(v1!UCeL)s}rj`|jrbhQ+ToTx
z{iqkwV72CjV!4q~&^FyCq(8`mP-KMt31zU69qxyt1ue(s5=q&UwtEgTT}iM2l}ok0
z$KU$Xf|xjGjdTiCMYsLKErAYnxG3%ea9J7jGkPm#EQGY>L4@3koA=UWPHL9q94j;V
z6MjM!#>Sma&Y(UNU41mgbxIZ-E^=PBx~CI?p9#M!Uz=!Eg}`~x8L@Ul95Za_4ib|Q
z6w_DH6zO{T(YcWF%c+b~EK$`gb2BrY654C)M-iw4q$pdD6
zk{{Z;MzlN17i~-CA@_t#{tVx<)bOy;#UMP!1N2w~NEjeeB^z=I!UmA{%zE}b@*6gN
zOTjg+7{BoRpb{cd+5%e=>IJ_Psc6hya!XY&5Sp7qKp~swMr!2;jAwCuVY>V~9~WU7
zaC*NpUf#Zg!9Za}d2O<*SG<>9lwmJ+h-clSGT7X~?L702VMTh6ZV-YTU!M&m8EG7^
zKWk-L(r~yJ;fs%@q9U^td12Bs&L}{VF2ztApL25n
zf%ISu{km)QzD6*!jj!eQQ1HR~Y3C;A2o|q<(5({`*zEg(Xt(LI>1&zIv_w9hn;Z1H
zN=4jgCcwpQXYF}tyQ9w`aFnF?J)d)}S;^Ray
zaKhq$g%SWvUM}sp+J%Pq6nhiGe=v2ym$D^!*mDOP#Mc*w;}GMTZj0RP5!>Q01f#*$
z`RYZ-Z%ostSog1LrkXAvOPepscJ)~V4pD8<7GaUOn2$>7IEATopP7&t(p9UwZp+zJ4kQCXrw=iP*G_doz`U$%aBeQCdM%@h
z2Uwvd0=5x#O6Z(8l&q8(oj5takJC*4(x_|2w3>X0DoTS0kzQo;LIi2`yvj&LWRm
zDB4jOH9~5sd6Mssu*=a=gp;SE8dS6D<0~H{?~x-#vt=pvFy7x-X+BqckjI$zgjJ#)
zt5(3k?FgyuR##*@&tj*>yHxvDC#EfaT=Cz<*P#3@xQ7iGjarM4a(PM~?b{4i!G!Bx
z!teQ;A%dpLDMFkS8cI@x2q*nrw7LYP(SMH;=--CZtGyz&TG~1zPZ8=y6T4}jA-bZ>
z#8Q-I@)#Mb4B%^X;!Y;6Fw~UbAxUPySeO8Bw^>hn1rozS6?DU+-*JlhcUx{(k48#4
zY+G(Vq};PihHz|03F?t;aSw@gYED8rfCv{gjiJ0kEd7>FYP|>}x}rwT&3T`>pwOS(
z<|OF2kwk;sciJvXgJ%%k3^We<4%;LuZsXDF=(V~kYC&7Qj1rU=si`RMY%gDN1r0zX
zIAd?hHdxGvM(9sBf6XSzb$$P&939-1lKhHCjORMt4DVSW|
zS&?A#9YM6z*
zl4<@6Q<2#BrabkOeOYU(`SHq^W>aewXg-8iEPC~#Q~?SS6Y#%WUT$8HA={Mf;cBJ^
z8)@nVbD$Nw?DXk=M7ApPb0J_o{eoLq=&MEmjpsQ*(w#=dS41Mu?QfnCQb5+X3$;tL
zTJONH9@s23>UvsF4+XS*OYjn%G!tC4fx)-=b06YpgZbLI9}R~wNth35nGmA%-mcjD
zCmIq`wO(pBlD<&7;t-H#5n=c?SGI4H)p!|bPSRgDHSUUPvTZQc)-;fkCX40Z*NTfv
zTWd;#j?DmN;o&54Mu`!ZC7_7($NaAF&{b*6o50t`EkF4;Yr@rB-O*?hWL(o()Fvga
zC2H$No3l+Nqf}q$Hg(k=>1X5jn+cjq?(ma)t>35fh%$LYkvYs+&vuNf+Z)O9;z7}8
zYY#`0YZ{Xq%8)`IP)xU07wc1|lPS(HpA8`E(BCwqdzDXlWhaJv0oQpmcK68ANcjXW
zUWJBv5wYl^9`b5>T?-%OT!^2aOT9~%;qUFtJ;mx0?oai{reU76sj^_uacM^K
ze0zQw`pz8rbHkPZWv^kWS}B?-m5i$j<6C0}qun-hU~%JSTNoenq6&{QK9*H5tI0VT
z1T$kxKN7rey1OPMYTDoIyaP;o9yDdu3jQzn0(R@fk0
z-frWxu+b!UfSB$!tb2{kyw?R5wa?OiQZMB^jsUJE<;a6T9J$NpZ4x$vjhT~OBtR`P
zH*Ww9v#^v;9Jm!Ggwe;$8iINrNd?zjqecW<9+}N=?`;rBGfE!H(~XR*AF7nH+lQbB
z=j`S)4A#h$$0qEG+K&(pYcoyHyufAj5g*MnSeNjy3n3D8F9f+_5C};G^xn5NWFJMK
zH?MCcq~idi`7kOxyw-VjYARakWk-_c$nZ5$Z0kth6XZL!ZyKKacPQZ1YdqDzaKq30
z-XE$@VYs@Q?XICV!3^(EER%qF;$pd^^o)Z9$%#TWJT`RUz3_faq{CYHA8bz+gXv->
z<#V?$R=hGfibSvkSP97wV;!gtG%Gl~7I*kOPRIjKPcf7Svcb$I2DJ(8X*d&{2IoSsdKsBgg`**_6g%F;c=;v?Zs8}_ygjwV5Lf^VbT#oS{
zH{Y~mM;b6pUA34ENb?443@ieDR7Y}<%D5$xWS*<0GichJk5-M9M`49guO~A)8q5=R
zuT+3#Gj?mv-*%w@ZgCunEhcbxA7}Dj8-61e2=zR=u`D9f@xE(F))y%_P>92T>H4eq
z`|CBui2@E&mZaBK3oS-5uk>aE0p4bNxA{s{faWb6pFQ7P7HhKEG9rYh`Nxyyz#tWh
zR1eo&mg10;-BM`D7Ws$Eb^hI(>O3MmbTtr>iWoFZSoHh6#B!_saTj0hOK0-A5{}}5
zs3x99%VF5Vx|6$2YoZ8>-q)2MR}bwg~PclqDob_Rhj
zLy&v97Ma3K`F1gHjIKS9BMHCfF;XcGM4nMe{7aorNeZ$^U`cE2G@xq^MAuni`~+xI
z6NS6?1ooI*K9}u;n)`lE_Uv0)w)kT4m6>Uodde?EXvA#oItZvh1qmo{D7>~sYIaKQ
z$Hn??P3gT3ynLC|1dCE`d#o(!dQkw9|G*_|3*$|IP%Ya{gPRMBM~OVb@9jO3oV_q5
z{OIU{e_BC|odsUW1^v@3ZDTBDyFKdMYw;(#Ii@uspa6IqiI=Q7vCmN0V^I5(+1Bc<2&Sa!YQZM~G(*>QRPaN*3hU
zloOb88d-F*F|KV(i-8U-sw@N+Fwa*kq<%CpUuBsqg(i5G_OM2A5{oVfw5zDt%U9Vw
z{D`iqdu2MCbIk~^Iz(#(cdfNk^}6oLakatFmH(Z$Hv!Y4z5eTFvt%M3oBYHDg9QPH
zU{>Y+Ow|}{$3Noj1l`l?FG!p-_M>^$v^TIeODdLv=YFQEtX>0vI`=!+(tBgVuB}!1
zwrt0=a2ShxvmlkfG-<=nis4AvEjD2x+pCiPNfL@wElj>+#5UV0Aek-4GIl3n%bO=b
zHVq}1#w7C3d<1b#m(pdRbEGQs7*rk*28d
zr!lG6O}v)X=KwO@a4=~Nax*FvcSgEzyGoDDp9j
zF2nK8D+N|Q%U#DfjTA8Lvt4CeI9a!
z$$J6fKvyws0XL+MiRu`L!vUCFr#cD{
z7&LCft6jR1I6zAqRW%ju=u2Nl0VZfVG|ufGK}aZ%#MYp?h4?)Cvf2
z;lQ;dRm8?FWRc||)0ZtcCk2=4)3gVsUv7RLh$XX@aTYn)P=C?P`qf@bSDuK**+A$QzKPOvC42ffC@%ZE)ShVLE
zZ=f7-54D#GvcouzFFoU_UsPqo@gJ7n4+9zNd1=7TEX;r~jEAXr%8G>9IlyDD>`&GC
z0aN^aP`LYYtjvFY3GMa-BN3{uP<^vfRnJ>G%6@Iv&r1k7;9bib8&3Q?{)mxq?f&o#
z375HehX2K|_VXCrLdA(o;|z?5bqS=C3aiq9`59x7d=)TlV(2=`WT1qz6JI*9i!ktR
z*KcLf@fk=Hr0~vs0Gf?tJ~VvVuRVDRZ*w8T%NO)0cp9CKYhS)C=_*y<{E_Y`46hxw
zUFS5Pp-+hXkW*NY?SPN``3D89r+hvI6#YFQ?AwEEM5ib_k9<9;ma(=7Q9wWTAAtD2PB?
z;a03})9@8<2!eRn{rLKcKKaGVoUWe()*{bkpDvdM^FvrWDCgZvL)6MCY+k4yixM3B
zcoPn(9Fz~mytPZ?Y)7DvP!IbuPUVbDcYHW=r3O>t%xob7>J^#2%L%@t^_Qg>2V@xt
z256ol5mUv_0BWQAL(XWj_)v%T?DC;xjUx(unPvi4M(wFs+wWs?w-+_0Rmi3pHCBxaIg1yDM1LYmL3u`
z)#I1H?AC01x){lXR4tP^Ar)%3K%0r8VL>v{fA8avz{g5Du5>2l3XOdHmw^?HkSdb4dP3)?zduh>u>|bKc=W*_
z!SlLAf8=-?&(A{vaipZ#MlWJs
z+x~$1q>|*qYu3TYoL!9IQCyU|fEE15OCKX3n4Ls-2-6FYY<>Wr`Pl!;wCX=z>&K_Q
zU#>(P1|Q8-gNZNJ)gMU|JoJK0Lvu0&9Gms+cc}K63>56$COfi-SER;A44fw}Beglx
z9M=VrJcj{hDZ|AYd$%w@?UG%Tu-d&cr7>3w2t55B&PqNM3F6TdRNWL$(Sgyk*)jF;
zrMfe}to%wQ{hP>0r`J7tPpKq=kAtJD&F3K5wz~)GURmn*fy<+s3Z2W*P?$|qBM6&Q@GM5%zR=}
zuzX4;A77CKDA>HIDo%9?be<0(Acsl^+{sPBkwd@!=9OF}dblM<0qkx!L71atOg*X-
z-Ap`Vy3Lr9>`N1GzfO#l-jlN=WhH=d4+&*QOIyTsWiFV9-+tw+iOdz(XF9GWM?rNm
zN9H330lz?w;a7yQx5%q4YXs5
zjP{3eTGyRJK&|L9^ol%r4xv8g+@L@IEyXr+Bs{d1YtE?_z;1iBvNv3g4{?!jV~ET>
zGi!7%hVHPl=BjH^$%t;Vxu;udfuFZ=-wRY^(eToHH(d2^xeZ%?D-hm&c(+mqZhuAGa)zx7wIWJG{~0andKOJ;+MldHpI
zLY<)e^O!guP=J?Flgym%4ww*#5)#Dz!qTn(&h@^Z#hh_oTtHI@l`d2{!4E$OYKoFKS26&j)YR8+2?%C#MpV|qWFEJz5hY}Tq=Us?vd
z6J+*%TFaIt<;y~4|0dv?N)6yqM?>1(l}X4zYc5S@1M~iTl6Ns>&vbnQD;5y&?m4q&
zmx-^dv-=frd!Oj}{A3Ew@DO?|(ytzRj*VwcYn+hQXy{%~V^bvs)!tY49nsT_VEtHbrJV@}NZ7H=3*&Ka
zlk=N_5LoYL$rA30v*%0Ao1P0AzHt>{p17IEyQ%8vl-S2a2HEDrk{%7Ds>R&GnLaWz
z8^WiXs2pj7r@MX4gqPNl;k+MN&E50jZ;zCHX)at7E26GPn`8?2-BKb~Efs6y?k-Eo
z2TUop5TwS*AZ{=t4L#y0>99$=8q_UC%hKc=U
zzlj=OU;o3w@sV{HSmf2k`{jMp{aKV&h*<-Trf_V*P(f{X2c)5)NBb6iK)a5R-@k~w
z8JB`teL0w3cpWqX6DDK9MnFh75eJkYDJ+GtwwA-0$MDkOky2GwKeRQ-h`7_>t$zOL
z_grh5Qdz)>ZM2V2y_4~pjwu2Nl=%{{+n|
zt#r5me~`kF1_IOQVE&jGgZ{UBKNbh8VxVnRV?^{FE`i9BEUf0emD+~QDB$2c5g2E^w}aiSNc1G>_tJLI+tIqD9lJJmQ%york|T-Ab{ioA
zQu2Pyrn$<$tr(AatMPVJKBxB;oIA-#Wu0~Ik|1@c3&ATvN8CO=1VqmznIvsF7vLS>
zz|ZtWZIp0Op{dG?V05js(Wt_yPh+Vq+Q>Rx+F
zOj*q8U2x_y&~%hP^lN5JaC7a9?vXrPljQd_?-EiJu3fcWl{j&7(_SMJ|{JPRzk51x2
zfA)r6#<1V&g}n^EO@D1Hc&a6x#bGp^=ac`y)850AtU9X)SI(&1JqFmd0Wok}OfMw=
z8^}7wX<-t5IXHx&W%j}uLbrU_K?fl`km3%f$MIw!AD@U%6J_T@d6~7
zq`Y_WFoAzw=qbyXlZWasnXt1CI94t2lKXvbj*94Ej?8!5}hp?Uyt591OFQm-I~8ImQn1H!he9FyRjXM
zS0b>w@JZoBm?}HT|!?zCI?QX0e@+H;%q{DyoC$plk&?^qPtO%0NPx
z!vCim!qM*bLUb5=<{B5s{U~R=qAW`y-PqWwBF6%9-#S8JCh3>T6Y=IqKD^jxs
z5>WhsR9gEznLoim*Lu%%_mg4JZ2$d)q21e;CV1kxr8|XkM~$$b&*4oP$a~g+kZ+1|;sr3_)A
z&nKxSnmeT9)zx$#$9J`x)!PJ8D((~qXdLfAUkN25)iO;9LHo^&q7EJtn{f?NE_H+%
zi{kunHDe=SVFbTaY}UMz7ya+V6F21_+R4#L=L>f?GRlIq)KQg-&hnjZVm>u+%qrlCR|`yad;>Vfjm%&$8auZ{Uz~Ac
z*IGS)CGbaaId~P5!{?pC$6ibswsBmn`Q1sRw9x5%W%z%>n>DWcRldv(Jy~CTc8Nry
z_`|TuLkUO}#7K!_LNh&>{l2PmeJh^Xc{ag!G;m){2{{m*7EI}xvjdX;9bd9xnNCo|
zBa={ZyUZ{-c+ijZRF6&EeYXMcl9*dR`Z(sq%^qqi%HFCi!`)>1OpQ>Jt<$|9pHYv!
zn&Tcs!6My`Zm@osNFY_)daZIhXiQ0L3+c_lb-WH`D|XkhO{hphE5{!L8VyD|J0K6}
zGAqqs0No5dNFS(j(6U*!IVaj_UfY2!r?fw5)ojwDYYE*ACKY5C^q96I=k@Xz4u1Vc^T*1cl
z$_58h&z`kgo4=Y*wwOLt2&o=T28K9L!w1rVY6r%=&6_XE4LYQSITg_K@GTi9|H~|YY$Vx;g)KfB5O8X>(I&D+~-AtWdn@$kr{jV8VCW-Cg
zKCQ&)T4mQYgvP_Z`t4}T$eHtLGFfc~(RS*9fM4iwqqWED+8#!lpE{`)of2Jn5HRwp
zse4pa;bU=dh$h{w5-!SVIkpTwi~lXx$t>Rc!>#>-2O&4O&Ch?@Khm1Ibx!GhMgO?h
zy{LZ~H3)gx$kXVnlg%1?^Sy1r1qv!|{!jtmYxaEG;6E^?P0;70Mhz&B*HJ2=Ow@2iqRZ`Eco3V;rHxQk{csjpDb7!w4K9wAg@9HWlv{a{`;AP{}FXkX^2j-fHsi
zQLZ!EvHJU68^je^>Y&awjMT==OY&j0FBusLUd2jodw8##a-HM`KN^jY!MX~d;7
zXA2R^Ky$Z>8JQ(Fexa-7%`XQyUEAu^l?KkSLCX*@9F6oFOAA?Cgo%6j|B#a)
zR1ffI$#lT!I|(8A22SGCN(qqRts#&2cg9;8C=+8tG9%&9h0CtHN{ejw3o(y`q#Wsg
z>7LVO1#DfOz6o|c1k$E9UWIkV$+YY4Or3a(sM7K>iwI5E6Og!q6dc!NZ&9juh3l(s!NZDJ}!`B0D
zP@umYHY1u!m{QKPf@x+YpW%HTuL!FF4E(YHb)if_ps#R`KlM(GYFRA+qqr_s_idl<
zbo?H3ilS>PQ^HhirgeeyHJ>KY{KogJjGcqE@_@>I9&8kf5x&v#9m7A%{$hVWY2sF#
z`Lq(oqafWu>P+E$eR9o9&s5qe1<&r(8OzSt>w2NX#ofW4A9?gl9F>Fj$>$DD1Kx8AmYH<
z2Tiy3-~~3M493hQ45VBW7`ZQK*eF$u)6
z6M5?^?1tnVvBpQbni^zGmFQ-euz7qAkJ32Z!R>Y{BOR(YMI(4n2ZxYVD*$lode@J(
zGE6Q0jHN-sY@u*~Acd@I%AXNzzIelv_N!frT9BzXiqceiAMtLz)!zT>{uHkp=o2gg
z*-rI?Qv^iyxk3A1P}JWrdeDtI!sgs6x+Hl{f`rG!O&y;`(p}mq_4GGRrU*))P?kmV
zN!+@RM4Ut}((ms*advqC@G{x2-dU_`L;JeRSfUFXZ*@p?Tm#-8pXqZMtTh@eEsL-}
z4KB;Y-?JiUD@%0wUpY|ctS~vBf^5n{IbY0Qs)07-9
zj;7nKatJ7!(&wC%Hl{T#jc;j-KGy0=zmeu)(Jdj=1QIkWFy1TxiF6xFh?bePzyHCm
z8GRCIjIcf(ga65{4N{oIJ}w$;cH1%{@t>Qq!fh8lBt}DmmGD;!29xm0Pp(7t*3Bff
zcLqyJPjML9dDOmq*Q8dJZvuY2Y-b5l^i@@eD(f~nJ~dZkGkagpjC-kWr=?W`#%uRf
zDH*I8C4HziR@8`|u6W4%n)t+@CdD%I?;yK=Xms+}4@z|MG?^S_iCMJNQk5)=cvNzT
z(Bs%_a)d4`zF(EX$4O|yZIdyo?td6f>Q#j56l?-87ZP%dXY|TTMat%vqzITs>{|Gd
zbNJ+o;?abN3x&Sp6c(Wmbb5^df&nF`k(Tf~czFk{b0e{JRgR}UIUZS&nJ3qMgQD*?
zNr@2dinJa9NmDU0O`c)iosZ4xGb+v}egnOMxTf@>ChSuGNvn&~evlaJXn0Znhp4r;F%GXdQW2NN;pFlH92u^&hlR(d
z!g-lWYz$s*Lohg1APdJstL}U(BIL@);_Mv&)8ZqW$xMpB_F29Y`ny#OZi)V
zXVGWoaKe9jG0Mkv5_MByU_!8dX2N6Je5iWx%qmO$zh{n|paZ3hJ)j(+
z3x~rt|6u8Rrs(_yK-#nxIs@OW$D7Ii&_#{U$jXN0lJ@I$oZZB$f4^Jyu^y}%R>k2i
z7#oMlC0bM*3Zci3td(7thWgL@2@(B=FT!(#2MAR8fv{Ou(1&m3IEhFLV*yn`tX
zp6!axe6B@#0^>`5B92o!Yw)s41gyD!CihL^hOm=Y+h65^*bNj7|kQK$i*V
zd{fRMe{h
z;#>tV2MTMf6@GmE>fdb)Tp5BMZxhhP9apF*&HDgRhm-W_Cm5T9{QLNC1_pI#A1YI-
z9azbL+x3yob00HcqL6zSRP84s)j=wc+o67E*5Ff=8z|?OBL>-qy=wg-@JGJ0?YS@4
z%+iWb#@KZ~HrLR~wNsn-hxv&|zxgityUN*A1eJ8&-6BrLz=ZLi>NNX}jFDdx{
z^}M$|9Ctf%!c)4~|E4K+H#%@{@H<5!97Zc)L&0m87lN#AdMJ`!E~A8hMHWwie0NO3
zC~ctl&mLiITJn+On_L#d`4J`s0=)^m;d_19Umjnb*C9k<7uNHJ7RHKC@@;RB6EN~0
zsqHo0XxJNdViF!Go2+?7Xpid71B=oe}L^a7szHZ^qk)IssSu8q=K0g
z-=(m>MWpHUs8e%2wL><6pHV}ps18u`u}N_Ui{(;Hq3@%cajy{s$h^}?+C-|I-iN#~
z(|iXz7d+HyWc&yM+a)>|U!-sN7uL4vFZ{&XNa3H_(q)e}1c*dbiTm&%-h034+WfaMUw+ZaWm6bKeLP!U$Pn^gxl`z
zga~?+SCmxdz8A<2`oFn=na?a)|L1`J(oJkJ8pL`?RnsX5ly`#jyN4j-5PulVs5
z!k-V;&vCzs0KZJ{j*4^5Y_1sft^Pn|&5)3D|Ebk2V2Mi1lni}p1OK(jZNOyqok*rE
zwqDtl&`rrd8wYRPh!yNxQs5wq2xcpMZ=xaiJrwQUo-5u#i_dGf$7`i*uw_#)H>PHT
z8q&eL`+m0>ymKf!8iSGda!Ik2S1dZ;!}}x%fLvAK=Fv@`iH*0^9RxG?xG?7U{mm
z=e(Tmpz2@kgje!rrBkceAzcfq$LRgs_p*Ce-9=FzZmAt#eM_wdRODY{_H|``%s`}1
zN24N??oI4kBA(WqHu?7M^ZqEKh^v?LYCdecKp-(qi5K%%uh9-dUL=^ucK;ShALZb^
zbX_w)3+Tr_GX-~|!2iA~TDGkl!KP%6Cn^^5_b&WT&78HTO|8RA?({uhxD)}tbFY;Z
zJ<1o;SM8v!5h%ug6BE{F3>Z$RIe1FDuS83%5H=}$h#%m6G|mwY`iQHx{S7WOs^-B
z54m2i&jFzsXQlc#PgW!Q@)Q%yErvsvJ0yj7P&_p#>6OKaxT5u`#ADJ|5y^4i+rNu@
zEZUtMI53v9mu6)-TgUo)9U?ivKkEnSkynbOax%n^1%)
zD{Bs8Iv1iGtmZ5v?NI0d#R_ZWF{-4=vE*Y)h>1<{Oz&>>rGpMbf}TEej>b1$A{p;j
z_s*x6K57x-){%GW96dMob
zg)21%S%;F(;Bmin2)NgdX0C1)Cx0Lgus5db5j)WRCa>dd>yQ)Ogb{fw=RZfnk_nlX
zi(O~hQlHr&xPmG;d;p7yC7o#j0MWWqn?@?tS
zk*fdK&)PoyjJ6DocEbYWpXbz6f7**SQvf`b-*9=NO-Gjbu64-nT1v3oY7IRQ&%&nD
zJ5O2sZrtxOM|fv$ffB^g$EVK_@JuElKWj6~)su{LBRJXp)r#(dzW2Y`1^Xnm=nH1p
zUh6qjz)AHP(MW_`lfm1Wu~{{8_JAk$UblBbyq~pgUYZB>fp9OrfMEf!TkxMW6Nt$^
zukS^93p9i#c9&~^U;I=BQ!$e!yI&Z51)w`WKK`xF;y)@j|0_fIe_OEm-^=90{(see
zen6Gq?%dQ4cyfb$zQl!Pgvtf<{QjfJ6&f1)pCZ?oT@K>!n}&LN(3?hjdQ}iiAaasW
z&{UyLr6`|W{<;2pb1qIiK-)8NrylvEBSS#>S2pN&P;1Nm@>p}@$^c7Wn_UA`EoBG<
ztvst^bz$_aM;aj?uQab3uXxaGkH-=@nXL`m0%4<2&z9|P=G|8@jeGBpgCJwQHN$=w
z1bVB2l?K{x&9fw1uifuXo-;oiKDgf29%dhcLn-i`RVBZLL`VvP0v~mmu7eczCxLAS
zTLHu}kEBA9qZHj~lh8rt72-Oc*;aihbgaHEu6d~!w3q&qXEe@m-cwQ=)e7Se_gESy
zF7eG@XT4lAj$M2<`3DNV-WdmgQ@LM#{d;*6*!Gn;`PSp)uDONhNP+d@=gw7Qfd+HX
zniRc86`#4g4HA?Z4zR;raB{1#Mus7_z+05!N~J|>nrI#b38OUhy(7bN;?K)d#AG8}
zZ|%Wv1-kr)-Wl18;Dn17A%iLsii0+`$-;NH8xKy*MTLd`55+B%b~S%yjI}5ECV(Sf5vYw3^JHl+Z0Po!
zo=i+O)8W+>n70PD3f^Y8Rv}Ge2el?a0Xn(HaQGPU#h=qP_&vzR#BgC1x(q~`{-X_n
zYLG1nEmqRX2ctI@%3WzO_%z;XZfTx=3mc1p677IMm?Ww|T%VwJtU^5v(cVh-*gkf}
zqZ7KHVyCb;A8;ucfE^`GDYr%r5g@=q#x9m%xzC3O-?*&qFo-{@fFteD7TT9YOK`in
zJDQuWD?(GIkZ^-4pAfc!#Jw~hwF*ARRu#Lm>&q<-!>-fXngHWPxE&FxwR%;FdwKL=
zPc+u6@=Ej8UTNE9YSY$dc><=LJz1aWkY6l`Vnuh#3uOMe=8d~G$g)Py%=0mg5QGLV
zwT<7jW+5ilD*W~E2RZI}-Dg4PmxkPq-1iOZkwY
z(5R;`vjRBVt!k5pb{p8}0yYtrchgaOkbLoG5e=ZFcs1_D9a3%`mxa3U%VE#<1=8w`
zfNS!P&AbZN!vx)n$%^*%EM1^Yu;a-i=>6Cn{_XEF$?t9Nz$KF2$fDAr$m>#rq2
zGOH)BFJ|a}TKGTCF?j!27j9-X4=GZNyqfE7v`F|YyCvMw?#a8SrBZ2sE9M++9EhZ*
z`_pk`C&t`aL3E8-ANeJnvms#s{?`$mD3IU%aAtw^{ef{(oTb8^i^Sx|CG6YwZ^Uiz
zz?PIfW4B)fC=hQ98L!1LnOq*;ys{mI8S3$|`+?HnQaBBNgBER~^U}`LlTi@fKvKD*
zK>lWAE**(xvvYhc@UO5P6)8`?8{qcx*rB6e`dgjXT2;z@3H@6Dzon3%YCBo>>H!FH
z(v=tcdYi-J;UPbv&+oejw6GmH0Afub&$3TDE6G=Alv-1vEY+Lpa~2Dj7OQu*RNfX9(;
zyKR+YnAu))CgE+qW-Xc?zF;54TkUL+o$)FdXv2$KTk791Hv#c5S7#yiybc`M1t7qy
z&|8hcb0A)O8R=Cj9EKwl=bqq}DiJIC*GzRXV(aI9Ic0eil69HT-*D2T(w$(Op2KFt
z@+h~Jt7$hw{O+ppd&JUid)qg-Ygjt0sB0#Q6CVq!bQSTG#Vzs1LL%%U@~sL+S}9^Y
zUwG^es)rdh)H-SCs-GmMSsUO+OCo>%=5Cn7SbvZoQ^OoHAziX!q!`*WGjlcBn~lvm
zH${YxXt{4;dvH=F-V^4La>~D4HS79E4Bcq(Vp>W5B7(xY^MIJ4i)y*_GnG?ei`=wQBYvn=}@B30Dsf-
zTj$|fu{6zoLfI6I!faYxxyO4T4ckR&WmJK$k?Go9k?Lqh#yW7>{=Px=x4t
z$8+CVo%7xK^-Ri1L&N-73zEvVTtK%4ebZ_F1#j!i$=#l{#aA@Nohf`ziY2uZ4YG5e
z9>m8M!c{*&zUy{f#~bj(IkxmiI9Z!3GY+6<_{)g0n2EV4{{M7w)nQdOO&{SP(%s!C
zc_`^FX#o+WIl!R~AR+BdNymXhBhnx#-5nyGN~d(Gr1XcrKJV-E?LV_STeJ7zgGb>DzOenf-;naK-OeSlYU+&%>Sd86Gs`Qzi?DN3@0Sru%cnS*V6fRX@f9QcZbI|BZP9Or{b6bY#0=&S3f;
zE;$&W*3E#UJ1i|RRt_5Ge7u9{y|TfT>0)c7CrQfOmfWeNkFTH{X$Ic}4|?K1#HR?n
zmdj?qdk`rNG76C=dI%1Fx&4U9URzE%=%eXaKyaQldn_0pLle$J$8*0!MJ|9Ll7Jkg
z^he196l4gT-2Bi$T0T?G`keq#pSx`MlL$-Tqn>0L*^f|6N=$!{z4T#no*=}2wPRzz
zJv>l72)pCHn`vOMDXW_)D|UzaZo7I^$3bjp8;eoUK=%eSJlq)_6vm=jH}_eS>R`Pp
zR=h>k^GFmkyOVJ*oZ-zzpG*k5t$tWIYS2F39@?co545OM-t{nXaNK2M>
z=o6!gd?mqvwPyppMPujy+_RxD37kSq#lKodjg^RIuizjs`6Y7N*1D9u@U!L%KAGaI
zDk}?J70akl`(*Yi^r)0LGO4SxrCS@o_v${uWjB~_y|BWw8q-z@a
zJm?vmH-(&ts!%D}T}dKMdhONB9F+Qjr=H};19L~a^MvqgsqL8t4`6CSm^lW=Xn1_Z4vPw;3{hFvq0n{VCA?ZD;bi>6Id`(3pR?|)(2NDX&e`m1lDRcwGVt;yu
zBfts^i~_Z~m{lf>9Ua#GRN29&{aH4w&{|qbovF>ze?PvQlNYCjmn-x|rZP@L1X+V3
zgXFWr)h}Dc`cm^4^>MZBW$m>JI!&2Ai{}0;Jv+}1Ct6TFfZYahUp1K%`etj+liXe!y%@O#0MrO=6A(z*gCpGp%X+w>mVCL8}>_i|us_*R-@!8Eq2@H9`CJ
zdAbtO+}a70Qe>KIFJJM&==JbhIeyA@yDb(-ORaBGhvTb$^P-+^zW#ca9({6n@fp{V
zQ($}BLiSHMqLg$eNMBjy=oBCPl
zK^1dRJXJaPcE;7hygCl_Xv&hg7;QEnWu67us09WuYl3ZM;%5E4_Sj6`MkZaK%&||%
z1DUp>(YCs61GzVg>
zGl}wu>qEa030dK{j0pj5K+rE26z%VG%G@<`@QO?CO6K?=3}w*Ay)MH<
zdL8BThzd=-l6;Q+^1NCM;8Z#1JGsUPA5hdU;muGHjf5`Wx^0O+|5n#sdfjo`{!U_Q
zj3v#Fm1pvKjM(Jaop(iS@C&>`Wn(y1#TIUAPvJ%}S(7@WTR~VNFyref_F?z&F6VWV
z{npZ}x_W5w%y?ZfR
zQ`}*;QW{L*RHyXi1+72C(3rP4s|4*=u9a&JuAB|ukeKvVUMVU-us
zz@nU?ozFt|wm5;gEKqBMU7GlL@mnj^QrBhz)PeNT{!QbQ(!KDfg1YlOm*c7F$9iUK
zu)gu3pXu0D-04bQRP2$>eudnv#E>@{kC+Xl&0~pmj-rVR;x|pEI*fPCiGzE;zVtFw
zeKY^2Dk&*xRMRf-Ybx-8&C<3$PRQb6*N~1-+OSM-8d$A&Hl(@riDwEdnF<^G^KobK
zPB|qte#in6|BrY5V-;q}a|cFDUl*E`d}bnduKhF;S6Jy%0pE*;Fw~T&1x!x^&7L^Y
zoEV!1Ur%~D*dvT-kif=p&K7+&;62}4yrSw!9Kn6@ke&uaP!)COT;N4)uP^2XL-WSo?P{S{xjWZpMTX?Tv$b
z-dN7NT?WOB&vz0_0WQe9(LQKuabMC~*Oo&ukCl9Vh9