Browse Source

Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop

Laurent Destailleur 9 years ago
parent
commit
51ce4804dd
100 changed files with 739 additions and 533 deletions
  1. 1 0
      ChangeLog
  2. 1 1
      htdocs/accountancy/admin/categories.php
  3. 1 1
      htdocs/accountancy/admin/importaccounts.php
  4. 2 2
      htdocs/accountancy/admin/productaccount.php
  5. 1 1
      htdocs/accountancy/bookkeeping/balance.php
  6. 2 2
      htdocs/accountancy/bookkeeping/card.php
  7. 1 1
      htdocs/accountancy/bookkeeping/list.php
  8. 1 1
      htdocs/accountancy/bookkeeping/listbyyear.php
  9. 1 1
      htdocs/accountancy/customer/lines.php
  10. 1 1
      htdocs/accountancy/customer/list.php
  11. 1 1
      htdocs/accountancy/report/result.php
  12. 1 1
      htdocs/accountancy/supplier/lines.php
  13. 1 1
      htdocs/accountancy/supplier/list.php
  14. 1 1
      htdocs/adherents/admin/public.php
  15. 20 2
      htdocs/adherents/card.php
  16. 10 6
      htdocs/admin/menus/edit.php
  17. 48 9
      htdocs/admin/menus/index.php
  18. 71 62
      htdocs/admin/multicurrency.php
  19. 5 2
      htdocs/admin/receiptprinter.php
  20. 3 3
      htdocs/comm/action/listactions.php
  21. 1 1
      htdocs/comm/propal/card.php
  22. 7 4
      htdocs/comm/propal/class/propal.class.php
  23. 7 4
      htdocs/commande/class/commande.class.php
  24. 1 1
      htdocs/commande/class/commandestats.class.php
  25. 10 1
      htdocs/commande/tpl/linkedobjectblock.tpl.php
  26. 2 2
      htdocs/compta/facture.php
  27. 2 1
      htdocs/compta/facture/class/facture-rec.class.php
  28. 3 4
      htdocs/compta/facture/class/facture.class.php
  29. 5 0
      htdocs/compta/facture/fiche-rec.php
  30. 1 1
      htdocs/compta/facture/list.php
  31. 2 2
      htdocs/compta/index.php
  32. 5 2
      htdocs/contrat/class/contrat.class.php
  33. 1 1
      htdocs/contrat/list.php
  34. 4 1
      htdocs/core/ajax/ajaxdirpreview.php
  35. 2 1
      htdocs/core/class/commonobject.class.php
  36. 1 1
      htdocs/core/class/extrafields.class.php
  37. 3 3
      htdocs/core/class/html.form.class.php
  38. 67 64
      htdocs/core/class/ldap.class.php
  39. 4 0
      htdocs/core/class/menubase.class.php
  40. 7 0
      htdocs/core/lib/admin.lib.php
  41. 10 3
      htdocs/core/lib/functions.lib.php
  42. 15 8
      htdocs/core/lib/treeview.lib.php
  43. 2 2
      htdocs/core/menus/standard/eldy.lib.php
  44. 1 0
      htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php
  45. 1 1
      htdocs/core/modules/propale/doc/pdf_azur.modules.php
  46. 1 2
      htdocs/ecm/index.php
  47. 11 3
      htdocs/expedition/tpl/linkedobjectblock.tpl.php
  48. 10 7
      htdocs/expensereport/card.php
  49. 1 1
      htdocs/expensereport/synchro_compta.php
  50. 2 2
      htdocs/fichinter/card.php
  51. 12 1
      htdocs/filefunc.inc.php
  52. 7 4
      htdocs/fourn/ajax/getSupplierPrices.php
  53. 2 4
      htdocs/fourn/class/fournisseur.commande.class.php
  54. 6 3
      htdocs/fourn/class/fournisseur.facture.class.php
  55. 1 1
      htdocs/fourn/class/fournisseur.product.class.php
  56. 5 4
      htdocs/fourn/commande/card.php
  57. 1 1
      htdocs/fourn/commande/list.php
  58. 2 2
      htdocs/fourn/facture/card.php
  59. 3 5
      htdocs/fourn/facture/list.php
  60. 5 1
      htdocs/imports/import.php
  61. 1 0
      htdocs/install/mysql/migration/3.8.0-3.9.0.sql
  62. 2 0
      htdocs/install/mysql/migration/3.9.0-4.0.0.sql
  63. 1 1
      htdocs/install/mysql/tables/llx_import_model.sql
  64. 4 4
      htdocs/langs/en_US/accountancy.lang
  65. 56 53
      htdocs/langs/en_US/admin.lang
  66. 3 3
      htdocs/langs/en_US/agenda.lang
  67. 3 3
      htdocs/langs/en_US/banks.lang
  68. 16 16
      htdocs/langs/en_US/bills.lang
  69. 1 1
      htdocs/langs/en_US/bookmarks.lang
  70. 51 51
      htdocs/langs/en_US/boxes.lang
  71. 6 6
      htdocs/langs/en_US/commercial.lang
  72. 16 16
      htdocs/langs/en_US/companies.lang
  73. 4 3
      htdocs/langs/en_US/compta.lang
  74. 4 4
      htdocs/langs/en_US/contracts.lang
  75. 3 3
      htdocs/langs/en_US/cron.lang
  76. 1 1
      htdocs/langs/en_US/dict.lang
  77. 1 1
      htdocs/langs/en_US/donations.lang
  78. 3 3
      htdocs/langs/en_US/errors.lang
  79. 4 4
      htdocs/langs/en_US/holiday.lang
  80. 5 5
      htdocs/langs/en_US/install.lang
  81. 2 2
      htdocs/langs/en_US/interventions.lang
  82. 4 4
      htdocs/langs/en_US/mailmanspip.lang
  83. 2 2
      htdocs/langs/en_US/mails.lang
  84. 16 16
      htdocs/langs/en_US/main.lang
  85. 4 4
      htdocs/langs/en_US/members.lang
  86. 17 0
      htdocs/langs/en_US/multicurrency.lang
  87. 5 5
      htdocs/langs/en_US/orders.lang
  88. 30 30
      htdocs/langs/en_US/other.lang
  89. 6 6
      htdocs/langs/en_US/products.lang
  90. 12 12
      htdocs/langs/en_US/projects.lang
  91. 5 5
      htdocs/langs/en_US/propal.lang
  92. 1 1
      htdocs/langs/en_US/sendings.lang
  93. 2 2
      htdocs/langs/en_US/stocks.lang
  94. 2 2
      htdocs/langs/en_US/supplier_proposal.lang
  95. 4 4
      htdocs/langs/en_US/users.lang
  96. 3 3
      htdocs/langs/en_US/withdrawals.lang
  97. 27 4
      htdocs/multicurrency/class/multicurrency.class.php
  98. 3 2
      htdocs/product/card.php
  99. 2 2
      htdocs/product/class/product.class.php
  100. 1 1
      htdocs/product/fournisseurs.php

+ 1 - 0
ChangeLog

@@ -121,6 +121,7 @@ NEW: When emailing is not sent completely, show progression.
 
 For developers:
 
+NEW: Add a css class style called 'reposition', so when clicking on a link with this class will move scrollbarr to be placed at same page location.
 NEW: TimeZone can be supplied to mktime
 NEW: hook in shipment card
 NEW: Deprecated Societe::set_prospect_level, Societe::set_commnucation_level, Societe::set_OutstandingBill functions

+ 1 - 1
htdocs/accountancy/admin/categories.php

