Browse Source

Merge remote-tracking branch 'origin/3.7' into develop

Conflicts:
	htdocs/core/lib/tax.lib.php
Laurent Destailleur 10 years ago
parent
commit
e3885d6d73

+ 1 - 0
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

+ 4 - 0
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.

+ 16 - 13
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."<br><br>\n";
+
 // Output mode
 print_titre($langs->trans("SyslogOutput"));
 
@@ -190,7 +192,7 @@ foreach ($syslogModules as $moduleName)
 	$var=!$var;
 	print '<tr '.$bc[$var].'>';
 	print '<td width="140">';
-	print '<input '.$bc[$var].' type="checkbox" name="SYSLOG_HANDLERS[]" value="'.$moduleName.'" '.(in_array($moduleName, $activeModules) ? 'checked="checked"' : '').(!$moduleactive ? 'disabled="disabled"' : '').'> ';
+	print '<input '.$bc[$var].' type="checkbox" name="SYSLOG_HANDLERS[]" value="'.$moduleName.'" '.(in_array($moduleName, $activeModules) ? 'checked="checked"' : '').($moduleactive <= 0 ? 'disabled="disabled"' : '').'> ';
 	print $module->getName();
 	print '</td>';
 
@@ -205,6 +207,7 @@ foreach ($syslogModules as $moduleName)
 			else $value = (isset($option['default']) ? $option['default'] : '');
 
 			print $option['name'].': <input type="text" class="flat" name="'.$option['constant'].'" value="'.$value.'"'.(isset($option['attr']) ? ' '.$option['attr'] : '').'>';
+			if (! empty($option['example'])) print '<br>'.$langs->trans("Example").': '.$option['example'];
 		}
 	}
 	print '</td>';

+ 1 - 0
htdocs/comm/action/class/actioncomm.class.php

@@ -1172,6 +1172,7 @@ class ActionComm extends CommonObject
         $this->datef=$now;
         $this->author=$user;
         $this->usermod=$user;
+        $this->usertodo=$user;
         $this->fulldayevent=0;
         $this->punctual=0;
         $this->percentage=0;

+ 3 - 3
htdocs/comm/mailing/card.php

@@ -197,7 +197,7 @@ if (empty($reshook))
 					$now=dol_now();
 
 					// Positionne date debut envoi
