Browse Source

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

Laurent Destailleur 3 years ago
parent
commit
89b0a7b2b5

+ 169 - 159
htdocs/admin/expensereport_rules.php

@@ -38,169 +38,178 @@ if (!$user->admin) {
 	accessforbidden();
 }
 
-//Init error
-$error = false;
-$message = false;
-
-$action = GETPOST('action', 'aZ09');
-$id = GETPOST('id', 'int');
-
-$apply_to = GETPOST('apply_to');
-$fk_user = GETPOST('fk_user', 'int');
-$fk_usergroup = GETPOST('fk_usergroup', 'int');
-
-$fk_c_type_fees = GETPOST('fk_c_type_fees');
-$code_expense_rules_type = GETPOST('code_expense_rules_type');
-$dates = dol_mktime(12, 0, 0, GETPOST('startmonth'), GETPOST('startday'), GETPOST('startyear'));
-$datee = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear'));
-$amount = GETPOST('amount');
-
-$object = new ExpenseReportRule($db);
-if (!empty($id)) {
-	$result = $object->fetch($id);
-	if ($result < 0) {
-		dol_print_error('', $object->error, $object->errors);
-	}
-}
+// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
+$hookmanager->initHooks(array('admin', 'dictionaryadmin','expensereport_rules'));
 
-// TODO do action
-if ($action == 'save') {
-	$error = 0;
 
-	// check parameters
-	if (empty($apply_to)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportApplyTo")), null, 'errors');
-	}
-	if (empty($fk_c_type_fees)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDomain")), null, 'errors');
-	}
-	if (empty($code_expense_rules_type)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportLimitOn")), null, 'errors');
-	}
-	if (empty($dates)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDateStart")), null, 'errors');
-	}
-	if (empty($datee)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDateEnd")), null, 'errors');
-	}
-	if (empty($amount)) {
-		$error++;
-		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportLimitAmount")), null, 'errors');
-	}
+$parameters = array();
+$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+	setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}
 