@@ -138,7 +138,7 @@ if ($action == 'display' || $action == 'delete') {
 		if(!empty($obj)){
 			foreach ( $obj as $cpt ) {
 				$var = ! $var;
-				print "<tr $bc[$var]>";
+				print '<tr'. $bc[$var].'>';
 				print '<td>' . length_accountg($cpt->account_number) . '</td>';
 				print '<td>' . $cpt->label . '</td>';
 				print $form->formconfirm($_SERVER["PHP_SELF"]."?account_category=$cat_id&cptid=".$cpt->rowid, $langs->trans("DeleteCptCategory"), $langs->trans("ConfirmDeleteCptCategory"), "delete", '', 0, "action-delete".$j);

+ 1 - 1
htdocs/accountancy/admin/importaccounts.php

@@ -138,7 +138,7 @@ if ($result) {
 	while ( $i < min($num_lines, $limit) ) {
 		$objp = $db->fetch_object($result);
 		$var = ! $var;
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 		
 		print '<td align="left">';
 		print $objp->accounting;

+ 2 - 2
htdocs/accountancy/admin/productaccount.php

@@ -328,10 +328,10 @@ if ($result) {
 		
 		$product_static = new Product($db);
 		
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 		
 		print "</tr>";
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 		// Ref produit as link
 		$product_static->ref = $obj->ref;
 		$product_static->id = $obj->rowid;

+ 1 - 1
htdocs/accountancy/bookkeeping/balance.php

@@ -223,7 +223,7 @@ else {
 		if(empty($description)){
 			$link = '<a href="../admin/card.php?action=create&compte=' . length_accountg($line->numero_compte) . '">' . img_edit_add() .'</a>';
 		}
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 
 		print '<td>' . length_accountg($line->numero_compte) . '</td>';
 		print '<td>' . $description . '</td>';

+ 2 - 2
htdocs/accountancy/bookkeeping/card.php

@@ -346,7 +346,7 @@ if ($action == 'create') {
 				
 				foreach ( $book->linesmvt as $line ) {
 					$var = ! $var;
-					print "<tr $bc[$var]>";
+					print '<tr'. $bc[$var].'>';
 					
 					$total_debit += $line->debit;
 					$total_credit += $line->credit;
@@ -400,7 +400,7 @@ if ($action == 'create') {
 				
 				if ($action == "" || $action == 'add') {
 					$var = ! $var;
-					print "<tr $bc[$var]>";
+					print '<tr'. $bc[$var].'>';
 					print '<td>';
 					print $formventilation->select_account($account_number, 'account_number', 0, array (), 1, 1, '');
 					print '</td>';

+ 1 - 1
htdocs/accountancy/bookkeeping/list.php

@@ -368,7 +368,7 @@ foreach ( $object->lines as $line ) {
 	$total_debit += $line->debit;
 	$total_credit += $line->credit;
 
-	print "<tr $bc[$var]>";
+	print '<tr'. $bc[$var].'>';
 
 	print '<td><a href="./card.php?piece_num=' . $line->piece_num . '">' . $line->piece_num . '</a></td>';
 	print '<td align="center">' . dol_print_date($line->doc_date, 'day') . '</td>';

+ 1 - 1
htdocs/accountancy/bookkeeping/listbyyear.php

@@ -269,7 +269,7 @@ $var = True;
 foreach ( $object->lines as $line ) {
 	$var = ! $var;
 
-	print "<tr $bc[$var]>";
+	print '<tr'. $bc[$var].'>';
 	print '<td>' . $line->piece_num . '</td>' . "\n";
 	print '<td>' . $line->doc_type . '</td>' . "\n";
 	print '<td>' . dol_print_date($line->doc_date) . '</td>';

+ 1 - 1
htdocs/accountancy/customer/lines.php

@@ -288,7 +288,7 @@ if ($result) {
 		$var = ! $var;
 		$codecompta = length_accountg($objp->account_number) . ' - ' . $objp->label_compte;
 		
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 		
 		// Ref Invoice
 		$facture_static->ref = $objp->facnumber;

+ 1 - 1
htdocs/accountancy/customer/list.php

@@ -302,7 +302,7 @@ if ($result) {
 		if ($objp->code_sell_l != $objp->code_sell_p)
 			$code_sell_p_l_differ = 'color:red';
 
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 
 		// Ref Invoice
 		$facture_static->ref = $objp->facnumber;

+ 1 - 1
htdocs/accountancy/report/result.php

@@ -127,7 +127,7 @@ if(!empty($cats))
 			$resultN = $AccCat->getResult($cpt['account_number'], 0, $year_current, $cpt['dc']);
 			$sommes[$code]['NP'] += $resultNP;
 			$sommes[$code]['N'] += $resultN; 
-			print "<tr $bc[$var]>";
+			print '<tr'. $bc[$var].'>';
 			print '<td>' . $cpt['account_number'] . '</td>';
 			print '<td>' . $cpt['name_cpt'] . '</td>';
 			print '<td>' . price($resultNP)  . '</td>';

+ 1 - 1
htdocs/accountancy/supplier/lines.php

@@ -236,7 +236,7 @@ if ($result) {
 		$var = ! $var;
 		$codeCompta = length_accountg($objp->account_number) . ' - ' . $objp->label;
 		
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 		
 		// Ref Invoice
 		$facturefournisseur_static->ref = $objp->facnumber;

+ 1 - 1
htdocs/accountancy/supplier/list.php

@@ -314,7 +314,7 @@ if ($result) {
 		if ($objp->code_buy_l != $objp->code_buy_p)
 			$code_buy_p_l_differ = 'color:red';
 		
-		print "<tr $bc[$var]>";
+		print '<tr'. $bc[$var].'>';
 
 		// Ref Invoice
 		$facturefourn_static->ref = $objp->ref;

+ 1 - 1
htdocs/adherents/admin/public.php

@@ -200,7 +200,7 @@ if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled))
     print '<tr '.$bc[$var].' id="tremail"><td>';
     print $langs->trans("MEMBER_PAYONLINE_SENDEMAIL");
     print '</td><td align="right">';
-	print '<input type="text" id="MEMBER_PAYONLINE_SENDEMAIL" name="MEMBER_PAYONLINE_SENDEMAIL" size="24" value="'.(! empty($conf->global->MEMBER_PAYONLINE_SENDEMAIL)?$conf->global->MEMBER_PAYONLINE_SENDEMAIL:'').'">';
+    print '<input type="text" id="MEMBER_PAYONLINE_SENDEMAIL" name="MEMBER_PAYONLINE_SENDEMAIL" size="24" value="'.(! empty($conf->global->MEMBER_PAYONLINE_SENDEMAIL)?$conf->global->MEMBER_PAYONLINE_SENDEMAIL:'').'">';
     print "</td></tr>\n";
 }
 

+ 20 - 2
htdocs/adherents/card.php

@@ -253,7 +253,8 @@ if (empty($reshook))
 		}
 		$lastname=$_POST["lastname"];
 		$firstname=$_POST["firstname"];
-		$morphy=$morphy=$_POST["morphy"];
+		$morphy=$_POST["morphy"];
+		$login=$_POST["login"];
 		if ($morphy != 'mor' && empty($lastname)) {
 			$error++;
 			$langs->load("errors");
@@ -264,7 +265,19 @@ if (empty($reshook))
 			$langs->load("errors");
 			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors');
 		}
-
+		if ($morphy == 'mor' && empty($societe)) {
+			$error++;
+			$langs->load("errors");
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
+		}
+		// Test si le login existe deja
+		if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED))
+		{
+			if (empty($login)) {
+				$error++;
+				setEventMessages($langs->trans("ErrorFieldRequired", $langs->trans("Login")), null, 'errors');
+			}
+		}
 		// Create new object
 		if ($result > 0 && ! $error)
 		{
@@ -506,6 +519,11 @@ if (empty($reshook))
 				setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Password")), null, 'errors');
 			}
 		}
+		if ($morphy == 'mor' && empty($societe)) {
+			$error++;
+			$langs->load("errors");
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors');
+		}
 		if ($morphy != 'mor' && empty($lastname)) {
 			$error++;
 			$langs->load("errors");

+ 10 - 6
htdocs/admin/menus/edit.php

@@ -272,7 +272,7 @@ if ($action == 'create')
     </script>';
 
     print load_fiche_titre($langs->trans("NewMenu"),'','title_setup');
-
+    
     print '<form action="./edit.php?action=add&menuId='.$_GET['menuId'].'" method="post" name="formmenucreate">';
     print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
 
@@ -284,7 +284,7 @@ if ($action == 'create')
     $parent_rowid = $_GET['menuId'];
     if ($_GET['menuId'])
     {
-        $sql = "SELECT m.rowid, m.mainmenu, m.level, m.langs FROM ".MAIN_DB_PREFIX."menu as m WHERE m.rowid = ".$_GET['menuId'];
+        $sql = "SELECT m.rowid, m.mainmenu, m.leftmenu, m.level, m.langs FROM ".MAIN_DB_PREFIX."menu as m WHERE m.rowid = ".$_GET['menuId'];
         $res  = $db->query($sql);
         if ($res)
         {
@@ -293,6 +293,7 @@ if ($action == 'create')
             {
                 $parent_rowid = $menu['rowid'];
                 $parent_mainmenu = $menu['mainmenu'];
+                $parent_leftmenu = $menu['leftmenu'];
                 $parent_langs = $menu['langs'];
                 $parent_level = $menu['level'];
             }
@@ -343,7 +344,9 @@ if ($action == 'create')
     {
         print '<td><input type="text" size="20" id="menuId" name="menuId" value="'.($_POST["menuId"]?$_POST["menuId"]:'').'"></td>';
     }
-    print '<td>'.$langs->trans('DetailMenuIdParent').'</td></tr>';
+    print '<td>'.$langs->trans('DetailMenuIdParent');
+    print ', '.$langs->trans("Example").': fk_mainmenu=abc&fk_leftmenu=def';
+    print '</td></tr>';
 
     // Title
     print '<tr><td class="fieldrequired">'.$langs->trans('Title').'</td><td><input type="text" size="30" name="titre" value="'.$_POST["titre"].'"></td><td>'.$langs->trans('DetailTitre').'</td></tr>';
@@ -423,9 +426,10 @@ elseif ($action == 'edit')
 
     // MenuId Parent
     print '<tr><td class="fieldrequired">'.$langs->trans('MenuIdParent').'</td>';
-    print '<td><input type="text" name="fk_menu" value="'.$menu->fk_menu.'" size=10></td>';
-    //$menu_handler
-    //print '<td><input type="text" size="50" name="handler" value="all"></td>';
+    $valtouse=$menu->fk_menu;
+    if ($menu->fk_mainmenu) $valtouse='fk_mainmenu='.$menu->fk_mainmenu;
+    if ($menu->fk_leftmenu) $valtouse.='&fk_leftmenu='.$menu->fk_leftmenu;
+    print '<td><input type="text" name="fk_menu" value="'.$valtouse.'" size="10"></td>';
     print '<td>'.$langs->trans('DetailMenuIdParent').'</td></tr>';
 
     // Niveau

+ 48 - 9
htdocs/admin/menus/index.php

@@ -289,17 +289,18 @@ if ($conf->use_javascript_ajax)
 	  - la chaine a afficher
 	ie: data[]= array (index, index parent, chaine )
 	*/
+    
 	//il faut d'abord declarer un element racine de l'arbre
 
-	$data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>'');
-
+    $data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>'');
+    
 	//puis tous les elements enfants
 
-	$sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu";
+	$sql = "SELECT m.rowid, m.titre, m.langs, m.mainmenu, m.leftmenu, m.fk_menu, m.fk_mainmenu, m.fk_leftmenu, m.module";
 	$sql.= " FROM ".MAIN_DB_PREFIX."menu as m";
 	$sql.= " WHERE menu_handler = '".$menu_handler_to_search."'";
 	$sql.= " AND entity = ".$conf->entity;
-	$sql.= " AND fk_menu >= 0";
+	//$sql.= " AND fk_menu >= 0";
 	$sql.= " ORDER BY m.position, m.rowid";		// Order is position then rowid (because we need a sort criteria when position is same)
 
 	$res  = $db->query($sql);
@@ -314,9 +315,10 @@ if ($conf->use_javascript_ajax)
 			$titre = $langs->trans($menu['titre']);
 			$data[] = array(
 				'rowid'=>$menu['rowid'],
+			    'module'=>$menu['module'],
 				'fk_menu'=>$menu['fk_menu'],
 				'title'=>$titre,
-				'mainmenu'=>$menu['mainmenu'],
+			    'mainmenu'=>$menu['mainmenu'],
 				'leftmenu'=>$menu['leftmenu'],
 				'fk_mainmenu'=>$menu['fk_mainmenu'],
 				'fk_leftmenu'=>$menu['fk_leftmenu'],
@@ -334,17 +336,54 @@ if ($conf->use_javascript_ajax)
 		}
 	}
 
+	global $tree_recur_alreadyadded;       // This var was def into tree_recur
+	
 	// Appelle de la fonction recursive (ammorce)
 	// avec recherche depuis la racine.
 	//var_dump($data);
-	tree_recur($data,$data[0],0);
+	tree_recur($data, $data[0], 0, 'iddivjstree');  // $data[0] is virtual record 'racine'
+	
 
 	print '</td>';
-
+	
 	print '</tr>';
-
+	
 	print '</table>';
-
+	
+	
+	// Process remaining records (records that are not linked to root by any path)
+    $remainingdata = array();
+	foreach($data as $datar)
+	{
+	    if (empty($datar['rowid']) || $tree_recur_alreadyadded[$datar['rowid']]) continue;
+	    $remainingdata[] = $datar;
+	}
+	
+	if (count($remainingdata))
+	{
+    	print '<table class="border" width="100%">';
+    	
+    	print '<tr class="liste_titre">';
+    	print '<td>'.$langs->trans("NotTopTreeMenuPersonalized").'</td>';
+    	print '<td align="right"></td>';
+    	print '</tr>';
+    	
+    	print '<tr>';
+    	print '<td colspan="2">';	
+    	
+    	foreach($remainingdata as $datar)
+    	{
+            $father = array('rowid'=>$datar['rowid'],'title'=>"???",'mainmenu'=>$datar['fk_mainmenu'],'leftmenu'=>$datar['fk_leftmenu'],'fk_mainmenu'=>'','fk_leftmenu'=>'');
+    	    //print 'Start with rowid='.$datar['rowid'].' mainmenu='.$father ['mainmenu'].' leftmenu='.$father ['leftmenu'].'<br>'."\n";
+    	    tree_recur($data, $father, 0, 'iddivjstree'.$datar['rowid'], 1, 1);
+    	}
+    
+    	print '</td>';
+    
+    	print '</tr>';
+    
+    	print '</table>';
+	}
 
 	print '</div>';
 

+ 71 - 62
htdocs/admin/multicurrency.php

@@ -77,20 +77,20 @@ if (preg_match('/del_(.*)/',$action,$reg))
 
 if ($action == 'add_currency')
 {
+	$langs->loadCacheCurrencies('');
+	
 	$code = GETPOST('code', 'alpha');
-	$name = GETPOST('name', 'alpha');
 	$rate = GETPOST('rate', 'alpha');
-	
 	$currency = new MultiCurrency($db);
 	$currency->code = $code;
-	$currency->name = $name;
+	$currency->name = !empty($langs->cache_currencies[$code]['label']) ? $langs->cache_currencies[$code]['label'].' ('.$langs->getCurrencySymbol($code).')' : $code;
 
 	if ($currency->create($user) > 0)
 	{
 		if ($currency->addRate($rate)) setEventMessages($langs->trans('RecordSaved'), array());
 		else setEventMessages($langs->trans('ErrorAddRateFail'), array(), 'errors');
 	}
-	else setEventMessages($langs->trans('ErrorAddCurrencyFail'), array());
+	else setEventMessages($langs->trans('ErrorAddCurrencyFail'), $currency->errors, 'errors');
 }
 elseif ($action == 'update_currency')
 {
@@ -182,6 +182,7 @@ print '<td>'.$langs->trans("Parameters").'</td>'."\n";
 print '<td align="center" width="20">&nbsp;</td>';
 print '<td align="center" width="100">'.$langs->trans("Value").'</td>'."\n";
 
+/* TODO uncomment when the functionality will integrated
 $var=!$var;
 print '<tr '.$bc[$var].'>';
 print '<td>'.$langs->transnoentitiesnoconv("multicurrency_useRateOnInvoiceDate").'</td>';
@@ -194,6 +195,7 @@ print $form->selectyesno("MULTICURRENCY_USE_RATE_ON_INVOICE_DATE",$conf->global-
 print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
 print '</form>';
 print '</td></tr>';
+*/
 
 $var=!$var;
 print '<tr '.$bc[$var].'>';
@@ -208,6 +210,7 @@ print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'
 print '</form>';
 print '</td></tr>';
 
+/* TODO uncomment when the functionality will integrated
 $var=!$var;
 print '<tr '.$bc[$var].'>';
 print '<td>'.$langs->transnoentitiesnoconv("multicurrency_buyPriceInCurrency").'</td>';
@@ -220,7 +223,9 @@ print $form->selectyesno("MULTICURRENCY_BUY_PRICE_IN_CURRENCY",$conf->global->MU
 print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
 print '</form>';
 print '</td></tr>';
+*/
 
+/* TODO uncomment when the functionality will integrated 
 $var=!$var;
 print '<tr '.$bc[$var].'>';
 print '<td>'.$langs->transnoentitiesnoconv("multicurrency_modifyRateApplication").'</td>';
@@ -234,71 +239,75 @@ print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">'
 print '</form>';
 print '</td></tr>';
 
-print '</table>';
-print '<br />';
-
-$var=false;
-print '<table class="noborder" width="100%">';
-print '<tr class="liste_titre">';
-print '<td>'.$langs->trans("CurrencyLayerAccount").'</td>'."\n";
-print '<td align="center" width="20">&nbsp;</td>';
-print '<td align="right" width="100">';
-print '<form id="form_sync" action="" method="POST">';
-print '<input type="hidden" name="action" value="synchronize" />';
-print '<textarea id="response" class="hideobject" name="response"></textarea>';
-print $langs->trans("Value").'&nbsp;<input type="button" id="bt_sync" class="button" onclick="javascript:getRates();" value="'.$langs->trans('Synchronize').'" />';
-print '</form>';
-print '</td></tr>';
-
-
-$var=!$var;
-print '<tr '.$bc[$var].'>';
-print '<td><a target="_blank" href="https://currencylayer.com">'.$langs->transnoentitiesnoconv("multicurrency_appId").'</a></td>';
-print '<td align="center" width="20">&nbsp;</td>';
-print '<td align="right" width="400">';
-print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
-print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_ID">';
-print '<input type="text" name="MULTICURRENCY_APP_ID" value="'.$conf->global->MULTICURRENCY_APP_ID.'" size="28" />&nbsp;';
-print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
-print '</form>';
-print '</td></tr>';
-
-/* This property seems not used in code, so i comment it
-$var=!$var;
-print '<tr '.$bc[$var].'>';
-print '<td>'.$langs->transnoentitiesnoconv("multicurrency_appCurrencySource").'</td>';
-print '<td align="center" width="20">&nbsp;</td>';
-print '<td align="right" width="400">';
-print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
-print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_SOURCE">';
-print '<input type="text" name="MULTICURRENCY_APP_SOURCE" value="'.$conf->global->MULTICURRENCY_APP_SOURCE.'" size="10" placeholder="USD" />&nbsp;'; // Default: USD
-print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
-print '</form>';
-print '</td></tr>';
-
-$var=!$var;
-print '<tr '.$bc[$var].'>';
-print '<td>'.$langs->transnoentitiesnoconv("multicurrency_alternateCurrencySource").'</td>';
-print '<td align="center" width="20">&nbsp;</td>';
-print '<td align="right" width="400">';
-print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
-print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
-print '<input type="hidden" name="action" value="set_MULTICURRENCY_ALTERNATE_SOURCE">';
-print '<input type="text" name="MULTICURRENCY_ALTERNATE_SOURCE" value="'.$conf->global->MULTICURRENCY_ALTERNATE_SOURCE.'" size="10" placeholder="EUR" />&nbsp;'; // Example: EUR
-print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
-print '</form>';
-print '</td></tr>';
 */
 
 print '</table>';
 print '<br />';
 
+if (!empty($conf->global->MAIN_MULTICURRENCY_ALLOW_SYNCHRONIZATION))
+{
+	$var=false;
+	print '<table class="noborder" width="100%">';
+	print '<tr class="liste_titre">';
+	print '<td>'.$form->textwithpicto($langs->trans("CurrencyLayerAccount"), $langs->trans("CurrencyLayerAccount_help_to_synchronize")).'</td>'."\n";
+	print '<td align="center" width="20">&nbsp;</td>';
+	print '<td align="right" width="100">';
+	print '<form id="form_sync" action="" method="POST">';
+	print '<input type="hidden" name="action" value="synchronize" />';
+	print '<textarea id="response" class="hideobject" name="response"></textarea>';
+	print $langs->trans("Value").'&nbsp;<input type="button" id="bt_sync" class="button" onclick="javascript:getRates();" value="'.$langs->trans('Synchronize').'" />';
+	print '</form>';
+	print '</td></tr>';
+	
+	
+	$var=!$var;
+	print '<tr '.$bc[$var].'>';
+	print '<td><a target="_blank" href="https://currencylayer.com">'.$langs->transnoentitiesnoconv("multicurrency_appId").'</a></td>';
+	print '<td align="center" width="20">&nbsp;</td>';
+	print '<td align="right" width="400">';
+	print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_ID">';
+	print '<input type="text" name="MULTICURRENCY_APP_ID" value="'.$conf->global->MULTICURRENCY_APP_ID.'" size="28" />&nbsp;';
+	print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
+	print '</form>';
+	print '</td></tr>';
+	
+	$var=!$var;
+	print '<tr '.$bc[$var].'>';
+	print '<td>'.$langs->transnoentitiesnoconv("multicurrency_appCurrencySource").'</td>';
+	print '<td align="center" width="20">&nbsp;</td>';
+	print '<td align="right" width="400">';
+	print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="action" value="set_MULTICURRENCY_APP_SOURCE">';
+	print '<input type="text" name="MULTICURRENCY_APP_SOURCE" value="'.$conf->global->MULTICURRENCY_APP_SOURCE.'" size="10" placeholder="USD" />&nbsp;'; // Default: USD
+	print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
+	print '</form>';
+	print '</td></tr>';
+	
+	$var=!$var;
+	print '<tr '.$bc[$var].'>';
+	print '<td>'.$langs->transnoentitiesnoconv("multicurrency_alternateCurrencySource").'</td>';
+	print '<td align="center" width="20">&nbsp;</td>';
+	print '<td align="right" width="400">';
+	print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
+	print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+	print '<input type="hidden" name="action" value="set_MULTICURRENCY_ALTERNATE_SOURCE">';
+	print '<input type="text" name="MULTICURRENCY_ALTERNATE_SOURCE" value="'.$conf->global->MULTICURRENCY_ALTERNATE_SOURCE.'" size="10" placeholder="EUR" />&nbsp;'; // Example: EUR
+	print '<input type="submit" class="button" value="'.$langs->trans("Modify").'">';
+	print '</form>';
+	print '</td></tr>';
+	
+	print '</table>';
+	print '<br />';
+}
+
+
 print '<table class="noborder" width="100%">';
 
 print '<tr class="liste_titre">';
-print '<td>'.$langs->trans("Currencies").'</td>'."\n";
+print '<td>'.$form->textwithpicto($langs->trans("CurrenciesUsed"), $langs->transnoentitiesnoconv("CurrenciesUsed_help_to_add")).'</td>'."\n";
 print '<td align="center" width="20">&nbsp;</td>';
 print '<td align="center" width="100">'.$langs->trans("Rate").'</td>'."\n";
 
@@ -307,7 +316,7 @@ print '<tr '.$bc[$var].'>';
 print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
 print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
 print '<input type="hidden" name="action" value="add_currency">';
-print '<td><input type="text" name="code" value="" size="5" placeholder="'.$langs->trans('code').'" /> - <input type="text" name="name" value="" size="35" placeholder="'.$langs->trans('name').'" /></td>';
+print '<td>'.$form->selectCurrency('', 'code').'</td>';
 print '<td align="center" width="20">&nbsp;</td>';
 print '<td align="right" width="300">';
 print '<input type="text" name="rate" value="" size="13" placeholder="'.$langs->trans('rate').'" />&nbsp;';

+ 5 - 2
htdocs/admin/receiptprinter.php

@@ -1,6 +1,7 @@
 <?php
 /* Copyright (C) 2013-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2015      Frederic France      <frederic.france@free.fr>
+ * Copyright (C) 2016      Juanjo Menent        <jmenent@2byte.es>
  *
  * 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
@@ -377,7 +378,8 @@ if ($mode == 'template' && $user->admin)
     if ($ret > 0) {
         setEventMessages($printer->error, $printer->errors, 'errors');
     } else {
-        for ($line=0; $line < count($printer->listprinterstemplates); $line++) {
+        $max = count($printer->listprinterstemplates);
+        for ($line=0; $line < $max; $line++) {
             $var = !$var;
             print '<tr '.$bc[$var].'>';
             if ($action=='edittemplate' && $printer->listprinterstemplates[$line]['rowid']==$templateid) {
@@ -422,7 +424,8 @@ if ($mode == 'template' && $user->admin)
     print '<th>'.$langs->trans("Tag").'</th>';
     print '<th>'.$langs->trans("Description").'</th>';
     print "</tr>\n";
-    for ($tag=0; $tag < count($printer->tags); $tag++) {
+    $max = count($printer->tags);
+    for ($tag=0; $tag < $max; $tag++) {
         $var = !$var;
         print '<tr '.$bc[$var].'>';
         print '<td>&lt;'.$printer->tags[$tag].'&gt;</td><td>'.$langs->trans(strtoupper($printer->tags[$tag])).'</td>';

+ 3 - 3
htdocs/comm/action/listactions.php

@@ -1,7 +1,7 @@
 <?php
 /* Copyright (C) 2001-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (C) 2003      Eric Seigne          <erics@rycks.com>
- * Copyright (C) 2004-2015 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2004-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2005-2012 Regis Houssin        <regis.houssin@capnetworks.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -199,7 +199,7 @@ if ($status == 'todo') { $sql.= " AND ((a.percent >= 0 AND a.percent < 100) OR (
 if ($filtert > 0 || $usergroup > 0)
 {
     $sql.= " AND (";
-    if ($filtert > 0) $sql.= "(ar.fk_element = ".$filtert." OR a.fk_user_action=".$filtert.")";
+    if ($filtert > 0) $sql.= "(ar.fk_element = ".$filtert." OR (ar.fk_element IS NULL AND a.fk_user_action=".$filtert."))";	// The OR is for backward compatibility
     if ($usergroup > 0) $sql.= ($filtert>0?" OR ":"")." ugu.fk_usergroup = ".$usergroup;
     $sql.= ")";
 }
@@ -368,7 +368,7 @@ if ($resql)
 		$actionstatic->type_code=$obj->type_code;
 		$actionstatic->type_label=$obj->type_label;
 		$actionstatic->label=$obj->label;
-		print $actionstatic->getNomUrl(1,28);
+		print $actionstatic->getNomUrl(1,36);
 		print '</td>';
 
 		if (! empty($conf->global->AGENDA_USE_EVENT_TYPE))

+ 1 - 1
htdocs/comm/propal/card.php

@@ -1433,7 +1433,7 @@ if ($action == 'create')
 		print '<td>'.fieldLabel('Currency','multicurrency_code').'</td>';
         print '<td colspan="3" class="maxwidthonsmartphone">';
 		$currency_code = (!empty($soc->multicurrency_code) ? $soc->multicurrency_code : ($object->multicurrency_code ? $object->multicurrency_code : $conf->currency)); 
-	    print $form->selectMultiCurrency($currency_code, 'multicurrency_code', 1);
+	    print $form->selectMultiCurrency($currency_code, 'multicurrency_code', 0);
 		print '</td></tr>';
 	}
 	

+ 7 - 4
htdocs/comm/propal/class/propal.class.php

@@ -2570,7 +2570,7 @@ class Propal extends CommonObject
 	        $response = new WorkboardResponse();
 	        $response->warning_delay = $delay_warning/60/60/24;
 	        $response->label = $label;
-	        $response->url = DOL_URL_ROOT.'/comm/propal/list.php?viewstatut='.$statut;
+	        $response->url = DOL_URL_ROOT.'/comm/propal/list.php?viewstatut='.$statut.'&mainmenu=commercial&leftmenu=propals';
 	        $response->img = img_object($langs->trans("Propals"),"propal");
 
             // This assignment in condition is not a bug. It allows walking the results.
@@ -2674,9 +2674,12 @@ class Propal extends CommonObject
                 $line->remise_percent=00;
             }
 
-            $prodid = mt_rand(1, $num_prods);
-            $line->fk_product=$prodids[$prodid];
-
+            if ($num_prods > 0)
+            {
+            	$prodid = mt_rand(1, $num_prods);
+            	$line->fk_product=$prodids[$prodid];
+            }
+            
             $this->lines[$xnbp]=$line;
 
             $this->total_ht       += $line->total_ht;

+ 7 - 4
htdocs/commande/class/commande.class.php

@@ -2974,7 +2974,7 @@ class Commande extends CommonOrder
 	        $response = new WorkboardResponse();
 	        $response->warning_delay=$conf->commande->client->warning_delay/60/60/24;
 	        $response->label=$langs->trans("OrdersToProcess");
-	        $response->url=DOL_URL_ROOT.'/commande/list.php?viewstatut=-3';
+	        $response->url=DOL_URL_ROOT.'/commande/list.php?viewstatut=-3&mainmenu=commercial&leftmenu=orders';
 	        $response->img=img_object($langs->trans("Orders"),"order");
 
             $generic_commande = new Commande($this->db);
@@ -3278,9 +3278,12 @@ class Commande extends CommonOrder
                 $line->total_tva=19.6;
                 $line->remise_percent=0;
             }
-            $prodid = mt_rand(1, $num_prods);
-            $line->fk_product=$prodids[$prodid];
-
+            if ($num_prods > 0)
+            {
+            	$prodid = mt_rand(1, $num_prods);
+            	$line->fk_product=$prodids[$prodid];
+            }
+            
             $this->lines[$xnbp]=$line;
 
             $this->total_ht       += $line->total_ht;

+ 1 - 1
htdocs/commande/class/commandestats.class.php

@@ -206,7 +206,7 @@ class CommandeStats extends Stats
 
 		$sql = "SELECT product.ref, COUNT(product.ref) as nb, SUM(tl.".$this->field_line.") as total, AVG(tl.".$this->field_line.") as avg";
 		$sql.= " FROM ".$this->from.", ".$this->from_line.", ".MAIN_DB_PREFIX."product as product";
-		//if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
+		if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
 		$sql.= " WHERE ".$this->where;
 		$sql.= " AND c.rowid = tl.fk_commande AND tl.fk_product = product.rowid";
     	$sql.= " AND c.date_commande BETWEEN '".$this->db->idate(dol_get_first_day($year,1,false))."' AND '".$this->db->idate(dol_get_last_day($year,12,false))."'";

+ 10 - 1
htdocs/commande/tpl/linkedobjectblock.tpl.php

@@ -46,7 +46,16 @@ foreach($linkedObjectBlock as $key => $objectlink)
 			echo price($objectlink->total_ht);
 		} ?></td>
 	<td align="right"><?php echo $objectlink->getLibStatut(3); ?></td>
-	<td align="right"><a href="<?php echo $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=dellink&dellinkid='.$key; ?>"><?php echo img_delete($langs->transnoentitiesnoconv("RemoveLink")); ?></a></td>
+	<td align="right">
+		<?php
+		// For now, shipments must stay linked to order, so link is not deletable
+		if($object->element != 'shipping') {
+			?>
+			<a href="<?php echo $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=dellink&dellinkid='.$key; ?>"><?php echo img_delete($langs->transnoentitiesnoconv("RemoveLink")); ?></a>
+			<?php
+		}
+		?>
+	</td>
 </tr>
 <?php
 }

+ 2 - 2
htdocs/compta/facture.php

@@ -863,7 +863,7 @@ if (empty($reshook))
 			}
 		}
 
-		// Standard invoice or Deposit invoice created from a Predefined invoice
+		// Standard invoice or Deposit invoice created from a Predefined template invoice
 		if (($_POST['type'] == Facture::TYPE_STANDARD || $_POST['type'] == Facture::TYPE_DEPOSIT) && GETPOST('fac_rec') > 0)
 		{
 			$dateinvoice = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
@@ -2036,7 +2036,7 @@ if ($action == 'create')
 		if (!empty($conf->multicurrency->enabled) && !empty($soc->multicurrency_code)) $currency_code = $soc->multicurrency_code;
 	}
 
-	$absolute_discount = $soc->getAvailableDiscounts();
+	if(!empty($soc->id)) $absolute_discount = $soc->getAvailableDiscounts();
 
 	if (! empty($conf->use_javascript_ajax))
 	{

+ 2 - 1
htdocs/compta/facture/class/facture-rec.class.php

@@ -666,7 +666,7 @@ class FactureRec extends CommonInvoice
 				$facture->fac_rec = $facturerec->id;    // We will create $facture from this recurring invoice
 			    $facture->type = self::TYPE_STANDARD;
 			    $facture->brouillon = 1;
-			    $facture->date = $now;
+			    $facture->date = $facturerec->date_when;	// We could also use dol_now here but we prefer date_when so invoice has real date when we would like even if we generate later.
 			    $facture->socid = $facturerec->socid;
 			    
 			    $invoiceidgenerated = $facture->create($user);       // This will also update fields of recurring invoice
@@ -962,6 +962,7 @@ class FactureRec extends CommonInvoice
         if ($this->db->query($sql))
         {
             $this->date_when = $date;
+            if ($increment_nb_gen_done>0) $_facrec->nb_gen_done++;
             return 1;
         }
         else

+ 3 - 4
htdocs/compta/facture/class/facture.class.php

@@ -309,13 +309,12 @@ class Facture extends CommonInvoice
 		
 			$forceduedate = $this->calculate_date_lim_reglement();
 			
-			// Update date and number of last generation of recurring template invoice, before inserting new invoice
+			// For recurrn invoices, update date and number of last generation of recurring template invoice, before inserting new invoice
 			if ($_facrec->frequency > 0)
 			{
-                $_facrec->nb_gen_done++;
                 $next_date = $_facrec->getNextDate();   // Calculate next date
                 $_facrec->setValueFrom('date_last_gen', $now, '', null, 'date');
-                $_facrec->setValueFrom('nb_gen_done', $_facrec->nb_gen_done + 1);
+                //$_facrec->setValueFrom('nb_gen_done', $_facrec->nb_gen_done + 1);		// Not required, +1 already included into setNextDate when second param is 1.
                 $_facrec->setNextDate($next_date,1);
 			}
 		}
@@ -3465,7 +3464,7 @@ class Facture extends CommonInvoice
 			$response = new WorkboardResponse();
 			$response->warning_delay=$conf->facture->client->warning_delay/60/60/24;
 			$response->label=$langs->trans("CustomerBillsUnpaid");
-			$response->url=DOL_URL_ROOT.'/compta/facture/list.php?search_status=1';
+			$response->url=DOL_URL_ROOT.'/compta/facture/list.php?search_status=1&mainmenu=accountancy&leftmenu=customers_bills';
 			$response->img=img_object($langs->trans("Bills"),"bill");
 
 			$generic_facture = new Facture($this->db);

+ 5 - 0
htdocs/compta/facture/fiche-rec.php

@@ -1256,8 +1256,13 @@ else
 		
     	print '<br>';
 		
+    	// Frequencry/Recurring section
 		if ($object->frequency > 0)
 		{
+    		if (empty($conf->cron->enabled))
+    		{
+    			print info_admin($langs->trans("EnableAndSetupModuleCron", $langs->transnoentitiesnoconv("Module2300Name")));	
+    		}
     		
     		print '<table class="border" width="100%">';
     		

+ 1 - 1
htdocs/compta/facture/list.php

@@ -182,7 +182,7 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e
 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
 
 // Do we click on purge search criteria ?
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter") || GETPOST("button_removefilter.x")) // Both test are required to be compatible with all browsers
 {
     $search_user='';
     $search_sale='';

+ 2 - 2
htdocs/compta/index.php

@@ -2,7 +2,7 @@
 /* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  * Copyright (C) 2004-2013 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2005-2015 Regis Houssin        <regis.houssin@capnetworks.com>
- * Copyright (C) 2015 	   Juanjo Menent	    <jmenent@2byte.es>
+ * Copyright (C) 2015-2016 Juanjo Menent	    <jmenent@2byte.es>
  * Copyright (C) 2015      Jean-François Ferry	<jfefe@aternatik.fr>
  * Copyright (C) 2015      Raphaël Doursenaud   <rdoursenaud@gpcsolutions.fr>
  * Copyright (C) 2016      Marcos García        <marcosgdf@gmail.com>
@@ -877,7 +877,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture-
 	if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".$user->id;
 	if ($socid) $sql.= " AND ff.fk_soc = ".$socid;
 	$sql.= " GROUP BY ff.rowid, ff.ref, ff.fk_statut, ff.libelle, ff.total_ht, ff.tva, ff.total_tva, ff.total_ttc, ff.paye,";
-	$sql.= " s.nom, s.rowid, s.code_client, s.code_fournisseur";
+	$sql.= " s.nom, s.rowid, s.code_client, s.code_fournisseur, ff.date_lim_reglement";
 	$sql.= " ORDER BY ff.date_lim_reglement ASC";
 
 	$resql=$db->query($sql);

+ 5 - 2
htdocs/contrat/class/contrat.class.php

@@ -2147,8 +2147,11 @@ class Contrat extends CommonObject
 			$line->total_ht=90;
 			$line->total_ttc=107.64;	// 90 * 1.196
 			$line->total_tva=17.64;
-			$prodid = mt_rand(1, $num_prods);
-			$line->fk_product=$prodids[$prodid];
+            if ($num_prods > 0)
+            {
+				$prodid = mt_rand(1, $num_prods);
+				$line->fk_product=$prodids[$prodid];
+            }
 			$this->lines[$xnbp]=$line;
 			$xnbp++;
 		}

+ 1 - 1
htdocs/contrat/list.php

@@ -256,7 +256,7 @@ if ($resql)
     print '<input type="text" class="flat" size="3" name="search_contract" value="'.dol_escape_htmltag($search_contract).'">';
     print '</td>';
     print '<td class="liste_titre">';
-    print '<input type="text" class="flat" size="6" name="search_ref_customer value="'.dol_escape_htmltag($search_ref_supplier).'">';
+    print '<input type="text" class="flat" size="6" name="search_ref_customer value="'.dol_escape_htmltag($search_ref_customer).'">';
     print '</td>';
     print '<td class="liste_titre">';
     print '<input type="text" class="flat" size="6" name="search_ref_supplier value="'.dol_escape_htmltag($search_ref_supplier).'">';

+ 4 - 1
htdocs/core/ajax/ajaxdirpreview.php

@@ -240,7 +240,10 @@ if ($section)
 		require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
 		$useglobalvars=1;
 		$form = new Form($db);
-		$formquestion=array('urlfile'=>array('type'=>'hidden','value'=>$urlfile,'name'=>'urlfile'));
+		$formquestion=array(
+			'urlfile'=>array('type'=>'hidden','value'=>$urlfile,'name'=>'urlfile'),
+			'section'=>array('type'=>'hidden','value'=>$section,'name'=>'section')
+		);
 		print $form->formconfirm($url,$langs->trans("DeleteFile"),$langs->trans("ConfirmDeleteFile"),'confirm_deletefile',$formquestion,"no",($useajax?'deletefile':0));
 	}
 

+ 2 - 1
htdocs/core/class/commonobject.class.php

@@ -744,7 +744,8 @@ abstract class CommonObject
 
         $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
         $sql.= " WHERE element_id = ".$this->id;
-        $sql.= " AND fk_c_type_contact IN (".$listId.")";
+        if ($listId)
+        	$sql.= " AND fk_c_type_contact IN (".$listId.")";
 
         dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
         if ($this->db->query($sql))

+ 1 - 1
htdocs/core/class/extrafields.class.php

@@ -1133,7 +1133,7 @@ class ExtraFields
 			if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
 			{
                 $object = new $InfoFieldList[0]($this->db);
-                $object->fetch($value);
+                if (!empty($value)) $object->fetch($value);
                 $valuetoshow=$object->ref;
                 if ($object->element == 'societe') $valuetoshow=$object->name;  // Special case for thirdparty because ref is id because name is not unique
                 $out.='<input type="text" class="flat" name="'.$keysuffix.'options_'.$key.$keyprefix.'"  size="20" value="'.$valuetoshow.'" >';

+ 3 - 3
htdocs/core/class/html.form.class.php

@@ -2329,7 +2329,7 @@ class Form
         $sql.= " FROM ".MAIN_DB_PREFIX."product as p";
         $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product";
         $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON pfp.fk_soc = s.rowid";
-        $sql.= " WHERE p.entity IN (".getEntity('product', 1).")";
+        $sql.= " WHERE p.entity IN (".getEntity('productprice', 1).")";
         $sql.= " AND p.tobuy = 1";
         $sql.= " AND s.fournisseur = 1";
         $sql.= " AND p.rowid = ".$productid;
@@ -3812,7 +3812,7 @@ class Form
             print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
             print '<table class="nobordernopadding" cellpadding="0" cellspacing="0">';
             print '<tr><td>';
-            print $this->selectMultiCurrency($selected, $htmlname, 1);
+            print $this->selectMultiCurrency($selected, $htmlname, 0);
             print '</td>';
             print '<td align="left"><input type="submit" class="button" value="'.$langs->trans("Modify").'"></td>';
             print '</tr></table></form>';
@@ -4091,7 +4091,7 @@ class Form
 		
 		$out='';
         $out.= '<select class="flat" name="'.$htmlname.'" id="'.$htmlname.'">';
-		if ($useempty) $out .= '<option value="'.$conf->currency.'"'.((empty($selected) || $selected == $conf->currency)?' selected="selected"':'').'>'.$langs->cache_currencies[$conf->currency]['label'].'</option>';
+		if ($useempty) $out .= '<option value=""></option>';
 		if (count($TCurrency) > 0)
 		{
 			foreach ($langs->cache_currencies as $code_iso => $currency)

+ 67 - 64
htdocs/core/class/ldap.class.php

@@ -162,68 +162,52 @@ class Ldap
 			return -1;
 		}
 
-		if (! function_exists('ldap_connect'))
+		if (! function_exists("ldap_connect"))
 		{
-			$this->error='Your PHP need extension ldap';
+			$this->error='LDAPFunctionsNotAvailableOnPHP';
 			dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
-		    return -1;
+			$return=-1;
 		}
-		
-		// Loop on each ldap server
-		foreach ($this->server as $key => $host)
-		{
-			if ($connected) break;
-			if (empty($host)) continue;
-
-			if (preg_match('/^ldap/',$host))
-			{
-				$this->connection = ldap_connect($host);
-			}
-			else
-			{
-				$this->connection = ldap_connect($host,$this->serverPort);
-			}
 
-			if (is_resource($this->connection))
+		if (empty($this->error))
+		{
+			// Loop on each ldap server
+			foreach ($this->server as $key => $host)
 			{
-				// Begin TLS if requested by the configuration
-    			if (! empty($conf->global->LDAP_SERVER_USE_TLS)) 
-    			{
-    			    if (! ldap_start_tls($this->connection)) 
-    			    {
-    			        dol_syslog(get_class($this)."::connect_bind failed to start tls", LOG_WARNING);
-    			        $connected = 0;
-    			        $this->close();
-    				}
-    			}
-			
-			    // Execute the ldap_set_option here (after connect and before bind)
-				$this->setVersion();
-				ldap_set_option($this->connection, LDAP_OPT_SIZELIMIT, 0); // no limit here. should return true.
-
-
-				if ($this->serverType == "activedirectory")
+				if ($connected) break;
+				if (empty($host)) continue;
+	
+				if (preg_match('/^ldap/',$host))
 				{
-					$result=$this->setReferrals();
-					dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
-					$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
-					if ($this->result)
-					{
-						$this->bind=$this->result;
-						$connected=2;
-						break;
-					}
-					else
-					{
-						$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
-					}
+					$this->connection = ldap_connect($host);
 				}
 				else
 				{
-					// Try in auth mode
-					if ($this->searchUser && $this->searchPassword)
+					$this->connection = ldap_connect($host,$this->serverPort);
+				}
+	
+				if (is_resource($this->connection))
+				{
+					// Begin TLS if requested by the configuration
+	    			if (! empty($conf->global->LDAP_SERVER_USE_TLS)) 
+	    			{
+	    			    if (! ldap_start_tls($this->connection)) 
+	    			    {
+	    			        dol_syslog(get_class($this)."::connect_bind failed to start tls", LOG_WARNING);
+	    			        $connected = 0;
+	    			        $this->close();
+	    				}
+	    			}
+			
+					// Execute the ldap_set_option here (after connect and before bind)
+					$this->setVersion();
+					ldap_set_option($this->connection, LDAP_OPT_SIZELIMIT, 0); // no limit here. should return true.
+	
+	
+					if ($this->serverType == "activedirectory")
 					{
-						dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
+						$result=$this->setReferrals();
+						dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
 						$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
 						if ($this->result)
 						{
@@ -236,26 +220,45 @@ class Ldap
 							$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
 						}
 					}
-					// Try in anonymous
-					if (! $this->bind)
+					else
 					{
-						dol_syslog(get_class($this)."::connect_bind try bind on ".$host,LOG_DEBUG);
-						$result=$this->bind();
-						if ($result)
+						// Try in auth mode
+						if ($this->searchUser && $this->searchPassword)
 						{
-							$this->bind=$this->result;
-							$connected=1;
-							break;
+							dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
+							$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
+							if ($this->result)
+							{
+								$this->bind=$this->result;
+								$connected=2;
+								break;
+							}
+							else
+							{
+								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
+							}
 						}
-						else
+						// Try in anonymous
+						if (! $this->bind)
 						{
-							$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
+							dol_syslog(get_class($this)."::connect_bind try bind on ".$host,LOG_DEBUG);
+							$result=$this->bind();
+							if ($result)
+							{
+								$this->bind=$this->result;
+								$connected=1;
+								break;
+							}
+							else
+							{
+								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
+							}
 						}
 					}
 				}
+	
+				if (! $connected) $this->close();
 			}
-
-			if (! $connected) $this->close();
 		}
 
 		if ($connected)

+ 4 - 0
htdocs/core/class/menubase.class.php

@@ -264,6 +264,8 @@ class Menubase
         $sql.= " t.mainmenu,";
         $sql.= " t.leftmenu,";
         $sql.= " t.fk_menu,";
+        $sql.= " t.fk_mainmenu,";
+        $sql.= " t.fk_leftmenu,";
         $sql.= " t.position,";
         $sql.= " t.url,";
         $sql.= " t.target,";
@@ -293,6 +295,8 @@ class Menubase
                 $this->mainmenu = $obj->mainmenu;
                 $this->leftmenu = $obj->leftmenu;
                 $this->fk_menu = $obj->fk_menu;
+                $this->fk_mainmenu = $obj->fk_mainmenu;
+                $this->fk_leftmenu = $obj->fk_leftmenu;
                 $this->position = $obj->position;
                 $this->url = $obj->url;
                 $this->target = $obj->target;

+ 7 - 0
htdocs/core/lib/admin.lib.php

@@ -736,17 +736,24 @@ function activateModule($value,$withdeps=1)
         if (isset($objMod->depends) && is_array($objMod->depends) && ! empty($objMod->depends))
         {
             // Activation des modules dont le module depend
+            $TError=array();
             $num = count($objMod->depends);
             for ($i = 0; $i < $num; $i++)
             {
+            	$activate = false;
             	foreach ($modulesdir as $dir)
             	{
             		if (file_exists($dir.$objMod->depends[$i].".class.php"))
             		{
             			activateModule($objMod->depends[$i]);
+						$activate = true;
             		}
             	}
+				
+				if (!$activate) $TError[] = $langs->trans('activateModuleDependNotSatisfied', $objMod->name, $objMod->depends[$i]);
             }
+            
+            setEventMessages('', $TError, 'errors');
         }
 
         if (isset($objMod->conflictwith) && is_array($objMod->conflictwith) && ! empty($objMod->conflictwith))

+ 10 - 3
htdocs/core/lib/functions.lib.php

@@ -436,7 +436,7 @@ function dol_size($size,$type='')
  */
 function dol_sanitizeFileName($str,$newstr='_',$unaccent=1)
 {
-	$filesystem_forbidden_chars = array('<','>',':','/','\\','?','*','|','"');
+	$filesystem_forbidden_chars = array('<','>',':','/','\\','?','*','|','"','°');
 	return dol_string_nospecial($unaccent?dol_string_unaccent($str):$str, $newstr, $filesystem_forbidden_chars);
 }
 
@@ -902,8 +902,15 @@ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='r
 		if ($showimage) $morehtmlleft.='<div class="floatleft inline-block valignmiddle divphotoref">'.$object->show_photos($conf->product->multidir_output[$object->entity],'small',-$maxvisiblephotos,0,0,0,$width,0).'</div>';
         else 
         {
-			$nophoto='/public/theme/common/nophoto.png';
-            $morehtmlleft.='<div class="floatleft inline-block valignmiddle divphotoref"><img class="photo'.$modulepart.($cssclass?' '.$cssclass:'').'" alt="No photo" border="0"'.($width?' width="'.$width.'"':'').($height?' height="'.$height.'"':'').' src="'.DOL_URL_ROOT.$nophoto.'"></div>';
+			if (!empty($conf->global->PRODUCT_NODISPLAYIFNOPHOTO)) {
+				$nophoto='';
+				$morehtmlleft.='<div class="floatleft inline-block valignmiddle divphotoref"></div>';
+			}
+			else {
+				$nophoto='/public/theme/common/nophoto.png';
+				$morehtmlleft.='<div class="floatleft inline-block valignmiddle divphotoref"><img class="photo'.$modulepart.($cssclass?' '.$cssclass:'').'" alt="No photo" border="0"'.($width?' width="'.$width.'"':'').($height?' height="'.$height.'"':'').' src="'.DOL_URL_ROOT.$nophoto.'"></div>';
+			}
+            
         }
 	}
 	else 

+ 15 - 8
htdocs/core/lib/treeview.lib.php

@@ -109,15 +109,17 @@ function tree_showpad(&$fulltree,$key,$silent=0)
  *  @param  int	    $pere   		Array with parent ids ('rowid'=>,'mainmenu'=>,'leftmenu'=>,'fk_mainmenu=>,'fk_leftmenu=>)
  *  @param  int	    $rang   		Level of element
  *  @param	string	$iddivjstree	Id to use for parent ul element
+ *  @param  int     $donoresetalreadyloaded     Do not reset global array $donoresetalreadyloaded used to avoid to go down on an aleady processed record
+ *  @param  int     $showfk         Show fk links to parent into label
  *  @return	void
  */
-function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree')
+function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree', $donoresetalreadyloaded=0, $showfk=0)
 {
     global $tree_recur_alreadyadded;
     
-    if ($rang == 0) $tree_recur_alreadyadded=array();
+    if ($rang == 0 && empty($donoresetalreadyloaded)) $tree_recur_alreadyadded=array();
     
-    if (empty($pere['rowid']))
+    if ($rang == 0)
 	{
 		// Test also done with jstree and dynatree (not able to have <a> inside label)
 		print '<script type="text/javascript" language="javascript">
@@ -161,7 +163,9 @@ function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree')
 			}
 			print "\n".'<li '.($tab[$x]['statut']?' class="liuseractive"':'class="liuserdisabled"').'>';
 			print $tab[$x]['entry'];
-		    $tree_recur_alreadyadded[$tab[$x]['rowid']]=$rang;
+			if ($showfk) print '&nbsp; (fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].')';
+			//print ' -> A '.$tab[$x]['rowid'].' mainmenu='.$tab[$x]['mainmenu'].' leftmenu='.$tab[$x]['leftmenu'].' fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].'<br>'."\n";
+		    $tree_recur_alreadyadded[$tab[$x]['rowid']]=($rang + 1);
 			// And now we search all its sons of lower level
 			tree_recur($tab,$tab[$x],$rang+1);
 			print '</li>';
@@ -173,7 +177,8 @@ function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree')
 		    {
 		        if (! empty($tree_recur_alreadyadded[$tab[$x]['rowid']]))
 		        {
-                    dol_syslog('Error, record with id '.$tab[$x]['rowid'].' seems to be a child of record with id '.$pere['rowid'].' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.', LOG_WARNING);
+		            dol_syslog('Error, record with id '.$tab[$x]['rowid'].' seems to be a child of record with id '.$pere['rowid'].' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.', LOG_WARNING);
+		            //print 'Error, record with id '.$tab[$x]['rowid'].' seems to be a child of record with id '.$pere['rowid'].' but it was already output. Complete field "leftmenu" and "mainmenu" on ALL records to avoid ambiguity.';
                     continue;
 		        }
 		        
@@ -181,15 +186,17 @@ function tree_recur($tab, $pere, $rang, $iddivjstree='iddivjstree')
 		    }
 			print "\n".'<li '.($tab[$x]['statut']?' class="liuseractive"':'class="liuserdisabled"').'>';
 			print $tab[$x]['entry'];
-		    $tree_recur_alreadyadded[$tab[$x]['rowid']]=$rang;
+			if ($showfk) print '&nbsp; (fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].')';
+			//print ' -> B '.$tab[$x]['rowid'].' mainmenu='.$tab[$x]['mainmenu'].' leftmenu='.$tab[$x]['leftmenu'].' fk_mainmenu='.$tab[$x]['fk_mainmenu'].' fk_leftmenu='.$tab[$x]['fk_leftmenu'].'<br>'."\n";
+			$tree_recur_alreadyadded[$tab[$x]['rowid']]=($rang + 1);
 			// And now we search all its sons of lower level
-			//print 'Appel de tree_recur pour x='.$x.' rowid='.$tab[$x]['rowid']." fk_mainmenu pere = ".$tab[$x]['fk_mainmenu']." fk_leftmenu pere = ".$tab[$x]['fk_leftmenu']."<br>\n";
+			//print 'Call tree_recur for x='.$x.' rowid='.$tab[$x]['rowid']." fk_mainmenu pere = ".$tab[$x]['fk_mainmenu']." fk_leftmenu pere = ".$tab[$x]['fk_leftmenu']."<br>\n";
 		    tree_recur($tab,$tab[$x],$rang+1);
 			print '</li>';
 		}
 	}
 	if (! empty($ulprinted) && ! empty($pere['rowid'])) { print '</ul>'."\n"; }
 
-	if (empty($pere['rowid'])) print '</ul>';
+    if ($rang == 0) print '</ul>';
 }
 

+ 2 - 2
htdocs/core/menus/standard/eldy.lib.php

@@ -788,8 +788,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 			if (! empty($conf->facture->enabled))
 			{
 				$langs->load("bills");
-				$newmenu->add("/compta/facture/list.php",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills');
-				$newmenu->add("/compta/facture.php?action=create",$langs->trans("NewBill"),1,$user->rights->facture->creer);
+				$newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills');
+				$newmenu->add("/compta/facture.php?action=create&leftmenu=customers_bills",$langs->trans("NewBill"),1,$user->rights->facture->creer);
 				$newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire);
 
 				if (empty($leftmenu) || ($leftmenu == 'customers_bills'))

+ 1 - 0
htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php

@@ -397,6 +397,7 @@ class doc_generic_proposal_odt extends ModelePDFPropales
 
 				$tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_other,$array_thirdparty_contact);
 				complete_substitutions_array($tmparray, $outputlangs, $object);
+				$object->fetch_optionals();
 				// Call the ODTSubstitution hook
 				$parameters=array('odfHandler'=>&$odfHandler,'file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$tmparray);
 				$reshook=$hookmanager->executeHooks('ODTSubstitution',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks

+ 1 - 1
htdocs/core/modules/propale/doc/pdf_azur.modules.php

@@ -711,7 +711,7 @@ class pdf_azur extends ModelePDFPropales
 										if (file_exists($infile) && is_readable($infile)) {
 											$pagecount = $pdf->setSourceFile($infile);
 											for($i = 1; $i <= $pagecount; $i ++) {
-												$tplIdx = $pdf->importPage(1);
+												$tplIdx = $pdf->importPage($i);
 												if ($tplIdx!==false) {
 													$s = $pdf->getTemplatesize($tplIdx);
 													$pdf->AddPage($s['h'] > $s['w'] ? 'P' : 'L');

+ 1 - 2
htdocs/ecm/index.php

@@ -175,10 +175,9 @@ if ($action == 'confirm_deletefile')
 	    		dol_print_error($db,$ecmdir->error);
 	    		exit;
 	    	}
-	    	$relativepath=$ecmdir->getRelativePath();
     	}
     	else $relativepath='';
-    	$upload_dir = $conf->ecm->dir_output.($relativepath?'/'.$relativepath:'');
+    	$upload_dir = $conf->ecm->dir_output;
     	$file = $upload_dir . "/" . GETPOST('urlfile');	// Do not use urldecode here ($_GET and $_POST are already decoded by PHP).
 
     	$ret=dol_delete_file($file);

+ 11 - 3
htdocs/expedition/tpl/linkedobjectblock.tpl.php

@@ -41,12 +41,20 @@ foreach($linkedObjectBlock as $key => $objectlink)
     <td></td>
 	<td align="center"><?php echo dol_print_date($objectlink->date_delivery,'day'); ?></td>
 	<td align="right"><?php
-		/*if ($user->rights->expedition->lire) {
+		if ($user->rights->expedition->lire) {
 			$total = $total + $objectlink->total_ht;
 			echo price($objectlink->total_ht);
-		}*/ ?></td>
+		} ?></td>
 	<td align="right"><?php echo $objectlink->getLibStatut(3); ?></td>
-	<td align="right"><a href="<?php echo $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=dellink&dellinkid='.$key; ?>"><?php echo img_delete($langs->transnoentitiesnoconv("RemoveLink")); ?></a></td>
+	<td align="right">
+		<?php
+		// For now, shipments must stay linked to order, so link is not deletable
+		if($object->element != 'commande') {
+			?>
+			<a href="<?php echo $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=dellink&dellinkid='.$key; ?>"><?php echo img_delete($langs->transnoentitiesnoconv("RemoveLink")); ?></a></td>
+			<?php
+		}
+		?>
 </tr>
 <?php
 }

+ 10 - 7
htdocs/expensereport/card.php

@@ -819,7 +819,7 @@ if ($action == 'set_paid' && $id > 0 && $user->rights->expensereport->to_paid)
 	}
 }
 
-if ($action == "addline")
+if ($action == "addline" && $user->rights->expensereport->creer)
 {
 	$error = 0;
 
@@ -911,7 +911,7 @@ if ($action == "addline")
 	$action='';
 }
 
-if ($action == 'confirm_delete_line' && GETPOST("confirm") == "yes")
+if ($action == 'confirm_delete_line' && GETPOST("confirm") == "yes" && $user->rights->expensereport->creer)
 {
 	$object = new ExpenseReport($db);
 	$object->fetch($id);
@@ -954,7 +954,7 @@ if ($action == 'confirm_delete_line' && GETPOST("confirm") == "yes")
 	}
 }
 
-if ($action == "updateligne" )
+if ($action == "updateligne" && $user->rights->expensereport->creer)
 {
 	$object = new ExpenseReport($db);
 	$object->fetch($id);
@@ -1640,8 +1640,11 @@ else
 							print '<td style="text-align:right;">'.$langs->trans('AmountHT').'</td>';
 							print '<td style="text-align:right;">'.$langs->trans('AmountTTC').'</td>';
 						}
-						print '<td style="text-align:right;"></td>';
-
+						// Ajout des boutons de modification/suppression
+						if (($object->fk_statut < 2 || $object->fk_statut == 99) && $user->rights->expensereport->creer)
+						{
+							print '<td style="text-align:right;"></td>';
+						}
 						print '</tr>';
 
 						$var=true;
@@ -1682,7 +1685,7 @@ else
 
 								// Ajout des boutons de modification/suppression
 								print '<td style="text-align:right;" class="nowrap">';
-								if($object->fk_statut<2 OR $object->fk_statut==99)
+								if (($object->fk_statut < 2 || $object->fk_statut == 99) && $user->rights->expensereport->creer)
 								{
 									print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&amp;action=editline&amp;rowid='.$objp->rowid.'#'.$objp->rowid.'">';
 									print img_edit();
@@ -1768,7 +1771,7 @@ else
 					//print '</div>';
 
 					// Add a line
-					if (($object->fk_statut==0 || $object->fk_statut==99) && $action != 'editline')
+					if (($object->fk_statut==0 || $object->fk_statut==99) && $action != 'editline' && $user->rights->expensereport->creer)
 					{
 						print '<tr class="liste_titre">';
 						print '<td colspan="2"></td>';

+ 1 - 1
htdocs/expensereport/synchro_compta.php

@@ -165,7 +165,7 @@ else:
 				while($i<$num):
 					$objp = $db->fetch_object($resql);
 					$var=!$var;
-						print "<tr $bc[$var]>";
+						print '<tr'. $bc[$var].'>';
 							print '<td>'.$objp->ref.'</td>';
 							print '<td>'.dol_print_date($db->jdate($objp->date_valid),'day').'</td>';
 							print '<td><a href="'.DOL_URL_ROOT.'/user/card.php?id='.$objp->fk_user_author.'">'.img_object($langs->trans("ShowUser"),"user").' '.$objp->declarant_NDF.'</a></td>';

+ 2 - 2
htdocs/fichinter/card.php

@@ -494,7 +494,7 @@ if (empty($reshook))
 
 			$desc=GETPOST('np_desc');
 			$date_intervention = dol_mktime(GETPOST('dihour','int'), GETPOST('dimin','int'), 0, GETPOST('dimonth','int'), GETPOST('diday','int'), GETPOST('diyear','int'));
-			$duration = empty($conf->global->FICHINTER_WITHOUT_DURATION)?0:convertTime2Seconds(GETPOST('durationhour','int'), GETPOST('durationmin','int'));
+			$duration = empty($conf->global->FICHINTER_WITHOUT_DURATION)?convertTime2Seconds(GETPOST('durationhour','int'), GETPOST('durationmin','int')) : 0;
 
 
 			// Extrafields
@@ -1553,7 +1553,7 @@ else if ($id > 0 || ! empty($ref))
                         $selectmode = 'select';
                         if (!empty($conf->global->INTERVENTION_ADDLINE_FREEDUREATION))
                             $selectmode = 'text';
-                        $form->select_duration('duration', $objp->duree, $selectmode);
+                        $form->select_duration('duration', $objp->duree, 0, $selectmode);
                     }
                     print '</td>';
 

+ 12 - 1
htdocs/filefunc.inc.php

@@ -89,7 +89,18 @@ if (! $result && ! empty($_SERVER["GATEWAY_INTERFACE"]))    // If install not do
 {
 	// Note: If calling page was not into htdocs (index.php, ...), then this redirect will fails.
 	// There is no real solution, because the only way to know the apache url relative path is to have into conf file.
-	header("Location: install/index.php");
+	$TDir = explode('/', $_SERVER['PHP_SELF']);
+	$path = '';
+	$i = count($TDir);
+	while ($i--)
+	{
+		if (empty($TDir[$i]) || $TDir[$i] == 'htdocs') break;
+		if (substr($TDir[$i], -4, 4) == '.php') continue;
+		
+		$path .= '../';
+	}
+	
+	header("Location: ".$path."install/index.php");
 	exit;
 }
 

+ 7 - 4
htdocs/fourn/ajax/getSupplierPrices.php

@@ -92,13 +92,16 @@ if ($idprod > 0)
 		}
 	}
 	
-	// Add price for pmp
-	$price=$producttmp->pmp;
-	$prices[] = array("id" => 'pmpprice', "price" => price2num($price), "label" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency));  // For price field, we must use price2num(), for label or title, price()
-
 	// Add price for costprice
 	$price=$producttmp->cost_price;
 	$prices[] = array("id" => 'costprice', "price" => price2num($price), "label" => $langs->trans("CostPrice").': '.price($price,0,$langs,0,0,-1,$conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency));  // For price field, we must use price2num(), for label or title, price()
+
+	if(!empty($conf->stock->enabled)) 
+	{
+		// Add price for pmp
+		$price=$producttmp->pmp;
+		$prices[] = array("id" => 'pmpprice', "price" => price2num($price), "label" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency));  // For price field, we must use price2num(), for label or title, price()
+	}
 }
 
 echo json_encode($prices);

