Browse Source

Merge branch 'Dolibarr:develop' into develop

mschamp 3 years ago
parent
commit
77d1f83964

+ 5 - 1
htdocs/adherents/agenda.php

@@ -136,7 +136,11 @@ if ($object->id > 0) {
 
 	$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
 
-	dol_banner_tab($object, 'rowid', $linkback);
+	$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
+	$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
+	$morehtmlref .= '</a>';
+
+	dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
 
 	print '<div class="fichecenter">';
 

+ 13 - 19
htdocs/adherents/card.php

@@ -918,12 +918,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
 	// When used in standard mode
 	// -----------------------------------------
 
+	// Create mode
 	if ($action == 'create') {
-		/* ************************************************************************** */
-		/*                                                                            */
-		/* Creation mode                                                              */
-		/*                                                                            */
-		/* ************************************************************************** */
 		$object->canvas = $canvas;
 		$object->state_id = GETPOST('state_id', 'int');
 
@@ -1145,13 +1141,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
 		print "</form>\n";
 	}
 
+	// Edit mode
 	if ($action == 'edit') {
-		/********************************************
-		*
-		* Edition mode
-		*
-		********************************************/
-
 		$res = $object->fetch($id);
 		if ($res < 0) {
 			dol_print_error($db, $object->error); exit;
@@ -1412,13 +1403,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
 		print '</form>';
 	}
 
+	// View
 	if ($id > 0 && $action != 'edit') {
-		/* ************************************************************************** */
-		/*                                                                            */
-		/* View mode                                                                  */
-		/*                                                                            */
-		/* ************************************************************************** */
-
 		$res = $object->fetch($id);
 		if ($res < 0) {
 			dol_print_error($db, $object->error); exit;
@@ -1707,7 +1693,12 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
 
 		$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
 
-		dol_banner_tab($object, 'rowid', $linkback);
+		$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
+		$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
+		$morehtmlref .= '</a>';
+
+
+		dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
 
 		print '<div class="fichecenter">';
 		print '<div class="fichehalfleft">';
@@ -1862,13 +1853,16 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
 		print '</td></tr>';
 
 		// VCard
+		/*
 		print '<tr><td>';
 		print $langs->trans("VCard").'</td><td colspan="3">';
 		print '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'">';
-		print img_picto($langs->trans("Download"), 'vcard.png', 'class="paddingrightonly"');
+		print img_picto($langs->trans("Download").' vcard', 'vcard.png', 'class="paddingrightonly"');
 		print $langs->trans("Download");
+		print img_picto($langs->trans("Download").' vcard', 'download', 'class="paddingleft"');
 		print '</a>';
 		print '</td></tr>';
+		*/
 
 		print "</table>\n";
 

+ 5 - 1
htdocs/adherents/document.php

@@ -138,7 +138,11 @@ if ($id > 0) {
 
 		$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
 
-		dol_banner_tab($object, 'rowid', $linkback);
+		$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
+		$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
+		$morehtmlref .= '</a>';
+
+		dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
 
 		print '<div class="fichecenter">';
 

+ 5 - 1
htdocs/adherents/note.php

@@ -107,7 +107,11 @@ if ($id) {
 
 	$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
 
-	dol_banner_tab($object, 'id', $linkback);
+	$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
+	$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
+	$morehtmlref .= '</a>';
+
+	dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref);
 
 	print '<div class="fichecenter">';
 

+ 5 - 1
htdocs/adherents/subscription.php

@@ -485,7 +485,11 @@ if ($rowid > 0) {
 
 	$linkback = '<a href="'.DOL_URL_ROOT.'/adherents/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
 
-	dol_banner_tab($object, 'rowid', $linkback);
+	$morehtmlref = '<a href="'.DOL_URL_ROOT.'/adherents/vcard.php?id='.$object->id.'" class="refid">';
+	$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"');
+	$morehtmlref .= '</a>';
+
+	dol_banner_tab($object, 'rowid', $linkback, 1, 'rowid', 'ref', $morehtmlref);
 
 	print '<div class="fichecenter">';
 	print '<div class="fichehalfleft">';

+ 5 - 13
htdocs/adherents/type.php

@@ -292,7 +292,7 @@ if (!$rowid && $action != 'create' && $action != 'edit') {
 			$membertype->amount = $objp->amount;
 
 			print '<tr class="oddeven">';
-			print '<td>';
+			print '<td class="nowraponall">';
 			print $membertype->getNomUrl(1);
 			//<a href="'.$_SERVER["PHP_SELF"].'?rowid='.$objp->rowid.'">'.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.'</a>
 			print '</td>';
@@ -340,12 +340,7 @@ if (!$rowid && $action != 'create' && $action != 'edit') {
 	}
 }
 
-
-/* ************************************************************************** */
-/*                                                                            */
-/* Creation mode                                                              */
-/*                                                                            */
-/* ************************************************************************** */
+// Creation
 if ($action == 'create') {
 	$object = new AdherentType($db);
 
@@ -416,11 +411,7 @@ if ($action == 'create') {
 	print "</form>\n";
 }
 
-/* ************************************************************************** */
-/*                                                                            */
-/* View mode                                                                  */
-/*                                                                            */
-/* ************************************************************************** */
+// View
 if ($rowid > 0) {
 	if ($action != 'edit') {
 		$object = new AdherentType($db);
@@ -455,8 +446,9 @@ if ($rowid > 0) {
 		print yn($object->subscription);
 		print '</tr>';
 
+		// Amount
 		print '<tr><td class="titlefield">'.$langs->trans("Amount").'</td><td>';
-		print ((is_null($object->amount) || $object->amount === '') ? '' : price($object->amount));
+		print ((is_null($object->amount) || $object->amount === '') ? '' : '<span class="amount">'.price($object->amount).'</span>');
 		print '</tr>';
 
 		print '<tr><td>'.$langs->trans("VoteAllowed").'</td><td>';

+ 70 - 61
htdocs/admin/notification.php

@@ -204,6 +204,18 @@ if (!empty($conf->global->NOTIFICATION_EMAIL_FROM) && !isValidEmail($conf->globa
 print '</td>';
 print '</tr>';
 
+print '<tr class="oddeven"><td>';
+print $langs->trans("NotificationDisableConfirmMessageContact").'</td>';
+print '<td>';
+if ($conf->use_javascript_ajax) {
+	print ajax_constantonoff('NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT');
+} else {
+	$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
+	print $form->selectarray("NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT", $arrval, $conf->global->NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT);
+}
+print '</td>';
+print '</tr>';
+
 print '<tr class="oddeven"><td>';
 print $langs->trans("NotificationDisableConfirmMessageUser").'</td>';
 print '<td>';
@@ -215,6 +227,7 @@ if ($conf->use_javascript_ajax) {
 }
 print '</td>';
 print '</tr>';
+
 print '<tr class="oddeven"><td>';
 print $langs->trans("NotificationDisableConfirmMessageFix").'</td>';
 print '<td>';
@@ -241,79 +254,68 @@ print '<input type="hidden" name="token" value="'.newToken().'">';
 print '<input type="hidden" name="action" value="settemplates">';
 
 // Notification per contacts
-$title = $langs->trans("ListOfNotificationsPerUser");
-if (!empty($conf->societe->enabled)) {
-	$title = $langs->trans("ListOfNotificationsPerUserOrContact");
-}
-print load_fiche_titre($title, '', '');
+$title = $langs->trans("TemplatesForNotifications");
+
+print load_fiche_titre($title, '', 'email');
 
 // Load array of available notifications
 $notificationtrigger = new InterfaceNotification($db);
 $listofnotifiedevents = $notificationtrigger->getListOfManagedEvents();
 
+// Editing global variables not related to a specific theme
+$constantes = array();
+foreach ($listofnotifiedevents as $notifiedevent) {
+	$label = $langs->trans("Notify_".$notifiedevent['code']); //!=$langs->trans("Notify_".$notifiedevent['code'])?$langs->trans("Notify_".$notifiedevent['code']):$notifiedevent['label'];
+	$elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
 
-if ($conf->global->MAIN_FEATURES_LEVEL >= 2) {
-	// Editing global variables not related to a specific theme
-	$constantes = array();
-	foreach ($listofnotifiedevents as $notifiedevent) {
-		$label = $langs->trans("Notify_".$notifiedevent['code']); //!=$langs->trans("Notify_".$notifiedevent['code'])?$langs->trans("Notify_".$notifiedevent['code']):$notifiedevent['label'];
-		$elementLabel = $langs->trans(ucfirst($notifiedevent['elementtype']));
-
-		if ($notifiedevent['elementtype'] == 'order_supplier') {
-			$elementLabel = $langs->trans('SupplierOrder');
-		} elseif ($notifiedevent['elementtype'] == 'propal') {
-			$elementLabel = $langs->trans('Proposal');
-		} elseif ($notifiedevent['elementtype'] == 'facture') {
-			$elementLabel = $langs->trans('Bill');
-		} elseif ($notifiedevent['elementtype'] == 'commande') {
-			$elementLabel = $langs->trans('Order');
-		} elseif ($notifiedevent['elementtype'] == 'ficheinter') {
-			$elementLabel = $langs->trans('Intervention');
-		} elseif ($notifiedevent['elementtype'] == 'shipping') {
-			$elementLabel = $langs->trans('Shipping');
-		} elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
-			$elementLabel = $langs->trans('ExpenseReport');
-		}
-
-		if ($notifiedevent['elementtype'] == 'propal') {
-			$model = 'propal_send';
-		} elseif ($notifiedevent['elementtype'] == 'commande') {
-			$model = 'order_send';
-		} elseif ($notifiedevent['elementtype'] == 'facture') {
-			$model = 'facture_send';
-		} elseif ($notifiedevent['elementtype'] == 'shipping') {
-			$model = 'shipping_send';
-		} elseif ($notifiedevent['elementtype'] == 'ficheinter') {
-			$model = 'fichinter_send';
-		} elseif ($notifiedevent['elementtype'] == 'expensereport') {
-			$model = 'expensereport_send';
-		} elseif ($notifiedevent['elementtype'] == 'order_supplier') {
-			$model = 'order_supplier_send';
-			// } elseif ($notifiedevent['elementtype'] == 'invoice_supplier') $model = 'invoice_supplier_send';
-		} elseif ($notifiedevent['elementtype'] == 'member') {
-			$model = 'member';
-		}
+	if ($notifiedevent['elementtype'] == 'order_supplier') {
+		$elementLabel = $langs->trans('SupplierOrder');
+	} elseif ($notifiedevent['elementtype'] == 'propal') {
+		$elementLabel = $langs->trans('Proposal');
+	} elseif ($notifiedevent['elementtype'] == 'facture') {
+		$elementLabel = $langs->trans('Bill');
+	} elseif ($notifiedevent['elementtype'] == 'commande') {
+		$elementLabel = $langs->trans('Order');
+	} elseif ($notifiedevent['elementtype'] == 'ficheinter') {
+		$elementLabel = $langs->trans('Intervention');
+	} elseif ($notifiedevent['elementtype'] == 'shipping') {
+		$elementLabel = $langs->trans('Shipping');
+	} elseif ($notifiedevent['elementtype'] == 'expensereport' || $notifiedevent['elementtype'] == 'expense_report') {
+		$elementLabel = $langs->trans('ExpenseReport');
+	}
 
-		$constantes[$notifiedevent['code'].'_TEMPLATE'] = array('type'=>'emailtemplate:'.$model, 'label'=>$label);
+	if ($notifiedevent['elementtype'] == 'propal') {
+		$model = 'propal_send';
+	} elseif ($notifiedevent['elementtype'] == 'commande') {
+		$model = 'order_send';
+	} elseif ($notifiedevent['elementtype'] == 'facture') {
+		$model = 'facture_send';
+	} elseif ($notifiedevent['elementtype'] == 'shipping') {
+		$model = 'shipping_send';
+	} elseif ($notifiedevent['elementtype'] == 'ficheinter') {
+		$model = 'fichinter_send';
+	} elseif ($notifiedevent['elementtype'] == 'expensereport') {
+		$model = 'expensereport_send';
+	} elseif ($notifiedevent['elementtype'] == 'order_supplier') {
+		$model = 'order_supplier_send';
+		// } elseif ($notifiedevent['elementtype'] == 'invoice_supplier') $model = 'invoice_supplier_send';
+	} elseif ($notifiedevent['elementtype'] == 'member') {
+		$model = 'member';
 	}
 
-	$helptext = '';
-	form_constantes($constantes, 3, $helptext, 'EmailTemplate');
+	$constantes[$notifiedevent['code'].'_TEMPLATE'] = array('type'=>'emailtemplate:'.$model, 'label'=>$label);
+}
 
-	print '<div class="opacitymedium">';
-	print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
-	if (!empty($conf->societe->enabled)) {
-		print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
-	}
-	print '</div>';
+$helptext = '';
+form_constantes($constantes, 3, $helptext, 'EmailTemplate');
+
+print $form->buttonsSaveCancel("Save", '');
 
-	print $form->buttonsSaveCancel("Save", '');
+/*
 } else {
 	print '<table class="noborder centpercent">';
 	print '<tr class="liste_titre">';
 	print '<td>'.$langs->trans("Label").'</td>';
-	/*print '<td>'.$langs->trans("Code").'</td>';
-	print '<td>'.$langs->trans("Label").'</td>';*/
 	//print '<td class="right">'.$langs->trans("NbOfTargetedContacts").'</td>';
 	print "</tr>\n";
 
@@ -359,6 +361,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL >= 2) {
 	}
 	print '</div>';
 }
+*/
 
 print '</form>';
 
@@ -371,7 +374,15 @@ print '<input type="hidden" name="token" value="'.newToken().'">';
 print '<input type="hidden" name="action" value="setfixednotif">';
 print '<input type="hidden" name="page_y" value="">';
 
-print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', '');
+print load_fiche_titre($langs->trans("ListOfFixedNotifications"), '', 'email');
+
+print '<div class="info">';
+print $langs->trans("Note").':<br>';
+print '* '.$langs->trans("GoOntoUserCardToAddMore").'<br>';
+if (!empty($conf->societe->enabled)) {
+	print '** '.$langs->trans("GoOntoContactCardToAddMore").'<br>';
+}
+print '</div>';
 
 print '<table class="noborder centpercent">';
 print '<tr class="liste_titre">';
@@ -488,8 +499,6 @@ foreach ($listofnotifiedevents as $notifiedevent) {
 }
 print '</table>';
 
-print '<br>';
-
 print $form->buttonsSaveCancel("Save", '');
 
 print '</form>';

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

@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2001-2007  Rodolphe Quiedeville    <rodolphe@quiedeville.org>
+/* Copyright (C) 2001-2007 Rodolphe Quiedeville    <rodolphe@quiedeville.org>
  * Copyright (C) 2004-2014 Laurent Destailleur   <eldy@users.sourceforge.net>
  * Copyright (C) 2004      Eric Seigne           <eric.seigne@ryxeo.com>
  * Copyright (C) 2005      Marc Barilley / Ocebo <marc@ocebo.com>
@@ -817,7 +817,7 @@ if (empty($reshook)) {
 				}
 			}
 		}
-	} elseif ($action == 'addline' && GETPOST('submitforalllines', 'alpha') && GETPOST('vatforalllines', 'alpha') !== '') {
+	} elseif ($action == 'addline' && GETPOST('submitforalllines', 'alpha') && GETPOST('vatforalllines', 'alpha') !== '' && $usercancreate) {
 		// Define vat_rate
 		$vat_rate = (GETPOST('vatforalllines') ? GETPOST('vatforalllines') : 0);
 		$vat_rate = str_replace('*', '', $vat_rate);
@@ -835,7 +835,7 @@ if (empty($reshook)) {
 		$prod_entry_mode = GETPOST('prod_entry_mode');
 		if ($prod_entry_mode == 'free') {
 			$idprod = 0;
-			$tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0);
+			$tva_tx = (GETPOST('tva_tx') ? price2num(GETPOST('tva_tx')) : 0);
 		} else {
 			$idprod = GETPOST('idprod', 'int');
 			$tva_tx = '';
@@ -2680,7 +2680,7 @@ if ($action == 'create') {
 		$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem, $compatibleImportElementsList);
 
 		// Show online signature link
-		$useonlinesignature = 1; // Replace this with 1 when feature to make online signature is ok
+		$useonlinesignature = 1;
 
 		if ($object->statut != Propal::STATUS_DRAFT && $useonlinesignature) {
 			print '<br><!-- Link to sign -->';

+ 80 - 50
htdocs/core/ajax/onlineSign.php

@@ -51,11 +51,27 @@ if (!defined('NOBROWSERNOTIF')) {
 include '../../main.inc.php';
 
 $action = GETPOST('action', 'aZ09');
+
 $signature = GETPOST('signaturebase64');
 $ref = GETPOST('ref', 'aZ09');
 $mode = GETPOST('mode', 'aZ09');
+$SECUREKEY = GETPOST("securekey"); // Secure key
+
 $error = 0;
 $response = "";
+
+// Check securitykey
+$securekeyseed = $conf->global->PROPOSAL_ONLINE_SIGNATURE_SECURITY_TOKEN;
+$type = $mode;
+$calculatedsecuritykey = dol_hash($securekeyseed.$type.$ref, '0');
+
+if ($calculatedsecuritykey != $SECUREKEY) {
+	http_response_code(403);
+	print 'Bad value for securitykey. Value provided '.dol_escape_htmltag($SECUREKEY).' does not match expected value for ref='.dol_escape_htmltag($ref);
+	exit(-1);
+}
+
+
 /*
  * Actions
  */
@@ -71,62 +87,76 @@ if ($action == "importSignature") {
 	if (!empty($signature) && $signature[0] == "image/png;base64") {
 		$signature = $signature[1];
 		$data = base64_decode($signature);
-		$upload_dir = DOL_DATA_ROOT."/".$mode."/".$ref."/";
-		$date = dol_print_date(dol_now(), "%Y%m%d%H%M%S");
-		$filename = "signatures/".$date."_signature.png";
-		if (!is_dir($upload_dir."signatures/")) {
-			if (!mkdir($upload_dir."signatures/")) {
-				$response ="error mkdir";
-				$error++;
+
+		if ($mode == "propale" || $mode == 'proposal') {
+			require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
+			require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
+			$object = new Propal($db);
+			$object->fetch(0, $ref);
+
+			$upload_dir = !empty($conf->propal->multidir_output[$object->entity])?$conf->propal->multidir_output[$object->entity]:$conf->propal->dir_output;
+			$upload_dir .= '/'.dol_sanitizeFileName($object->ref).'/';
+
+			$date = dol_print_date(dol_now(), "%Y%m%d%H%M%S");
+			$filename = "signatures/".$date."_signature.png";
+			if (!is_dir($upload_dir."signatures/")) {
+				if (!dol_mkdir($upload_dir."signatures/")) {
+					$response ="Error mkdir. Failed to create dir ".$upload_dir."signatures/";
+					$error++;
+				}
 			}
-		}
-		if (!$error) {
-			$return = file_put_contents($upload_dir.$filename, $data);
-			if ($return == false) {
-				$response = 'error file_put_content';
-			} else {
-				if ($mode == "propale") {
-					require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
-					require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
-					$object = new Propal($db);
-					$object->fetch(0, $ref);
-
-					$pdf = pdf_getInstance();
-					$pdf->Open();
-					$pdf->AddPage();
-					$pagecount = $pdf->setSourceFile($upload_dir.$ref.".pdf");
-
-					$tppl = $pdf->importPage(1);
-					$pdf->useTemplate($tppl);
-					$pdf->Image($upload_dir.$filename, 129, 239.6, 60, 15);
-					$pdf->Close();
-					$pdf->Output($upload_dir.$ref."_signed-".$date.".pdf", "F");
-
-					$sql  = "UPDATE ".MAIN_DB_PREFIX."propal";
-					$sql .= " SET fk_statut = ".((int) $object::STATUS_SIGNED).", note_private = '".$object->note_private."', date_signature='".$db->idate(dol_now())."'";
-					$sql .= " WHERE rowid = ".((int) $object->id);
-
-					dol_syslog(__METHOD__, LOG_DEBUG);
-					$resql = $db->query($sql);
-					if (!$resql) {
-						$error++;
-					} else {
-						$num = $db->affected_rows($resql);
-					}
-
-					if (!$error) {
-						$db->commit();
-						$response = "success";
-						setEventMessage("PropalSigned");
-					} else {
-						$db->rollback();
-						$response = "error sql";
-					}
+
+			if (!$error) {
+				$return = file_put_contents($upload_dir.$filename, $data);
+				if ($return == false) {
+					$error++;
+					$response = 'error file_put_content';
+				}
+			}
+
+			if (!$error) {
+				$pdf = pdf_getInstance();
+				$pdf->Open();
+				$pdf->AddPage();
+				$pagecount = $pdf->setSourceFile($upload_dir.$ref.".pdf");
+
+				$tppl = $pdf->importPage(1);
+				$pdf->useTemplate($tppl);
+				$pdf->Image($upload_dir.$filename, 129, 239.6, 60, 15);
+				$pdf->Close();
+				$pdf->Output($upload_dir.$ref."_signed-".$date.".pdf", "F");
+
+				$sql  = "UPDATE ".MAIN_DB_PREFIX."propal";
+				$sql .= " SET fk_statut = ".((int) $object::STATUS_SIGNED).", note_private = '".$object->note_private."', date_signature='".$db->idate(dol_now())."'";
+				$sql .= " WHERE rowid = ".((int) $object->id);
+
+				dol_syslog(__METHOD__, LOG_DEBUG);
+				$resql = $db->query($sql);
+				if (!$resql) {
+					$error++;
+				} else {
+					$num = $db->affected_rows($resql);
+				}
+
+				if (!$error) {
+					$db->commit();
+					$response = "success";
+					setEventMessages("PropalSigned", null, 'warnings');
+				} else {
+					$db->rollback();
+					$error++;
+					$response = "error sql";
 				}
 			}
 		}
 	} else {
+		$error++;
 		$response = 'error signature_not_found';
 	}
 }
+
+if ($error) {
+	http_response_code(501);
+}
+
 echo $response;

+ 1 - 1
htdocs/core/class/html.formfile.class.php

@@ -761,7 +761,7 @@ class FormFile
 					$arraykeys = array_keys($modellist);
 					$modelselected = $arraykeys[0];
 				}
-				$morecss = 'maxwidth200';
+				$morecss = 'minwidth75 maxwidth200';
 				if ($conf->browser->layout == 'phone') {
 					$morecss = 'maxwidth100';
 				}

+ 10 - 0
htdocs/core/class/notify.class.php

@@ -108,7 +108,9 @@ class Notify
 		global $conf, $langs;
 		$langs->load("mails");
 
+		// Get full list of all notifications subscribed for $action, $socid and $object
 		$listofnotiftodo = $this->getNotificationsArray($action, $socid, $object, 0);
+
 		if (!empty($conf->global->NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_USER)) {
 			foreach ($listofnotiftodo as $val) {
 				if ($val['type'] == 'touser') {
@@ -117,6 +119,14 @@ class Notify
 				}
 			}
 		}
+		if (!empty($conf->global->NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_CONTACT)) {
+			foreach ($listofnotiftodo as $val) {
+				if ($val['type'] == 'tocontact') {
+					unset($listofnotiftodo[$val['email']]);
+					//$listofnotiftodo = array_merge($listofnotiftodo);
+				}
+			}
+		}
 		if (!empty($conf->global->NOTIFICATION_EMAIL_DISABLE_CONFIRM_MESSAGE_FIX)) {
 			foreach ($listofnotiftodo as $val) {
 				if ($val['type'] == 'tofixedemail') {

+ 26 - 4
htdocs/core/lib/signature.lib.php

@@ -18,7 +18,7 @@
  */
 
 /**
- * Return string with full Url
+ * Return string with full online Url to accept and sign a quote
  *
  * @param   string	$type		Type of URL ('proposal', ...)
  * @param	string	$ref		Ref of object
@@ -58,13 +58,27 @@ function showOnlineSignatureUrl($type, $ref)
  */
 function getOnlineSignatureUrl($mode, $type, $ref = '')
 {
-	global $conf, $db, $langs;
+	global $conf, $db, $langs, $dolibarr_main_url_root;
 
 	$ref = str_replace(' ', '', $ref);
 	$out = '';
 
+	// Define $urlwithroot
+	$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+	$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
+	//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
+
+	$localorexternal = 1; // external
+
+	$urltouse = DOL_MAIN_URL_ROOT;
+	if ($localorexternal) {
+		$urltouse = $urlwithroot;
+	}
+
+	$securekeyseed = $conf->global->PROPOSAL_ONLINE_SIGNATURE_SECURITY_TOKEN;
+
 	if ($type == 'proposal') {
-		$out = DOL_MAIN_URL_ROOT.'/public/onlinesign/newonlinesign.php?source=proposal&ref='.($mode ? '<span style="color: #666666">' : '');
+		$out = $urltouse.'/public/onlinesign/newonlinesign.php?source=proposal&ref='.($mode ? '<span style="color: #666666">' : '');
 		if ($mode == 1) {
 			$out .= 'proposal_ref';
 		}
@@ -72,6 +86,12 @@ function getOnlineSignatureUrl($mode, $type, $ref = '')
 			$out .= urlencode($ref);
 		}
 		$out .= ($mode ? '</span>' : '');
+		if ($mode == 1) {
+			$out .= "hash('".$securekeyseed."' + '".$type."' + proposal_ref)";
+		} else {
+			$out .= '&securekey='.dol_hash($securekeyseed.$type.$ref, '0');
+		}
+		/*
 		if ($mode == 1) {
 			$out .= '&hashp=<span style="color: #666666">hash_of_file</span>';
 		} else {
@@ -94,13 +114,15 @@ function getOnlineSignatureUrl($mode, $type, $ref = '')
 			} else {
 				$out .= '&hashp='.$hashp;
 			}
-		}
+		}*/
 	}
 
 	// For multicompany
+	/*
 	if (!empty($out)) {
 		$out .= "&entity=".$conf->entity; // Check the entity because He may be the same reference in several entities
 	}
+	*/
 
 	return $out;
 }

+ 2 - 2
htdocs/core/menus/init_menu_auguria.sql

@@ -283,6 +283,8 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $conf->expensereport->enabled && empty($conf->global->ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS)', __HANDLER__, 'left', 2420__+MAX_llx_menu__, 'accountancy', 'accountancy_dispatch_expensereport', 2400__+MAX_llx_menu__, '/accountancy/expensereport/index.php?mainmenu=accountancy&amp;leftmenu=accountancy_dispatch_expensereport', 'ExpenseReportsVentilation', 1, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 5, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $conf->expensereport->enabled && empty($conf->global->ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS) && $leftmenu=="accountancy_dispatch_expensereport"', __HANDLER__, 'left', 2421__+MAX_llx_menu__, 'accountancy', '', 2420__+MAX_llx_menu__, '/accountancy/expensereport/list.php?mainmenu=accountancy', 'ToDispatch', 2, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 6, __ENTITY__);
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $conf->expensereport->enabled && empty($conf->global->ACCOUNTING_DISABLE_BINDING_ON_EXPENSEREPORTS) && $leftmenu=="accountancy_dispatch_expensereport"', __HANDLER__, 'left', 2422__+MAX_llx_menu__, 'accountancy', '', 2420__+MAX_llx_menu__, '/accountancy/expensereport/lines.php?mainmenu=accountancy', 'Dispatched', 2, 'accountancy', '$user->rights->accounting->bind->write', '', 0, 7, __ENTITY__);
+-- Export accounting documents
+insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->comptabilite->enabled || $conf->accounting->enabled', __HANDLER__, 'left', 2436__+MAX_llx_menu__, 'accountancy', 'accountancy_files', 2400__+MAX_llx_menu__, '/compta/accounting-files.php?mainmenu=accountancy&leftmenu=accountancy_files', 'AccountantFiles', 1, 'accountancy', '$user->rights->compta->resultat->lire || $user->rights->accounting->mouvements->lire', '', 0, 16, __ENTITY__);
 -- Journals
 --insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2705__+MAX_llx_menu__, 'accountancy', '', 2400__+MAX_llx_menu__, '', 'Journalization', 1, 'main', '$user->rights->accounting->comptarapport->lire', '', 0, 1, __ENTITY__);
 --insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2707__+MAX_llx_menu__, 'accountancy', '', 2705__+MAX_llx_menu__, '/accountancy/journal/bankjournal.php?mainmenu=accountancy&leftmenu=accountancy_journal&id_journal=3', 'BankJournal', 2, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 1, __ENTITY__);
@@ -295,8 +297,6 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2432__+MAX_llx_menu__, 'accountancy', 'bookkeeping', 2400__+MAX_llx_menu__, '/accountancy/bookkeeping/listbyaccount.php?mainmenu=accountancy&leftmenu=accountancy_bookeeping', 'Bookkeeping', 1, 'accountancy', '$user->rights->accounting->mouvements->lire', '', 0, 12, __ENTITY__);
 -- Journals
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2434__+MAX_llx_menu__, 'accountancy', 'bookkeeping', 2400__+MAX_llx_menu__, '/accountancy/bookkeeping/list.php?mainmenu=accountancy&leftmenu=accountancy_bookeeping', 'Journals', 1, 'accountancy', '$user->rights->accounting->mouvements->lire', '', 0, 15, __ENTITY__);
--- Export accounting documents
-insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->comptabilite->enabled || $conf->accounting->enabled', __HANDLER__, 'left', 2436__+MAX_llx_menu__, 'accountancy', 'accountancy_files', 2400__+MAX_llx_menu__, '/compta/accounting-files.php?mainmenu=accountancy&leftmenu=accountancy_files', 'AccountantFiles', 1, 'accountancy', '$user->rights->compta->resultat->lire || $user->rights->accounting->mouvements->lire', '', 0, 16, __ENTITY__);
 -- Closure
 insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2437__+MAX_llx_menu__, 'accountancy', 'accountancy_closure', 2400__+MAX_llx_menu__, '/accountancy/closure/index.php?mainmenu=accountancy&leftmenu=accountancy_closure', 'MenuAccountancyClosure', 1, 'accountancy', '$user->rights->accounting->fiscalyear->write', '', 0, 17, __ENTITY__);
 -- Reports

+ 6 - 5
htdocs/core/menus/standard/eldy.lib.php

@@ -1348,6 +1348,12 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM
 					$db->free($resql);
 				}
 
+				// Files
+				if (empty($conf->global->ACCOUNTANCY_HIDE_EXPORT_FILES_MENU)) {
+					$newmenu->add("/compta/accounting-files.php?mainmenu=accountancy&amp;leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 1, $user->rights->accounting->mouvements->lire);
+				}
+
+
 				// Accounting
 				$newmenu->add("/accountancy/index.php?leftmenu=accountancy_accountancy", $langs->trans("MenuAccountancy"), 0, $user->rights->accounting->mouvements->lire || $user->rights->accounting->comptarapport->lire, '', $mainmenu, 'accountancy', 1, '', '', '', img_picto('', 'accountancy', 'class="paddingright pictofixedwidth"'));
 
@@ -1360,11 +1366,6 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM
 				// Account Balance
 				$newmenu->add("/accountancy/bookkeeping/balance.php?mainmenu=accountancy&amp;leftmenu=accountancy_accountancy", $langs->trans("AccountBalance"), 1, $user->rights->accounting->mouvements->lire);
 
-				// Files
-				if (empty($conf->global->ACCOUNTANCY_HIDE_EXPORT_FILES_MENU)) {
-					$newmenu->add("/compta/accounting-files.php?mainmenu=accountancy&amp;leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 1, $user->rights->accounting->mouvements->lire);
-				}
-
 				// Closure
 				$newmenu->add("/accountancy/closure/index.php?mainmenu=accountancy&amp;leftmenu=accountancy_closure", $langs->trans("MenuAccountancyClosure"), 1, $user->rights->accounting->fiscalyear->write, '', $mainmenu, 'closure');
 

+ 4 - 0
htdocs/install/default.css

@@ -40,6 +40,10 @@
 	display: inline-block;	
 }
 
+.no-bottom {
+	padding-bottom: 0;	
+}
+
 .small {
 	font-size: 0.9em;	
 }

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

@@ -48,7 +48,7 @@ CountriesNotInEEC=Countries not in EEC
 CountriesInEECExceptMe=Countries in EEC except %s
 CountriesExceptMe=All countries except %s
 AccountantFiles=Export source documents
-ExportAccountingSourceDocHelp=With this tool, you can export the source events (list in CSV and PDFs) that were used to generate your accountancy.
+ExportAccountingSourceDocHelp=With this tool, you can export the source events (list in CSV and PDFs) that are used to generate your accountancy.
 ExportAccountingSourceDocHelp2=To export your journals, use the menu entry %s - %s.
 VueByAccountAccounting=View by accounting account
 VueBySubAccountAccounting=View by accounting subaccount

+ 4 - 2
htdocs/langs/en_US/admin.lang

@@ -1712,8 +1712,9 @@ MailingDelay=Seconds to wait after sending next message
 NotificationSetup=Email Notification module setup
 NotificationEMailFrom=Sender email (From) for emails sent by the Notifications module
 FixedEmailTarget=Recipient
-NotificationDisableConfirmMessageFix=Disable the information about targets into the confirmation message before sending the notifications to the global emails
-NotificationDisableConfirmMessageUser=Disable the information about targets into the confirmation message before sending the notifications to the user emails
+NotificationDisableConfirmMessageContact=Hide the list of recipients (subscribed as contact) of notifications into the confirmation message
+NotificationDisableConfirmMessageUser=Hide the list of recipients (subscribed as user) of notifications into the confirmation message
+NotificationDisableConfirmMessageFix=Hide the list of recipients (subscribed as global email) of notifications into the confirmation message
 ##### Sendings #####
 SendingsSetup=Shipping module setup
 SendingsReceiptModel=Sending receipt model
@@ -1905,6 +1906,7 @@ ExpenseReportsRulesSetup=Setup of module Expense Reports - Rules
 ExpenseReportNumberingModules=Expense reports numbering module
 NoModueToManageStockIncrease=No module able to manage automatic stock increase has been activated. Stock increase will be done on manual input only.
 YouMayFindNotificationsFeaturesIntoModuleNotification=You may find options for email notifications by enabling and configuring the module "Notification".
+TemplatesForNotifications=Templates for notifications
 ListOfNotificationsPerUser=List of automatic notifications per user*
 ListOfNotificationsPerUserOrContact=List of possible automatic notifications (on business event) available per user* or per contact**
 ListOfFixedNotifications=List of automatic fixed notifications

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

@@ -88,7 +88,7 @@ FileWasNotUploaded=A file is selected for attachment but was not yet uploaded. C
 NbOfEntries=No. of entries
 GoToWikiHelpPage=Read online help (Internet access needed)
 GoToHelpPage=Read help
-DedicatedPageAvailable=There is a dedicated help page related to your current screen
+DedicatedPageAvailable=Dedicated help page related to your current screen
 HomePage=Home Page
 RecordSaved=Record saved
 RecordDeleted=Record deleted

+ 3 - 3
htdocs/main.inc.php

@@ -1932,9 +1932,9 @@ function top_menu($head, $title = '', $target = '', $disablejs = 0, $disablehead
 			// Link to help pages
 			if ($helpbaseurl && $helppage) {
 				$text = '';
-				$title = $langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage' : 'GoToHelpPage').'...';
+				$title = $langs->trans($mode == 'wiki' ? 'GoToWikiHelpPage' : 'GoToHelpPage').', ';
 				if ($mode == 'wiki') {
-					$title .= '<br>'.$langs->trans("PageWiki").' '.dol_escape_htmltag('"'.strtr($helppage, '_', ' ').'"');
+					$title .= '<br>'.img_picto('', 'globe', 'class="pictofixedwidth"').$langs->trans("PageWiki").' '.dol_escape_htmltag('"'.strtr($helppage, '_', ' ').'"');
 					if ($helppresent) {
 						$title .= ' <span class="opacitymedium">('.$langs->trans("DedicatedPageAvailable").')</span>';
 					} else {
@@ -1949,7 +1949,7 @@ function top_menu($head, $title = '', $target = '', $disablejs = 0, $disablehead
 				}
 				$text .= '">';
 				$text .= '<span class="fa fa-question-circle atoplogin valignmiddle'.($helppresent ? ' '.$helppresent : '').'"></span>';
-				$text .= '<span class="fa fa-circle helppresentcircle'.($helppresent ? '' : ' unvisible').'"></span>';
+				$text .= '<span class="fa fa-long-arrow-alt-up helppresentcircle'.($helppresent ? '' : ' unvisible').'"></span>';
 				$text .= '</a>';
 				$toprightmenu .= $form->textwithtooltip('', $title, 2, 1, $text, 'login_block_elem', 2);
 			}

+ 27 - 8
htdocs/public/onlinesign/newonlinesign.php

@@ -122,6 +122,17 @@ $creditor = $mysoc->name;
 $object = new Propal($db);
 $object->fetch(0, $ref);
 
+// Check securitykey
+$securekeyseed = $conf->global->PROPOSAL_ONLINE_SIGNATURE_SECURITY_TOKEN;
+$type = $source;
+$calculatedsecuritykey = dol_hash($securekeyseed.$type.$ref, '0');
+
+if ($calculatedsecuritykey != $SECUREKEY) {
+	http_response_code(403);
+	print 'Bad value for securitykey. Value provided '.dol_escape_htmltag($SECUREKEY).' does not match expected value for ref='.dol_escape_htmltag($ref);
+	exit(-1);
+}
+
 
 /*
  * Actions
@@ -144,7 +155,7 @@ if ($action == 'confirm_refusepropal') {
 		$db->commit();
 
 		$message = 'refused';
-		setEventMessages("PropalRefused", null, 'warning');
+		setEventMessages("PropalRefused", null, 'warnings');
 	} else {
 		$db->rollback();
 	}
@@ -170,7 +181,7 @@ $replacemainarea = (empty($conf->dol_hide_leftmenu) ? '<div>' : '').'<div>';
 llxHeader($head, $langs->trans("OnlineSignature"), '', '', 0, 0, '', '', '', 'onlinepaymentbody', $replacemainarea, 1);
 
 if ($action == 'refusepropal') {
-	print $form->formconfirm($_SERVER["PHP_SELF"].'?ref='.$ref, $langs->trans('RefusePropal'), $langs->trans('ConfirmRefusePropal', $object->ref), 'confirm_refusepropal', '', '', 1);
+	print $form->formconfirm($_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&securekey='.urlencode($SECUREKEY), $langs->trans('RefusePropal'), $langs->trans('ConfirmRefusePropal', $object->ref), 'confirm_refusepropal', '', '', 1);
 }
 
 // Check link validity for param 'source'
@@ -195,7 +206,7 @@ print '<input type="hidden" name="entity" value="'.$entity.'" />';
 print "\n";
 print '<!-- Form to sign -->'."\n";
 
-print '<table id="dolpaymenttable" summary="Payment form" class="center">'."\n";
+print '<table id="dolpublictable" summary="Payment form" class="center">'."\n";
 
 // Show logo (search order: logo defined by ONLINE_SIGN_LOGO_suffix, then ONLINE_SIGN_LOGO_, then small company logo, large company logo, theme logo, common logo)
 // Define logo and logosmall
@@ -295,6 +306,13 @@ if ($source == 'proposal') {
 	print '<b>'.$proposal->thirdparty->name.'</b>';
 	print '</td></tr>'."\n";
 
+	// Amount
+
+	print '<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans("Amount");
+	print '</td><td class="CTableRow2">';
+	print '<b>'.price($proposal->total_ttc, 0, $langs, 1, -1, -1, $conf->currency).'</b>';
+	print '</td></tr>'."\n";
+
 	// Object
 
 	$text = '<b>'.$langs->trans("SignatureProposalRef", $proposal->ref).'</b>';
@@ -308,7 +326,7 @@ if ($source == 'proposal') {
 			print $langs->trans("DownloadDocument").'</a>';
 		}
 	} else {
-		/* TODO If proposal signed newer than proposal ref, get link of proposal signed
+		/* TODO If the file of proposal signed is newer than the default proposal file, get link of proposal signed
 
 		*/
 	}
@@ -358,7 +376,7 @@ if ($action == "dosign" && empty($cancel)) {
 	print '<script language="JavaScript" type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/jSignature/jSignature.js"></script>
 	<script type="text/javascript">
 	$(document).ready(function() {
-	  $("#signature").jSignature({ color:"#000", lineWidth:4, height: 180});
+	  $("#signature").jSignature({ color:"#000", lineWidth:4, '.(empty($conf->dol_optimize_smallscreen) ? '' : 'width: 280, ' ).'height: 180});
 
 	  $("#signature").on("change",function(){
 		$("#clearsignature").css("display","");
@@ -373,13 +391,14 @@ if ($action == "dosign" && empty($cancel)) {
 					data: {
 						"action" : "importSignature",
 						"signaturebase64" : signature,
-						"ref" : "'.dol_escape_js($REF).'",
-						"mode" : "propale",
+						"ref" : \''.dol_escape_js($REF).'\',
+						"securekey" : \''.dol_escape_js($SECUREKEY).'\',
+						"mode" : \''.dol_escape_htmltag($source).'\',
 					},
 					success: function(response) {
 						if(response == "success"){
 							console.log("Success on saving signature");
-							window.location.replace("'.$_SERVER["SELF"].'?ref='.urlencode($ref).'&message=signed");
+							window.location.replace("'.$_SERVER["PHP_SELF"].'?ref='.urlencode($ref).'&message=signed&securekey='.urlencode($SECUREKEY).'");
 						}else{
 							console.error(response);
 						}

+ 8 - 4
htdocs/public/payment/newpayment.php

@@ -926,7 +926,8 @@ print '<!-- urlok = '.$urlok.' -->'."\n";
 print '<!-- urlko = '.$urlko.' -->'."\n";
 print "\n";
 
-print '<table id="dolpaymenttable" summary="Payment form" class="center">'."\n";
+// Section with payment informationsummary
+print '<table id="dolpublictable" summary="Payment form" class="center">'."\n";
 
 // Output introduction text
 $text = '';
@@ -1524,10 +1525,13 @@ if ($source == 'member' || $source == 'membersubscription') {
 
 	// Debitor
 	print '<tr class="CTableRow2"><td class="CTableRow2">'.$langs->trans("Member");
-	print '</td><td class="CTableRow2"><b>';
-	if ($member->morphy == 'mor' && !empty($member->societe)) {
-		print $member->societe;
+	print '</td><td class="CTableRow2">';
+	print '<b>';
+	if ($member->morphy == 'mor' && !empty($member->company)) {
+		print img_picto('', 'company', 'class="pictofixedwidth"');
+		print $member->company;
 	} else {
+		print img_picto('', 'member', 'class="pictofixedwidth"');
 		print $member->getFullName($langs);
 	}
 	print '</b>';

+ 16 - 1
htdocs/public/test/test_csrf.php

@@ -49,9 +49,24 @@ This is a form to test if a CSRF exists into a Dolibarr page.<br>
 	print 'urltosendrequest = '.$urltosendrequest.'<br><br>';
 ?>
 
+Test post
 <form method="POST" action="<?php echo $urltosendrequest; ?>" target="_blank">
 <!-- <input type="hidden" name="token" value="123456789"> -->
 <input type="text" name="action" value="add">
 <input type="text" name="nom" value="New group test">
 <input type="submit" name="submit" value="Submit">
-</form>
+</form>
+
+
+Test logout
+<html>
+  <body>
+  <script>history.pushState('', '', '/')</script>
+	<form action="http://localhostgit/dolibarr_dev/htdocs/user/logout.php">
+	  <input type="submit" value="Submit request" />
+	</form>
+	<script>
+	  document.forms[0].submit();
+	</script>
+  </body>
+</html>

+ 1 - 1
htdocs/theme/eldy/dropdown.inc.php

@@ -359,7 +359,7 @@ a.top-menu-dropdown-link {
 	-webkit-font-smoothing: antialiased;
 	text-align:center;
 	text-decoration:none;
-	margin-right: 5px;
+	margin-<?php echo $right; ?>: 5px;
 	display: inline-block;
 	content: "\f0da";
 	/* color: rgba(0,0,0,0.3); */

+ 24 - 10
htdocs/theme/eldy/global.inc.php

@@ -2932,14 +2932,17 @@ a.help:link, a.help:visited, a.help:hover, a.help:active, span.help {
 	/* color: #f3e4ac !important; */
 }
 .helppresentcircle {
+	/*
 	color: var(--colorbackhmenu1);
-	filter: invert(0.8);
-	margin-<?php echo $left ?>: -7px;
+	filter: invert(0.5);
+	*/
+	color: var(--colortextbackhmenu);
+	margin-<?php echo $left ?>: -4px;
 	display: inline-block;
-	margin-top: -10px;
 	font-size: x-small;
 	vertical-align: super;
 	opacity: 0.95;
+	transform: rotate(<?php echo ($left == 'left' ? '55deg' : '305deg'); ?>);
 }
 
 .vmenu div.blockvmenufirst, .vmenu div.blockvmenulogo, .vmenu div.blockvmenusearchphone, .vmenu div.blockvmenubookmarks
@@ -3627,16 +3630,19 @@ div.refidpadding  {
 }
 div.refid  {
 	font-weight: bold;
-	  color: var(--colortexttitlenotab);
-	  font-size: 1.2em;
-	  word-break: break-word;
+	color: var(--colortexttitlenotab);
+	font-size: 1.2em;
+	word-break: break-word;
+}
+a.refid {
+	color: var(--colortexttitlenotab) !important;
 }
 div.refidno  {
 	padding-top: 3px;
 	font-weight: normal;
-	  color: var(--refidnocolor);
-	  font-size: <?php print is_numeric($fontsize) ? $fontsize.'px' : $fontsize ?>;
-	  line-height: 1.4em;
+	color: var(--refidnocolor);
+	font-size: <?php print is_numeric($fontsize) ? $fontsize.'px' : $fontsize ?>;
+	line-height: 1.4em;
 }
 div.refidno form {
 	display: inline-block;
@@ -4576,7 +4582,15 @@ div.backgreypublicpayment { background-color: #f0f0f0; padding: 20px; border-bot
 	color: #222;
 	opacity: 0.3;
 }
-#dolpaymenttable { min-width: 320px; font-size: 16px; }	/* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */
+
+#dolpublictable {
+	min-width: 300px; font-size: 16px;
+	padding: 6px;
+}
+#dolpaymenttable {
+	min-width: 320px; font-size: 16px;
+}	/* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */
+
 #tablepublicpayment {
 	border: 1px solid #CCCCCC !important;
 	width: 100%;

+ 1 - 1
htdocs/theme/md/dropdown.inc.php

@@ -365,7 +365,7 @@ a.top-menu-dropdown-link {
 	-webkit-font-smoothing: antialiased;
 	text-align:center;
 	text-decoration:none;
-	margin-right: 5px;
+	margin-<?php echo $right; ?>: 5px;
 	display: inline-block;
 	content: "\f0da";
 	color: rgba(0,0,0,0.3);

+ 30 - 15
htdocs/theme/md/style.css.php

@@ -1834,7 +1834,7 @@ td.showDragHandle {
 	width: 100%;
 	padding-bottom: 20px;
 <?php if (GETPOST('optioncss', 'aZ09') != 'print') { ?>
-	padding-left: 229px;
+	padding-<?php print $left; ?>: 229px;
 	padding-top: 16px;
 <?php } ?>
 }
@@ -1860,13 +1860,13 @@ td.showDragHandle {
 	display: none;
 <?php } else { ?>
 	background: var(--colorbackvmenu1);
-	border-right: 1px solid rgba(0,0,0,0.2);
+	border-<?php echo $right; ?>: 1px solid rgba(0,0,0,0.2);
 	box-shadow: 3px 0 6px -2px #eee;
 	bottom: 0;
 	color: #333;
 	display: block;
 	font-family: "RobotoDraft","Roboto",sans-serif;
-	left: 0;
+	<?php echo $left; ?>: 0;
 	<?php
 	if (in_array($conf->browser->layout, array('phone', 'tablet')) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
 	} else { ?>
@@ -1920,12 +1920,13 @@ td.showDragHandle {
 }
 
 body.sidebar-collapse .side-nav-vert, body.sidebar-collapse #id-right {
-	margin-left: 0;padding-left:0
+	margin-left: 0;
+	padding-left:0
 }
 
 
 .side-nav-vert {
-	margin-left: 228px;
+	margin-<?php echo $left; ?>: 228px;
 }
 
 /* body.sidebar-collapse .side-nav, body.sidebar-collapse .login_block_other, body.sidebar-collapse #topmenu-login-dropdown */
@@ -1991,7 +1992,7 @@ div.backgroundsemitransparent {
 
 
 #id-right {
-	padding-left: 0 ! important;
+	padding-<?php print $left; ?>: 0 ! important;
 }
 #id-left {
 	z-index: 91;
@@ -2941,7 +2942,7 @@ form[name="addtime"] img.userphoto {
 div.vmenu, td.vmenu {
 	margin-<?php print $right; ?>: 2px;
 	position: relative;
-	float: left;
+	float: <?php print $left; ?>;
 	padding: 0px;
 	padding-bottom: 0px;
 	padding-top: 0px;
@@ -2949,7 +2950,7 @@ div.vmenu, td.vmenu {
 }
 
 .vmenu {
-	margin-left: 4px;
+	margin-<?php print $left; ?>: 4px;
 	<?php if (GETPOST('optioncss', 'aZ09') == 'print') { ?>
 	display: none;
 	<?php } ?>
@@ -2993,14 +2994,17 @@ a.help:link, a.help:visited, a.help:hover, a.help:active, span.help {
 }
 
 .helppresentcircle {
+	/*
 	color: var(--colorbackhmenu1);
 	filter: invert(0.5);
-	margin-left: -7px;
+	*/
+	color: var(--colortextbackhmenu);
+	margin-left: -4px;
 	display: inline-block;
-	margin-top: -10px;
 	font-size: x-small;
 	vertical-align: super;
 	opacity: 0.95;
+	transform: rotate(<?php echo ($left == 'left' ? '55deg' : '305deg'); ?>);
 }
 
 div.blockvmenulogo
@@ -3658,14 +3662,17 @@ div.refidpadding  {
 div.refid  {
 	font-weight: bold;
 	color: rgb(--colortexttitlenotab);
-	  font-size: 160%;
+	font-size: 160%;
+}
+a.refid {
+	color: var(--colortexttitlenotab) !important;
 }
 div.refidno  {
 	padding-top: 8px;
 	font-weight: normal;
-	  color: #444;
-	  font-size: <?php print $fontsize ?>px;
-	  line-height: 21px;
+	color: #444;
+	font-size: <?php print $fontsize ?>px;
+	line-height: 21px;
 }
 div.refidno form {
 	display: inline-block;
@@ -4527,7 +4534,15 @@ div.backgreypublicpayment { background-color: #f0f0f0; padding: 20px; border-bot
 span.buttonpaymentsmall {
 	text-shadow: none;
 }
-#dolpaymenttable { min-width: 320px; font-size: 16px; }	/* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */
+
+#dolpublictable {
+	min-width: 300px; font-size: 16px;
+	padding: 6px;
+}
+#dolpaymenttable {
+	min-width: 320px; font-size: 16px;
+}	/* Width must have min to make stripe input area visible. Lower than 320 makes input area crazy for credit card that need zip code */
+
 #tablepublicpayment { border: 1px solid #CCCCCC !important; width: 100%; padding: 20px; }
 #tablepublicpayment .CTableRow1  { background-color: #F0F0F0 !important; }
 #tablepublicpayment tr.liste_total { border-bottom: 1px solid #CCCCCC !important; }