-	if (empty($error)) {
-		$object->setValues($_POST);
-
-		if ($apply_to == 'U') {
-			$object->fk_user = (int) $fk_user;
-			$object->fk_usergroup = 0;
-			$object->is_for_all = 0;
-		} elseif ($apply_to == 'G') {
-			$object->fk_usergroup = (int) $fk_usergroup;
-			$object->fk_user = 0;
-			$object->is_for_all = 0;
-		} elseif ($apply_to == 'A') {
-			$object->is_for_all = 1;
-			$object->fk_user = 0;
-			$object->fk_usergroup = 0;
+if (empty($reshook)) {
+	//Init error
+	$error = false;
+	$message = false;
+
+	$action = GETPOST('action', 'aZ09');
+	$id = GETPOST('id', 'int');
+
+	$apply_to = GETPOST('apply_to');
+	$fk_user = GETPOST('fk_user', 'int');
+	$fk_usergroup = GETPOST('fk_usergroup', 'int');
+
+	$fk_c_type_fees = GETPOST('fk_c_type_fees');
+	$code_expense_rules_type = GETPOST('code_expense_rules_type');
+	$dates = dol_mktime(12, 0, 0, GETPOST('startmonth'), GETPOST('startday'), GETPOST('startyear'));
+	$datee = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear'));
+	$amount = GETPOST('amount');
+
+	$object = new ExpenseReportRule($db);
+	if (!empty($id)) {
+		$result = $object->fetch($id);
+		if ($result < 0) {
+			dol_print_error('', $object->error, $object->errors);
 		}
+	}
+	// TODO do action
+	if ($action == 'save') {
+		$error = 0;
+
+		// check parameters
+		if (empty($apply_to)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportApplyTo")), null, 'errors');
+		}
+		if (empty($fk_c_type_fees)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDomain")), null, 'errors');
+		}
+		if (empty($code_expense_rules_type)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportLimitOn")), null, 'errors');
+		}
+		if (empty($dates)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDateStart")), null, 'errors');
+		}
+		if (empty($datee)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportDateEnd")), null, 'errors');
+		}
+		if (empty($amount)) {
+			$error++;
+			setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ExpenseReportLimitAmount")), null, 'errors');
+		}
+
+		if (empty($error)) {
+			$object->setValues($_POST);
+
+			if ($apply_to == 'U') {
+				$object->fk_user = (int) $fk_user;
+				$object->fk_usergroup = 0;
+				$object->is_for_all = 0;
+			} elseif ($apply_to == 'G') {
+				$object->fk_usergroup = (int) $fk_usergroup;
+				$object->fk_user = 0;
+				$object->is_for_all = 0;
+			} elseif ($apply_to == 'A') {
+				$object->is_for_all = 1;
+				$object->fk_user = 0;
+				$object->fk_usergroup = 0;
+			}
 
-		$object->dates = $dates;
-		$object->datee = $datee;
+			$object->dates = $dates;
+			$object->datee = $datee;
 
-		$object->entity = $conf->entity;
+			$object->entity = $conf->entity;
 
-		$res = $object->create($user);
-		if ($res > 0) {
-			setEventMessages($langs->trans('ExpenseReportRuleSave'), null);
-		} else {
+			$res = $object->create($user);
+			if ($res > 0) {
+				setEventMessages($langs->trans('ExpenseReportRuleSave'), null);
+			} else {
+				dol_print_error($object->db);
+			}
+
+			header('Location: ' . $_SERVER['PHP_SELF']);
+			exit;
+		}
+	} elseif ($action == 'delete') {
+		// TODO add confirm
+		$res = $object->delete($user);
+
+		if ($res < 0) {
 			dol_print_error($object->db);
 		}
 
-		header('Location: '.$_SERVER['PHP_SELF']);
+		header('Location: ' . $_SERVER['PHP_SELF']);
 		exit;
 	}
-} elseif ($action == 'delete') {
-	// TODO add confirm
-	$res = $object->delete($user);
 
-	if ($res < 0) {
-		dol_print_error($object->db);
-	}
-
-	header('Location: '.$_SERVER['PHP_SELF']);
-	exit;
+	$rules = $object->getAllRule();
+
+	$tab_apply = array(
+		'A' => $langs->trans('All'),
+		'G' => $langs->trans('Group'),
+		'U' => $langs->trans('User')
+	);
+	$tab_rules_type = array(
+		'EX_DAY' => $langs->trans('Day'),
+		'EX_MON' => $langs->trans('Month'),
+		'EX_YEA' => $langs->trans('Year'),
+		'EX_EXP' => $langs->trans('OnExpense')
+	);
 }
+	/*
+	 * View
+	 */
 
-$rules = $object->getAllRule();
-
-$tab_apply = array(
-	'A' => $langs->trans('All'),
-	'G' => $langs->trans('Group'),
-	'U' => $langs->trans('User')
-);
-$tab_rules_type = array(
-	'EX_DAY' => $langs->trans('Day'),
-	'EX_MON' => $langs->trans('Month'),
-	'EX_YEA' => $langs->trans('Year'),
-	'EX_EXP' => $langs->trans('OnExpense')
-);
+	llxHeader('', $langs->trans("ExpenseReportsSetup"));
 
+	$form = new Form($db);
 
-/*
- * View
- */
-
-llxHeader('', $langs->trans("ExpenseReportsSetup"));
+	$linkback = '<a href="' . DOL_URL_ROOT . '/admin/modules.php?restore_lastsearch_values=1">' . $langs->trans("BackToModuleList") . '</a>';
+	print load_fiche_titre($langs->trans("ExpenseReportsSetup"), $linkback, 'title_setup');
 
-$form = new Form($db);
+	$head = expensereport_admin_prepare_head();
+	print dol_get_fiche_head($head, 'expenserules', $langs->trans("ExpenseReportsRules"), -1, 'trip');
 
-$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
-print load_fiche_titre($langs->trans("ExpenseReportsSetup"), $linkback, 'title_setup');
-
-$head = expensereport_admin_prepare_head();
-print dol_get_fiche_head($head, 'expenserules', $langs->trans("ExpenseReportsRules"), -1, 'trip');
-
-echo '<span class="opacitymedium">'.$langs->trans('ExpenseReportRulesDesc').'</span>';
-print '<br><br>';
+	echo '<span class="opacitymedium">' . $langs->trans('ExpenseReportRulesDesc') . '</span>';
+	print '<br><br>';
 
 if ($action != 'edit') {
-	echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
-	echo '<input type="hidden" name="token" value="'.newToken().'" />';
+	echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">';
+	echo '<input type="hidden" name="token" value="' . newToken() . '" />';
 	echo '<input type="hidden" name="action" value="save" />';
 
 	echo '<table class="noborder centpercent">';
 
 	echo '<tr class="liste_titre">';
-	echo '<th>'.$langs->trans('ExpenseReportApplyTo').'</th>';
-	echo '<th>'.$langs->trans('Type').'</th>';
-	echo '<th>'.$langs->trans('ExpenseReportLimitOn').'</th>';
-	echo '<th>'.$langs->trans('ExpenseReportDateStart').'</th>';
-	echo '<th>'.$langs->trans('ExpenseReportDateEnd').'</th>';
-	echo '<th>'.$langs->trans('ExpenseReportLimitAmount').'</th>';
-	echo '<th>'.$langs->trans('ExpenseReportRestrictive').'</th>';
+	echo '<th>' . $langs->trans('ExpenseReportApplyTo') . '</th>';
+	echo '<th>' . $langs->trans('Type') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportLimitOn') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportDateStart') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportDateEnd') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportLimitAmount') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportRestrictive') . '</th>';
 	echo '<th>&nbsp;</th>';
 	echo '</tr>';
 
 	echo '<tr class="oddeven">';
 	echo '<td>';
-	echo '<div class="float">'.$form->selectarray('apply_to', $tab_apply, '', 0).'</div>';
-	echo '<div id="user" class="float">'.$form->select_dolusers('', 'fk_user').'</div>';
-	echo '<div id="group" class="float">'.$form->select_dolgroups('', 'fk_usergroup').'</div>';
+	echo '<div class="float">' . $form->selectarray('apply_to', $tab_apply, '', 0) . '</div>';
+	echo '<div id="user" class="float">' . $form->select_dolusers('', 'fk_user') . '</div>';
+	echo '<div id="group" class="float">' . $form->select_dolgroups('', 'fk_usergroup') . '</div>';
 	echo '</td>';
 
-	echo '<td>'.$form->selectExpense('', 'fk_c_type_fees', 0, 1, 1).'</td>';
-	echo '<td>'.$form->selectarray('code_expense_rules_type', $tab_rules_type, '', 0).'</td>';
-	echo '<td>'.$form->selectDate(strtotime(date('Y-m-01', dol_now())), 'start', '', '', 0, '', 1, 0).'</td>';
-	echo '<td>'.$form->selectDate(strtotime(date('Y-m-t', dol_now())), 'end', '', '', 0, '', 1, 0).'</td>';
-	echo '<td><input type="text" value="" class="maxwidth100" name="amount" class="amount" /> '.$conf->currency.'</td>';
-	echo '<td>'.$form->selectyesno('restrictive', 0, 1).'</td>';
-	echo '<td class="right"><input type="submit" class="button button-add" value="'.$langs->trans('Add').'" /></td>';
+	echo '<td>' . $form->selectExpense('', 'fk_c_type_fees', 0, 1, 1) . '</td>';
+	echo '<td>' . $form->selectarray('code_expense_rules_type', $tab_rules_type, '', 0) . '</td>';
+	echo '<td>' . $form->selectDate(strtotime(date('Y-m-01', dol_now())), 'start', '', '', 0, '', 1, 0) . '</td>';
+	echo '<td>' . $form->selectDate(strtotime(date('Y-m-t', dol_now())), 'end', '', '', 0, '', 1, 0) . '</td>';
+	echo '<td><input type="text" value="" class="maxwidth100" name="amount" class="amount" /> ' . $conf->currency . '</td>';
+	echo '<td>' . $form->selectyesno('restrictive', 0, 1) . '</td>';
+	echo '<td class="right"><input type="submit" class="button button-add" value="' . $langs->trans('Add') . '" /></td>';
 	echo '</tr>';
 
 	echo '</table>';
@@ -208,26 +217,26 @@ if ($action != 'edit') {
 }
 
 
-echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
-echo '<input type="hidden" name="token" value="'.newToken().'" />';
+	echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">';
+	echo '<input type="hidden" name="token" value="' . newToken() . '" />';
 
 if ($action == 'edit') {
-	echo '<input type="hidden" name="id" value="'.$object->id.'" />';
+	echo '<input type="hidden" name="id" value="' . $object->id . '" />';
 	echo '<input type="hidden" name="action" value="save" />';
 }
 
-echo '<table class="noborder centpercent">';
+	echo '<table class="noborder centpercent">';
 
-echo '<tr class="liste_titre">';
-echo '<th>'.$langs->trans('ExpenseReportApplyTo').'</th>';
-echo '<th>'.$langs->trans('Type').'</th>';
-echo '<th>'.$langs->trans('ExpenseReportLimitOn').'</th>';
-echo '<th>'.$langs->trans('ExpenseReportDateStart').'</th>';
-echo '<th>'.$langs->trans('ExpenseReportDateEnd').'</th>';
-echo '<th>'.$langs->trans('ExpenseReportLimitAmount').'</th>';
-echo '<th>'.$langs->trans('ExpenseReportRestrictive').'</th>';
-echo '<th>&nbsp;</th>';
-echo '</tr>';
+	echo '<tr class="liste_titre">';
+	echo '<th>' . $langs->trans('ExpenseReportApplyTo') . '</th>';
+	echo '<th>' . $langs->trans('Type') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportLimitOn') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportDateStart') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportDateEnd') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportLimitAmount') . '</th>';
+	echo '<th>' . $langs->trans('ExpenseReportRestrictive') . '</th>';
+	echo '<th>&nbsp;</th>';
+	echo '</tr>';
 
 foreach ($rules as $rule) {
 	echo '<tr class="oddeven">';
@@ -235,16 +244,16 @@ foreach ($rules as $rule) {
 	echo '<td>';
 	if ($action == 'edit' && $object->id == $rule->id) {
 		$selected = ($object->is_for_all > 0) ? 'A' : ($object->fk_usergroup > 0 ? 'G' : 'U');
-		echo '<div class="float">'.$form->selectarray('apply_to', $tab_apply, $selected, 0).'</div>';
-		echo '<div id="user" class="float">'.$form->select_dolusers($object->fk_user, 'fk_user').'</div>';
-		echo '<div id="group" class="float">'.$form->select_dolgroups($object->fk_usergroup, 'fk_usergroup').'</div>';
+		echo '<div class="float">' . $form->selectarray('apply_to', $tab_apply, $selected, 0) . '</div>';
+		echo '<div id="user" class="float">' . $form->select_dolusers($object->fk_user, 'fk_user') . '</div>';
+		echo '<div id="group" class="float">' . $form->select_dolgroups($object->fk_usergroup, 'fk_usergroup') . '</div>';
 	} else {
 		if ($rule->is_for_all > 0) {
 			echo $tab_apply['A'];
 		} elseif ($rule->fk_usergroup > 0) {
-			echo $tab_apply['G'].' ('.$rule->getGroupLabel().')';
+			echo $tab_apply['G'] . ' (' . $rule->getGroupLabel() . ')';
 		} elseif ($rule->fk_user > 0) {
-			echo $tab_apply['U'].' ('.$rule->getUserName().')';
+			echo $tab_apply['U'] . ' (' . $rule->getUserName() . ')';
 		}
 	}
 	echo '</td>';
@@ -257,11 +266,11 @@ foreach ($rules as $rule) {
 		if ($rule->fk_c_type_fees == -1) {
 			echo $langs->trans('AllExpenseReport');
 		} else {
-			$key = getDictionaryValue(MAIN_DB_PREFIX.'c_type_fees', 'code', $rule->fk_c_type_fees, false, 'id');
+			$key = getDictionaryValue(MAIN_DB_PREFIX . 'c_type_fees', 'code', $rule->fk_c_type_fees, false, 'id');
 			if ($key && $key != $langs->trans($key)) {
 				echo $langs->trans($key);
 			} else {
-				$value = getDictionaryValue(MAIN_DB_PREFIX.'c_type_fees', 'label', $rule->fk_c_type_fees, false, 'id');
+				$value = getDictionaryValue(MAIN_DB_PREFIX . 'c_type_fees', 'label', $rule->fk_c_type_fees, false, 'id');
 				echo $langs->trans($value ? $value : 'Undefined'); // TODO check to return trans of 'code'
 			}
 		}
@@ -298,7 +307,7 @@ foreach ($rules as $rule) {
 
 	echo '<td>';
 	if ($action == 'edit' && $object->id == $rule->id) {
-		echo '<input type="text" value="'.price2num($object->amount).'" name="amount" class="amount" />'.$conf->currency;
+		echo '<input type="text" value="' . price2num($object->amount) . '" name="amount" class="amount" />' . $conf->currency;
 	} else {
 		echo price($rule->amount, 0, $langs, 1, -1, -1, $conf->currency);
 	}
@@ -316,11 +325,11 @@ foreach ($rules as $rule) {
 
 	echo '<td class="center">';
 	if ($object->id != $rule->id) {
-		echo '<a class="editfielda paddingright paddingleft" href="'.$_SERVER['PHP_SELF'].'?action=edit&token='.newToken().'&id='.$rule->id.'">'.img_edit().'</a>&nbsp;';
-		echo '<a class="paddingright paddingleft" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$rule->id.'">'.img_delete().'</a>';
+		echo '<a class="editfielda paddingright paddingleft" href="' . $_SERVER['PHP_SELF'] . '?action=edit&token=' . newToken() . '&id=' . $rule->id . '">' . img_edit() . '</a>&nbsp;';
+		echo '<a class="paddingright paddingleft" href="' . $_SERVER['PHP_SELF'] . '?action=delete&token=' . newToken() . '&id=' . $rule->id . '">' . img_delete() . '</a>';
 	} else {
-		echo '<input type="submit" class="button button-edit" value="'.$langs->trans('Update').'" />&nbsp;';
-		echo '<a href="'.$_SERVER['PHP_SELF'].'" class="button button-cancel">'.$langs->trans("Cancel").'</a>';
+		echo '<input type="submit" class="button button-edit" value="' . $langs->trans('Update') . '" />&nbsp;';
+		echo '<a href="' . $_SERVER['PHP_SELF'] . '" class="button button-cancel">' . $langs->trans("Cancel") . '</a>';
 	}
 	echo '</td>';
 
@@ -328,10 +337,10 @@ foreach ($rules as $rule) {
 }
 
 
-echo '</table>';
-echo '</form>';
+	echo '</table>';
+	echo '</form>';
 
-echo '<script type="text/javascript"> $(function() {
+	echo '<script type="text/javascript"> $(function() {
 	$("#apply_to").change(function() {
 		var value = $(this).val();
 		if (value == "A") {
@@ -349,6 +358,7 @@ echo '<script type="text/javascript"> $(function() {
 
 }); </script>';
 
+
 print dol_get_fiche_end();
 
 // End of page

+ 3 - 2
htdocs/admin/mails_templates.php

@@ -769,7 +769,7 @@ if ($action == 'add') {
 			if (empty($conf->global->FCKEDITOR_ENABLE_MAIL)) {
 				$okforextended = false;
 			}
-			$doleditor = new DolEditor($tmpfieldlist, (!empty($obj->{$tmpfieldlist}) ? $obj->{$tmpfieldlist} : ''), '', 180, 'dolibarr_mailings', 'In', 0, false, $okforextended, ROWS_4, '90%');
+			$doleditor = new DolEditor($tmpfieldlist, (!empty($obj->{$tmpfieldlist}) ? $obj->{$tmpfieldlist} : ''), '', 180, 'dolibarr_mailings', 'In', 0, true, $okforextended, ROWS_4, '90%');
 			print $doleditor->Create(1);
 		}
 		print '</td>';
@@ -1000,7 +1000,7 @@ if ($resql) {
 							if (empty($conf->global->FCKEDITOR_ENABLE_MAIL)) {
 								$okforextended = false;
 							}
-							$doleditor = new DolEditor($tmpfieldlist.'-'.$rowid, (!empty($obj->{$tmpfieldlist}) ? $obj->{$tmpfieldlist} : ''), '', 500, 'dolibarr_mailings', 'In', 0, false, $okforextended, ROWS_6, '90%');
+							$doleditor = new DolEditor($tmpfieldlist.'-'.$rowid, (!empty($obj->{$tmpfieldlist}) ? $obj->{$tmpfieldlist} : ''), '', 500, 'dolibarr_mailings', 'In', 0, true, $okforextended, ROWS_6, '90%');
 							print $doleditor->Create(1);
 						}
 						if ($tmpfieldlist == 'content_lines') {
@@ -1152,6 +1152,7 @@ if ($resql) {
 					//else print '<a href="#">'.img_delete().'</a>';    // Some dictionary can be edited by other profile than admin
 				}
 				print '</td>';
+
 				print "</tr>\n";
 			}
 

+ 0 - 1
htdocs/core/lib/functions.lib.php

@@ -7909,7 +7909,6 @@ function dol_htmloutput_events($disabledoutputofmessages = 0)
 		}
 		unset($_SESSION['dol_events']['mesgs']);
 	}
-
 	// Show errors
 	if (isset($_SESSION['dol_events']['errors'])) {
 		if (empty($disabledoutputofmessages)) {

+ 2 - 2
htdocs/core/login/functions_ldap.php

@@ -109,9 +109,9 @@ function check_user_password_ldap($usertotest, $passwordtotest, $entitytotest)
 			$userSearchFilter = str_replace('%1%', $usertotest, $dolibarr_main_auth_ldap_filter);
 		}
 
-		// If admin login provided
+		// If admin login or ldap auth filter provided
 		// Code to get user in LDAP from an admin connection (may differ from user connection, done later)
-		if ($ldapadminlogin) {
+		if ($ldapadminlogin || $dolibarr_main_auth_ldap_filter) {
 			$result = $ldap->connect_bind();
 			if ($result > 0) {
 				$resultFetchLdapUser = $ldap->fetch($usertotest, $userSearchFilter);

+ 2 - 0
htdocs/install/mysql/migration/15.0.0-16.0.0.sql

@@ -300,3 +300,5 @@ UPDATE llx_c_availability SET type_duration = 'w', qty = 3 WHERE code = 'AV_3W';
 UPDATE llx_c_availability SET type_duration = 'w', qty = 4 WHERE code = 'AV_4W';
 
 ALTER TABLE llx_boxes_def ADD COLUMN fk_user integer DEFAULT 0 NOT NULL;
+
+ALTER TABLE llx_contratdet ADD COLUMN rang integer DEFAULT 0 AFTER info_bits;

+ 1 - 0
htdocs/install/mysql/tables/llx_contratdet.sql

@@ -56,6 +56,7 @@ create table llx_contratdet
   product_type			integer       DEFAULT 1,               -- Type of line (1=service by default)
   info_bits		        integer DEFAULT 0, 		               -- TVA NPR ou non
 
+  rang					integer DEFAULT 0,
   buy_price_ht          double(24,8)  DEFAULT NULL,            -- buying price
   fk_product_fournisseur_price integer DEFAULT NULL,           -- reference of supplier price when line was added was created (may be used to update buy_price_ht when future invoice will be created)
 

+ 2 - 1
htdocs/takepos/invoice.php

@@ -535,7 +535,8 @@ if ($action == "addline") {
 	}
 
 	$idoflineadded = 0;
-	if (!empty($conf->global->TAKEPOS_GROUP_SAME_PRODUCT)) {
+	// Group if enabled. Skip group if line already sent to the printer
+	if (!empty($conf->global->TAKEPOS_GROUP_SAME_PRODUCT) && $line->special_code != "4") {
 		foreach ($invoice->lines as $line) {
 			if ($line->product_ref == $prod->ref) {
 				if ($line->special_code==4) continue; // If this line is sended to printer create new line