+ 2 - 4
htdocs/fourn/class/fournisseur.commande.class.php

@@ -1458,12 +1458,10 @@ class CommandeFournisseur extends CommonOrder
             //print $sql;
             if ($resql)
             {
-                $this->rowid = $this->db->last_insert_id(MAIN_DB_PREFIX.'commande_fournisseurdet');
-
                	if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
 				{
 					$linetmp = new CommandeFournisseurLigne($this->db);
-					$linetmp->id=$this->rowid;
+					$linetmp->id=$this->db->last_insert_id(MAIN_DB_PREFIX.'commande_fournisseurdet');
 					$linetmp->array_options = $array_options;
 					$result=$linetmp->insertExtraFields();
 					if ($result < 0)
@@ -2494,7 +2492,7 @@ class CommandeFournisseur extends CommonOrder
 	        $response = new WorkboardResponse();
 	        $response->warning_delay=$conf->commande->fournisseur->warning_delay/60/60/24;
 	        $response->label=$langs->trans("SuppliersOrdersToProcess");
-	        $response->url=DOL_URL_ROOT.'/fourn/commande/list.php?statut=1,2,3';
+	        $response->url=DOL_URL_ROOT.'/fourn/commande/list.php?statut=1,2,3&mainmenu=commercial&leftmenu=orders_suppliers';
 	        $response->img=img_object($langs->trans("Orders"),"order");
 
             while ($obj=$this->db->fetch_object($resql))

+ 6 - 3
htdocs/fourn/class/fournisseur.facture.class.php

@@ -1507,7 +1507,7 @@ class FactureFournisseur extends CommonInvoice
 	        $response = new WorkboardResponse();
 	        $response->warning_delay=$conf->facture->fournisseur->warning_delay/60/60/24;
 	        $response->label=$langs->trans("SupplierBillsToPay");
-	        $response->url=DOL_URL_ROOT.'/fourn/facture/list.php?filtre=fac.fk_statut:1,paye:0';
+	        $response->url=DOL_URL_ROOT.'/fourn/facture/list.php?filtre=fac.fk_statut:1,paye:0&mainmenu=accountancy&leftmenu=suppliers_bills';
 	        $response->img=img_object($langs->trans("Bills"),"bill");
 
             $facturestatic = new FactureFournisseur($this->db);
@@ -1708,8 +1708,11 @@ class FactureFournisseur extends CommonInvoice
     			$line->remise_percent=0;
 			}
 
-			$prodid = mt_rand(1, $num_prods);
-            $line->fk_product=$prodids[$prodid];
+            if ($num_prods > 0)
+            {
+				$prodid = mt_rand(1, $num_prods);
+            	$line->fk_product=$prodids[$prodid];
+            }
             $line->product_type=0;
 
             $this->lines[$xnbp]=$line;

+ 1 - 1
htdocs/fourn/class/fournisseur.product.class.php

@@ -445,7 +445,7 @@ class ProductFournisseur extends Product
         $sql.= " pfp.price, pfp.quantity, pfp.unitprice, pfp.remise_percent, pfp.remise, pfp.tva_tx, pfp.fk_availability, pfp.charges, pfp.unitcharges, pfp.info_bits, pfp.delivery_time_days, pfp.supplier_reputation";
         $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).")";
