diff --git a/COPYRIGHT b/COPYRIGHT
index c6a629c5c7a..1631f85d321 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -13,6 +13,7 @@ Component Version License GPL Compatible
-------------------------------------------------------------------------------------
PHP libraries:
AdoDb-Date 0.32 Modified BSD License Yes Date convertion (not into rpm package)
+ChromePHP 4.3.3 Apache Software License 2.0 Yes Return server log to chrome browser console
CKEditor 4.3.3 LGPL-2.1+ Yes Editor WYSIWYG
FPDI 1.4.2 Apache Software License 2.0 Yes PDF templates management
FPDF_TPL 1.2 Apache Software License 2.0 Yes PDF templates management
diff --git a/ChangeLog b/ChangeLog
index 9023171f337..158ec290a40 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -208,6 +208,10 @@ Dolibarr better:
- Fix: [ bug #1783 ] SQL error when enabling 3rd party module with PostgreSQL and MySQL strict mode ON
- Fix: [ bug #1717 ] Sorting unpaid invoices by amount received brings due amount
- Fix: [ bug #1784 ] MOTD doesn't show up in Amarok theme
+- Fix: Tracking number not visible on shipment pdf
+- Fix: [ bug #1812 ] SQL Error message while sending emailing with PostgreSQL datatabase
+- Fix: [ bug #1819 ] SQL error when searching for an invoice payment
+- Fix: [ bug #1827 ] Tax reports gives incorrect amounts when using external modules that create lines with special codes
***** ChangeLog for 3.6.2 compared to 3.6.1 *****
- Fix: fix ErrorBadValueForParamNotAString error message in price customer multiprice.
diff --git a/htdocs/admin/syslog.php b/htdocs/admin/syslog.php
index 18de8bf6bfc..c1fc11add9b 100644
--- a/htdocs/admin/syslog.php
+++ b/htdocs/admin/syslog.php
@@ -81,33 +81,32 @@ if ($action == 'set')
{
$db->begin();
- $activeModules = array();
+ $newActiveModules = array();
$selectedModules = (isset($_POST['SYSLOG_HANDLERS']) ? $_POST['SYSLOG_HANDLERS'] : array());
-
- foreach ($selectedModules as $syslogHandler)
+ //var_dump($selectedModules);
+ foreach ($syslogModules as $syslogHandler)
{
if (in_array($syslogHandler, $syslogModules))
{
$module = new $syslogHandler;
- if ($module->isActive())
+ if (in_array($syslogHandler, $selectedModules)) $newActiveModules[] = $syslogHandler;
+ foreach ($module->configure() as $option)
{
- $activeModules[] = $syslogHandler;
-
- foreach ($module->configure() as $option)
+ if (isset($_POST[$option['constant']]))
{
- if ($_POST[$option['constant']])
- {
- dolibarr_del_const($db, $option['constant'], 0);
- dolibarr_set_const($db, $option['constant'], $_POST[$option['constant']], 'chaine',0, '', 0);
- }
+ $_POST[$option['constant']] = trim($_POST[$option['constant']]);
+ dolibarr_del_const($db, $option['constant'], 0);
+ dolibarr_set_const($db, $option['constant'], $_POST[$option['constant']], 'chaine',0, '', 0);
}
}
}
}
+ $activeModules = $newActiveModules;
dolibarr_set_const($db, 'SYSLOG_HANDLERS', json_encode($activeModules), 'chaine',0,'',0);
+
if (! $error)
{
$db->commit();
@@ -165,6 +164,9 @@ if ($conf->global->MAIN_MODULE_MULTICOMPANY && $user->entity)
$option = 'disabled="disabled"';
}
+
+//print "conf->global->MAIN_FEATURES_LEVEL = ".$conf->global->MAIN_FEATURES_LEVEL."
\n";
+
// Output mode
print_titre($langs->trans("SyslogOutput"));
@@ -190,7 +192,7 @@ foreach ($syslogModules as $moduleName)
$var=!$var;
print '
| '.$langs->trans("AccountingResult").' | ';
for ($annee = $year_start ; $annee <= $year_end ; $annee++)
{
print ' ';
diff --git a/htdocs/compta/tva/clients.php b/htdocs/compta/tva/clients.php
index c2620fd34df..5d8dce0fd73 100644
--- a/htdocs/compta/tva/clients.php
+++ b/htdocs/compta/tva/clients.php
@@ -35,6 +35,7 @@ $langs->load("bills");
$langs->load("compta");
$langs->load("companies");
$langs->load("products");
+$langs->load("other");
// Date range
$year=GETPOST("year");
diff --git a/htdocs/compta/tva/quadri_detail.php b/htdocs/compta/tva/quadri_detail.php
index 681448e901e..f551e92cb9d 100644
--- a/htdocs/compta/tva/quadri_detail.php
+++ b/htdocs/compta/tva/quadri_detail.php
@@ -41,6 +41,7 @@ $langs->load("bills");
$langs->load("compta");
$langs->load("companies");
$langs->load("products");
+$langs->load("other");
// Date range
$year=GETPOST("year");
diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php
index baa46bc0356..d21642912b2 100644
--- a/htdocs/contact/class/contact.class.php
+++ b/htdocs/contact/class/contact.class.php
@@ -140,6 +140,7 @@ class Contact extends CommonObject
$sql.= ", statut";
$sql.= ", canvas";
$sql.= ", entity";
+ $sql.= ",ref_ext";
$sql.= ", import_key";
$sql.= ") VALUES (";
$sql.= "'".$this->db->idate($now)."',";
@@ -152,6 +153,7 @@ class Contact extends CommonObject
$sql.= " ".$this->statut.",";
$sql.= " ".(! empty($this->canvas)?"'".$this->canvas."'":"null").",";
$sql.= " ".$conf->entity.",";
+ $sql.= "'".$this->db->escape($this->ref_ext)."',";
$sql.= " ".(! empty($this->import_key)?"'".$this->import_key."'":"null");
$sql.= ")";
@@ -492,10 +494,12 @@ class Contact extends CommonObject
*
* @param int $id id du contact
* @param User $user Utilisateur (abonnes aux alertes) qui veut les alertes de ce contact
- * @return int -1 if KO, 0 if OK but not found, 1 if OK
+ * @param string $ref_ext External reference, not given by Dolibarr
+ * @return int -1 if KO, 0 if OK but not found, 1 if OK
*/
- function fetch($id, $user=null)
+ function fetch($id, $user=0, $ref_ext='')
{
+ dol_syslog(get_class($this)."::fetch ".$this->error, LOG_ERR);
global $langs;
$langs->load("companies");
@@ -517,7 +521,8 @@ class Contact extends CommonObject
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d ON c.fk_departement = d.rowid";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u ON c.rowid = u.fk_socpeople";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON c.fk_soc = s.rowid";
- $sql.= " WHERE c.rowid = ". $id;
+ if ($id) $sql.= " WHERE c.rowid = ". $id;
+ elseif ($ref_ext) $sql .= " WHERE c.ref_ext = '".$this->db->escape($ref_ext)."'";
dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
$resql=$this->db->query($sql);
diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php
index 364307468a7..7453e36d350 100644
--- a/htdocs/core/class/extrafields.class.php
+++ b/htdocs/core/class/extrafields.class.php
@@ -100,7 +100,7 @@ class ExtraFields
* @param int $type Type of attribute ('int', 'text', 'varchar', 'date', 'datehour')
* @param int $pos Position of attribute
* @param int $size Size/length of attribute
- * @param string $elementtype Element type ('member', 'product', 'company', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', ...)
* @param int $unique Is field unique or not
* @param int $required Is field required or not
* @param string $default_value Defaulted value
@@ -113,6 +113,8 @@ class ExtraFields
if (empty($attrname)) return -1;
if (empty($label)) return -1;
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
// Create field into database except for separator type which is not stored in database
if ($type != 'separate')
{
@@ -145,7 +147,7 @@ class ExtraFields
* @param string $attrname code of attribute
* @param int $type Type of attribute ('int', 'text', 'varchar', 'date', 'datehour')
* @param int $length Size/length of attribute
- * @param string $elementtype Element type ('member', 'product', 'company', 'contact', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', 'contact', ...)
* @param int $unique Is field unique or not
* @param int $required Is field required or not
* @param string $default_value Default value for field
@@ -155,6 +157,8 @@ class ExtraFields
*/
private function create($attrname, $type='varchar', $length=255, $elementtype='member', $unique=0, $required=0, $default_value='',$param='')
{
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
$table=$elementtype.'_extrafields';
if (! empty($attrname) && preg_match("/^\w[a-zA-Z0-9_]*$/",$attrname) && ! is_numeric($attrname))
@@ -216,7 +220,7 @@ class ExtraFields
* @param int $type Type of attribute ('int', 'text', 'varchar', 'date', 'datehour', 'float')
* @param int $pos Position of attribute
* @param int $size Size/length of attribute
- * @param string $elementtype Element type ('member', 'product', 'company', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', ...)
* @param int $unique Is field unique or not
* @param int $required Is field required or not
* @param array||string $param Params for field (ex for select list : array('options' => array(value'=>'label of option')) )
@@ -227,6 +231,8 @@ class ExtraFields
{
global $conf;
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
// Clean parameters
if (empty($pos)) $pos=0;
@@ -277,11 +283,13 @@ class ExtraFields
* Delete an optional attribute
*
* @param string $attrname Code of attribute to delete
- * @param string $elementtype Element type ('member', 'product', 'company', 'contact', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', 'contact', ...)
* @return int < 0 if KO, 0 if nothing is done, 1 if OK
*/
function delete($attrname, $elementtype='member')
{
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
$table=$elementtype.'_extrafields';
if (! empty($attrname) && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
@@ -307,13 +315,15 @@ class ExtraFields
* Delete description of an optional attribute
*
* @param string $attrname Code of attribute to delete
- * @param string $elementtype Element type ('member', 'product', 'company', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', ...)
* @return int < 0 if KO, 0 if nothing is done, 1 if OK
*/
private function delete_label($attrname, $elementtype='member')
{
global $conf;
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{
$sql = "DELETE FROM ".MAIN_DB_PREFIX."extrafields";
@@ -347,7 +357,7 @@ class ExtraFields
* @param string $label Label of attribute
* @param string $type Type of attribute
* @param int $length Length of attribute
- * @param string $elementtype Element type ('member', 'product', 'company', 'contact', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', 'contact', ...)
* @param int $unique Is field unique or not
* @param int $required Is field required or not
* @param int $pos Position of attribute
@@ -357,6 +367,8 @@ class ExtraFields
*/
function update($attrname,$label,$type,$length,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0)
{
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
$table=$elementtype.'_extrafields';
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
@@ -433,7 +445,7 @@ class ExtraFields
* @param string $label Label of attribute
* @param string $type Type of attribute
* @param int $size Length of attribute
- * @param string $elementtype Element type ('member', 'product', 'company', ...)
+ * @param string $elementtype Element type ('member', 'product', 'thirdparty', ...)
* @param int $unique Is field unique or not
* @param int $required Is field required or not
* @param int $pos Position of attribute
@@ -446,6 +458,8 @@ class ExtraFields
global $conf;
dol_syslog(get_class($this)."::update_label ".$attrname.", ".$label.", ".$type.", ".$size.", ".$elementtype.", ".$unique.", ".$required);
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
if (isset($attrname) && $attrname != '' && preg_match("/^\w[a-zA-Z0-9-_]*$/",$attrname))
{
$this->db->begin();
@@ -513,7 +527,7 @@ class ExtraFields
/**
* Load array this->attribute_xxx like attribute_label, attribute_type, ...
*
- * @param string $elementtype Type of element ('adherent', 'commande', societe', 'facture', 'propal', 'product', ...)
+ * @param string $elementtype Type of element ('adherent', 'commande', thirdparty', 'facture', 'propal', 'product', ...)
* @param boolean $forceload Force load of extra fields whatever is option MAIN_EXTRAFIELDS_DISABLED
* @return array Array of attributes for all extra fields
*/
@@ -521,6 +535,8 @@ class ExtraFields
{
global $conf;
+ if ($elementtype == 'thirdparty') $elementtype='societe';
+
$array_name_label=array();
// For avoid conflicts with external modules
diff --git a/htdocs/core/db/pgsql.class.php b/htdocs/core/db/pgsql.class.php
index 19d0cabc07f..22ca6e4171e 100644
--- a/htdocs/core/db/pgsql.class.php
+++ b/htdocs/core/db/pgsql.class.php
@@ -7,6 +7,7 @@
* Copyright (C) 2005-2012 Regis Houssin
* Copyright (C) 2012 Yann Droneaud
* Copyright (C) 2012 Florian Henry
+ * Copyright (C) 2015 Marcos García
*
* 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
@@ -254,7 +255,7 @@ class DoliDBPgsql extends DoliDB
$newreg3=preg_replace('/ NOT NULL/i','',$newreg3);
$newreg3=preg_replace('/ NULL/i','',$newreg3);
$newreg3=preg_replace('/ DEFAULT 0/i','',$newreg3);
- $newreg3=preg_replace('/ DEFAULT \'[0-9a-zA-Z_@]*\'/i','',$newreg3);
+ $newreg3=preg_replace('/ DEFAULT \'?[0-9a-zA-Z_@]*\'?/i','',$newreg3);
$line.= "ALTER TABLE ".$reg[1]." ALTER COLUMN ".$reg[2]." TYPE ".$newreg3;
// TODO Add alter to set default value or null/not null if there is this in $reg[3]
}
diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php
index 50c02125fb7..8f6847bcb9a 100644
--- a/htdocs/core/lib/geturl.lib.php
+++ b/htdocs/core/lib/geturl.lib.php
@@ -52,7 +52,6 @@ function getURLContent($url,$postorget='GET',$param='',$followlocation=1,$addhea
exit;*/
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
- curl_setopt($ch, CURLOPT_SSLVERSION, 3); // Force SSLv3
curl_setopt($ch, CURLOPT_USERAGENT, 'Dolibarr geturl function');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, ($followlocation?true:false));
diff --git a/htdocs/core/lib/tax.lib.php b/htdocs/core/lib/tax.lib.php
index 1c048c7d6f5..aae464ad17d 100644
--- a/htdocs/core/lib/tax.lib.php
+++ b/htdocs/core/lib/tax.lib.php
@@ -1,10 +1,11 @@
- * Copyright (C) 2006-2007 Yannick Warnier
- * Copyright (C) 2011 Regis Houssin
- * Copyright (C) 2012 Juanjo Menent
+/* Copyright (C) 2004-2009 Laurent Destailleur
+ * Copyright (C) 2006-2007 Yannick Warnier
+ * Copyright (C) 2011 Regis Houssin
+ * Copyright (C) 2012 Juanjo Menent
* Copyright (C) 2012 Cédric Salvador
* Copyright (C) 2012-2014 Raphaël Doursenaud
+ * Copyright (C) 2015 Marcos García
*
* 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
@@ -88,26 +89,18 @@ function vat_by_thirdparty($db, $y, $date_start, $date_end, $modetax, $direction
global $conf;
$list=array();
- //print "xx".$conf->global->MAIN_MODULE_ACCOUNTING;
- //print "xx".$conf->global->MAIN_MODULE_COMPTABILITE;
if ($direction == 'sell')
{
$invoicetable='facture';
- $invoicedettable='facturedet';
- $fk_facture='fk_facture';
- $total_tva='total_tva';
- $total_localtax1='total_localtax1';
- $total_localtax2='total_localtax2';
+ $total_ht='total';
+ $total_tva='tva';
}
if ($direction == 'buy')
{
$invoicetable='facture_fourn';
- $invoicedettable='facture_fourn_det';
- $fk_facture='fk_facture_fourn';
- $total_tva='tva';
- $total_localtax1='total_localtax1';
- $total_localtax2='total_localtax2';
+ $total_ht='total_ht';
+ $total_tva='total_tva';
}
// Define sql request
@@ -127,11 +120,10 @@ function vat_by_thirdparty($db, $y, $date_start, $date_end, $modetax, $direction
if (! empty($conf->global->MAIN_MODULE_COMPTABILITE))
{
$sql = "SELECT s.rowid as socid, s.nom as name, s.siren as tva_intra, s.tva_assuj as assuj,";
- $sql.= " sum(fd.total_ht) as amount, sum(fd.".$total_tva.") as tva,";
- $sql.= " sum(fd.".$total_localtax1.") as localtax1,";
- $sql.= " sum(fd.".$total_localtax2.") as localtax2";
+ $sql.= " sum(f.$total_ht) as amount, sum(f.".$total_tva.") as tva,";
+ $sql.= " sum(f.localtax1) as localtax1,";
+ $sql.= " sum(f.localtax2) as localtax2";
$sql.= " FROM ".MAIN_DB_PREFIX.$invoicetable." as f,";
- $sql.= " ".MAIN_DB_PREFIX.$invoicedettable." as fd,";
$sql.= " ".MAIN_DB_PREFIX."societe as s";
$sql.= " WHERE f.entity = " . $conf->entity;
$sql.= " AND f.fk_statut in (1,2)"; // Validated or paid (partially or completely)
@@ -148,7 +140,7 @@ function vat_by_thirdparty($db, $y, $date_start, $date_end, $modetax, $direction
$sql.= " AND f.datef <= '".$db->idate(dol_get_last_day($y,12,false))."'";
}
if ($date_start && $date_end) $sql.= " AND f.datef >= '".$db->idate($date_start)."' AND f.datef <= '".$db->idate($date_end)."'";
- $sql.= " AND s.rowid = f.fk_soc AND f.rowid = fd.".$fk_facture;
+ $sql.= " AND s.rowid = f.fk_soc";
$sql.= " GROUP BY s.rowid, s.nom, s.tva_intra, s.tva_assuj";
}
}
diff --git a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
index e861bff6169..312e8bc5e1f 100644
--- a/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
+++ b/htdocs/core/modules/expedition/doc/pdf_merou.modules.php
@@ -558,6 +558,7 @@ class pdf_merou extends ModelePdfExpedition
// Date Expedition
$Yoff = $Yoff+7;
$pdf->SetXY($blSocX-80,$blSocY+17);
+
$pdf->SetFont('','B', $default_font_size - 2);
$pdf->SetTextColor(0,0,0);
$pdf->MultiCell(50, 8, $outputlangs->transnoentities("DateDelivery")." : " . dol_print_date($object->date_delivery,'day',false,$outputlangs,true), '', 'L');
@@ -581,6 +582,7 @@ class pdf_merou extends ModelePdfExpedition
{
// Get code using getLabelFromKey
$code=$outputlangs->getLabelFromKey($this->db,$object->shipping_method_id,'c_shipment_mode','rowid','code');
+
$label='';
$label.=$outputlangs->trans("SendingMethod").": ".$outputlangs->trans("SendingMethod".strtoupper($code));
//var_dump($object->tracking_url != $object->tracking_number);exit;
diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php
index c8d77040a9d..14de889d9ce 100644
--- a/htdocs/core/modules/import/import_csv.modules.php
+++ b/htdocs/core/modules/import/import_csv.modules.php
@@ -599,7 +599,7 @@ class ImportCsv extends ModeleImports
//var_dump($objimport->array_import_convertvalue); exit;
// Build SQL request
- if (empty($tablewithentity[$tablename]))
+ if (empty($tablewithentity_cache[$tablename]))
{
$sql ='INSERT INTO '.$tablename.'('.$listfields.', import_key';
if (! empty($objimport->array_import_tables_creator[0][$alias])) $sql.=', '.$objimport->array_import_tables_creator[0][$alias];
diff --git a/htdocs/core/modules/syslog/mod_syslog_chromephp.php b/htdocs/core/modules/syslog/mod_syslog_chromephp.php
index 06d37dfa431..b2520d27d7b 100644
--- a/htdocs/core/modules/syslog/mod_syslog_chromephp.php
+++ b/htdocs/core/modules/syslog/mod_syslog_chromephp.php
@@ -42,7 +42,7 @@ class mod_syslog_chromephp extends LogHandler implements LogHandlerInterface
/**
* Is the module active ?
*
- * @return boolean
+ * @return int
*/
public function isActive()
{
@@ -51,8 +51,13 @@ class mod_syslog_chromephp extends LogHandler implements LogHandlerInterface
{
if (empty($conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH)) $conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH='/usr/share/php';
set_include_path($conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH);
- $res = @include_once 'ChromePhp.class.php';
+
+ //print 'rrrrr'.get_include_path();
+ $res = include_once('ChromePhp.php');
+ if (! $res) $res=@include_once('ChromePhp.class.php');
+
restore_include_path();
+
if ($res)
{
return 1;
@@ -77,10 +82,11 @@ class mod_syslog_chromephp extends LogHandler implements LogHandlerInterface
return array(
array(
- 'name' => $langs->trans('IncludePath'),
+ 'name' => $langs->trans('IncludePath','SYSLOG_CHROMEPHP_INCLUDEPATH'),
'constant' => 'SYSLOG_CHROMEPHP_INCLUDEPATH',
'default' => '/usr/share/php',
- 'attr' => 'size="40"'
+ 'attr' => 'size="60"',
+ 'example' => DOL_DOCUMENT_ROOT.'/includes/chromephp'
)
);
}
@@ -88,24 +94,19 @@ class mod_syslog_chromephp extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
- * @return boolean True if configuration ok
+ * @return array Array of errors. Empty array if ok.
*/
public function checkConfiguration()
{
- global $langs;
+ global $langs,$conf;
$errors = array();
- $oldinclude = get_include_path();
- set_include_path(SYSLOG_CHROMEPHP_INCLUDEPATH);
-
- if (!file_exists('ChromePhp.class.php'))
+ if (! file_exists($conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH.'/ChromePhp.php') && ! file_exists($conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH.'/ChromePhp.class.php'))
{
- $errors[] = $langs->trans("ErrorFailedToOpenFile", 'ChromePhp.class.php');
+ $errors[] = $langs->trans("ErrorFailedToOpenFile", 'ChromePhp.class.php or ChromePhp.php');
}
- set_include_path($oldinclude);
-
return $errors;
}
@@ -122,16 +123,18 @@ class mod_syslog_chromephp extends LogHandler implements LogHandlerInterface
if (! empty($conf->global->MAIN_SYSLOG_DISABLE_CHROMEPHP)) return; // Global option to disable output of this handler
//We check the configuration to avoid showing PHP warnings
- if (count($this->checkConfiguration())) return false;
+ if (count($this->checkConfiguration()) > 0) return false;
try
{
// Warning ChromePHP must be into PHP include path. It is not possible to use into require_once() a constant from
// database or config file because we must be able to log data before database or config file read.
$oldinclude=get_include_path();
- set_include_path(SYSLOG_CHROMEPHP_INCLUDEPATH);
- include_once 'ChromePhp.class.php';
+ set_include_path($conf->global->SYSLOG_CHROMEPHP_INCLUDEPATH);
+ $res = @include_once('ChromePhp.php');
+ if (! $res) $res=@include_once('ChromePhp.class.php');
set_include_path($oldinclude);
+
ob_start(); // To be sure headers are not flushed until all page is completely processed
if ($content['level'] == LOG_ERR) ChromePhp::error($content['message']);
elseif ($content['level'] == LOG_WARNING) ChromePhp::warn($content['message']);
diff --git a/htdocs/core/modules/syslog/mod_syslog_file.php b/htdocs/core/modules/syslog/mod_syslog_file.php
index 331b7331194..92d2302bea7 100644
--- a/htdocs/core/modules/syslog/mod_syslog_file.php
+++ b/htdocs/core/modules/syslog/mod_syslog_file.php
@@ -45,11 +45,11 @@ class mod_syslog_file extends LogHandler implements LogHandlerInterface
/**
* Is the module active ?
*
- * @return boolean
+ * @return int
*/
public function isActive()
{
- return true;
+ return 1;
}
/**
@@ -74,7 +74,7 @@ class mod_syslog_file extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
- * @return boolean True if configuration ok
+ * @return array Array of errors. Empty array if ok.
*/
public function checkConfiguration()
{
diff --git a/htdocs/core/modules/syslog/mod_syslog_firephp.php b/htdocs/core/modules/syslog/mod_syslog_firephp.php
index 31a3fb13431..31addd8b17a 100644
--- a/htdocs/core/modules/syslog/mod_syslog_firephp.php
+++ b/htdocs/core/modules/syslog/mod_syslog_firephp.php
@@ -42,7 +42,7 @@ class mod_syslog_firephp extends LogHandler implements LogHandlerInterface
/**
* Is the module active ?
*
- * @return boolean
+ * @return int
*/
public function isActive()
{
@@ -53,7 +53,7 @@ class mod_syslog_firephp extends LogHandler implements LogHandlerInterface
restore_include_path();
if ($res)
{
- return true;
+ return 1;
}
}
catch(Exception $e)
@@ -61,7 +61,7 @@ class mod_syslog_firephp extends LogHandler implements LogHandlerInterface
print ''."\n";
}
- return false;
+ return -1;
}
///**
@@ -86,7 +86,7 @@ class mod_syslog_firephp extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
- * @return boolean True if configuration ok
+ * @return array Array of errors. Empty array if ok.
*/
public function checkConfiguration()
{
diff --git a/htdocs/core/modules/syslog/mod_syslog_syslog.php b/htdocs/core/modules/syslog/mod_syslog_syslog.php
index 58ac241695c..2043225857b 100644
--- a/htdocs/core/modules/syslog/mod_syslog_syslog.php
+++ b/htdocs/core/modules/syslog/mod_syslog_syslog.php
@@ -42,14 +42,14 @@ class mod_syslog_syslog extends LogHandler implements LogHandlerInterface
/**
* Is the module active ?
*
- * @return boolean
+ * @return int
*/
public function isActive()
{
// This function does not exists on some ISP (Ex: Free in France)
- if (!function_exists('openlog')) return false;
+ if (!function_exists('openlog')) return 0;
- return true;
+ return 1;
}
/**
@@ -73,7 +73,7 @@ class mod_syslog_syslog extends LogHandler implements LogHandlerInterface
/**
* Return if configuration is valid
*
- * @return boolean True if configuration ok
+ * @return array Array of errors. Empty array if ok.
*/
public function checkConfiguration()
{
diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php
index fd2e3e0d469..ae2238e06f2 100644
--- a/htdocs/core/tpl/objectline_edit.tpl.php
+++ b/htdocs/core/tpl/objectline_edit.tpl.php
@@ -367,7 +367,7 @@ if (! empty($conf->margin->enabled))
var rounding = main_rounding_unit;
var pos = amount.indexOf(dec);
var decpart = '';
- if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Supprime les 0 de fin de partie decimale
+ if (pos >= 0) decpart = amount.substr(pos+1).replace('/0+$/i',''); // Remove 0 for decimal part
var nbdec = decpart.length;
if (nbdec > rounding) rounding = nbdec;
// If rounding higher than max shown
diff --git a/htdocs/includes/chromephp/ChromePhp.php b/htdocs/includes/chromephp/ChromePhp.php
new file mode 100644
index 00000000000..577b1cecb9d
--- /dev/null
+++ b/htdocs/includes/chromephp/ChromePhp.php
@@ -0,0 +1,446 @@
+
+ */
+class ChromePhp
+{
+ /**
+ * @var string
+ */
+ const VERSION = '4.1.0';
+
+ /**
+ * @var string
+ */
+ const HEADER_NAME = 'X-ChromeLogger-Data';
+
+ /**
+ * @var string
+ */
+ const BACKTRACE_LEVEL = 'backtrace_level';
+
+ /**
+ * @var string
+ */
+ const LOG = 'log';
+
+ /**
+ * @var string
+ */
+ const WARN = 'warn';
+
+ /**
+ * @var string
+ */
+ const ERROR = 'error';
+
+ /**
+ * @var string
+ */
+ const GROUP = 'group';
+
+ /**
+ * @var string
+ */
+ const INFO = 'info';
+
+ /**
+ * @var string
+ */
+ const GROUP_END = 'groupEnd';
+
+ /**
+ * @var string
+ */
+ const GROUP_COLLAPSED = 'groupCollapsed';
+
+ /**
+ * @var string
+ */
+ const TABLE = 'table';
+
+ /**
+ * @var string
+ */
+ protected $_php_version;
+
+ /**
+ * @var int
+ */
+ protected $_timestamp;
+
+ /**
+ * @var array
+ */
+ protected $_json = array(
+ 'version' => self::VERSION,
+ 'columns' => array('log', 'backtrace', 'type'),
+ 'rows' => array()
+ );
+
+ /**
+ * @var array
+ */
+ protected $_backtraces = array();
+
+ /**
+ * @var bool
+ */
+ protected $_error_triggered = false;
+
+ /**
+ * @var array
+ */
+ protected $_settings = array(
+ self::BACKTRACE_LEVEL => 1
+ );
+
+ /**
+ * @var ChromePhp
+ */
+ protected static $_instance;
+
+ /**
+ * Prevent recursion when working with objects referring to each other
+ *
+ * @var array
+ */
+ protected $_processed = array();
+
+ /**
+ * constructor
+ */
+ private function __construct()
+ {
+ $this->_php_version = phpversion();
+ $this->_timestamp = $this->_php_version >= 5.1 ? $_SERVER['REQUEST_TIME'] : time();
+ $this->_json['request_uri'] = $_SERVER['REQUEST_URI'];
+ }
+
+ /**
+ * gets instance of this class
+ *
+ * @return ChromePhp
+ */
+ public static function getInstance()
+ {
+ if (self::$_instance === null) {
+ self::$_instance = new self();
+ }
+ return self::$_instance;
+ }
+
+ /**
+ * logs a variable to the console
+ *
+ * @param mixed $data,... unlimited OPTIONAL number of additional logs [...]
+ * @return void
+ */
+ public static function log()
+ {
+ $args = func_get_args();
+ return self::_log('', $args);
+ }
+
+ /**
+ * logs a warning to the console
+ *
+ * @param mixed $data,... unlimited OPTIONAL number of additional logs [...]
+ * @return void
+ */
+ public static function warn()
+ {
+ $args = func_get_args();
+ return self::_log(self::WARN, $args);
+ }
+
+ /**
+ * logs an error to the console
+ *
+ * @param mixed $data,... unlimited OPTIONAL number of additional logs [...]
+ * @return void
+ */
+ public static function error()
+ {
+ $args = func_get_args();
+ return self::_log(self::ERROR, $args);
+ }
+
+ /**
+ * sends a group log
+ *
+ * @param string value
+ */
+ public static function group()
+ {
+ $args = func_get_args();
+ return self::_log(self::GROUP, $args);
+ }
+
+ /**
+ * sends an info log
+ *
+ * @param mixed $data,... unlimited OPTIONAL number of additional logs [...]
+ * @return void
+ */
+ public static function info()
+ {
+ $args = func_get_args();
+ return self::_log(self::INFO, $args);
+ }
+
+ /**
+ * sends a collapsed group log
+ *
+ * @param string value
+ */
+ public static function groupCollapsed()
+ {
+ $args = func_get_args();
+ return self::_log(self::GROUP_COLLAPSED, $args);
+ }
+
+ /**
+ * ends a group log
+ *
+ * @param string value
+ */
+ public static function groupEnd()
+ {
+ $args = func_get_args();
+ return self::_log(self::GROUP_END, $args);
+ }
+
+ /**
+ * sends a table log
+ *
+ * @param string value
+ */
+ public static function table()
+ {
+ $args = func_get_args();
+ return self::_log(self::TABLE, $args);
+ }
+
+ /**
+ * internal logging call
+ *
+ * @param string $type
+ * @return void
+ */
+ protected static function _log($type, array $args)
+ {
+ // nothing passed in, don't do anything
+ if (count($args) == 0 && $type != self::GROUP_END) {
+ return;
+ }
+
+ $logger = self::getInstance();
+
+ $logger->_processed = array();
+
+ $logs = array();
+ foreach ($args as $arg) {
+ $logs[] = $logger->_convert($arg);
+ }
+
+ $backtrace = debug_backtrace(false);
+ $level = $logger->getSetting(self::BACKTRACE_LEVEL);
+
+ $backtrace_message = 'unknown';
+ if (isset($backtrace[$level]['file']) && isset($backtrace[$level]['line'])) {
+ $backtrace_message = $backtrace[$level]['file'] . ' : ' . $backtrace[$level]['line'];
+ }
+
+ $logger->_addRow($logs, $backtrace_message, $type);
+ }
+
+ /**
+ * converts an object to a better format for logging
+ *
+ * @param Object
+ * @return array
+ */
+ protected function _convert($object)
+ {
+ // if this isn't an object then just return it
+ if (!is_object($object)) {
+ return $object;
+ }
+
+ //Mark this object as processed so we don't convert it twice and it
+ //Also avoid recursion when objects refer to each other
+ $this->_processed[] = $object;
+
+ $object_as_array = array();
+
+ // first add the class name
+ $object_as_array['___class_name'] = get_class($object);
+
+ // loop through object vars
+ $object_vars = get_object_vars($object);
+ foreach ($object_vars as $key => $value) {
+
+ // same instance as parent object
+ if ($value === $object || in_array($value, $this->_processed, true)) {
+ $value = 'recursion - parent object [' . get_class($value) . ']';
+ }
+ $object_as_array[$key] = $this->_convert($value);
+ }
+
+ $reflection = new ReflectionClass($object);
+
+ // loop through the properties and add those
+ foreach ($reflection->getProperties() as $property) {
+
+ // if one of these properties was already added above then ignore it
+ if (array_key_exists($property->getName(), $object_vars)) {
+ continue;
+ }
+ $type = $this->_getPropertyKey($property);
+
+ if ($this->_php_version >= 5.3) {
+ $property->setAccessible(true);
+ }
+
+ try {
+ $value = $property->getValue($object);
+ } catch (ReflectionException $e) {
+ $value = 'only PHP 5.3 can access private/protected properties';
+ }
+
+ // same instance as parent object
+ if ($value === $object || in_array($value, $this->_processed, true)) {
+ $value = 'recursion - parent object [' . get_class($value) . ']';
+ }
+
+ $object_as_array[$type] = $this->_convert($value);
+ }
+ return $object_as_array;
+ }
+
+ /**
+ * takes a reflection property and returns a nicely formatted key of the property name
+ *
+ * @param ReflectionProperty
+ * @return string
+ */
+ protected function _getPropertyKey(ReflectionProperty $property)
+ {
+ $static = $property->isStatic() ? ' static' : '';
+ if ($property->isPublic()) {
+ return 'public' . $static . ' ' . $property->getName();
+ }
+
+ if ($property->isProtected()) {
+ return 'protected' . $static . ' ' . $property->getName();
+ }
+
+ if ($property->isPrivate()) {
+ return 'private' . $static . ' ' . $property->getName();
+ }
+ }
+
+ /**
+ * adds a value to the data array
+ *
+ * @var mixed
+ * @return void
+ */
+ protected function _addRow(array $logs, $backtrace, $type)
+ {
+ // if this is logged on the same line for example in a loop, set it to null to save space
+ if (in_array($backtrace, $this->_backtraces)) {
+ $backtrace = null;
+ }
+
+ // for group, groupEnd, and groupCollapsed
+ // take out the backtrace since it is not useful
+ if ($type == self::GROUP || $type == self::GROUP_END || $type == self::GROUP_COLLAPSED) {
+ $backtrace = null;
+ }
+
+ if ($backtrace !== null) {
+ $this->_backtraces[] = $backtrace;
+ }
+
+ $row = array($logs, $backtrace, $type);
+
+ $this->_json['rows'][] = $row;
+ $this->_writeHeader($this->_json);
+ }
+
+ protected function _writeHeader($data)
+ {
+ header(self::HEADER_NAME . ': ' . $this->_encode($data));
+ }
+
+ /**
+ * encodes the data to be sent along with the request
+ *
+ * @param array $data
+ * @return string
+ */
+ protected function _encode($data)
+ {
+ return base64_encode(utf8_encode(json_encode($data)));
+ }
+
+ /**
+ * adds a setting
+ *
+ * @param string key
+ * @param mixed value
+ * @return void
+ */
+ public function addSetting($key, $value)
+ {
+ $this->_settings[$key] = $value;
+ }
+
+ /**
+ * add ability to set multiple settings in one call
+ *
+ * @param array $settings
+ * @return void
+ */
+ public function addSettings(array $settings)
+ {
+ foreach ($settings as $key => $value) {
+ $this->addSetting($key, $value);
+ }
+ }
+
+ /**
+ * gets a setting
+ *
+ * @param string key
+ * @return mixed
+ */
+ public function getSetting($key)
+ {
+ if (!isset($this->_settings[$key])) {
+ return null;
+ }
+ return $this->_settings[$key];
+ }
+}
diff --git a/htdocs/includes/chromephp/README.md b/htdocs/includes/chromephp/README.md
new file mode 100644
index 00000000000..3dd7dbe19dd
--- /dev/null
+++ b/htdocs/includes/chromephp/README.md
@@ -0,0 +1,23 @@
+## Overview
+ChromePhp is a PHP library for the Chrome Logger Google Chrome extension.
+
+This library allows you to log variables to the Chrome console.
+
+## Requirements
+- PHP 5 or later
+
+## Installation
+1. Install the Chrome extension from: https://chrome.google.com/extensions/detail/noaneddfkdjfnfdakjjmocngnfkfehhd
+2. Click the extension icon in the browser to enable it for the current tab's domain
+3. Put ChromePhp.php somewhere in your PHP include path
+4. Log some data
+
+ ```php
+ include 'ChromePhp.php';
+ ChromePhp::log('Hello console!');
+ ChromePhp::log($_SERVER);
+ ChromePhp::warn('something went wrong!');
+ ```
+
+More information can be found here:
+http://www.chromelogger.com
diff --git a/htdocs/includes/chromephp/composer.json b/htdocs/includes/chromephp/composer.json
new file mode 100644
index 00000000000..dc16853d3ec
--- /dev/null
+++ b/htdocs/includes/chromephp/composer.json
@@ -0,0 +1,24 @@
+{
+ "name": "ccampbell/chromephp",
+ "type": "library",
+ "description": "Log variables to the Chrome console (via Chrome Logger Google Chrome extension).",
+ "keywords": ["log","logging"],
+ "homepage": "http://github.com/ccampbell/chromephp",
+ "license": "Apache-2.0",
+ "authors": [
+ {
+ "name": "Craig Campbell",
+ "email": "iamcraigcampbell@gmail.com",
+ "homepage": "http://craig.is",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.0.0"
+ },
+ "autoload": {
+ "psr-0": {
+ "ChromePhp": ""
+ }
+ }
+}
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index e018a45eab9..ed39be9426c 100755
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -1568,3 +1568,4 @@ SalariesSetup=Setup of module salaries
SortOrder=Sort order
Format=Format
TypePaymentDesc=0:Customer payment type, 1:Supplier payment type, 2:Both customers and suppliers payment type
+IncludePath=Include path (defined into variable %s)
diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang
index cd6d6fbf033..13de82c602f 100644
--- a/htdocs/langs/en_US/agenda.lang
+++ b/htdocs/langs/en_US/agenda.lang
@@ -60,6 +60,7 @@ SupplierOrderSentByEMail=Supplier order %s sent by EMail
SupplierInvoiceSentByEMail=Supplier invoice %s sent by EMail
ShippingSentByEMail=Shipment %s sent by EMail
ShippingValidated= Shipment %s validated
+InterventionSentByEMail=Intervention %s sent by EMail
NewCompanyToDolibarr= Third party created
DateActionPlannedStart= Planned start date
DateActionPlannedEnd= Planned end date
diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang
index 89a32876dc3..116b2c52fa8 100644
--- a/htdocs/langs/en_US/compta.lang
+++ b/htdocs/langs/en_US/compta.lang
@@ -29,6 +29,7 @@ ReportTurnover=Turnover
PaymentsNotLinkedToInvoice=Payments not linked to any invoice, so not linked to any third party
PaymentsNotLinkedToUser=Payments not linked to any user
Profit=Profit
+AccountingResult=Accounting result
Balance=Balance
Debit=Debit
Credit=Credit
diff --git a/htdocs/langs/en_US/orders.lang b/htdocs/langs/en_US/orders.lang
index 4127de804c6..e8c0556d550 100644
--- a/htdocs/langs/en_US/orders.lang
+++ b/htdocs/langs/en_US/orders.lang
@@ -29,7 +29,7 @@ StatusOrderDraftShort=Draft
StatusOrderValidatedShort=Validated
StatusOrderSentShort=In process
StatusOrderSent=Shipment in process
-StatusOrderOnProcessShort=Reception
+StatusOrderOnProcessShort=Order sent
StatusOrderProcessedShort=Processed
StatusOrderToBillShort=Delivered
StatusOrderToBill2Short=To bill
@@ -41,7 +41,7 @@ StatusOrderReceivedAllShort=Everything received
StatusOrderCanceled=Canceled
StatusOrderDraft=Draft (needs to be validated)
StatusOrderValidated=Validated
-StatusOrderOnProcess=Waiting to receive
+StatusOrderOnProcess=Order sent - Standby reception
StatusOrderProcessed=Processed
StatusOrderToBill=Delivered
StatusOrderToBill2=To bill
diff --git a/htdocs/webservices/server_contact.php b/htdocs/webservices/server_contact.php
index b7550244fc2..ec652e80074 100644
--- a/htdocs/webservices/server_contact.php
+++ b/htdocs/webservices/server_contact.php
@@ -83,6 +83,7 @@ $server->wsdl->addComplexType(
$contact_fields = array(
'id' => array('name'=>'id','type'=>'xsd:string'),
+ 'ref_ext' => array('name'=>'ref_ext','type'=>'xsd:string'),
'lastname' => array('name'=>'lastname','type'=>'xsd:string'),
'firstname' => array('name'=>'firstname','type'=>'xsd:string'),
'address' => array('name'=>'address','type'=>'xsd:string'),
@@ -176,14 +177,14 @@ $styleuse='encoded'; // encoded/literal/literal wrapped
$server->register(
'getContact',
// Entry values
- array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
+ array('authentication'=>'tns:authentication','id'=>'xsd:string','ref_ext'=>'xsd:string'),
// Exit values
array('result'=>'tns:result','contact'=>'tns:contact'),
$ns,
$ns.'#getContact',
$styledoc,
$styleuse,
- 'WS to get contact'
+ 'WS to get a contact'
);
// Register WSDL
@@ -233,15 +234,14 @@ $server->register(
*
* @param array $authentication Array of authentication information
* @param int $id Id of object
- * @param string $ref Ref of object
* @param string $ref_ext Ref external of object
* @return mixed
*/
-function getContact($authentication,$id,$ref='',$ref_ext='')
+function getContact($authentication,$id,$ref_ext)
{
global $db,$conf,$langs;
- dol_syslog("Function: getContact login=".$authentication['login']." id=".$id." ref=".$ref." ref_ext=".$ref_ext);
+ dol_syslog("Function: getContact login=".$authentication['login']." id=".$id." ref_ext=".$ref_ext);
if ($authentication['entity']) $conf->entity=$authentication['entity'];
@@ -251,10 +251,10 @@ function getContact($authentication,$id,$ref='',$ref_ext='')
$error=0;
$fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
// Check parameters
- if (! $error && (($id && $ref) || ($id && $ref_ext) || ($ref && $ref_ext)))
+ if (! $error && ($id && $ref_ext))
{
$error++;
- $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id, ref and ref_ext can't be both provided. You must choose one or other but not both.";
+ $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id and ref_ext can't be both provided. You must choose one or other but not both.";
}
if (! $error)
@@ -262,7 +262,7 @@ function getContact($authentication,$id,$ref='',$ref_ext='')
$fuser->getrights();
$contact=new Contact($db);
- $result=$contact->fetch($id,$ref,$ref_ext);
+ $result=$contact->fetch($id,0,$ref_ext);
if ($result > 0)
{
// Only internal user who have contact read permission
@@ -273,6 +273,7 @@ function getContact($authentication,$id,$ref='',$ref_ext='')
){
$contact_result_fields =array(
'id' => $contact->id,
+ 'ref_ext' => $contact->ref_ext,
'lastname' => $contact->lastname,
'firstname' => $contact->firstname,
'address' => $contact->address,
@@ -383,6 +384,7 @@ function createContact($authentication,$contact)
$newobject=new Contact($db);
$newobject->id=$contact['id'];
+ $newobject->ref_ext=$contact['ref_ext'];
$newobject->civility_id=$contact['civility_id'];
$newobject->lastname=$contact['lastname'];
$newobject->firstname=$contact['firstname'];
diff --git a/htdocs/webservices/server_order.php b/htdocs/webservices/server_order.php
index 9229d3b9c26..587e50385a6 100644
--- a/htdocs/webservices/server_order.php
+++ b/htdocs/webservices/server_order.php
@@ -690,6 +690,7 @@ function createOrder($authentication,$order)
$newobject->statut=0; // We start with status draft
$newobject->billed=$order['billed'];
$newobject->fk_project=$order['project_id'];
+ $newObject->fk_delivery_address=$order['fk_delivery_address'];
$newobject->cond_reglement_id=$order['cond_reglement_id'];
$newobject->demand_reason_id=$order['demand_reason_id'];
$newobject->date_creation=$now;
|