-					$sql="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi=".$db->idate($now)." WHERE rowid=".$object->id;
+					$sql="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi='".$db->idate($now)."' WHERE rowid=".$object->id;
 					$resql2=$db->query($sql);
 					if (! $resql2)
 					{
@@ -293,7 +293,7 @@ if (empty($reshook))
 							dol_syslog("comm/mailing/card.php: ok for #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG);
 
 							$sql="UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
-							$sql.=" SET statut=1, date_envoi=".$db->idate($now)." WHERE rowid=".$obj->rowid;
+							$sql.=" SET statut=1, date_envoi='".$db->idate($now)."' WHERE rowid=".$obj->rowid;
 							$resql2=$db->query($sql);
 							if (! $resql2)
 							{
@@ -340,7 +340,7 @@ if (empty($reshook))
 							dol_syslog("comm/mailing/card.php: error for #".$i.($mail->error?' - '.$mail->error:''), LOG_WARNING);
 
 							$sql="UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
-							$sql.=" SET statut=-1, date_envoi=".$db->idate($now)." WHERE rowid=".$obj->rowid;
+							$sql.=" SET statut=-1, date_envoi='".$db->idate($now)."' WHERE rowid=".$obj->rowid;
 							$resql2=$db->query($sql);
 							if (! $resql2)
 							{

+ 7 - 4
htdocs/compta/facture.php

@@ -570,10 +570,12 @@ if (empty($reshook))
 			// Boucle sur chaque taux de tva
 			$i = 0;
 			foreach ($object->lines as $line) {
-				$amount_ht [$line->tva_tx] += $line->total_ht;
-				$amount_tva [$line->tva_tx] += $line->total_tva;
-				$amount_ttc [$line->tva_tx] += $line->total_ttc;
-				$i ++;
+				if($line->total_ht!=0) { // no need to create discount if amount is null
+					$amount_ht [$line->tva_tx] += $line->total_ht;
+					$amount_tva [$line->tva_tx] += $line->total_tva;
+					$amount_ttc [$line->tva_tx] += $line->total_ttc;
+					$i ++;
+				}
 			}
 
 			// Insert one discount by VAT rate category
@@ -590,6 +592,7 @@ if (empty($reshook))
 			$discount->fk_facture_source = $object->id;
 
 			$error = 0;
+			
 			foreach ($amount_ht as $tva_tx => $xxx) {
 				$discount->amount_ht = abs($amount_ht [$tva_tx]);
 				$discount->amount_tva = abs($amount_tva [$tva_tx]);

+ 4 - 4
htdocs/compta/paiement/list.php

@@ -121,10 +121,10 @@ else
         else  $sql.= " AND f.fk_user_author = ".$userid;
     }
     // Search criteria
-    if ($search_ref)         		$sql .=" AND p.rowid=".$search_ref;
+    if ($search_ref > 0)       		$sql .=" AND p.rowid=".$search_ref;
     if ($search_account > 0)      	$sql .=" AND b.fk_account=".$search_account;
-    if ($search_paymenttype != "")  $sql .=" AND c.code='".$search_paymenttype."'";
-    if ($search_amount)      		$sql .=" AND p.amount='".price2num($search_amount)."'";
+    if ($search_paymenttype != "")  $sql .=" AND c.code='".$db->escape($search_paymenttype)."'";
+    if ($search_amount)      		$sql .=" AND p.amount='".$db->escape(price2num($search_amount))."'";
     if ($search_company)     		$sql .= natural_search('s.nom', $search_company);
 }
 $sql.= $db->order($sortfield,$sortorder);
@@ -237,7 +237,7 @@ if ($resql)
             if ($objp->statut == 0) print '</a>';
             print '</td>';
         }
-		
+
 		print '<td>&nbsp;</td>';
         print '</tr>';
 

+ 4 - 4
htdocs/compta/resultat/index.php

@@ -22,7 +22,7 @@
 
 /**
  *       \file        htdocs/compta/resultat/index.php
- *       \brief       Page reporting resultat
+ *       \brief       Page reporting result
  */
 
 require '../../main.inc.php';
@@ -570,8 +570,8 @@ print '</tr>';
 print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Month").'</td>';
 for ($annee = $year_start ; $annee <= $year_end ; $annee++)
 {
-	print '<td align="right">'.$langs->trans("Outcome").'</td>';
-	print '<td align="right" class="borderrightlight">'.$langs->trans("Income").'</td>';
+	print '<td align="center">'.$langs->trans("Outcome").'</td>';
+	print '<td align="center" class="borderrightlight">'.$langs->trans("Income").'</td>';
 }
 print '</tr>';
 
@@ -634,7 +634,7 @@ print "</tr>\n";
 
 // Balance
 $var=!$var;
-print '<tr class="liste_total"><td>'.$langs->trans("Profit").'</td>';
+print '<tr class="liste_total"><td>'.$langs->trans("AccountingResult").'</td>';
 for ($annee = $year_start ; $annee <= $year_end ; $annee++)
 {
 	print '<td align="right" colspan="2" class="borderrightlight"> ';

+ 1 - 0
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");

+ 1 - 0
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");

+ 8 - 3
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);

+ 24 - 8
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

+ 2 - 1
htdocs/core/db/pgsql.class.php

@@ -7,6 +7,7 @@
  * Copyright (C) 2005-2012	Regis Houssin			<regis.houssin@capnetworks.com>
  * Copyright (C) 2012		Yann Droneaud			<yann@droneaud.fr>
  * Copyright (C) 2012		Florian Henry			<florian.henry@open-concept.pro>
+ * Copyright (C) 2015       Marcos García           <marcosgdf@gmail.com>
  *
  * 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]
                 }

+ 0 - 1
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));

+ 13 - 21
htdocs/core/lib/tax.lib.php

@@ -1,10 +1,11 @@
 <?php
-/* Copyright (C) 2004-2009	Laurent Destailleur	<eldy@users.sourceforge.net>
- * Copyright (C) 2006-2007	Yannick Warnier		<ywarnier@beeznest.org>
- * Copyright (C) 2011		Regis Houssin		<regis.houssin@capnetworks.com>
- * Copyright (C) 2012		Juanjo Menent		<jmenent@2byte.es>
+/* Copyright (C) 2004-2009 Laurent Destailleur	<eldy@users.sourceforge.net>
+ * Copyright (C) 2006-2007 Yannick Warnier		<ywarnier@beeznest.org>
+ * Copyright (C) 2011	   Regis Houssin		<regis.houssin@capnetworks.com>
+ * Copyright (C) 2012	   Juanjo Menent		<jmenent@2byte.es>
  * Copyright (C) 2012      Cédric Salvador      <csalvador@gpcsolutions.fr>
  * Copyright (C) 2012-2014 Raphaël Doursenaud   <rdoursenaud@gpcsolutions.fr>
+ * Copyright (C) 2015      Marcos García        <marcosgdf@gmail.com>
  *
  * 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";
         }
     }

+ 2 - 0
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;

+ 1 - 1
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];

+ 19 - 16
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']);

+ 3 - 3
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()
 	{

+ 4 - 4
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 '<!-- FirePHP not available into PHP -->'."\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()
 	{

+ 4 - 4
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()
 	{

+ 1 - 1
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

+ 446 - 0
htdocs/includes/chromephp/ChromePhp.php

@@ -0,0 +1,446 @@
+<?php
+/**
+ * Copyright 2010-2013 Craig Campbell
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Server Side Chrome PHP debugger class
+ *
+ * @package ChromePhp
+ * @author Craig Campbell <iamcraigcampbell@gmail.com>
+ */
+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];
+    }
+}

+ 23 - 0
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

+ 24 - 0
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": ""
+        }
+    }
+}

+ 1 - 0
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)

+ 1 - 0
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

+ 1 - 0
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

+ 2 - 2
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

+ 10 - 8
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'];

+ 1 - 0
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;