+        $sql.= " WHERE pfp.entity IN (".getEntity('productprice', 1).")";
         $sql.= " AND pfp.fk_soc = s.rowid";
         $sql.= " AND s.status=1"; // only enabled company selected
         $sql.= " AND pfp.fk_product = ".$prodid;

+ 5 - 4
htdocs/fourn/commande/card.php

@@ -1030,7 +1030,7 @@ if (empty($reshook))
 							$num = count($lines);
 
 							$productsupplier = new ProductFournisseur($db);
-							
+						
 							for($i = 0; $i < $num; $i ++)
 							{
 
@@ -1040,7 +1040,7 @@ if (empty($reshook))
 								$label = (! empty($lines[$i]->label) ? $lines[$i]->label : '');
 								$desc = (! empty($lines[$i]->desc) ? $lines[$i]->desc : $lines[$i]->libelle);
 								$product_type = (! empty($lines[$i]->product_type) ? $lines[$i]->product_type : 0);
-
+	
 								// Reset fk_parent_line for no child products and special product
 								if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) {
 									$fk_parent_line = 0;
@@ -1055,7 +1055,7 @@ if (empty($reshook))
 								}
 
 								$result = $productsupplier->find_min_price_product_fournisseur($lines[$i]->fk_product, $lines[$i]->qty);
-								if ($result>0) 
+								if ($result>=0) 
 								{
 								    $tva_tx = $lines[$i]->tva_tx;
 								    
@@ -1073,7 +1073,7 @@ if (empty($reshook))
 										$tva_tx,
 										$lines[$i]->localtax1_tx,
 										$lines[$i]->localtax2_tx,
-										$lines[$i]->fk_product,
+										$lines[$i]->fk_product > 0 ? $lines[$i]->fk_product : 0,
 										$productsupplier->product_fourn_price_id,
 										$productsupplier->ref_supplier,
 										$lines[$i]->remise_percent,
@@ -1088,6 +1088,7 @@ if (empty($reshook))
 										$lines[$i]->fk_unit
 									);
 								}
+									
 								if ($result < 0) {
 									$error++;
 									break;

+ 1 - 1
htdocs/fourn/commande/list.php

@@ -252,7 +252,7 @@ if ($status)
     if ($status == '6,7') $title.=' - '.$langs->trans("StatusOrderCanceled");
     else $title.=' - '.$langs->trans($commandestatic->statuts[$status]);
 }
-if ($billed) $title.=' - '.$langs->trans("Billed");
+if ($billed > 0) $title.=' - '.$langs->trans("Billed");
 
 //$help_url="EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes";
 $help_url='';

+ 2 - 2
htdocs/fourn/facture/card.php

@@ -1869,8 +1869,8 @@ else
         print '</td></tr>';
 
         // Label
-        print '<tr><td>'.$form->editfieldkey("Label",'label',$object->label,$object,($user->rights->fournisseur->facture->creer)).'</td>';
-        print '<td colspan="3">'.$form->editfieldval("Label",'label',$object->label,$object,($user->rights->fournisseur->facture->creer)).'</td>';
+        print '<tr><td>'.$form->editfieldkey("Label",'libelle',$object->label,$object,($user->rights->fournisseur->facture->creer)).'</td>';
+        print '<td colspan="3">'.$form->editfieldval("Label",'libelle',$object->label,$object,($user->rights->fournisseur->facture->creer)).'</td>';
 
         /*
          * List of payments

+ 3 - 5
htdocs/fourn/facture/list.php

@@ -82,10 +82,9 @@ $year = GETPOST("year","int");
 $day_lim	= GETPOST('day_lim','int');
 $month_lim	= GETPOST('month_lim','int');
 $year_lim	= GETPOST('year_lim','int');
-$filter = GETPOST("filtre");
 $optioncss = GETPOST('optioncss','alpha');
 
-if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter"))		// Both test must be present to be compatible with all browsers
+if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter") || GETPOST("button_removefilter.x"))		// All test must be present to be compatible with all browsers
 {
     $search_all="";
 	$search_ref="";
@@ -225,7 +224,7 @@ if ($search_amount_all_tax != '')
 	$sql .= natural_search('fac.total_ttc', $search_amount_all_tax, 1);
 }
 
-if ($search_status != '' && $search_status>=0)
+if ($search_status != '' && $search_status >= 0)
 {
 	$sql.= " AND fac.fk_statut = ".$search_status;
 }
@@ -273,7 +272,6 @@ if ($resql)
 	if ($search_company)      	$param.='&search_company='.urlencode($search_company);
 	if ($search_amount_no_tax)	$param.='&search_amount_no_tax='.urlencode($search_amount_no_tax);
 	if ($search_amount_all_tax)	$param.='&search_amount_all_tax='.urlencode($search_amount_all_tax);
-	if ($filter && $filter != -1) $param.='&filtre='.urlencode($filter);
 	if ($optioncss != '')       $param.='&optioncss='.$optioncss;
 	if ($search_status >= 0)  	$param.="&search_status=".$search_status;
 
@@ -347,7 +345,7 @@ if ($resql)
 	print '<input class="flat" type="text" size="6" name="search_amount_all_tax" value="'.$search_amount_all_tax.'">';
 	print '</td><td class="liste_titre" align="right">';
 	$liststatus=array('0'=>$langs->trans("Draft"),'1'=>$langs->trans("Unpaid"), '2'=>$langs->trans("Paid"));
-	print $form->selectarray('filtre', $liststatus, $search_status, 1);
+	print $form->selectarray('search_status', $liststatus, $search_status, 1);
 	print '</td>';
     print '<td class="liste_titre" align="right">';
     $searchpitco=$form->showFilterAndCheckAddButtons(0);

+ 5 - 1
htdocs/imports/import.php

@@ -634,6 +634,10 @@ if ($step == 4 && $datatoimport)
         }
         
     }
+	
+	if (GETPOST('update')) {
+		$array_match_file_to_database=array();
+	}
 
 	// Load source fields in input file
 	$fieldssource=array();
@@ -757,7 +761,7 @@ if ($step == 4 && $datatoimport)
 		print '<input type="text" size="1" name="separator" value="'.htmlentities($separator).'"/>';
 		print '&nbsp;&nbsp;&nbsp;&nbsp;'.$langs->trans("Enclosure").' : ';
 		print '<input type="text" size="1" name="enclosure" value="'.htmlentities($enclosure).'"/>';
-		print '<input type="submit" value="'.$langs->trans('Update').'" class="button" />';
+		print '<input name="update" type="submit" value="'.$langs->trans('Update').'" class="button" />';
 		print '</form>';
 		print '</td></tr>';
     }

+ 1 - 0
htdocs/install/mysql/migration/3.8.0-3.9.0.sql

@@ -610,3 +610,4 @@ INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (14
 
 -- VMYSQL4.1 ALTER TABLE llx_c_type_resource CHANGE COLUMN rowid rowid integer NOT NULL AUTO_INCREMENT;
 
+ALTER TABLE llx_import_model MODIFY COLUMN type varchar(50);

+ 2 - 0
htdocs/install/mysql/migration/3.9.0-4.0.0.sql

@@ -501,3 +501,5 @@ CREATE TABLE llx_oauth_state (
     fk_adherent integer,
     entity integer
 )ENGINE=InnoDB;
+
+ALTER TABLE llx_import_model MODIFY COLUMN type varchar(50);

+ 1 - 1
htdocs/install/mysql/tables/llx_import_model.sql

@@ -23,6 +23,6 @@ create table llx_import_model
   	rowid         integer AUTO_INCREMENT PRIMARY KEY,
 	fk_user		  integer DEFAULT 0 NOT NULL,
   	label         varchar(50) NOT NULL,
-  	type		  varchar(20) NOT NULL,
+  	type		  varchar(50) NOT NULL,
   	field         text NOT NULL
 )ENGINE=innodb;

+ 4 - 4
htdocs/langs/en_US/accountancy.lang

@@ -3,9 +3,9 @@ ACCOUNTING_EXPORT_SEPARATORCSV=Column separator for export file
 ACCOUNTING_EXPORT_DATE=Date format for export file
 ACCOUNTING_EXPORT_PIECE=Export the number of piece
 ACCOUNTING_EXPORT_GLOBAL_ACCOUNT=Export with global account
-ACCOUNTING_EXPORT_LABEL=Export the label
-ACCOUNTING_EXPORT_AMOUNT=Export the amount
-ACCOUNTING_EXPORT_DEVISE=Export the devise
+ACCOUNTING_EXPORT_LABEL=Export label
+ACCOUNTING_EXPORT_AMOUNT=Export amount
+ACCOUNTING_EXPORT_DEVISE=Export currency
 Selectformat=Select the format for the file
 ACCOUNTING_EXPORT_PREFIX_SPEC=Specify the prefix for the file name
  
@@ -183,4 +183,4 @@ Formula=Formula
 
 ## Error
 ErrorNoAccountingCategoryForThisCountry=No accounting category are available for this country
-ExportNotSupported=The export format setuped is not supported into this page
+ExportNotSupported=The export format setuped is not supported into this page

+ 56 - 53
htdocs/langs/en_US/admin.lang

@@ -2,8 +2,8 @@
 Foundation=Foundation
 Version=Version
 VersionProgram=Version program
-VersionLastInstall=Version initial install
-VersionLastUpgrade=Version last upgrade
+VersionLastInstall=Initial install version
+VersionLastUpgrade=Latest version upgrade
 VersionExperimental=Experimental
 VersionDevelopment=Development
 VersionUnknown=Unknown
@@ -145,8 +145,8 @@ Boxes=Widgets
 MaxNbOfLinesForBoxes=Max number of lines for widgets
 PositionByDefault=Default order
 Position=Position
-MenusDesc=Menus managers define content of the 2 menu bars (horizontal bar and vertical bar). 
-MenusEditorDesc=The menu editor allow you to define personalized entries in menus. Use it carefully to avoid making dolibarr unstable and menu entries permanently unreachable.<br>Some modules add entries in the menus (in menu <b>All</b> in most cases). If you removed some of these entries by mistake, you can restore them by disabling and reenabling the module.
+MenusDesc=Menu managers set content of the two menu bars (horizontal and vertical).
+MenusEditorDesc=The menu editor allows you to define custom menu entries. Use it carefully to avoid instability and permanently unreachable menu entries.<br />Some modules add menu entries (in menu <b>All</b> mostly). If you remove some of these entries by mistake, you can restore them disabling and reenabling the module.
 MenuForUsers=Menu for users
 LangFile=.lang file
 System=System
@@ -154,13 +154,13 @@ SystemInfo=System information
 SystemToolsArea=System tools area
 SystemToolsAreaDesc=This area provides administration features. Use the menu to choose the feature you're looking for.
 Purge=Purge
-PurgeAreaDesc=This page allows you to delete all files built or stored by Dolibarr (temporary files or all files in <b>%s</b> directory). Using this feature is not necessary. It is provided for users whose Dolibarr is hosted by a provider that does not offer permissions to delete files built by the web server.
-PurgeDeleteLogFile=Delete log file <b>%s</b> defined for Syslog module (no risk to loose data)
-PurgeDeleteTemporaryFiles=Delete all temporary files (no risk to loose data)
+PurgeAreaDesc=This page allows you to delete all files generated or stored by Dolibarr (temporary files or all files in <b>%s</b> directory). Using this feature is not necessary. It is provided as a workaround for users whose Dolibarr is hosted by a provider that does not offer permissions to delete files generated by the web server.
+PurgeDeleteLogFile=Delete log file <b>%s</b> defined for Syslog module (no risk of losing data)
+PurgeDeleteTemporaryFiles=Delete all temporary files (no risk of losing data)
 PurgeDeleteTemporaryFilesShort=Delete temporary files
 PurgeDeleteAllFilesInDocumentsDir=Delete all files in directory <b>%s</b>. Temporary files but also database backup dumps, files attached to elements (third parties, invoices, ...) and uploaded into the ECM module will be deleted.
 PurgeRunNow=Purge now
-PurgeNothingToDelete=No directory or file to delete.
+PurgeNothingToDelete=No directory or files to delete.
 PurgeNDirectoriesDeleted=<b>%s</b> files or directories deleted.
 PurgeAuditEvents=Purge all security events
 ConfirmPurgeAuditEvents=Are you sure you want to purge all security events ? All security logs will be deleted, no other data will be removed.
@@ -210,12 +210,12 @@ OnlyActiveElementsAreShown=Only elements from <a href="%s">enabled modules</a> a
 ModulesDesc=Dolibarr modules define which functionality is enabled in software. Some modules require permissions you must grant to users, after enabling module. Click on button on/off in column "Status" to enable a module/feature.
 ModulesInterfaceDesc=The Dolibarr modules interface allows you to add features depending on external software, systems or services.
 ModulesSpecialDesc=Special modules are very specific or seldom used modules.
-ModulesJobDesc=Business modules provide simple predefined setup of Dolibarr for a particular business.
-ModulesMarketPlaceDesc=You can find more modules to download on external web sites on the Internet...
+ModulesJobDesc=Business modules provide simple preconfigured setup of Dolibarr for specific businesses.
+ModulesMarketPlaceDesc=You can find more modules to download on external websites on the Internet...
 ModulesMarketPlaces=More modules...
 DoliStoreDesc=DoliStore, the official market place for Dolibarr ERP/CRM external modules
-DoliPartnersDesc=List with some companies that can provide/develop on-demand modules or features (Note: any Open Source company knowning PHP language can provide you specific development)  
-WebSiteDesc=Web site providers you can search to find more modules...
+DoliPartnersDesc=List of companies providing custom developed modules or features (Note: anyone experienced in PHP programming can provide custom development for an open source project)
+WebSiteDesc=Reference websites to find more modules...
 URL=Link
 BoxesAvailable=Widgets available
 BoxesActivated=Widgets activated
@@ -312,8 +312,8 @@ InfDirAlt=Since version 3 it is possible to define an alternative root directory
 InfDirExample=<br>Then declare it in the file conf.php<br> $dolibarr_main_url_root_alt='http://myserver/custom'<br>$dolibarr_main_document_root_alt='/path/of/dolibarr/htdocs/custom'<br>*These lines are commented with "#", to uncomment only remove the character.
 YouCanSubmitFile=For this step, you can send package using this tool: Select module file
 CurrentVersion=Dolibarr current version
-CallUpdatePage=Go to the page that updates the database structure and datas: %s.
-LastStableVersion=Last stable version
+CallUpdatePage=Go to the page that updates the database structure and data: %s.
+LastStableVersion=Latest stable version
 UpdateServerOffline=Update server offline
 GenericMaskCodes=You may enter any numbering mask. In this mask, the following tags could be used:<br><b>{000000}</b> corresponds to a number which will be incremented on each %s. Enter as many zeros as the desired length of the counter. The counter will be completed by zeros from the left in order to have as many zeros as the mask. <br><b>{000000+000}</b> same as previous but an offset corresponding to the number to the right of the + sign is applied starting on first %s. <br><b>{000000@x}</b> same as previous but the counter is reset to zero when month x is reached (x between 1 and 12, or 0 to use the early months of fiscal year defined in your configuration, or 99 to reset to zero every month). If this option is used and x is 2 or higher, then sequence {yy}{mm} or {yyyy}{mm} is also required. <br><b>{dd}</b> day (01 to 31).<br><b>{mm}</b> month (01 to 12).<br><b>{yy}</b>, <b>{yyyy}</b> or <b>{y}</b> year over 2, 4 or 1 numbers. <br>
 GenericMaskCodes2=<b>{cccc}</b> the client code on n characters<br><b>{cccc000}</b> the client code on n characters is followed by a counter dedicated for customer. This counter dedicated to customer is reset at same time than global counter.<br><b>{tttt}</b> The code of thirdparty type on n characters (see dictionary-thirdparty types).<br>
@@ -367,7 +367,7 @@ PDFAddressForging=Rules to forge address boxes
 HideAnyVATInformationOnPDF=Hide all information related to VAT on generated PDF
 HideDescOnPDF=Hide products description on generated PDF
 HideRefOnPDF=Hide products ref. on generated PDF
-HideDetailsOnPDF=Hide products lines details on generated PDF
+HideDetailsOnPDF=Hide product lines details on generated PDF
 PlaceCustomerAddressToIsoLocation=Use french standard position (La Poste) for customer address position
 Library=Library
 UrlGenerationParameters=Parameters to secure URLs
@@ -401,8 +401,8 @@ ExtrafieldParamHelpcheckbox=Parameters list have to be like key,value<br><br> fo
 ExtrafieldParamHelpradio=Parameters list have to be like key,value<br><br> for example : <br>1,value1<br>2,value2<br>3,value3<br>...
 ExtrafieldParamHelpsellist=Parameters list comes from a table<br>Syntax : table_name:label_field:id_field::filter<br>Example : c_typent:libelle:id::filter<br><br>filter can be a simple test (eg active=1) to display only active value<br>You can also use $ID$ in filter witch is the current id of current object<br>To do a SELECT in filter use $SEL$<br>if you want to filter on extrafields use syntaxt  extra.fieldcode=... (where field code is the code of extrafield)<br><br>In order to have the list depending on another :<br>c_typent:libelle:id:parent_list_code|parent_column:filter 
 ExtrafieldParamHelpchkbxlst=Parameters list comes from a table<br>Syntax : table_name:label_field:id_field::filter<br>Example : c_typent:libelle:id::filter<br><br>filter can be a simple test (eg active=1) to display only active value<br>You can also use $ID$ in filter witch is the current id of current object<br>To do a SELECT in filter use $SEL$<br>if you want to filter on extrafields use syntaxt  extra.fieldcode=... (where field code is the code of extrafield)<br><br>In order to have the list depending on another :<br>c_typent:libelle:id:parent_list_code|parent_column:filter
-ExtrafieldParamHelplink=Parameters must be ObjectName:Classpath<br>Syntax : ObjectName:Classpath<br>Example : Societe:societe/class/societe.class.php  
-LibraryToBuildPDF=Library used to build PDF
+ExtrafieldParamHelplink=Parameters must be ObjectName:Classpath<br>Syntax : ObjectName:Classpath<br>Example : Societe:societe/class/societe.class.php
+LibraryToBuildPDF=Library used for PDF generation
 WarningUsingFPDF=Warning: Your <b>conf.php</b> contains directive <b>dolibarr_pdf_force_fpdf=1</b>. This means you use the FPDF library to generate PDF files. This library is old and does not support a lot of features (Unicode, image transparency, cyrillic, arab and asiatic languages, ...), so you may experience errors during PDF generation.<br>To solve this and have a full support of PDF generation, please download <a href="http://www.tcpdf.org/" target="_blank">TCPDF library</a>, then comment or remove the line <b>$dolibarr_pdf_force_fpdf=1</b>, and add instead <b>$dolibarr_lib_TCPDF_PATH='path_to_TCPDF_dir'</b>   
 LocalTaxDesc=Some countries apply 2 or 3 taxes on each invoice line. If this is the case, choose type for second and third tax and its rate. Possible type are:<br>1 : local tax apply on products and services without vat (localtax is calculated on amount without tax)<br>2 : local tax apply on products and services including vat (localtax is calculated on amount + main tax)<br>3 : local tax apply on products without vat (localtax is calculated on amount without tax)<br>4 : local tax apply on products including vat (localtax is calculated on amount + main vat)<br>5 : local tax apply on services without vat (localtax is calculated on amount without tax)<br>6 : local tax apply on services including vat (localtax is calculated on amount + tax)
 SMS=SMS
@@ -424,12 +424,13 @@ AllBarcodeReset=All barcode values have been removed
 NoBarcodeNumberingTemplateDefined=No numbering barcode template enabled into barcode module setup.
 NoRecordWithoutBarcodeDefined=No record with no barcode value defined.
 EnableFileCache=Enable file cache
-ShowDetailsInPDFPageFoot=Add more details into footer of PDF files, like your company address, or manager names (to complete professional ids, capital and VAT number).
+ShowDetailsInPDFPageFoot=Add more details into footer of PDF files, like your company address, or manager names (to complete professional ids, company capital and VAT number).
 NoDetails=No more details in footer
 DisplayCompanyInfo=Display company address
 DisplayCompanyManager=Display manager names
-DisplayCompanyInfoAndManagers=Display company and manager names 
-  
+DisplayCompanyInfoAndManagers=Display company and manager names
+EnableAndSetupModuleCron=If you want to have this recurring invoice beeing generated automatically, module *%s* must be enabled and correctly setup. Otherwise, generation of invoices must be done manually from this template with button *Create*. Note that even if you enabled automatic generation, you can still safely launch manual generation. Duplicates generation for same period are not possible. 
+
 # Modules
 Module0Name=Users & groups
 Module0Desc=Users and groups management
@@ -492,15 +493,15 @@ Module200Desc=LDAP directory synchronisation
 Module210Name=PostNuke
 Module210Desc=PostNuke integration
 Module240Name=Data exports
-Module240Desc=Tool to export Dolibarr datas (with assistants)
+Module240Desc=Tool to export Dolibarr data (with assistants)
 Module250Name=Data imports
-Module250Desc=Tool to import datas in Dolibarr  (with assistants)
+Module250Desc=Tool to import data in Dolibarr  (with assistants)
 Module310Name=Members
 Module310Desc=Foundation members management
 Module320Name=RSS Feed
 Module320Desc=Add RSS feed inside Dolibarr screen pages
 Module330Name=Bookmarks
-Module330Desc=Bookmark management
+Module330Desc=Bookmarks management
 Module400Name=Projects/Opportunities/Leads
 Module400Desc=Management of projects, opportunities or leads. You can then assign any element (invoice, order, proposal, intervention, ...) to a project and get a transversal view from the project view.
 Module410Name=Webcalendar
@@ -549,7 +550,7 @@ Module2800Desc=FTP Client
 Module2900Name=GeoIPMaxmind
 Module2900Desc=GeoIP Maxmind conversions capabilities
 Module3100Name=Skype
-Module3100Desc=Add a Skype button into card of users / third parties / contacts / members
+Module3100Desc=Add a Skype button into users / third parties / contacts / members cards
 Module4000Name=HRM
 Module4000Desc=Human resources management
 Module5000Name=Multi-company
@@ -607,7 +608,7 @@ Permission71=Read members
 Permission72=Create/modify members
 Permission74=Delete members
 Permission75=Setup types of membership
-Permission76=Export datas
+Permission76=Export data
 Permission78=Read subscriptions
 Permission79=Create/modify subscriptions
 Permission81=Read customers orders
@@ -817,15 +818,15 @@ Permission55002=Create/modify polls
 Permission59001=Read commercial margins
 Permission59002=Define commercial margins
 Permission59003=Read every user margin
-DictionaryCompanyType=Thirdparties type
-DictionaryCompanyJuridicalType=Juridical kinds of thirdparties
+DictionaryCompanyType=Types of thirdparties
+DictionaryCompanyJuridicalType=Legal forms of thirdparties
 DictionaryProspectLevel=Prospect potential level
 DictionaryCanton=State/Province
 DictionaryRegion=Regions
 DictionaryCountry=Countries
 DictionaryCurrency=Currencies
-DictionaryCivility=Civility title
-DictionaryActions=Type of agenda events
+DictionaryCivility=Personal and professional titles
+DictionaryActions=Types of agenda events
 DictionarySocialContributions=Social or fiscal taxes types
 DictionaryVAT=VAT Rates or Sales Tax Rates
 DictionaryRevenueStamp=Amount of revenue stamps
@@ -834,7 +835,7 @@ DictionaryPaymentModes=Payment modes
 DictionaryTypeContact=Contact/Address types
 DictionaryEcotaxe=Ecotax (WEEE)
 DictionaryPaperFormat=Paper formats
-DictionaryFees=Type of fees
+DictionaryFees=Types of fees
 DictionarySendingMethods=Shipping methods
 DictionaryStaff=Staff
 DictionaryAvailability=Delivery delay
@@ -845,14 +846,14 @@ DictionaryAccountancysystem=Models for chart of accounts
 DictionaryEMailTemplates=Emails templates
 DictionaryUnits=Units
 DictionaryProspectStatus=Prospection status
-DictionaryHolidayTypes=Type of leaves
+DictionaryHolidayTypes=Types of leaves
 DictionaryOpportunityStatus=Opportunity status for project/lead
 SetupSaved=Setup saved
 BackToModuleList=Back to modules list
 BackToDictionaryList=Back to dictionaries list
 VATReceivedOnly=Special rate not charged
 VATManagement=VAT Management
-VATIsUsedDesc=The VAT rate by default when creating prospects, invoices, orders etc follow the active standard rule:<br>If the seller is not subjected to VAT, then VAT by default=0. End of rule.<br>If the (selling country= buying country), then the VAT by default=VAT of the product in the selling country. End of rule. <br>If seller and buyer in the European Community and goods are transport products (car, ship, plane), the default VAT=0 ( The VAT should be paid by the buyer at the customoffice of his country and not at the seller). End of rule.<br>If seller and buyer in the European Community and buyer is not a company, then the VAT by default=VAT of product sold.  End of rule.<br>If seller and buyer in the European Community and buyer is a company, then the VAT by default=0. End of rule.<br>Else the proposed default VAT=0. End of rule.
+VATIsUsedDesc=By default when creating prospects, invoices, orders etc the VAT rate follows the active standard rule:<br>If the seller is not subjected to VAT, then VAT defaults to 0. End of rule.<br>If the (selling country= buying country), then the VAT by default equals the VAT of the product in the selling country. End of rule. <br>If seller and buyer are both in the European Community and goods are transport products (car, ship, plane), the default VAT is 0 ( The VAT should be paid by the buyer to the customoffice of his country and not to the seller). End of rule.<br>If seller and buyer are both in the European Community and the buyer is not a company, then the VAT by defaults to the VAT of the product sold.  End of rule.<br>If seller and buyer are both in the European Community and the buyer is a company, then the VAT is 0 by default . End of rule.<br>In any othe case the proposed default is VAT=0. End of rule.
 VATIsNotUsedDesc=By default the proposed VAT is 0 which can be used for cases like associations, individuals ou small companies.
 VATIsUsedExampleFR=In France, it means companies or organisations having a real fiscal system (Simplified real or normal real).  A system in which VAT is declared.
 VATIsNotUsedExampleFR=In France, it means associations that are non VAT declared or companies, organisations or liberal professions that have chosen the micro enterprise fiscal system (VAT in franchise) and paid a franchise VAT without any VAT declaration.  This choice will display the reference "Non applicable VAT - art-293B of CGI" on invoices.
@@ -978,10 +979,10 @@ DelayBeforeWarning=Delay before warning
 DelaysBeforeWarning=Delays before warning
 DelaysOfToleranceBeforeWarning=Tolerance delays before warning
 DelaysOfToleranceDesc=This screen allows you to define the tolerated delays before an alert is reported on screen with picto %s for each late element.
-Delays_MAIN_DELAY_ACTIONS_TODO=Delay tolerance (in days) before alert on planned events not yet realised
-Delays_MAIN_DELAY_TASKS_TODO=Delay tolerance (in days) before alert on planned tasks not yet realised
-Delays_MAIN_DELAY_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on orders not yet processed
-Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on suppliers orders not yet processed
+Delays_MAIN_DELAY_ACTIONS_TODO=Delay tolerance (in days) before alert on planned events not completed yet
+Delays_MAIN_DELAY_TASKS_TODO=Delay tolerance (in days) before alert on planned tasks not completed yet
+Delays_MAIN_DELAY_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on orders not processed yet
+Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=Delay tolerance (in days) before alert on suppliers orders not processed yet
 Delays_MAIN_DELAY_PROPALS_TO_CLOSE=Delay tolerance (in days) before alert on proposals to close
 Delays_MAIN_DELAY_PROPALS_TO_BILL=Delay tolerance (in days) before alert on proposals not billed
 Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=Tolerance delay (in days) before alert on services to activate
@@ -992,21 +993,21 @@ Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Tolerance delay (in days) before al
 Delays_MAIN_DELAY_MEMBERS=Tolerance delay (in days) before alert on delayed membership fee
 Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Tolerance delay (in days) before alert for cheques deposit to do
 Delays_MAIN_DELAY_EXPENSEREPORTS=Tolerance delay (in days) before alert for expense reports to approve
-SetupDescription1=All parameters available in the setup area allow you to setup Dolibarr before starting using it.
-SetupDescription2=The 2 most important setup steps are the 2 first ones in the left setup menu, this means Company/foundation setup page and Modules setup page:
-SetupDescription3=Parameters in menu <a href="%s">Setup -> Company/foundation</a> are required because input information is used on Dolibarr displays and to modify Dolibarr behaviour (for example for features related to your country).
-SetupDescription4=Parameters in menu <a href="%s">Setup -> Modules</a> are required because Dolibarr is not a fixed ERP/CRM but a sum of several modules, all more or less independant. It's only after activating modules you're interesting in that you will see features appeared in menus.
+SetupDescription1=The setup area is for initial setup parameters before starting to use Dolibarr.
+SetupDescription2=The two most important setup steps are the first two in the setup menu on the left: Company/foundation setup page and Modules setup page:
+SetupDescription3=Parameters in menu <a href="%s">Setup -> Company/foundation</a> are required because submitted data are used on Dolibarr displays and to customize the default behaviour of the software (for country-related features for example).
+SetupDescription4=Parameters in menu <a href="%s">Setup -> Modules</a> are required because Dolibarr is not a monolithic ERP/CRM but a collection of several modules, all more or less independent. New features will be added to menus for every module you'll enable.
 SetupDescription5=Other menu entries manage optional parameters.
 EventsSetup=Setup for events logs
 LogEvents=Security audit events
 Audit=Audit
-InfoDolibarr=Infos Dolibarr
-InfoBrowser=Infos Browser
-InfoOS=Infos OS
-InfoWebServer=Infos web server
-InfoDatabase=Infos database
-InfoPHP=Infos PHP
-InfoPerf=Infos performances
+InfoDolibarr=About Dolibarr
+InfoBrowser=About Browser
+InfoOS=About OS
+InfoWebServer=About Web Server
+InfoDatabase=About Database
+InfoPHP=About PHP
+InfoPerf=About Performances
 BrowserName=Browser name
 BrowserOS=Browser OS
 ListEvents=Audit events
@@ -1030,10 +1031,10 @@ TriggerDisabledAsModuleDisabled=Triggers in this file are disabled as module <b>
 TriggerAlwaysActive=Triggers in this file are always active, whatever are the activated Dolibarr modules.
 TriggerActiveAsModuleActive=Triggers in this file are active as module <b>%s</b> is enabled.
 GeneratedPasswordDesc=Define here which rule you want to use to generate new password if you ask to have auto generated password
-DictionaryDesc=Define here all reference datas. You can complete predefined value with yours.
-ConstDesc=This page allows you to edit all other parameters not available in previous pages. They are reserved parameters for advanced developers or for troubleshouting.
+DictionaryDesc=Insert all reference data. You can add your values to the default.
+ConstDesc=This page allows you to edit all other parameters not available in previous pages. These are mostly reserved parameters for developers or advanced troubleshooting.
 OnceSetupFinishedCreateUsers=Warning, you are a Dolibarr administrator user. Administrator users are used to setup Dolibarr. For a usual usage of Dolibarr, it is recommended to use a non administrator user created from Users & Groups menu.
-MiscellaneousDesc=Define here all other parameters related to security.
+MiscellaneousDesc=All other security related parameters are defined here.
 LimitsSetup=Limits/Precision setup
 LimitsDesc=You can define limits, precisions and optimisations used by Dolibarr here
 MAIN_MAX_DECIMALS_UNIT=Max decimals for unit prices
@@ -1103,8 +1104,8 @@ PathToDocuments=Path to documents
 PathDirectory=Directory
 SendmailOptionMayHurtBuggedMTA=Feature to send mails using method "PHP mail direct" will generate a mail message that might be not correctly parsed by some receiving mail servers. Result is that some mails can't be read by people hosted by those bugged platforms. It's case for some Internet providers (Ex: Orange in France). This is not a problem into Dolibarr nor into PHP but onto receiving mail server. You can however add option MAIN_FIX_FOR_BUGGED_MTA to 1 into setup - other to modify Dolibarr to avoid this. However, you may experience problem with other servers that respect strictly the SMTP standard. The other solution (recommended) is to use the method "SMTP socket library" that has no disadvantages.
 TranslationSetup=Configuration de la traduction
-TranslationDesc=Choice of language visible on screen can be modified:<br>* Globally from menu <strong>Home - Setup - Display</strong><br>* For user only from tab <strong>User display</strong> of user card (click on login on top of screen). 
-TranslationOverwriteDesc=You can also overwrite some value by completing/editing the following table. You must use for "%s" the language code, for "%s" the key found into file langs/xx_XX/somefile.lang and "%s" the new value you want to use as new translation. 
+TranslationDesc=How to set displayed application language<br>* Systemwide: menu <strong>Home - Setup - Display</strong><br>* Per user: <strong>User display setup</strong> tab of user card (click on username at the top of the screen).
+TranslationOverwriteDesc=You can also override strings filling the following table. Choose your language from "%s" dropdown, insert the key string found in the lang file (langs/xx_XX/somefile.lang) into "%s" and your new translation into "%s".
 TotalNumberOfActivatedModules=Total number of activated feature modules: <b>%s</b> / <b>%s</b>
 YouMustEnableOneModule=You must at least enable 1 module
 ClassNotFoundIntoPathWarning=Class %s not found into PHP path
@@ -1526,6 +1527,7 @@ MenuDeleted=Menu deleted
 TreeMenu=Tree menus
 Menus=Menus
 TreeMenuPersonalized=Personalized menus
+NotTopTreeMenuPersonalized=Personalized menus not linked to a top menu entry
 NewMenu=New menu
 MenuConf=Menus setup
 Menu=Selection of menu
@@ -1750,4 +1752,5 @@ AddModels=Add document or numbering templates
 AddSubstitutions=Add keys substitutions
 DetectionNotPossible=Detection not possible
 UrlToGetKeyToUseAPIs=Url to get token to use API (once token has been received it is saved on database user table and will be checked on each future access) 
-ListOfAvailableAPIs=List of available APIs
+ListOfAvailableAPIs=List of available APIs
+activateModuleDependNotSatisfied=Module "%s" depends on module "%s" that is missing, so module "%1$s" may not work correclty. Please install module "%2$s" or disable module "%1$s" if you want to be safe from any surprise

+ 3 - 3
htdocs/langs/en_US/agenda.lang

@@ -81,8 +81,8 @@ AgendaUrlOptions2=<b>login=%s</b> to restrict output to actions created by or as
 AgendaUrlOptions3=<b>logina=%s</b> to restrict output to actions owned by a user <b>%s</b>.
 AgendaUrlOptions4=<b>logint=%s</b> to restrict output to actions assigned to user <b>%s</b>.
 AgendaUrlOptionsProject=<b>project=PROJECT_ID</b> to restrict output to actions associated to project <b>PROJECT_ID</b>.
-AgendaShowBirthdayEvents=Show birthday's contacts
-AgendaHideBirthdayEvents=Hide birthday's contacts
+AgendaShowBirthdayEvents=Show birthdays of contacts
+AgendaHideBirthdayEvents=Hide birthdays of contacts
 Busy=Busy
 ExportDataset_event1=List of agenda events
 DefaultWorkingDays=Default working days range in week (Example: 1-5, 1-6)
@@ -110,4 +110,4 @@ EveryWeek=Every week
 EveryMonth=Every month
 DayOfMonth=Day of month
 DayOfWeek=Day of week
-DateStartPlusOne=Date start + 1 hour
+DateStartPlusOne=Date start + 1 hour

+ 3 - 3
htdocs/langs/en_US/banks.lang

@@ -127,7 +127,7 @@ ConfirmValidateCheckReceipt=Are you sure you want to validate this check receipt
 DeleteCheckReceipt=Delete this check receipt ?
 ConfirmDeleteCheckReceipt=Are you sure you want to delete this check receipt ?
 BankChecks=Bank checks
-BankChecksToReceipt=Checks waiting for deposit
+BankChecksToReceipt=Checks awaiting deposit
 ShowCheckReceipt=Show check deposit receipt
 NumberOfCheques=Nb of check
 DeleteTransaction=Delete transaction
@@ -141,9 +141,9 @@ ExportDataset_banque_1=Bank transactions and account statement
 ExportDataset_banque_2=Deposit slip
 TransactionOnTheOtherAccount=Transaction on the other account
 TransactionWithOtherAccount=Account transfer
-PaymentNumberUpdateSucceeded=Payment number updated succesfully
+PaymentNumberUpdateSucceeded=Payment number updated successfully
 PaymentNumberUpdateFailed=Payment number could not be updated
-PaymentDateUpdateSucceeded=Payment date update succesfully
+PaymentDateUpdateSucceeded=Payment date updated successfully
 PaymentDateUpdateFailed=Payment date could not be updated
 Transactions=Transactions
 BankTransactionLine=Bank transaction

+ 16 - 16
htdocs/langs/en_US/bills.lang

@@ -11,7 +11,7 @@ BillsSuppliersUnpaidForCompany=Unpaid supplier's invoices for %s
 BillsLate=Late payments
 BillsStatistics=Customers invoices statistics
 BillsStatisticsSuppliers=Suppliers invoices statistics
-DisabledBecauseNotErasable=Disabled because can not be erased
+DisabledBecauseNotErasable=Disabled because cannot be erased
 InvoiceStandard=Standard invoice
 InvoiceStandardAsk=Standard invoice
 InvoiceStandardDesc=This kind of invoice is the common invoice.
@@ -319,27 +319,27 @@ FrequencyPer_m=Every %s months
 FrequencyPer_y=Every %s years
 toolTipFrequency=Examples:<br /><b>Set 7 / day</b>: give a new invoice every 7 days<br /><b>Set 3 / month</b>: give a new invoice every 3 month
 NextDateToExecution=Date for next invoice generation
-DateLastGeneration=Date of last generation
+DateLastGeneration=Date of latest generation
 MaxPeriodNumber=Max nb of invoice generation
 NbOfGenerationDone=Nb of invoice generation already done
-InvoiceAutoValidate=Automatically validate invoice
+InvoiceAutoValidate=Validate invoices automatically
 GeneratedFromRecurringInvoice=Generated from template recurring invoice %s
-DateIsNotEnough=Date not yet reached
+DateIsNotEnough=Date not reached yet
 InvoiceGeneratedFromTemplate=Invoice %s generated from recurring template invoice %s
 # PaymentConditions
 PaymentConditionShortRECEP=Immediate
 PaymentConditionRECEP=Immediate
 PaymentConditionShort30D=30 days
 PaymentCondition30D=30 days
-PaymentConditionShort30DENDMONTH=30 days end of month
-PaymentCondition30DENDMONTH=30 days end of month
+PaymentConditionShort30DENDMONTH=30 days of month-end
+PaymentCondition30DENDMONTH=Within 30 days following the end of the month
 PaymentConditionShort60D=60 days
 PaymentCondition60D=60 days
-PaymentConditionShort60DENDMONTH=60 days end of month
-PaymentCondition60DENDMONTH=60 days end of month
+PaymentConditionShort60DENDMONTH=60 days of month-end
+PaymentCondition60DENDMONTH=Within 60 days following the end of the month
 PaymentConditionShortPT_DELIVERY=Delivery
 PaymentConditionPT_DELIVERY=On delivery
-PaymentConditionShortPT_ORDER=On order
+PaymentConditionShortPT_ORDER=Order
 PaymentConditionPT_ORDER=On order
 PaymentConditionShortPT_5050=50-50
 PaymentConditionPT_5050=50%% in advance, 50%% on delivery
@@ -356,12 +356,12 @@ PaymentTypeCB=Credit card
 PaymentTypeShortCB=Credit card
 PaymentTypeCHQ=Check
 PaymentTypeShortCHQ=Check
-PaymentTypeTIP=Interbank Payment
-PaymentTypeShortTIP=Interbank Payment
+PaymentTypeTIP=TIP (Documents against Payment)
+PaymentTypeShortTIP=TIP Payment
 PaymentTypeVAD=On line payment
 PaymentTypeShortVAD=On line payment
-PaymentTypeTRA=Traite
-PaymentTypeShortTRA=Traite
+PaymentTypeTRA=Bank draft
+PaymentTypeShortTRA=Draft
 PaymentTypeFAC=Factor
 PaymentTypeShortFAC=Factor
 BankDetails=Bank details
@@ -369,7 +369,7 @@ BankCode=Bank code
 DeskCode=Desk code
 BankAccountNumber=Account number
 BankAccountNumberKey=Key
-Residence=Domiciliation
+Residence=Direct debit
 IBANNumber=IBAN number
 IBAN=IBAN
 BIC=BIC/SWIFT
@@ -425,7 +425,7 @@ ExpectedToPay=Expected payment
 CantRemoveConciliatedPayment=Can't remove conciliated payment
 PayedByThisPayment=Paid by this payment
 ClosePaidInvoicesAutomatically=Classify "Paid" all standard, situation or replacement invoices entirely paid.
-ClosePaidCreditNotesAutomatically=Classify "Paid" all credit notes entirely paid back. 
+ClosePaidCreditNotesAutomatically=Classify "Paid" all credit notes entirely paid back.
 AllCompletelyPayedInvoiceWillBeClosed=All invoice with no remain to pay will be automatically closed to status "Paid".
 ToMakePayment=Pay
 ToMakePaymentBack=Pay back
@@ -459,7 +459,7 @@ SituationDeduction=Situation subtraction
 Progress=Progress
 ModifyAllLines=Modify all lines
 CreateNextSituationInvoice=Create next situation
-NotLastInCycle=This invoice in not the last in cycle and must not be modified.
+NotLastInCycle=This invoice is not the latest in cycle and must not be modified.
 DisabledBecauseNotLastInCycle=The next situation already exists.
 DisabledBecauseFinal=This situation is final.
 CantBeLessThanMinPercent=The progress can't be smaller than its value in the previous situation.

+ 1 - 1
htdocs/langs/en_US/bookmarks.lang

@@ -14,6 +14,6 @@ BehaviourOnClick=Behaviour when a URL is clicked
 CreateBookmark=Create bookmark
 SetHereATitleForLink=Set a title for the bookmark
 UseAnExternalHttpLinkOrRelativeDolibarrLink=Use an external http URL or a relative Dolibarr URL
-ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choose if a page opened by link must appear on current or new window
+ChooseIfANewWindowMustBeOpenedOnClickOnBookmark=Choose if linked page must open in new window or not
 BookmarksManagement=Bookmarks management
 ListOfBookmarks=List of bookmarks

+ 51 - 51
htdocs/langs/en_US/boxes.lang

@@ -1,69 +1,69 @@
 # Dolibarr language file - Source file is en_US - boxes
 BoxLastRssInfos=Rss information
-BoxLastProducts=Last %s products/services
-BoxProductsAlertStock=Products in stock alert
-BoxLastProductsInContract=Last %s contracted products/services
-BoxLastSupplierBills=Last supplier's invoices
-BoxLastCustomerBills=Last customer's invoices
-BoxOldestUnpaidCustomerBills=Oldest unpaid customer's invoices
-BoxOldestUnpaidSupplierBills=Oldest unpaid supplier's invoices
-BoxLastProposals=Last commercial proposals
-BoxLastProspects=Last modified prospects
-BoxLastCustomers=Last modified customers
-BoxLastSuppliers=Last modified suppliers
-BoxLastCustomerOrders=Last customer orders
-BoxLastValidatedCustomerOrders=Last validated customer orders
-BoxLastBooks=Last books
-BoxLastActions=Last actions
-BoxLastContracts=Last contracts
-BoxLastContacts=Last contacts/addresses
-BoxLastMembers=Last members
-BoxFicheInter=Last interventions
+BoxLastProducts=Latest %s products/services
+BoxProductsAlertStock=Stock alerts for products
+BoxLastProductsInContract=Latest %s contracted products/services
+BoxLastSupplierBills=Latest supplier invoices
+BoxLastCustomerBills=Latest customer invoices
+BoxOldestUnpaidCustomerBills=Oldest unpaid customer invoices
+BoxOldestUnpaidSupplierBills=Oldest unpaid supplier invoices
+BoxLastProposals=Latest commercial proposals
+BoxLastProspects=Latest modified prospects
+BoxLastCustomers=Latest modified customers
+BoxLastSuppliers=Latest modified suppliers
+BoxLastCustomerOrders=Latest customer orders
+BoxLastValidatedCustomerOrders=Latest validated customer orders
+BoxLastBooks=Latest bookmarks
+BoxLastActions=Latest actions
+BoxLastContracts=Latest contracts
+BoxLastContacts=Latest contacts/addresses
+BoxLastMembers=Latest members
+BoxFicheInter=Latest interventions
 BoxCurrentAccounts=Open accounts balance
 BoxSalesTurnover=Sales turnover
 BoxTotalUnpaidCustomerBills=Total unpaid customer's invoices
 BoxTotalUnpaidSuppliersBills=Total unpaid supplier's invoices
-BoxTitleLastBooks=Last %s recorded books
+BoxTitleLastBooks=Latest %s recorded bookmarks
 BoxTitleNbOfCustomers=Number of clients
-BoxTitleLastRssInfos=Last %s news from %s
-BoxTitleLastProducts=Last %s modified products/services
+BoxTitleLastRssInfos=Latest %s news from %s
+BoxTitleLastProducts=Latest %s modified products/services
 BoxTitleProductsAlertStock=Products in stock alert
-BoxTitleLastCustomerOrders=Last %s customer orders
-BoxTitleLastModifiedCustomerOrders=Last %s modified customer orders
-BoxTitleLastSuppliers=Last %s recorded suppliers
-BoxTitleLastCustomers=Last %s recorded customers
-BoxTitleLastModifiedSuppliers=Last %s modified suppliers
-BoxTitleLastModifiedCustomers=Last %s modified customers
-BoxTitleLastCustomersOrProspects=Last %s customers or prospects
-BoxTitleLastPropals=Last %s proposals
-BoxTitleLastModifiedPropals=Last %s modified proposals
-BoxTitleLastCustomerBills=Last %s customer's invoices
-BoxTitleLastModifiedCustomerBills=Last %s modified customer invoices
-BoxTitleLastSupplierBills=Last %s supplier's invoices
-BoxTitleLastModifiedSupplierBills=Last %s modified supplier invoices
-BoxTitleLastModifiedProspects=Last %s modified prospects
-BoxTitleLastProductsInContract=Last %s products/services in a contract
-BoxTitleLastModifiedMembers=Last %s members
-BoxTitleLastFicheInter=Last %s modified intervention
+BoxTitleLastCustomerOrders=Latest %s customer orders
+BoxTitleLastModifiedCustomerOrders=Latest %s modified customer orders
+BoxTitleLastSuppliers=Latest %s recorded suppliers
+BoxTitleLastCustomers=Latest %s recorded customers
+BoxTitleLastModifiedSuppliers=Latest %s modified suppliers
+BoxTitleLastModifiedCustomers=Latest %s modified customers
+BoxTitleLastCustomersOrProspects=Latest %s customers or prospects
+BoxTitleLastPropals=Latest %s proposals
+BoxTitleLastModifiedPropals=Latest %s modified proposals
+BoxTitleLastCustomerBills=Latest %s customer's invoices
+BoxTitleLastModifiedCustomerBills=Latest %s modified customer invoices
+BoxTitleLastSupplierBills=Latest %s supplier's invoices
+BoxTitleLastModifiedSupplierBills=Latest %s modified supplier invoices
+BoxTitleLastModifiedProspects=Latest %s modified prospects
+BoxTitleLastProductsInContract=Latest %s products/services in a contract
+BoxTitleLastModifiedMembers=Latest %s members
+BoxTitleLastFicheInter=Latest %s modified interventions
 BoxTitleOldestUnpaidCustomerBills=Oldest %s unpaid customer invoices
 BoxTitleOldestUnpaidSupplierBills=Oldest %s unpaid supplier invoices
 BoxTitleCurrentAccounts=Open accounts balances
 BoxTitleSalesTurnover=Sales turnover
 BoxTitleTotalUnpaidCustomerBills=Unpaid customer invoices
 BoxTitleTotalUnpaidSuppliersBills=Unpaid supplier invoices
-BoxTitleLastModifiedContacts=Last %s modified contacts/addresses
-BoxMyLastBookmarks=My last %s bookmarks
+BoxTitleLastModifiedContacts=Latest %s modified contacts/addresses
+BoxMyLastBookmarks=My latest %s bookmarks
 BoxOldestExpiredServices=Oldest active expired services
-BoxLastExpiredServices=Last %s oldest contacts with active expired services
-BoxTitleLastActionsToDo=Last %s actions to do
-BoxTitleLastContracts=Last %s contracts
-BoxTitleLastModifiedDonations=Last %s modified donations
-BoxTitleLastModifiedExpenses=Last %s modified expense reports
+BoxLastExpiredServices=Latest %s oldest contacts with active expired services
+BoxTitleLastActionsToDo=Latest %s actions to do
+BoxTitleLastContracts=Latest %s contracts
+BoxTitleLastModifiedDonations=Latest %s modified donations
+BoxTitleLastModifiedExpenses=Latest %s modified expense reports
 BoxGlobalActivity=Global activity (invoices, proposals, orders)
 BoxGoodCustomers=Good customers
 BoxTitleGoodCustomers=%s Good customers
-FailedToRefreshDataInfoNotUpToDate=Failed to refresh RSS flux. Last successfull refresh date: %s
-LastRefreshDate=Last refresh date
+FailedToRefreshDataInfoNotUpToDate=Failed to refresh RSS flux. Latest successfull refresh date: %s
+LastRefreshDate=Latest refresh date
 NoRecordedBookmarks=No bookmarks defined.
 ClickToAdd=Click here to add.
 NoRecordedCustomers=No recorded customers
@@ -82,8 +82,8 @@ NoContractedProducts=No products/services contracted
 NoRecordedContracts=No recorded contracts
 NoRecordedInterventions=No recorded interventions
 BoxLatestSupplierOrders=Latest supplier orders
-BoxTitleLatestSupplierOrders=Last %s supplier orders
-BoxTitleLatestModifiedSupplierOrders=Last %s modified supplier orders
+BoxTitleLatestSupplierOrders=Latest %s supplier orders
+BoxTitleLatestModifiedSupplierOrders=Latest %s modified supplier orders
 NoSupplierOrder=No recorded supplier order
 BoxCustomersInvoicesPerMonth=Customer invoices per month
 BoxSuppliersInvoicesPerMonth=Supplier invoices per month
@@ -96,5 +96,5 @@ BoxProductDistributionFor=Distribution of %s for %s
 ForCustomersInvoices=Customers invoices
 ForCustomersOrders=Customers orders
 ForProposals=Proposals
-LastXMonthRolling=The last %s month rolling
+LastXMonthRolling=The latest %s month rolling
 ChooseBoxToAdd=Add widget to your dashboard...

+ 6 - 6
htdocs/langs/en_US/commercial.lang

@@ -16,8 +16,8 @@ Rendez-Vous=Rendezvous
 ConfirmDeleteAction=Are you sure you want to delete this event ?
 CardAction=Event card
 PercentDone=Percentage complete
-ActionOnCompany=Event about company
-ActionOnContact=Event about contact
+ActionOnCompany=Related company
+ActionOnContact=Related contact
 TaskRDV=Meetings
 TaskRDVWith=Meeting with %s
 ShowTask=Show task
@@ -35,9 +35,9 @@ ShowCustomer=Show customer
 ShowProspect=Show prospect
 ListOfProspects=List of prospects
 ListOfCustomers=List of customers
-LastDoneTasks=Last %s completed tasks
-LastRecordedTasks=Last recorded tasks
-LastActionsToDo=Last %s oldest actions not completed
+LastDoneTasks=Latest %s completed tasks
+LastRecordedTasks=Latest recorded tasks
+LastActionsToDo=Oldest %s not completed actions
 DoneAndToDoActionsFor=Completed and To do events for %s
 DoneAndToDoActions=Completed and To do events
 DoneActions=Completed events
@@ -94,4 +94,4 @@ StatusProsp=Prospect status
 DraftPropals=Draft commercial proposals
 SearchPropal=Search a commercial proposal
 CommercialDashboard=Commercial summary
-NoLimit=No limit
+NoLimit=No limit

+ 16 - 16
htdocs/langs/en_US/companies.lang

@@ -302,7 +302,7 @@ RequiredIfCustomer=Required if third party is a customer or prospect
 RequiredIfSupplier=Required if third party is a supplier
 ValidityControledByModule=Validity controled by module
 ThisIsModuleRules=This is rules for this module
-LastProspect=Last
+LastProspect=Latest
 ProspectToContact=Prospect to contact
 CompanyDeleted=Company "%s" deleted from database.
 ListOfContacts=List of contacts/addresses
@@ -328,7 +328,7 @@ NoContactForAnyContract=This contact is not a contact for any contract
 NoContactForAnyInvoice=This contact is not a contact for any invoice
 NewContact=New contact
 NewContactAddress=New contact/address
-LastContacts=Last contacts
+LastContacts=Latest contacts
 MyContacts=My contacts
 Phones=Phones
 Capital=Capital
@@ -343,7 +343,7 @@ VATIntraCheckableOnEUSite=Check Intracomunnautary VAT on European commision site
 VATIntraManualCheck=You can also check manually from european web site <a href="%s" target="_blank">%s</a>
 ErrorVATCheckMS_UNAVAILABLE=Check not possible. Check service is not provided by the member state (%s).
 NorProspectNorCustomer=Nor prospect, nor customer
-JuridicalStatus=Juridical status
+JuridicalStatus=Legal form
 Staff=Staff
 ProspectLevelShort=Potential
 ProspectLevel=Prospect potential
@@ -370,12 +370,12 @@ TE_PRIVATE=Private individual
 TE_OTHER=Other
 StatusProspect-1=Do not contact
 StatusProspect0=Never contacted
-StatusProspect1=To contact
+StatusProspect1=To be contacted
 StatusProspect2=Contact in process
 StatusProspect3=Contact done
 ChangeDoNotContact=Change status to 'Do not contact'
 ChangeNeverContacted=Change status to 'Never contacted'
-ChangeToContact=Change status to 'To contact'
+ChangeToContact=Change status to 'To be contacted'
 ChangeContactInProcess=Change status to 'Contact in process'
 ChangeContactDone=Change status to 'Contact done'
 ProspectsByStatus=Prospects by status
@@ -400,28 +400,28 @@ DeliveriesAddress=Delivery addresses
 DeliveryAddress=Delivery address
 DeliveryAddressLabel=Delivery address label
 DeleteDeliveryAddress=Delete a delivery address
-ConfirmDeleteDeliveryAddress=Are you sure you want to delete this delivery address?
+ConfirmDeleteDeliveryAddress=Are you sure you want to delete this delivery address ?
 NewDeliveryAddress=New delivery address
-AddDeliveryAddress=Create address
-AddAddress=Create address
+AddDeliveryAddress=Add delivery address
+AddAddress=Add address
 NoOtherDeliveryAddress=No alternative delivery address defined
 SupplierCategory=Supplier category
-JuridicalStatus200=Independant
+JuridicalStatus200=Independent
 DeleteFile=Delete file
 ConfirmDeleteFile=Are you sure you want to delete this file?
-AllocateCommercial=Assigned to sale representative
+AllocateCommercial=Assigned to sales representative
 SelectCountry=Select a country
 SelectCompany=Select a third party
 Organization=Organization
 AutomaticallyGenerated=Automatically generated
 FiscalYearInformation=Information on the fiscal year
 FiscalMonthStart=Starting month of the fiscal year
-YouMustCreateContactFirst=You must create emails contacts for third party first to be able to add emails notifications.
+YouMustCreateContactFirst=To be able to add email notifications, you must first insert email contacts for the third party
 ListSuppliersShort=List of suppliers
 ListProspectsShort=List of prospects
 ListCustomersShort=List of customers
 ThirdPartiesArea=Third parties and contact area
-LastModifiedThirdParties=Last %s modified third parties
+LastModifiedThirdParties=Latest %s modified third parties
 UniqueThirdParties=Total of unique third parties
 InActivity=Open
 ActivityCeased=Closed
@@ -429,7 +429,7 @@ ActivityStateFilter=Activity status
 ProductsIntoElements=List of products/services into %s
 CurrentOutstandingBill=Current outstanding bill
 OutstandingBill=Max. for outstanding bill
-OutstandingBillReached=Reached max. for outstanding bill
+OutstandingBillReached=Max. for outstanding bill reached
 MonkeyNumRefModelDesc=Return numero with format %syymm-nnnn for customer code and %syymm-nnnn for supplier code where yy is year, mm is month and nnnn is a sequence with no break and no return to 0.
 LeopardNumRefModelDesc=The code is free. This code can be modified at any time.
 ManagingDirectors=Manager(s) name (CEO, director, president...)
@@ -440,8 +440,8 @@ MergeThirdparties=Merge third parties
 ConfirmMergeThirdparties=Are you sure you want to merge this third party into the current one ? All linked objects (invoices, orders, ...) will be moved to current third party so you will be able to delete the duplicate one.
 ThirdpartiesMergeSuccess=Thirdparties have been merged
 ErrorThirdpartiesMerge=There was an error when deleting the thirdparties. Please check the log. Changes have been reverted.
-SaleRepresentativeLogin=Login of sale representative
-SaleRepresentativeFirstname=Firstname of sale representative
-SaleRepresentativeLastname=Lastname of sale representative
+SaleRepresentativeLogin=Login of sales representative
+SaleRepresentativeFirstname=Firstname of sales representative
+SaleRepresentativeLastname=Lastname of sales representative
 ModelModulesContact=Document Models of contact
 ModelModulesThirdParties=Document models of third party

+ 4 - 3
htdocs/langs/en_US/compta.lang

@@ -121,11 +121,11 @@ ErrorWrongAccountancyCodeForCompany=Bad customer accountancy code for %s
 SuppliersProductsSellSalesTurnover=The generated turnover by the sales of supplier's products.  
 CheckReceipt=Check deposit
 CheckReceiptShort=Check deposit
-LastCheckReceiptShort=Last %s check receipts
+LastCheckReceiptShort=Latest %s check receipts
 NewCheckReceipt=New discount
 NewCheckDeposit=New check deposit
 NewCheckDepositOn=Create receipt for deposit on account: %s
-NoWaitingChecks=No checks waiting for deposit.
+NoWaitingChecks=No checks awaiting deposit.
 DateChequeReceived=Check reception date
 NbOfCheques=Nb of checks
 PaySocialContribution=Pay a social/fiscal tax
@@ -225,4 +225,5 @@ BasedOnTwoFirstLettersOfVATNumberBeingDifferentFromYourCompanyCountry=Based on t
 SameCountryCustomersWithVAT=National customers report
 BasedOnTwoFirstLettersOfVATNumberBeingTheSameAsYourCompanyCountry=Based on the two first letters of the VAT number being the same as your own company's country code
 LinkedFichinter=Link to an intervention
-ImportDataset_tax_1=Import social/fiscal taxes
+ImportDataset_tax_1=Import social/fiscal taxes
+ErrorBankAccountNotFound=Error: Bank account not found

+ 4 - 4
htdocs/langs/en_US/contracts.lang

@@ -1,7 +1,7 @@
 # Dolibarr language file - Source file is en_US - contracts
 ContractsArea=Contracts area
 ListOfContracts=List of contracts
-LastModifiedContracts=Last %s modified contracts
+LastModifiedContracts=Latest %s modified contracts
 AllContracts=All contracts
 ContractCard=Contract card
 ContractStatus=Contract status
@@ -58,9 +58,9 @@ ListOfRunningContractsLines=List of running contract lines
 ListOfRunningServices=List of running services
 NotActivatedServices=Inactive services (among validated contracts)
 BoardNotActivatedServices=Services to activate among validated contracts
-LastContracts=Last %s contracts
-LastActivatedServices=Last %s activated services
-LastModifiedServices=Last %s modified services
+LastContracts=Latest %s contracts
+LastActivatedServices=Latest %s activated services
+LastModifiedServices=Latest %s modified services
 EditServiceLine=Edit service line
 ContractStartDate=Start date
 ContractEndDate=End date

+ 3 - 3
htdocs/langs/en_US/cron.lang

@@ -40,8 +40,8 @@ CronNone=None
 CronDtStart=Not before
 CronDtEnd=Not after
 CronDtNextLaunch=Next execution
-CronDtLastLaunch=Start date of last execution
-CronDtLastResult=End date of last execution
+CronDtLastLaunch=Start date of latest execution
+CronDtLastResult=End date of latest execution
 CronFrequency=Frequency
 CronClass=Class
 CronMethod=Method
@@ -63,7 +63,7 @@ CronHourStart= Start hour and date of job
 CronEvery=Execute job each
 CronObject=Instance/Object to create
 CronArgs=Parameters
-CronSaveSucess=Save succesfully
+CronSaveSucess=Save successfully
 CronNote=Comment
 CronFieldMandatory=Fields %s is mandatory
 CronErrEndDateStartDt=End date cannot be before start date

+ 1 - 1
htdocs/langs/en_US/dict.lang

@@ -138,7 +138,7 @@ CountryLS=Lesotho
 CountryLR=Liberia
 CountryLY=Libyan
 CountryLI=Liechtenstein
-CountryLT=Lituania
+CountryLT=Lithuania
 CountryLU=Luxembourg
 CountryMO=Macao
 CountryMK=Macedonia, the former Yugoslav of

+ 1 - 1
htdocs/langs/en_US/donations.lang

@@ -29,7 +29,7 @@ ValidPromess=Validate promise
 DonationReceipt=Donation receipt
 BuildDonationReceipt=Build receipt
 DonationsModels=Documents models for donation receipts
-LastModifiedDonations=Last %s modified donations
+LastModifiedDonations=Latest %s modified donations
 SearchADonation=Search a donation
 DonationRecipient=Donation recipient
 ThankYou=Thank You

+ 3 - 3
htdocs/langs/en_US/errors.lang

@@ -17,7 +17,7 @@ ErrorFailToCreateFile=Failed to create file '<b>%s</b>'.
 ErrorFailToRenameDir=Failed to rename directory '<b>%s</b>' into '<b>%s</b>'.
 ErrorFailToCreateDir=Failed to create directory '<b>%s</b>'.
 ErrorFailToDeleteDir=Failed to delete directory '<b>%s</b>'.
-ErrorFailedToDeleteJoinedFiles=Can not delete environment because there is some joined files. Remove join files first.
+ErrorFailedToDeleteJoinedFiles=Cannot delete environment because joined files are present. Remove joined files first.
 ErrorThisContactIsAlreadyDefinedAsThisType=This contact is already defined as contact for this type.
 ErrorCashAccountAcceptsOnlyCashMoney=This bank account is a cash account, so it accepts payments of type cash only.
 ErrorFromToAccountsMustDiffers=Source and targets bank accounts must be different.
@@ -41,7 +41,7 @@ ErrorBadDateFormat=Value '%s' has wrong date format
 ErrorWrongDate=Date is not correct!
 ErrorFailedToWriteInDir=Failed to write in directory %s
 ErrorFoundBadEmailInFile=Found incorrect email syntax for %s lines in file (example line %s with email=%s)
-ErrorUserCannotBeDelete=User can not be deleted. May be it is associated on Dolibarr entities.
+ErrorUserCannotBeDelete=User cannot be deleted. May be it is associated to Dolibarr entities.
 ErrorFieldsRequired=Some required fields were not filled.
 ErrorFailedToCreateDir=Failed to create a directory. Check that Web server user has permissions to write into Dolibarr documents directory. If parameter <b>safe_mode</b> is enabled on this PHP, check that Dolibarr php files owns to web server user (or group).
 ErrorNoMailDefinedForThisUser=No mail defined for this user
@@ -129,7 +129,7 @@ ErrorNewValueCantMatchOldValue=New value can't be equal to old one
 ErrorFailedToValidatePasswordReset=Failed to reinit password. May be the reinit was already done (this link can be used only one time). If not, try to restart the reinit process.
 ErrorToConnectToMysqlCheckInstance=Connect to database fails. Check Mysql server is running (in most cases, you can launch it from command line with 'sudo /etc/init.d/mysql start').
 ErrorFailedToAddContact=Failed to add contact
-ErrorDateMustBeBeforeToday=The date can not be greater than today
+ErrorDateMustBeBeforeToday=The date cannot be greater than today
 ErrorPaymentModeDefinedToWithoutSetup=A payment mode was set to type %s but setup of module Invoice was not completed to define information to show for this payment mode.
 ErrorPHPNeedModule=Error, your PHP must have module <b>%s</b> installed to use this feature.
 ErrorOpenIDSetupNotComplete=You setup Dolibarr config file to allow OpenID authentication, but URL of OpenID service is not defined into constant %s

+ 4 - 4
htdocs/langs/en_US/holiday.lang

@@ -80,7 +80,7 @@ alreadyCPexist=A leave request has already been done on this period.
 UserName=Name
 FirstDayOfHoliday=First day of vacation
 LastDayOfHoliday=Last day of vacation
-BoxTitleLastLeaveRequests=Last %s modified leave requests 
+BoxTitleLastLeaveRequests=Latest %s modified leave requests 
 HolidaysMonthlyUpdate=Monthly update
 ManualUpdate=Manual update
 HolidaysCancelation=Leave request cancelation
@@ -91,8 +91,8 @@ DescOptionCP=Description of the option
 ValueOptionCP=Value
 GroupToValidateCP=Group with the ability to approve leave requests
 ConfirmConfigCP=Validate the configuration
-LastUpdateCP=Last automatic update of leaves allocation
-MonthOfLastMonthlyUpdate=Month of last automatic update of leaves allocation
+LastUpdateCP=Latest automatic update of leaves allocation
+MonthOfLastMonthlyUpdate=Month of latest automatic update of leaves allocation
 UpdateConfCPOK=Updated successfully.
 ErrorUpdateConfCP=An error occurred during the update, please try again.
 AddCPforUsers=Please add the balance of leaves allocation of users by <a href="../define_holiday.php" style="font-weight: normal; color: red; text-decoration: underline;">clicking here</a>.
@@ -143,4 +143,4 @@ NewByMonth=Added per month
 Affect=Followed by a counter
 FollowedByACounter=1: This type of leave need to be followed by a counter. Counter is incremented manually or automatically and when a leave request is validated, counter is decremented.<br>0: Not followed by a counter.
 NoLeaveWithCounterDefined=There is no leave types defined that need to be followed by a counter
-GoIntoDictionaryHolidayTypes=Go into <strong>Home - Setup - Dictionaries - Type of leaves</strong> to setup the different types of leaves.
+GoIntoDictionaryHolidayTypes=Go into <strong>Home - Setup - Dictionaries - Type of leaves</strong> to setup the different types of leaves.

+ 5 - 5
htdocs/langs/en_US/install.lang

@@ -82,7 +82,7 @@ SetupEnd=End of setup
 SystemIsInstalled=This installation is complete.
 SystemIsUpgraded=Dolibarr has been upgraded successfully.
 YouNeedToPersonalizeSetup=You need to configure Dolibarr to suit your needs (appearance, features, ...). To do this, please follow the link below:
-AdminLoginCreatedSuccessfuly=Dolibarr administrator login '<b>%s</b>' created successfuly.
+AdminLoginCreatedSuccessfuly=Dolibarr administrator login '<b>%s</b>' created successfully.
 GoToDolibarr=Go to Dolibarr
 GoToSetupArea=Go to Dolibarr (setup area)
 MigrationNotFinished=Version of your database is not completely up to date, so you'll have to run the upgrade process again. 
@@ -159,7 +159,7 @@ MigrationSupplierOrder=Data migration for supplier's orders
 MigrationProposal=Data migration for commercial proposals
 MigrationInvoice=Data migration for customer's invoices
 MigrationContract=Data migration for contracts
-MigrationSuccessfullUpdate=Upgrade successful
+MigrationSuccessfullUpdate=Upgrade successfull
 MigrationUpdateFailed=Failed upgrade process
 MigrationRelationshipTables=Data migration for relationship tables (%s)
 MigrationPaymentsUpdate=Payment data correction
@@ -173,7 +173,7 @@ MigrationContractsLineCreation=Create contract line for contract ref %s
 MigrationContractsNothingToUpdate=No more things to do
 MigrationContractsFieldDontExist=Field fk_facture does not exists anymore. Nothing to do.
 MigrationContractsEmptyDatesUpdate=Contract empty date correction
-MigrationContractsEmptyDatesUpdateSuccess=Contract emtpy date correction done successfuly
+MigrationContractsEmptyDatesUpdateSuccess=Contract emtpy date correction done successfully
 MigrationContractsEmptyDatesNothingToUpdate=No contract empty date to correct
 MigrationContractsEmptyCreationDatesNothingToUpdate=No contract creation date to correct
 MigrationContractsInvalidDatesUpdate=Bad value date contract correction
@@ -181,7 +181,7 @@ MigrationContractsInvalidDateFix=Correct contract %s (Contract date=%s, Starting
 MigrationContractsInvalidDatesNumber=%s contracts modified
 MigrationContractsInvalidDatesNothingToUpdate=No date with bad value to correct
 MigrationContractsIncoherentCreationDateUpdate=Bad value contract creation date correction
-MigrationContractsIncoherentCreationDateUpdateSuccess=Bad value contract creation date correction done succesfuly
+MigrationContractsIncoherentCreationDateUpdateSuccess=Bad value contract creation date correction done successfully
 MigrationContractsIncoherentCreationDateNothingToUpdate=No bad value for contract creation date to correct
 MigrationReopeningContracts=Open contract closed by error
 MigrationReopenThisContract=Reopen contract %s
@@ -205,4 +205,4 @@ MigrationEvents=Migration of events to add event owner into assignement table
 MigrationReloadModule=Reload module %s
 ShowNotAvailableOptions=Show not available options
 HideNotAvailableOptions=Hide not available options
-ErrorFoundDuringMigration=Error were reported during migration process so next step is not available. To ignore errors, you can <a href="%s">click here</a>, but application or some features may not work correctly until fixed.
+ErrorFoundDuringMigration=Error were reported during migration process so next step is not available. To ignore errors, you can <a href="%s">click here</a>, but application or some features may not work correctly until fixed.

+ 2 - 2
htdocs/langs/en_US/interventions.lang

@@ -7,7 +7,7 @@ AddIntervention=Create intervention
 ListOfInterventions=List of interventions
 EditIntervention=Edit intervention
 ActionsOnFicheInter=Actions on intervention
-LastInterventions=Last %s interventions
+LastInterventions=Latest %s interventions
 AllInterventions=All interventions
 CreateDraftIntervention=Create draft
 CustomerDoesNotHavePrefix=Customer does not have a prefix
@@ -41,7 +41,7 @@ InterventionDeletedInDolibarr=Intervention %s deleted
 SearchAnIntervention=Search an intervention
 InterventionsArea=Interventions area
 DraftFichinter=Draft interventions
-LastModifiedInterventions=Last %s modified interventions
+LastModifiedInterventions=Latest %s modified interventions
 ##### Types de contacts #####
 TypeContact_fichinter_internal_INTERREPFOLL=Representative following-up intervention
 TypeContact_fichinter_internal_INTERVENING=Intervening

+ 4 - 4
htdocs/langs/en_US/mailmanspip.lang

@@ -3,8 +3,8 @@ MailmanSpipSetup=Mailman and SPIP module Setup
 MailmanTitle=Mailman mailing list system
 TestSubscribe=To test subscription to Mailman lists
 TestUnSubscribe=To test unsubscribe from Mailman lists
-MailmanCreationSuccess=Subscription test was executed succesfully
-MailmanDeletionSuccess=Unsubscription test was executed succesfully
+MailmanCreationSuccess=Subscription test was executed successfully
+MailmanDeletionSuccess=Unsubscription test was executed successfully
 SynchroMailManEnabled=A Mailman update will be performed
 SynchroSpipEnabled=A Spip update will be performed
 DescADHERENT_MAILMAN_ADMINPW=Mailman administrator password
@@ -23,5 +23,5 @@ DeleteIntoSpip=Remove from SPIP
 DeleteIntoSpipConfirmation=Are you sure you want to remove this member from SPIP?
 DeleteIntoSpipError=Failed to suppress the user from SPIP
 SPIPConnectionFailed=Failed to connect to SPIP
-SuccessToAddToMailmanList=Add of %s to mailman list %s or SPIP database done
-SuccessToRemoveToMailmanList=Removal of %s from mailman list %s or SPIP database done
+SuccessToAddToMailmanList=%s successfully added to mailman list %s or SPIP database
+SuccessToRemoveToMailmanList=%s successfully removed from mailman list %s or SPIP database

+ 2 - 2
htdocs/langs/en_US/mails.lang

@@ -70,7 +70,7 @@ CloneEMailing=Clone Emailing
 ConfirmCloneEMailing=Are you sure you want to clone this emailing ?
 CloneContent=Clone message
 CloneReceivers=Cloner recipients
-DateLastSend=Date of last sending
+DateLastSend=Date of latest sending
 DateSending=Date sending
 SentTo=Sent to <b>%s</b>
 MailingStatusRead=Read
@@ -170,4 +170,4 @@ AdvTgtSaveFilter=Save filter
 AdvTgtCreateFilter=Create filter
 AdvTgtOrCreateNewFilter=Name of new filter
 NoContactWithCategoryFound=No contact/address with a category found
-NoContactLinkedToThirdpartieWithCategoryFound=No contact/address with a category found
+NoContactLinkedToThirdpartieWithCategoryFound=No contact/address with a category found

+ 16 - 16
htdocs/langs/en_US/main.lang

@@ -36,8 +36,8 @@ ErrorFieldRequired=Field '%s' is required
 ErrorFieldFormat=Field '%s' has a bad value
 ErrorFileDoesNotExists=File %s does not exist
 ErrorFailedToOpenFile=Failed to open file %s
-ErrorCanNotCreateDir=Can not create dir %s
-ErrorCanNotReadDir=Can not read dir %s
+ErrorCanNotCreateDir=Cannot create dir %s
+ErrorCanNotReadDir=Cannot read dir %s
 ErrorConstantNotDefined=Parameter %s not defined
 ErrorUnknown=Unknown error
 ErrorSQL=SQL Error
@@ -73,7 +73,7 @@ FileNotUploaded=The file was not uploaded
 FileUploaded=The file was successfully uploaded
 FileWasNotUploaded=A file is selected for attachment but was not yet uploaded. Click on "Attach file" for this.
 NbOfEntries=Nb of entries
-GoToWikiHelpPage=Read online help (need Internet access)
+GoToWikiHelpPage=Read online help (Internet access needed)
 GoToHelpPage=Read help
 RecordSaved=Record saved
 RecordDeleted=Record deleted
@@ -94,12 +94,12 @@ ConnectedSince=Connected since
 AuthenticationMode=Authentification mode
 RequestedUrl=Requested Url
 DatabaseTypeManager=Database type manager
-RequestLastAccess=Request for last database access
-RequestLastAccessInError=Request for last database access in error
-ReturnCodeLastAccessInError=Return code for last database access in error
-InformationLastAccessInError=Information for last database access in error
+RequestLastAccess=Latest database access request
+RequestLastAccessInError=Latest database access request error
+ReturnCodeLastAccessInError=Return code for latest database access request error
+InformationLastAccessInError=Information for latest database access request error
 DolibarrHasDetectedError=Dolibarr has detected a technical error
-InformationToHelpDiagnose=This is information that can help diagnostic
+InformationToHelpDiagnose=This information can be useful for diagnostic
 MoreInformation=More information
 TechnicalInformation=Technical information
 TechnicalID=Technical ID
@@ -142,7 +142,7 @@ Update=Update
 AddActionToDo=Add event to do
 AddActionDone=Add event done
 Close=Close
-CloseBox=Remove box of your dashboard 
+CloseBox=Remove box from your dashboard
 Confirm=Confirm
 ConfirmSendCardByMail=Do you really want to send content of this card by mail to <b>%s</b> ?
 Delete=Delete
@@ -158,6 +158,7 @@ Save=Save
 SaveAs=Save As
 TestConnection=Test connection
 ToClone=Clone
+ConfirmCloneAction=Are you sure you want to clone this event ?
 ConfirmClone=Choose data you want to clone :
 NoCloneOptionsSpecified=No data to clone defined.
 Of=of
@@ -176,7 +177,6 @@ Upload=Send file
 ToLink=Link
 Select=Select
 Choose=Choose
-ChooseLangage=Please choose your language
 Resize=Resize
 Recenter=Recenter
 Author=Author
@@ -530,7 +530,7 @@ ReportName=Report name
 ReportPeriod=Report period
 ReportDescription=Description
 Report=Report
-Keyword=Mot clé
+Keyword=Keyword
 Legend=Legend
 FillTownFromZip=Fill city from zip
 Fill=Fill
@@ -550,8 +550,8 @@ NbOfCustomers=Number of customers
 NbOfLines=Number of lines
 NbOfObjects=Number of objects
 NbOfReferers=Number of referrers
-NbOfObjectReferers=Number of refering objects
-Referers=Refering objects
+NbOfObjectReferers=Number of related items
+Referers=Related items
 TotalQuantity=Total quantity
 DateFromTo=From %s to %s
 DateFrom=From %s
@@ -594,7 +594,7 @@ Priority=Priority
 SendByMail=Send by EMail
 MailSentBy=Email sent by
 TextUsedInTheMessageBody=Email body
-SendAcknowledgementByMail=Send Ack. by email
+SendAcknowledgementByMail=Send confirmation email
 EMail=E-mail
 NoEMail=No email
 NoMobilePhone=No mobile phone
@@ -746,7 +746,7 @@ Sincerely=Sincerely
 DeleteLine=Delete line
 ConfirmDeleteLine=Are you sure you want to delete this line ?
 NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked records
-TooManyRecordForMassAction=Too many records selected for mass action. Such action are restriced to a list of %s records.
+TooManyRecordForMassAction=Too many records selected for mass action. The action is restricted to a list of %s records.
 MassFilesArea=Area for files built by mass actions
 HideTempMassFilesArea=Hide area of files built by mass actions
 ShowTempMassFilesArea=Show area of files built by mass actions
@@ -804,4 +804,4 @@ SearchIntoSupplierProposals=Supplier proposals
 SearchIntoInterventions=Interventions
 SearchIntoContracts=Contracts
 SearchIntoExpenseReports=Expense reports
-SearchIntoCustomerShipments=Customer shipments
+SearchIntoCustomerShipments=Customer shipments

+ 4 - 4
htdocs/langs/en_US/members.lang

@@ -114,9 +114,9 @@ EnablePublicSubscriptionForm=Enable the public auto-subscription form
 MemberPublicLinks=Public links/pages
 ExportDataset_member_1=Members and subscriptions
 ImportDataset_member_1=Members
-LastMembers=Last %s members
-LastMembersModified=Last %s modified members
-LastSubscriptionsModified=Last %s modified subscriptions
+LastMembers=Latest %s members
+LastMembersModified=Latest %s modified members
+LastSubscriptionsModified=Latest %s modified subscriptions
 AttributeName=Attribute name
 String=String
 Text=Text
@@ -204,4 +204,4 @@ MembersByRegion=This screen show you statistics on members by region.
 VATToUseForSubscriptions=VAT rate to use for subscriptions
 NoVatOnSubscription=No TVA for subscriptions
 MEMBER_PAYONLINE_SENDEMAIL=Email to use for email warning when Dolibarr receive a confirmation of a validated payment for a subscription (Example: paymentdone@example.com)
-ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS=Product used for subscription line into invoice: %s
+ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS=Product used for subscription line into invoice: %s

+ 17 - 0
htdocs/langs/en_US/multicurrency.lang

@@ -0,0 +1,17 @@
+# ADMIN
+RecordSaved=Currency rate added
+RecordDeleted=Currency rate deleted
+ErrorAddRateFail=Error in added rate
+ErrorAddCurrencyFail=Error in added currency
+ErrorDeleteCurrencyFail=Error delete fail
+multicurrency_syncronize_error=Error in synchronization
+multicurrency_useOriginTx=Use the origin rate
+CurrencyLayerAccount=CurrencyLayer API
+CurrencyLayerAccount_help_to_synchronize=You sould create an account on their website to use this functionnality<br />Get your <b>API key</b><br />If you use a free account you can't change the <b>currency source</b> (USD by default)<br />But if your main currency isn't USD you can use the <b>alternate currency source</b> to force you main currency<br /><br />You are limited at 1000 synchronizations per month 
+multicurrency_appId=API key
+multicurrency_appCurrencySource=Currency source
+multicurrency_alternateCurrencySource= Alternate currency souce
+CurrenciesUsed=Currencies used
+CurrenciesUsed_help_to_add=Add the differents currencies and rates you need to use on you <b>proposals</b>, <b>orders</b>, etc.
+Rate=Rate
+rate=rate

+ 5 - 5
htdocs/langs/en_US/orders.lang

@@ -87,11 +87,11 @@ NoDraftOrders=No draft orders
 NoOrder=No order
 NoSupplierOrder=No supplier order
 OtherOrders=Other orders
-LastOrders=Last %s customer orders
-LastCustomerOrders=Last %s customer orders
-LastSupplierOrders=Last %s supplier orders
-LastModifiedOrders=Last %s modified orders
-LastClosedOrders=Last %s closed orders
+LastOrders=Latest %s customer orders
+LastCustomerOrders=Latest %s customer orders
+LastSupplierOrders=Latest %s supplier orders
+LastModifiedOrders=Latest %s modified orders
+LastClosedOrders=Latest %s closed orders
 AllOrders=All orders
 NbOfOrders=Number of orders
 OrdersStatistics=Order's statistics

+ 30 - 30
htdocs/langs/en_US/other.lang

@@ -3,12 +3,12 @@ SecurityCode=Security code
 Calendar=Calendar
 NumberingShort=N°
 Tools=Tools
-ToolsDesc=This area is dedicated to group miscellaneous tools not available into other menu entries.<br><br>Those tools can be reached from menu on the side.
+ToolsDesc=All miscellaneous tools not included in other menu entries are collected here.<br /><br />All the tools can be reached in the left menu.
 Birthday=Birthday
-BirthdayDate=Birthday
+BirthdayDate=Birthday date
 DateToBirth=Date of birth
-BirthdayAlertOn= birthday alert active
-BirthdayAlertOff= birthday alert inactive
+BirthdayAlertOn=birthday alert active
+BirthdayAlertOff=birthday alert inactive
 Notify_FICHINTER_ADD_CONTACT=Added contact to Intervention
 Notify_FICHINTER_VALIDATE=Intervention validated
 Notify_FICHINTER_SENTBYMAIL=Intervention sent by mail
@@ -69,8 +69,8 @@ PredefinedMailContentSendSupplierInvoice=__CONTACTCIVNAME__\n\nYou will find her
 PredefinedMailContentSendShipping=__CONTACTCIVNAME__\n\nYou will find here the shipping __SHIPPINGREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentSendFichInter=__CONTACTCIVNAME__\n\nYou will find here the intervention __FICHINTERREF__\n\n__PERSONALIZED__Sincerely\n\n__SIGNATURE__
 PredefinedMailContentThirdparty=__CONTACTCIVNAME__\n\n__PERSONALIZED__\n\n__SIGNATURE__
-DemoDesc=Dolibarr is a compact ERP/CRM composed by several functional modules. A demo that includes all modules does not mean anything as this never occurs. So, several demo profiles are available.
-ChooseYourDemoProfil=Choose the demo profile that match your activity...
+DemoDesc=Dolibarr is a compact ERP/CRM supporting several functional modules. A demo showcasing all modules makes no sense as this scenario never occurs. So, several demo profiles are available.
+ChooseYourDemoProfil=Choose the demo profile that best suits your needs...
 DemoFundation=Manage members of a foundation
 DemoFundation2=Manage members and bank account of a foundation
 DemoCompanyServiceOnly=Manage a freelance activity selling service only
@@ -84,22 +84,22 @@ ValidatedBy=Validated by %s
 CanceledBy=Canceled by %s
 ClosedBy=Closed by %s
 CreatedById=User id who created
-ModifiedById=User id who made last change
+ModifiedById=User id who made latest change
 ValidatedById=User id who validated
 CanceledById=User id who canceled
 ClosedById=User id who closed
 CreatedByLogin=User login who created
-ModifiedByLogin=User login who made last change
+ModifiedByLogin=User login who made latest change
 ValidatedByLogin=User login who validated
 CanceledByLogin=User login who canceled
 ClosedByLogin=User login who closed
 FileWasRemoved=File %s was removed
 DirWasRemoved=Directory %s was removed
-FeatureNotYetAvailableShort=Available in a next version
-FeatureNotYetAvailable=Feature not yet available in this version
-FeatureExperimental=Experimental feature. Not stable in this version
-FeatureDevelopment=Development feature. Not stable in this version
-FeaturesSupported=Features supported
+FeatureNotYetAvailableShort=Available in a future version
+FeatureNotYetAvailable=Feature not yet available in the current version
+FeatureExperimental=Experimental feature. Not stable in the current version
+FeatureDevelopment=Development feature. Not stable in the current version
+FeaturesSupported=Supported features
 Width=Width
 Height=Height
 Depth=Depth
@@ -111,7 +111,7 @@ CalculatedWeight=Calculated weight
 CalculatedVolume=Calculated volume
 Weight=Weight
 TotalWeight=Total weight
-WeightUnitton=tonnes
+WeightUnitton=tonne
 WeightUnitkg=kg
 WeightUnitg=g
 WeightUnitmg=mg
@@ -147,27 +147,27 @@ SizeUnitinch=inch
 SizeUnitfoot=foot
 SizeUnitpoint=point
 BugTracker=Bug tracker
-SendNewPasswordDesc=This form allows you to request a new password. It will be send to your email address.<br>Change will be effective only after clicking on confirmation link inside this email.<br>Check your email reader software.
+SendNewPasswordDesc=This form allows you to request a new password. It will be sent to your email address.<br />Change will become effective once you click on the confirmation link in the email.<br />Check your inbox.
 BackToLoginPage=Back to login page
-AuthenticationDoesNotAllowSendNewPassword=Authentication mode is <b>%s</b>.<br>In this mode, Dolibarr can't know nor change your password.<br>Contact your system administrator if you want to change your password.
-EnableGDLibraryDesc=Install or enable GD library with your PHP for use this option.
+AuthenticationDoesNotAllowSendNewPassword=Authentication mode is <b>%s</b>.<br />In this mode, Dolibarr can't know nor change your password.<br />Contact your system administrator if you want to change your password.
+EnableGDLibraryDesc=Install or enable GD library on your PHP installation to use this option.
 EnablePhpAVModuleDesc=You need to install a module compatible with your anti-virus. (Clamav : php4-clamavlib ou php5-clamavlib)
-ProfIdShortDesc=<b>Prof Id %s</b> is an information depending on third party country.<br>For example, for country <b>%s</b>, it's code <b>%s</b>. 
+ProfIdShortDesc=<b>Prof Id %s</b> is an information depending on third party country.<br>For example, for country <b>%s</b>, it's code <b>%s</b>.
 DolibarrDemo=Dolibarr ERP/CRM demo
 StatsByNumberOfUnits=Statistics in number of products/services units
 StatsByNumberOfEntities=Statistics in number of referring entities
-NumberOfProposals=Number of proposals on last 12 month
-NumberOfCustomerOrders=Number of customer orders on last 12 month
-NumberOfCustomerInvoices=Number of customer invoices on last 12 month
-NumberOfSupplierProposals=Number of supplier proposals on last 12 month
-NumberOfSupplierOrders=Number of supplier orders on last 12 month
-NumberOfSupplierInvoices=Number of supplier invoices on last 12 month
-NumberOfUnitsProposals=Number of units on proposals on last 12 month
-NumberOfUnitsCustomerOrders=Number of units on customer orders on last 12 month
-NumberOfUnitsCustomerInvoices=Number of units on customer invoices on last 12 month
-NumberOfUnitsSupplierProposals=Number of units on supplier proposals on last 12 month
-NumberOfUnitsSupplierOrders=Number of units on supplier orders on last 12 month
-NumberOfUnitsSupplierInvoices=Number of units on supplier invoices on last 12 month
+NumberOfProposals=Number of proposals in past 12 months
+NumberOfCustomerOrders=Number of customer orders in past 12 months
+NumberOfCustomerInvoices=Number of customer invoices in past 12 months
+NumberOfSupplierProposals=Number of supplier proposals in past 12 months
+NumberOfSupplierOrders=Number of supplier orders in past 12 months
+NumberOfSupplierInvoices=Number of supplier invoices in past 12 months
+NumberOfUnitsProposals=Number of units on proposals in past 12 months
+NumberOfUnitsCustomerOrders=Number of units on customer orders in past 12 months
+NumberOfUnitsCustomerInvoices=Number of units on customer invoices in past 12 months
+NumberOfUnitsSupplierProposals=Number of units on supplier proposals in past 12 months
+NumberOfUnitsSupplierOrders=Number of units on supplier orders in past 12 months
+NumberOfUnitsSupplierInvoices=Number of units on supplier invoices in past 12 months
 EMailTextInterventionAddedContact=A newintervention %s has been assigned to you.
 EMailTextInterventionValidated=The intervention %s has been validated.
 EMailTextInvoiceValidated=The invoice %s has been validated.

+ 6 - 6
htdocs/langs/en_US/products.lang

@@ -36,12 +36,12 @@ ServicesOnSell=Services for sale or for purchase
 ServicesNotOnSell=Services not for sale
 ServicesOnSellAndOnBuy=Services for sale and for purchase
 InternalRef=Internal reference
-LastRecorded=Last products/services on sell recorded
-LastRecordedProductsAndServices=Last %s recorded products/services
-LastModifiedProductsAndServices=Last %s modified products/services 
-LastRecordedProducts=Last %s products recorded
-LastRecordedServices=Last %s services recorded
-LastProducts=Last products
+LastRecorded=Latest recorded products/services on sell
+LastRecordedProductsAndServices=Latest %s recorded products/services
+LastModifiedProductsAndServices=Latest %s modified products/services
+LastRecordedProducts=Latest %s recorded products
+LastRecordedServices=Latest %s recorded services
+LastProducts=Latest products
 CardProduct0=Product card
 CardProduct1=Service card
 CardContract=Contract card

+ 12 - 12
htdocs/langs/en_US/projects.lang

@@ -8,7 +8,7 @@ Projects=Projects
 ProjectsArea=Projects Area
 ProjectStatus=Project status
 SharedProject=Everybody
-PrivateProject=Contacts of project
+PrivateProject=Project contacts
 MyProjectsDesc=This view is limited to projects you are a contact for (whatever is the type).
 ProjectsPublicDesc=This view presents all projects you are allowed to read.
 ProjectsPublicTaskDesc=This view presents all projects and tasks you are allowed to read.
@@ -28,11 +28,11 @@ DeleteATask=Delete a task
 ConfirmDeleteAProject=Are you sure you want to delete this project ?
 ConfirmDeleteATask=Are you sure you want to delete this task ?
 OfficerProject=Officer project
-LastProjects=Last %s projects
+LastProjects=Latest %s projects
 AllProjects=All projects
-OpenedProjects=Opened projects
-OpenedTasks=Opened tasks
-OpportunitiesStatusForOpenedProjects=Opportunities amount of opened projects by status
+OpenedProjects=Open projects
+OpenedTasks=Open tasks
+OpportunitiesStatusForOpenedProjects=Opportunities amount of open projects by status
 OpportunitiesStatusForProjects=Opportunities amount of projects by status
 ProjectsList=List of projects
 ShowProject=Show project
@@ -159,14 +159,14 @@ DocumentModelBaleine=Project report template for tasks
 PlannedWorkload=Planned workload
 PlannedWorkloadShort=Workload
 WorkloadOccupation=Workload assignation
-ProjectReferers=Refering objects
+ProjectReferers=Related items
 SearchAProject=Search a project
 SearchATask=Search a task
 ProjectMustBeValidatedFirst=Project must be validated first
 ProjectDraft=Draft projects
 FirstAddRessourceToAllocateTime=Associate a resource to allocate time
-InputPerDay=Input per day 
-InputPerWeek=Input per week 
+InputPerDay=Input per day
+InputPerWeek=Input per week
 InputPerAction=Input per action
 TimeAlreadyRecorded=Time spent already recorded for this task/day and user %s
 ProjectsWithThisUserAsContact=Projects with this user as contact
@@ -182,14 +182,14 @@ ManageOpportunitiesStatus=Use projects to follow leads/opportinuties
 ProjectNbProjectByMonth=Nb of created projects by month
 ProjectOppAmountOfProjectsByMonth=Amount of opportunities by month
 ProjectWeightedOppAmountOfProjectsByMonth=Weighted amount of opportunities by month
-ProjectOpenedProjectByOppStatus=Opened project/lead by opportunity status
+ProjectOpenedProjectByOppStatus=Open project/lead by opportunity status
 ProjectsStatistics=Statistics on projects/leads
 TaskAssignedToEnterTime=Task assigned. Entering time on this task should be possible.
 IdTaskTime=Id task time
 YouCanCompleteRef=If you want to complete the ref with some information (to use it as search filters), it is recommanded to add a - character to separate it, so the automatic numbering will still work correctly for next projects. For example %s-ABC. You may also prefer to add search keys into label.
-OpenedProjectsByThirdparties=Opened projects by thirdparties
+OpenedProjectsByThirdparties=Open projects by thirdparties
 OnlyOpportunitiesShort=Only opportunities
-OpenedOpportunitiesShort=Opened opportunities
+OpenedOpportunitiesShort=Open opportunities
 NotAnOpportunityShort=Not an opportunity
 OpportunityTotalAmount=Opportunities total amount
 OpportunityPonderatedAmount=Opportunities weighted amount
@@ -201,4 +201,4 @@ OppStatusNEGO=Negociation
 OppStatusPENDING=Pending
 OppStatusWON=Won
 OppStatusLOST=Lost
-Budget=Budget
+Budget=Budget

+ 5 - 5
htdocs/langs/en_US/propal.lang

@@ -19,11 +19,11 @@ ValidateProp=Validate commercial proposal
 AddProp=Create proposal
 ConfirmDeleteProp=Are you sure you want to delete this commercial proposal ?
 ConfirmValidateProp=Are you sure you want to validate this commercial proposal under name <b>%s</b> ?
-LastPropals=Last %s proposals
-LastClosedProposals=Last %s closed proposals
-LastModifiedProposals=Last %s modified proposals
+LastPropals=Latest %s proposals
+LastClosedProposals=Latest %s closed proposals
+LastModifiedProposals=Latest %s modified proposals
 AllPropals=All proposals
-LastProposals=Last proposals
+LastProposals=Latest proposals
 SearchAProposal=Search a proposal
 NoProposal=No proposal
 ProposalsStatistics=Commercial proposal's statistics
@@ -102,4 +102,4 @@ DefaultModelPropalCreate=Default model creation
 DefaultModelPropalToBill=Default template when closing a business proposal (to be invoiced)
 DefaultModelPropalClosed=Default template when closing a business proposal (unbilled)
 ProposalCustomerSignature=Written acceptance, company stamp, date and signature
-ProposalsStatisticsSuppliers=Supplier proposals statistics 
+ProposalsStatisticsSuppliers=Supplier proposals statistics 

+ 1 - 1
htdocs/langs/en_US/sendings.lang

@@ -11,7 +11,7 @@ SendingsArea=Shipments area
 ListOfSendings=List of shipments
 SendingMethod=Shipping method
 SendingReceipt=Shipping receipt
-LastSendings=Last %s shipments
+LastSendings=Latest %s shipments
 SearchASending=Search for shipment
 StatisticsOfSendings=Statistics for shipments
 NbOfSendings=Number of shipments

+ 2 - 2
htdocs/langs/en_US/stocks.lang

@@ -116,7 +116,7 @@ WarehouseForStockDecrease=The warehouse <b>%s</b> will be used for stock decreas
 WarehouseForStockIncrease=The warehouse <b>%s</b> will be used for stock increase
 ForThisWarehouse=For this warehouse
 ReplenishmentStatusDesc=This is a list of all products with a stock lower than desired stock (or lower than alert value if checkbox "alert only" is checked). Using the checkbox, you can create supplier orders to fill the difference.
-ReplenishmentOrdersDesc=This is a list of all opened supplier orders including predefined products. Only opened orders with predefined products, so orders that may affect stocks, are visible here.
+ReplenishmentOrdersDesc=This is a list of all open supplier orders including predefined products. Only open orders with predefined products, so orders that may affect stocks, are visible here.
 Replenishments=Replenishments
 NbOfProductBeforePeriod=Quantity of product %s in stock before selected period (< %s)
 NbOfProductAfterPeriod=Quantity of product %s in stock after selected period (> %s)
@@ -143,4 +143,4 @@ ThisSerialAlreadyExistWithDifferentDate=This lot/serial number (<strong>%s</stro
 OpenAll=Open for all actions
 OpenInternal=Open for internal actions
 OpenShipping=Open for shippings
-OpenDispatch=Open for dispatch
+OpenDispatch=Open for dispatch

+ 2 - 2
htdocs/langs/en_US/supplier_proposal.lang

@@ -7,7 +7,7 @@ CommRequests=Price requests
 SearchRequest=Find a request
 DraftRequests=Draft requests
 SupplierProposalsDraft=Draft supplier proposals
-LastModifiedRequests=Last %s modified price requests
+LastModifiedRequests=Latest %s modified price requests
 RequestsOpened=Open price requests
 SupplierProposalArea=Supplier proposals area
 SupplierProposalShort=Supplier proposal
@@ -58,4 +58,4 @@ DefaultModelSupplierProposalToBill=Default template when closing a price request
 DefaultModelSupplierProposalClosed=Default template when closing a price request (refused)
 ListOfSupplierProposal=List of supplier proposal requests
 SupplierProposalsToClose=Supplier proposals to close
-SupplierProposalsToProcess=Supplier proposals to process
+SupplierProposalsToProcess=Supplier proposals to process

+ 4 - 4
htdocs/langs/en_US/users.lang

@@ -48,7 +48,7 @@ AdministratorDescEntity=Administrator (for its company)
 DefaultRights=Default permissions
 DefaultRightsDesc=Define here <u>default</u> permissions that are automatically granted to a <u>new created</u> user (Go on user card to change permission of an existing user).
 DolibarrUsers=Dolibarr users
-LastName=Name
+LastName=Last Name
 FirstName=First name
 ListOfGroups=List of groups
 NewGroup=New group
@@ -58,8 +58,8 @@ PasswordChangedAndSentTo=Password changed and sent to <b>%s</b>.
 PasswordChangeRequestSent=Request to change password for <b>%s</b> sent to <b>%s</b>.
 MenuUsersAndGroups=Users & Groups
 MenuMyUserCard=My user card
-LastGroupsCreated=Last %s created groups
-LastUsersCreated=Last %s users created
+LastGroupsCreated=Latest %s created groups
+LastUsersCreated=Latest %s users created
 ShowGroup=Show group
 ShowUser=Show user
 NonAffectedUsers=Non assigned users
@@ -122,4 +122,4 @@ LoginUsingOpenID=Use OpenID to login
 WeeklyHours=Weekly hours
 ColorUser=Color of the user
 DisabledInMonoUserMode=Disabled in maintenance mode
-UserAccountancyCode=User accountancy code
+UserAccountancyCode=User accountancy code

+ 3 - 3
htdocs/langs/en_US/withdrawals.lang

@@ -11,8 +11,8 @@ Withdrawal=Withdrawal
 WithdrawalsReceipts=Withdrawal receipts
 WithdrawalReceipt=Withdrawal receipt
 WithdrawalReceiptShort=Receipt
-LastWithdrawalReceipts=Last %s withdrawal receipts
-WithdrawedBills=Withdrawn invoices
+LastWithdrawalReceipts=Latest %s withdrawal receipts
+WithdrawedBills=Withdrawal invoices
 WithdrawalsLines=Withdrawal lines
 RequestStandingOrderToTreat=Request for standing orders to process
 RequestStandingOrderTreated=Request for standing orders processed
@@ -29,7 +29,7 @@ ResponsibleUser=Responsible user
 WithdrawalsSetup=Withdrawal setup
 WithdrawStatistics=Withdraw's statistics
 WithdrawRejectStatistics=Withdraw reject's statistics
-LastWithdrawalReceipt=Last %s withdrawing receipts
+LastWithdrawalReceipt=Latest %s withdrawal receipts
 MakeWithdrawRequest=Make a withdraw request
 ThirdPartyBankCode=Third party bank code
 ThirdPartyDeskCode=Third party desk code

+ 27 - 4
htdocs/multicurrency/class/multicurrency.class.php

@@ -107,12 +107,19 @@ class MultiCurrency extends CommonObject
 	 */
 	public function create(User $user, $trigger = true)
 	{
-		global $conf;
+		global $conf,$langs;
 		
 		dol_syslog('Currency::create', LOG_DEBUG);
 
 		$error = 0;
 		
+		if (self::checkCodeAlreadyExists($this->code))
+		{
+			$error++;
+			$this->errors[] = $langs->trans('multicurrency_code_already_added');
+			return -1;
+		}
+		
 		if (empty($this->entity) || $this->entity <= 0) $this->entity = $conf->entity;
 		$now=date('Y-m-d H:i:s');
 		
@@ -505,9 +512,10 @@ class MultiCurrency extends CommonObject
 	 {
 	 	$sql = 'SELECT m.rowid, mc.rate FROM '.MAIN_DB_PREFIX.'multicurrency m';
 		$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
-		// FIXME Is this comptible with SQL ?
-		$sql.= ' WHERE m.code = "'.$db->escape($code).'" AND mc.date_sync >= ALL (SELECT date_sync FROM '.MAIN_DB_PREFIX.'multicurrency_rate)';
-		$sql.= " AND m.entity IN '".getEntity('multicurrency', 1)."'";
+		$sql.= ' WHERE m.code = "'.$db->escape($code).'"';
+		$sql.= " AND m.entity IN (".getEntity('multicurrency', 1).")";
+		$sql.= ' ORDER BY mc.date_sync DESC LIMIT 1';
+		
 		$resql = $db->query($sql);
 		if ($resql && $obj = $db->fetch_object($resql)) return array($obj->rowid, $obj->rate);
 		else return array(0, 1);
@@ -616,6 +624,21 @@ class MultiCurrency extends CommonObject
 			}	
 		}
 	}
+	
+	/**
+	 * Check in database if the current code already exists
+	 * 
+	 * @param	string	$code 	current code to search
+	 * @return	true if exists, false if not exists
+	 */
+	 public static function checkCodeAlreadyExists($code)
+	 {
+	 	global $db;
+		
+	 	$currency = new MultiCurrency($db);
+		if ($currency->fetch('', $code) > 0) return true;
+		else return false;
+	 }
 }
 
 /**

+ 3 - 2
htdocs/product/card.php

@@ -1121,7 +1121,7 @@ else
     else if ($object->id > 0)
     {
         // Fiche en mode edition
-        if ($action == 'edit' && ($user->rights->produit->creer || $user->rights->service->creer))
+        if ($action == 'edit' &&  ((($object->type == Product::TYPE_PRODUCT && $user->rights->produit->creer) ||  ($object->type == Product::TYPE_SERVICE && $user->rights->service->creer))))
         {
             //WYSIWYG Editor
             require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
@@ -1733,7 +1733,8 @@ if (empty($reshook))
 {
 	if ($action == '' || $action == 'view')
 	{
-	    if ($user->rights->produit->creer || $user->rights->service->creer)
+	    if (($object->type == Product::TYPE_PRODUCT && $user->rights->produit->creer ) || 
+	       ($object->type == Product::TYPE_SERVICE && $user->rights->service->creer))
 	    {
 	        if (! isset($object->no_button_edit) || $object->no_button_edit <> 1) print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=edit&amp;id='.$object->id.'">'.$langs->trans("Modify").'</a></div>';
 

+ 2 - 2
htdocs/product/class/product.class.php

@@ -2666,7 +2666,7 @@ class Product extends CommonObject
     		$sql.= " WHERE fk_soc = ".$id_fourn;
     		$sql.= " AND ref_fourn = '".$this->db->escape($ref_fourn)."'";
     		$sql.= " AND fk_product != ".$this->id;
-    		$sql.= " AND entity = ".$conf->entity;
+    		$sql.= " AND entity IN (".getEntity('productprice', 1).")";
 
     		$resql=$this->db->query($sql);
     		if ($resql)
@@ -2689,7 +2689,7 @@ class Product extends CommonObject
 		else $sql.= " AND (ref_fourn = '' OR ref_fourn IS NULL)";
 		$sql.= " AND quantity = '".$quantity."'";
 		$sql.= " AND fk_product = ".$this->id;
-		$sql.= " AND entity = ".$conf->entity;
+		$sql.= " AND entity IN (".getEntity('productprice', 1).")";
 
 		$resql=$this->db->query($sql);
 		if ($resql)

+ 1 - 1
htdocs/product/fournisseurs.php

@@ -155,7 +155,7 @@ if (empty($reshook))
 		{
 			$error++;
 			$langs->load("errors");
-			setEventMessages($langs->trans("ErrorFieldMustBeANumeric",'eeee'), null, 'errors');
+			setEventMessages($langs->trans("ErrorFieldMustBeANumeric",$langs->transnoentities("VATRateForSupplierProduct")), null, 'errors');
 		}
 		if (empty($quantity))
 		{

Some files were not shown because too many files changed in this diff