Browse Source

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

Laurent Destailleur 3 years ago
parent
commit
cb2c7d1485

+ 6 - 1
htdocs/core/actions_sendmails.inc.php

@@ -182,10 +182,15 @@ if (($action == 'send' || $action == 'relance') && !$_POST['addfile'] && !$_POST
 
 		$tmparray = array();
 		if (trim($_POST['sendto'])) {
-			// Recipients are provided into free text
+			// Recipients are provided into free text field
 			$tmparray[] = trim($_POST['sendto']);
 		}
 
+		if (trim($_POST['tomail'])) {
+			// Recipients are provided into free hidden text field
+			$tmparray[] = trim($_POST['tomail']);
+		}
+
 		if (count($receiver) > 0) {
 			// Recipient was provided from combo list
 			foreach ($receiver as $key => $val) {

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

@@ -3791,7 +3791,6 @@ abstract class CommonObject
 					} elseif ($objecttype == 'contact') {
 						 $module = 'societe';
 					}
-
 					// Set classfile
 					$classfile = strtolower($subelement);
 					$classname = ucfirst($subelement);
@@ -3823,6 +3822,11 @@ abstract class CommonObject
 						$classfile = 'conferenceorboothattendee';
 						$classname = 'ConferenceOrBoothAttendee';
 						$module = 'eventorganization';
+					} elseif ($objecttype == 'conferenceorbooth') {
+						$classpath = 'eventorganization/class';
+						$classfile = 'conferenceorbooth';
+						$classname = 'ConferenceOrBooth';
+						$module = 'eventorganization';
 					}
 
 					// Here $module, $classfile and $classname are set

+ 4 - 0
htdocs/core/class/html.form.class.php

@@ -7849,6 +7849,10 @@ class Form
 					$tplpath = 'expensereport';
 				} elseif ($objecttype == 'subscription') {
 					$tplpath = 'adherents';
+				} elseif ($objecttype == 'conferenceorbooth') {
+					$tplpath = 'eventorganization';
+				} elseif ($objecttype == 'conferenceorboothattendee') {
+					$tplpath = 'eventorganization';
 				}
 
 				global $linkedObjectBlock;

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

@@ -1255,7 +1255,7 @@ class FormMail extends Form
 	 */
 	public function getEMailTemplate($db, $type_template, $user, $outputlangs, $id = 0, $active = 1, $label = '')
 	{
-		global $conf;
+		global $conf, $langs;
 
 		$ret = new ModelMail();
 

+ 44 - 1
htdocs/eventorganization/conferenceorbooth_card.php

@@ -330,7 +330,15 @@ if (!empty($withproject)) {
 	print "</td></tr>";
 
 	print '<tr><td valign="middle">'.$langs->trans("EventOrganizationICSLink").'</td><td>';
-	print '';
+	// Define $urlwithroot
+	$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+	$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+
+	// Show message
+	$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
+	$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+	$message .= "&project=".$projectstatic->id.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
+	print $message;
 	print "</td></tr>";
 
 	print '</table>';
@@ -496,6 +504,41 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea
 	$keyforbreak='pubregister';
 
 	include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
+	$object->fetchObjectLinked();
+
+
+	if (is_array($object->linkedObjects) && count($object->linkedObjects)>0 && array_key_exists("facture", $object->linkedObjects)) {
+		foreach ($object->linkedObjects["facture"] as $fac) {
+			/**
+			 * @var $fac Facture
+			 */
+			if (empty($fac->paye)) {
+				$key = 'paymentlink_'.$fac->id;
+				print '<tr class="field_'.$key.'"><td';
+				print ' class="titlefield fieldname_'.$key;
+				print '">';
+				print img_picto('', 'globe').' <span class="opacitymedium">'.$langs->trans("ToOfferALinkForOnlinePayment", $langs->transnoentitiesnoconv('Online')) . ' '. $fac->ref.'</span><br>';
+				print '</td>';
+
+				print '<td class="valuefield fieldname_'.$key;
+				print '">';
+				$sourcetouse = 'boothlocation';
+				$reftouse = $fac->id;
+				$redirection = $dolibarr_main_url_root.'/public/payment/newpayment.php?source='.$sourcetouse.'&ref='.$reftouse.'&booth='.$object->id;
+				if (!empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
+					if (!empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
+						$redirection .= '&securekey='.dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . $sourcetouse . $reftouse, 2); // Use the source in the hash to avoid duplicates if the references are identical
+					} else {
+						$redirection .= '&securekey='.$conf->global->PAYMENT_SECURITY_TOKEN;
+					}
+				}
+				print '<div class="urllink"><input type="text" id="onlinepaymenturl" class="quatrevingtpercent" value="'.$redirection.'">';
+				print '<a href="'.$redirection.'" target="_blank">'.img_picto('', 'globe', 'class="paddingleft"').'</a></div>';
+				print '</td>';
+				print '</tr>';
+			}
+		}
+	}
 	//var_dump($object);
 	// Other attributes. Fields from hook formObjectOptions and Extrafields.
 	include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';

+ 9 - 1
htdocs/eventorganization/conferenceorbooth_contact.php

@@ -309,7 +309,15 @@ if (!empty($withproject)) {
 	print "</td></tr>";
 
 	print '<tr><td valign="middle">'.$langs->trans("EventOrganizationICSLink").'</td><td>';
-	print '';
+	// Define $urlwithroot
+	$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+	$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+
+	// Show message
+	$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
+	$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+	$message .= "&project=".$projectstatic->id.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
+	print $message;
 	print "</td></tr>";
 
 	print '</table>';

+ 9 - 2
htdocs/eventorganization/conferenceorbooth_document.php

@@ -266,8 +266,15 @@ if (!empty($withproject)) {
 	print "</td></tr>";
 
 	print '<tr><td valign="middle">'.$langs->trans("EventOrganizationICSLink").'</td><td>';
-	print '';
-	//TODO fill with ics
+	// Define $urlwithroot
+	$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+	$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+
+	// Show message
+	$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
+	$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+	$message .= "&project=".$projectstatic->id.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
+	print $message;
 	print "</td></tr>";
 
 	print '</table>';

+ 11 - 6
htdocs/eventorganization/conferenceorbooth_list.php

@@ -173,7 +173,10 @@ if (GETPOST('cancel', 'alpha')) {
 	$action = 'list';
 	$massaction = '';
 }
-if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
+if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend'
+	&& $massaction != 'presend_attendees'
+	&& $massaction != 'confirm_presend'
+	&& $massaction != 'confirm_presend_attendees') {
 	$massaction = '';
 }
 
@@ -211,6 +214,7 @@ if (empty($reshook)) {
 	$objectclass = 'ConferenceOrBooth';
 	$objectlabel = 'ConferenceOrBooth';
 	$uploaddir = $conf->eventorganization->dir_output;
+	include DOL_DOCUMENT_ROOT.'/eventorganization/core/actions_massactions_mail.inc.php';
 	include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
 }
 
@@ -421,8 +425,6 @@ if ($projectid > 0) {
 	$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
 	$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
 	$message .= "&project=".$projectid.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
-	$message .= '</div>';
-	$message .= '<br>';
 	print $message;
 	print "</td></tr>";
 
@@ -583,12 +585,13 @@ $arrayofmassactions = array(
 	//'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
 	//'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
 	//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
-	//'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
+	'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail").' - '.$langs->trans("ConferenceOrBooth"),
+	'presend_attendees'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail").' - '.$langs->trans("Attendees"),
 );
 if ($permissiontodelete) {
 	$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
 }
-if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'predelete'))) {
+if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend', 'presend_attendees', 'predelete'))) {
 	$arrayofmassactions = array();
 }
 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
@@ -612,9 +615,11 @@ print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sort
 $topicmail = "SendConferenceOrBoothRef";
 $modelmail = "conferenceorbooth";
 $objecttmp = new ConferenceOrBooth($db);
-$trackid = 'xxxx'.$object->id;
+$trackid = 'conferenceorbooth_'.$object->id;
+include DOL_DOCUMENT_ROOT.'/eventorganization/tpl/massactions_mail_pre.tpl.php';
 include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
 
+
 if ($search_all) {
 	foreach ($fieldstosearchall as $key => $val) {
 		$fieldstosearchall[$key] = $langs->trans($val);

+ 9 - 1
htdocs/eventorganization/conferenceorboothattendee_card.php

@@ -336,7 +336,15 @@ if (!empty($withproject)) {
 	print "</td></tr>";
 
 	print '<tr><td valign="middle">'.$langs->trans("EventOrganizationICSLink").'</td><td>';
-	print '';
+	// Define $urlwithroot
+	$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+	$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+
+	// Show message
+	$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
+	$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+	$message .= "&project=".$projectstatic->id.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
+	print $message;
 	print "</td></tr>";
 
 	print '</table>';

+ 9 - 1
htdocs/eventorganization/conferenceorboothattendee_list.php

@@ -499,7 +499,15 @@ if ($confOrBooth->id > 0) {
 		print "</td></tr>";
 
 		print '<tr><td valign="middle">'.$langs->trans("EventOrganizationICSLink").'</td><td>';
-		print '';
+		// Define $urlwithroot
+		$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
+		$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
+
+		// Show message
+		$message = '<a href="'.$urlwithroot.'/public/agenda/agendaexport.php?format=ical'.($conf->entity > 1 ? "&entity=".$conf->entity : "");
+		$message .= '&exportkey='.($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ?urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+		$message .= "&project=".$projectstatic->id.'&module='.urlencode('@eventorganization').'&status='.ConferenceOrBooth::STATUS_CONFIRMED.'">'.$langs->trans('DownloadICSLink').'</a>';
+		print $message;
 		print "</td></tr>";
 
 		print '</table>';

+ 315 - 0
htdocs/eventorganization/core/actions_massactions_mail.inc.php

@@ -0,0 +1,315 @@
+<?php
+/* Copyright (C) 2015-2017 Laurent Destailleur  <eldy@users.sourceforge.net>
+ * Copyright (C) 2018-2021 Nicolas ZABOURI	<info@inovea-conseil.com>
+ * Copyright (C) 2018 	   Juanjo Menent  <jmenent@2byte.es>
+ * Copyright (C) 2019 	   Ferran Marcet  <fmarcet@2byte.es>
+ * Copyright (C) 2019-2021 Frédéric France <frederic.france@netlogic.fr>
+ *
+ * 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
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ * or see https://www.gnu.org/
+ */
+
+/**
+ *    \file            htdocs/core/actions_massactions.inc.php
+ *  \brief            Code for actions done with massaction button (send by email, merge pdf, delete, ...)
+ */
+
+
+// $massaction must be defined
+// $objectclass and $objectlabel must be defined
+// $parameters, $object, $action must be defined for the hook.
+
+// $permissiontoread, $permissiontoadd, $permissiontodelete, $permissiontoclose may be defined
+// $uploaddir may be defined (example to $conf->projet->dir_output."/";)
+// $toselect may be defined
+// $diroutputmassaction may be defined
+
+
+// Protection
+if (empty($objectclass) || empty($uploaddir)) {
+	dol_print_error(null, 'include of actions_massactions.inc.php is done but var $objectclass or $uploaddir was not defined');
+	exit;
+}
+
+// For backward compatibility
+if (!empty($permtoread) && empty($permissiontoread)) {
+	$permissiontoread = $permtoread;
+}
+if (!empty($permtocreate) && empty($permissiontoadd)) {
+	$permissiontoadd = $permtocreate;
+}
+if (!empty($permtodelete) && empty($permissiontodelete)) {
+	$permissiontodelete = $permtodelete;
+}
+
+
+// Mass actions. Controls on number of lines checked.
+$maxformassaction = (empty($conf->global->MAIN_LIMIT_FOR_MASS_ACTIONS) ? 1000 : $conf->global->MAIN_LIMIT_FOR_MASS_ACTIONS);
+if (!empty($massaction) && is_array($toselect) && count($toselect) < 1) {
+	$error++;
+	setEventMessages($langs->trans("NoRecordSelected"), null, "warnings");
+}
+if (!$error && is_array($toselect) && count($toselect) > $maxformassaction) {
+	setEventMessages($langs->trans('TooManyRecordForMassAction', $maxformassaction), null, 'errors');
+	$error++;
+}
+
+if (!$error && $massaction == 'confirm_presend_attendees' && !GETPOST('sendmail')) {  // If we do not choose button send (for example when we change template or limit), we must not send email, but keep on send email form
+	$massaction = 'presend_attendees';
+}
+if (!$error && $massaction == 'confirm_presend_attendees') {
+	$resaction = '';
+	$nbsent = 0;
+	$nbignored = 0;
+	$langs->load("mails");
+	include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
+
+	$listofobjectid = array();
+
+	$listofobjectref = array();
+	$oneemailperrecipient = (GETPOST('oneemailperrecipient') == 'on' ? 1 : 0);
+
+	if (!$error) {
+		require_once DOL_DOCUMENT_ROOT . '/eventorganization/class/conferenceorboothattendee.class.php';
+		$attendee = new ConferenceOrBoothAttendee($db);
+		$listofselectedid = array();
+		$listofselectedref = array();
+		$objecttmp = new $objectclass($db);
+
+		foreach ($toselect as $toselectid) {
+			$result = $objecttmp->fetch($toselectid);
+			if ($result > 0) {
+				$attendees = $attendee->fetchAll('', '', 0, 0, array('t.fk_actioncomm' => $objecttmp->id));
+				if (is_array($attendees) && count($attendees) > 0) {
+					foreach ($attendees as $attmail) {
+						if (!empty($attmail->email)) {
+							$attmail->fetch_thirdparty();
+							$listofselectedid[$attmail->email] = $attmail;
+							$listofselectedref[$attmail->email] = $objecttmp;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// Check mandatory parameters
+	if (GETPOST('fromtype', 'alpha') === 'user' && empty($user->email)) {
+		$error++;
+		setEventMessages($langs->trans("NoSenderEmailDefined"), null, 'warnings');
+		$massaction = 'presend_attendees';
+	}
+
+	$receiver = $_POST['receiver'];
+	if (!is_array($receiver)) {
+		if (empty($receiver) || $receiver == '-1') {
+			$receiver = array();
+		} else {
+			$receiver = array($receiver);
+		}
+	}
+	if (!trim($_POST['sendto']) && count($receiver) == 0 && count($listofselectedid) == 1) {    // if only one recipient, receiver is mandatory
+		$error++;
+		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Recipient")), null, 'warnings');
+		$massaction = 'presend_attendees';
+	}
+
+	if (!GETPOST('subject', 'restricthtml')) {
+		$error++;
+		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("MailTopic")), null, 'warnings');
+		$massaction = 'presend_attendees';
+	}
+
+	if (!$error) {
+		$objecttmp->fetch_thirdparty();
+		foreach ($listofselectedid as $email => $attendees) {
+			$sendto = '';
+			$sendtocc = '';
+			$sendtobcc = '';
+			$sendtoid = array();
+
+			// Define $sendto
+			$sendto = $attendees->thirdparty->name . '<' . trim($attendees->email) . '>';
+
+			// Define $sendtocc
+			$receivercc = $_POST['receivercc'];
+			if (!is_array($receivercc)) {
+				if ($receivercc == '-1') {
+					$receivercc = array();
+				} else {
+					$receivercc = array($receivercc);
+				}
+			}
+			$tmparray = array();
+			if (trim($_POST['sendtocc'])) {
+				$tmparray[] = trim($_POST['sendtocc']);
+			}
+			$sendtocc = implode(',', $tmparray);
+
+
+			$langs->load("commercial");
+
+			$reg = array();
+			$fromtype = GETPOST('fromtype');
+			if ($fromtype === 'user') {
+				$from = $user->getFullName($langs) . ' <' . $user->email . '>';
+			} elseif ($fromtype === 'company') {
+				$from = $conf->global->MAIN_INFO_SOCIETE_NOM . ' <' . $conf->global->MAIN_INFO_SOCIETE_MAIL . '>';
+			} elseif (preg_match('/user_aliases_(\d+)/', $fromtype, $reg)) {
+				$tmp = explode(',', $user->email_aliases);
+				$from = trim($tmp[($reg[1] - 1)]);
+			} elseif (preg_match('/global_aliases_(\d+)/', $fromtype, $reg)) {
+				$tmp = explode(',', $conf->global->MAIN_INFO_SOCIETE_MAIL_ALIASES);
+				$from = trim($tmp[($reg[1] - 1)]);
+			} elseif (preg_match('/senderprofile_(\d+)_(\d+)/', $fromtype, $reg)) {
+				$sql = 'SELECT rowid, label, email FROM ' . MAIN_DB_PREFIX . 'c_email_senderprofile WHERE rowid = ' . (int) $reg[1];
+				$resql = $db->query($sql);
+				$obj = $db->fetch_object($resql);
+				if ($obj) {
+					$from = $obj->label . ' <' . $obj->email . '>';
+				}
+			} else {
+				$from = $_POST['fromname'] . ' <' . $_POST['frommail'] . '>';
+			}
+
+			$replyto = $from;
+			$subject = GETPOST('subject', 'restricthtml');
+			$message = GETPOST('message', 'restricthtml');
+
+			$sendtobcc = GETPOST('sendtoccc');
+
+			// $objecttmp is a real object or an empty object if we choose to send one email per thirdparty instead of one per object
+			// Make substitution in email content
+			$substitutionarray = getCommonSubstitutionArray($langs, 0, null, $attendees);
+
+			if (!empty($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY)) {
+				$urlwithouturlroot = preg_replace('/' . preg_quote(DOL_URL_ROOT, '/') . '$/i', '', trim($dolibarr_main_url_root));
+				$urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
+				$url_link = $urlwithroot . '/public/agenda/agendaexport.php?format=ical' . ($conf->entity > 1 ? "&entity=" . $conf->entity : "");
+				$url_link .= '&exportkey=' . ($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY ? urlencode($conf->global->MAIN_AGENDA_XCAL_EXPORTKEY) : '...');
+				$url_link .= "&project=" . $listofselectedref[$email]->fk_project . '&module=' . urlencode('@eventorganization') . '&status=' . ConferenceOrBooth::STATUS_CONFIRMED;
+				$html_link = '<a href="' . $url_link . '">' . $langs->trans('DownloadICSLink') . '</a>';
+			}
+			$substitutionarray['__EVENTORGANIZATION_ICS_LINK__'] = $html_link;
+			$substitutionarray['__EVENTORGANIZATION_URL_LINK__'] = $url_link;
+			$substitutionarray['__CHECK_READ__'] = '<img src="' . DOL_MAIN_URL_ROOT . '/public/emailing/mailing-read.php?tag=' . urlencode($attendees->thirdparty->tag) . '&securitykey=' . urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY) . '" width="1" height="1" style="width:1px;height:1px" border="0"/>';
+
+			$parameters = array('mode' => 'formemail');
+
+			if (!empty($listofobjectref)) {
+				$parameters['listofobjectref'] = $listofobjectref;
+			}
+
+			complete_substitutions_array($substitutionarray, $langs, $attendees, $parameters);
+
+			$subjectreplaced = make_substitutions($subject, $substitutionarray);
+			$messagereplaced = make_substitutions($message, $substitutionarray);
+
+
+			if (empty($sendcontext)) {
+				$sendcontext = 'standard';
+			}
+
+			// Send mail (substitutionarray must be done just before this)
+			require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
+			$mailfile = new CMailFile($subjectreplaced, $sendto, $from, $messagereplaced, array(), array(), array(), $sendtocc, $sendtobcc, $deliveryreceipt, -1, '', '', "attendees_".$attendees->id, '', $sendcontext);
+			if ($mailfile->error) {
+				$resaction .= '<div class="error">' . $mailfile->error . '</div>';
+			} else {
+				$result = $mailfile->sendfile();
+				if ($result) {
+					$resaction .= $langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($from, 2), $mailfile->getValidAddress($sendto, 2)) . '<br>'; // Must not contain "
+					$error = 0;
+
+					dol_syslog("Try to insert email event into agenda for objid=" . $attendees->id . " => objectobj=" . get_class($attendees));
+
+					$actionmsg = $langs->transnoentities('MailSentBy') . ' ' . $from . ' ' . $langs->transnoentities('To') . ' ' . $sendto;
+					if ($message) {
+						if ($sendtocc) {
+							$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc);
+						}
+						$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subjectreplaced);
+						$actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":");
+						$actionmsg = dol_concatdesc($actionmsg, $messagereplaced);
+					}
+					$actionmsg2 = '';
+
+					$objectobj2 = $listofselectedref[$email];
+					// Initialisation donnees
+					$objectobj2->actionmsg = $actionmsg; // Long text
+					$objectobj2->actionmsg2 = $actionmsg2; // Short text
+					$objectobj2->fk_element = $objectobj2->id;
+					$objectobj2->elementtype = $objectobj2->element;
+
+					$triggername = 'CONFERENCEORBOOTHATTENDEE_SENTBYMAIL';
+					if (!empty($triggername)) {
+						// Call trigger
+						$result = $objectobj2->call_trigger($triggername, $user);
+						if ($result < 0) {
+							$error++;
+						}
+						// End call triggers
+
+						if ($error) {
+							setEventMessages($db->lasterror(), $objectobj2->errors, 'errors');
+							dol_syslog("Error in trigger " . $triggername . ' ' . $db->lasterror(), LOG_ERR);
+						}
+					}
+
+					$nbsent++; // Nb of object sent
+				} else {
+					$langs->load("other");
+					if ($mailfile->error) {
+						$resaction .= $langs->trans('ErrorFailedToSendMail', $from, $sendto);
+						$resaction .= '<br><div class="error">' . $mailfile->error . '</div>';
+					} elseif (!empty($conf->global->MAIN_DISABLE_ALL_MAILS)) {
+						$resaction .= '<div class="warning">No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS</div>';
+					} else {
+						$resaction .= $langs->trans('ErrorFailedToSendMail', $from, $sendto) . '<br><div class="error">(unhandled error)</div>';
+					}
+				}
+			}
+		}
+	}
+	$resaction .= ($resaction ? '<br>' : $resaction);
+	$resaction .= '<strong>' . $langs->trans("ResultOfMailSending") . ':</strong><br>' . "\n";
+	$resaction .= $langs->trans("NbSelected") . ': ' . count($toselect) . "\n<br>";
+	$resaction .= $langs->trans("NbIgnored") . ': ' . ($nbignored ? $nbignored : 0) . "\n<br>";
+	$resaction .= $langs->trans("NbSent") . ': ' . ($nbsent ? $nbsent : 0) . "\n<br>";
+
+	if ($nbsent) {
+		$action = ''; // Do not show form post if there was at least one successfull sent
+		//setEventMessages($langs->trans("EMailSentToNRecipients", $nbsent.'/'.count($toselect)), null, 'mesgs');
+		setEventMessages($langs->trans("EMailSentForNElements", $nbsent . '/' . count($toselect)), null, 'mesgs');
+		setEventMessages($resaction, null, 'mesgs');
+	} else {
+		//setEventMessages($langs->trans("EMailSentToNRecipients", 0), null, 'warnings');  // May be object has no generated PDF file
+		setEventMessages($resaction, null, 'warnings');
+	}
+
+	$action = 'list';
+	$massaction = '';
+}
+
+
+
+$parameters['toselect'] = $toselect;
+$parameters['uploaddir'] = $uploaddir;
+$parameters['massaction'] = $massaction;
+$parameters['diroutputmassaction'] = isset($diroutputmassaction) ? $diroutputmassaction : null;
+
+$reshook = $hookmanager->executeHooks('doMassActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
+if ($reshook < 0) {
+	setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
+}

+ 61 - 0
htdocs/eventorganization/tpl/linkedobjectblock.tpl.php

@@ -0,0 +1,61 @@
+<?php
+/* Copyright (C) 2010-2011	Regis Houssin <regis.houssin@inodbox.com>
+ * Copyright (C) 2013		Juanjo Menent <jmenent@2byte.es>
+ * Copyright (C) 2014       Marcos García <marcosgdf@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+// Protection to avoid direct call of template
+if (empty($conf) || !is_object($conf)) {
+	print "Error, template page can't be called as URL";
+	exit;
+}
+
+echo "<!-- BEGIN PHP TEMPLATE -->\n";
+
+global $user;
+
+$langs = $GLOBALS['langs'];
+$linkedObjectBlock = $GLOBALS['linkedObjectBlock'];
+$langs->load("eventorganization");
+
+$total = 0;
+foreach ($linkedObjectBlock as $key => $objectlink) {
+	echo '<tr class="oddeven">';
+	echo '<td>' . $langs->trans(get_class($objectlink)) . '</td>';
+	echo '<td>'.$objectlink->getNomUrl(1).'</td>';
+	echo '<td class="center">';
+	if (get_class($objectlink)=='ConferenceOrBooth') {
+		print  dol_trunc($objectlink->label, 20);
+	}
+	print '</td>';
+	echo '<td class="center">';
+	if (get_class($objectlink)=='ConferenceOrBoothAttendee') {
+		print dol_print_date($objectlink->date_subscription);
+	} else {
+		print dol_print_date($objectlink->datep);
+	}
+	print '</td>';
+	echo '<td class="right">';
+	if (get_class($objectlink)=='ConferenceOrBoothAttendee') {
+		print price($objectlink->amount);
+	}
+	print '</td>';
+	echo '<td class="right">'.$objectlink->getLibStatut(3).'</td>';
+	echo '<td class="right"><a class="reposition" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=dellink&dellinkid='.$key.'">'.img_picto($langs->transnoentitiesnoconv("RemoveLink"), 'unlink').'</a></td>';
+	echo '</tr>';
+}
+
+echo "<!-- END PHP TEMPLATE -->\n";

+ 130 - 0
htdocs/eventorganization/tpl/massactions_mail_pre.tpl.php

@@ -0,0 +1,130 @@
+<?php
+/* Copyright (C)    2013      Cédric Salvador     <csalvador@gpcsolutions.fr>
+ * Copyright (C)    2013-2014 Laurent Destailleur <eldy@users.sourceforge.net>
+ * Copyright (C)	2015	  Marcos García		  <marcosgdf@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ * or see https://www.gnu.org/
+ */
+
+// Following var must be set:
+// $arrayofselected = array of id selected
+// $object
+// $objecttmp=new Propal($db);
+// $topicmail="SendSupplierProposalRef";
+// $modelmail="supplier_proposal_send";
+// $trackid='ord'.$object->id;
+
+if ($massaction == 'presend_attendees') {
+	$langs->load("mails");
+	require_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
+	$attendee = new ConferenceOrBoothAttendee($db);
+	$listofselectedid = array();
+	$listofselectedref = array();
+
+	if (!GETPOST('cancel', 'alpha')) {
+		foreach ($arrayofselected as $toselectid) {
+			$result = $objecttmp->fetch($toselectid);
+			if ($result > 0) {
+				$attendees = $attendee->fetchAll('', '', 0, 0, array('t.fk_actioncomm'=>$objecttmp->id));
+				if (is_array($attendees) && count($attendees)>0) {
+					foreach ($attendees as $attmail) {
+						if (!empty($attmail->email)) {
+							$listofselectedid[$attmail->email] = $attmail->id;
+							$listofselectedref[$attmail->id][$toselectid] = $objecttmp->ref;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	print '<input type="hidden" name="massaction" value="confirm_presend_attendees">';
+	print '<input type="hidden" name="projectid" value="'.GETPOST('projectid', 'int').'">';
+
+	include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+	$formmail = new FormMail($db);
+
+	print dol_get_fiche_head(null, '', '');
+
+	// Cree l'objet formulaire mail
+	include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+	$formmail = new FormMail($db);
+	$formmail->withform = -1;
+	$formmail->fromtype = (GETPOST('fromtype') ? GETPOST('fromtype') : (!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE) ? $conf->global->MAIN_MAIL_DEFAULT_FROMTYPE : 'user'));
+
+	if ($formmail->fromtype === 'user') {
+		$formmail->fromid = $user->id;
+	}
+	$formmail->trackid = $trackid;
+	if (!empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) { // If bit 2 is set
+		include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
+		$formmail->frommail = dolAddEmailTrackId($formmail->frommail, $trackid);
+	}
+	$formmail->withfrom = 1;
+	$liste = $langs->trans("AllRecipientSelected", count($listofselectedid));
+	$formmail->withtoreadonly = 1;
+
+	$formmail->withoptiononeemailperrecipient = ((count($listofselectedref) == 1 && count(reset($listofselectedref)) == 1) || empty($liste)) ? 0 : ((GETPOST('oneemailperrecipient') == 'on') ? 1 : -1);
+
+	$formmail->withto = empty($liste) ? (GETPOST('sendto', 'alpha') ?GETPOST('sendto', 'alpha') : array()) : $liste;
+	$formmail->withtofree = empty($liste) ? 1 : 0;
+	$formmail->withtocc = 1;
+	$formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC;
+	$formmail->withtopic = $langs->transnoentities($topicmail, '__REF__', '__REF_CLIENT__');
+	$formmail->withfile = 0;
+	// $formmail->withfile = 2; Not yet supported in mass action
+	$formmail->withmaindocfile = 0; // Add a checkbox "Attach also main document"
+	$formmail->withbody = 1;
+	$formmail->withdeliveryreceipt = 1;
+	$formmail->withcancel = 1;
+
+	// Make substitution in email content
+	$substitutionarray = getCommonSubstitutionArray($langs, 0, null, $object);
+
+	$substitutionarray['__EMAIL__'] = $sendto;
+	$substitutionarray['__CHECK_READ__'] = (is_object($object) && is_object($object->thirdparty)) ? '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag='.urlencode($object->thirdparty->tag).'&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'" width="1" height="1" style="width:1px;height:1px" border="0"/>' : '';
+	$substitutionarray['__PERSONALIZED__'] = ''; // deprecated
+	$substitutionarray['__CONTACTCIVNAME__'] = '';
+
+	$parameters = array(
+		'mode' => 'formemail'
+	);
+	complete_substitutions_array($substitutionarray, $langs, $object, $parameters);
+
+	// Tableau des substitutions
+	$formmail->substit = $substitutionarray;
+
+	// Tableau des parametres complementaires du post
+	$formmail->param['action'] = $action;
+	$formmail->param['models'] = $modelmail;
+	$formmail->param['models_id'] = empty(GETPOST('modelmailselected', 'int'))?$conf->global->EVENTORGANIZATION_TEMPLATE_EMAIL_BULK_ATTENDES:GETPOST('modelmailselected', 'int');
+	$formmail->param['id'] = join(',', $arrayofselected);
+	// $formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
+	if (!empty($conf->global->MAILING_LIMIT_SENDBYWEB) && count($listofselectedid) > $conf->global->MAILING_LIMIT_SENDBYWEB) {
+		$langs->load("errors");
+		print img_warning().' '.$langs->trans('WarningNumberOfRecipientIsRestrictedInMassAction', $conf->global->MAILING_LIMIT_SENDBYWEB);
+		print ' - <a href="javascript: window.history.go(-1)">'.$langs->trans("GoBack").'</a>';
+		$arrayofmassactions = array();
+	} else {
+		print $formmail->get_form();
+	}
+
+	print dol_get_fiche_end();
+}
+// Allow Pre-Mass-Action hook (eg for confirmation dialog)
+$parameters = array(
+	'toselect' => $toselect,
+	'uploaddir' => isset($uploaddir) ? $uploaddir : null
+);

+ 6 - 6
htdocs/install/mysql/data/llx_c_email_templates.sql

@@ -35,9 +35,9 @@ INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private,
 INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, enabled, active, topic, content, content_lines, joinfiles) VALUES (0,'recruitment','recruitmentcandidature_send','',0,null,null,'(AnswerCandidature)'       ,100,'$conf->recruitment->enabled',1,'[__[MAIN_INFO_SOCIETE_NOM]__] __(YourCandidature)__',       '__(Hello)__ __CANDIDATE_FULLNAME__,<br><br>\n\n__(YourCandidatureAnswerMessage)__<br>__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__\n<br><br>\n__(Sincerely)__<br>__USER_SIGNATURE__',null, 0);
 
 -- Event organization 
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationEmailAskConf',       10, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskConf)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventConfRequestWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationEmailAskBooth',      20, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskBooth)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBoothRequestWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationEmailSubsBooth',     30, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailSubsBooth)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBoothSubscriptionWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationEmailSubsEvent',     40, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailSubsEvent)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventEventSubscriptionWasReceived)__<br /><br />__(Sincerely)__<br /><br />__MYCOMPANY_NAME__<br />__USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationMassEmailAttendees', 50, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailAttendees)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBulkMailToAttendees)__<br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
-INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, 'EventOrganizationMassEmailSpeakers',  60, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailSpeakers)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBulkMailToSpeakers)__<br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskConf)',       10, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskConf)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventConfRequestWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailAskBooth)',      20, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailAskBooth)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBoothRequestWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailSubsBooth)',     30, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailSubsBooth)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBoothSubscriptionWasReceived)__<br /><br />__ONLINE_PAYMENT_TEXT_AND_URL__<br /><br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationEmailSubsEvent)',     40, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationEmailSubsEvent)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventEventSubscriptionWasReceived)__<br /><br />__(Sincerely)__<br /><br />__MYCOMPANY_NAME__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailAttendees)', 50, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailAttendees)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBulkMailToAttendees)__<br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);
+INSERT INTO llx_c_email_templates (entity, module, type_template, lang, private, fk_user, datec, label, position, active, topic, content, content_lines, enabled, joinfiles) values (0, '', 'conferenceorbooth', '', 0, null, null, '(EventOrganizationMassEmailSpeakers)',  60, 1, '[__[MAIN_INFO_SOCIETE_NOM]__] __(EventOrganizationMassEmailSpeakers)__', '__(Hello)__ __THIRDPARTY_NAME__,<br /><br />__(ThisIsContentOfYourOrganizationEventBulkMailToSpeakers)__<br /><br />__(Sincerely)__<br />__USER_SIGNATURE__', null, '1', null);

+ 2 - 0
htdocs/langs/en_US/eventorganization.lang

@@ -119,6 +119,8 @@ EventType = Event type
 LabelOfBooth=Booth label
 LabelOfconference=Conference label
 ConferenceIsNotConfirmed=Subcription not available, conference is not confirmed yet
+DateMustBeBeforeThan=%s must be before %s
+DateMustBeAfterThan=%s must be after %s
 
 #
 # Vote page

+ 2 - 2
htdocs/langs/fr_FR/eventorganization.lang

@@ -40,8 +40,8 @@ EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_CONF = Modèle de courriel à envoyer aprè
 EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_BOOTH = Modèle de courriel à envoyer après avoir reçu une suggestion d'un stand.
 EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_BOOTH = Modèle de courriel à envoyer après paiement d'une inscription à un stand.
 EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT = Modèle de courriel à envoyer après paiement d'une inscription à un événement.
-EVENTORGANIZATION_TEMPLATE_EMAIL_BULK_SPEAKER = Modèle de courriel pour action de masse aux participants
-EVENTORGANIZATION_TEMPLATE_EMAIL_BULK_ATTENDES = Modèle de courriel pour action de masse aux intervenants
+EVENTORGANIZATION_TEMPLATE_EMAIL_BULK_SPEAKER = Modèle de courriel pour action de masse aux intervenants
+EVENTORGANIZATION_TEMPLATE_EMAIL_BULK_ATTENDES = Modèle de courriel pour action de masse aux participants
 EVENTORGANIZATION_FILTERATTENDEES_CAT = Filtrer la liste de sélection des tiers dans la fiche/le formulaire de création des participants avec/selon la catégorie
 EVENTORGANIZATION_FILTERATTENDEES_TYPE = Filtrer la liste de sélection des tiers dans la fiche/le formulaire de création des participants avec le type de client
 

+ 6 - 3
htdocs/public/payment/paymentok.php

@@ -1136,6 +1136,8 @@ if ($ispaymentok) {
 						if ($resultattendee < 0) {
 							setEventMessages(null, $attendeetovalidate->errors, "errors");
 						} else {
+							$attendeetovalidate->amount=$FinalPaymentAmt;
+							$attendeetovalidate->update($user);
 							$attendeetovalidate->validate($user);
 
 							// Sending mail
@@ -1156,8 +1158,9 @@ if ($ispaymentok) {
 								$arraydefaultmessage = null;
 
 								$labeltouse = $conf->global->EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT;
+
 								if (!empty($labeltouse)) {
-									$arraydefaultmessage = $formmail->getEMailTemplate($db, 'eventorganization_send', $user, $outputlangs, $labeltouse, 1, '');
+									$arraydefaultmessage = $formmail->getEMailTemplate($db, 'conferenceorbooth', $user, $outputlangs, $labeltouse, 1, '');
 								}
 
 								if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
@@ -1171,7 +1174,7 @@ if ($ispaymentok) {
 								$subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
 								$texttosend = make_substitutions($msg, $substitutionarray, $outputlangs);
 
-								$sendto = $thirdparty->email;
+								$sendto = $attendeetovalidate->email;
 								$from = $conf->global->MAILING_EMAIL_FROM;
 								$urlback = $_SERVER["REQUEST_URI"];
 
@@ -1338,7 +1341,7 @@ if ($ispaymentok) {
 
 										$labeltouse = $conf->global->EVENTORGANIZATION_TEMPLATE_EMAIL_AFT_SUBS_EVENT;
 										if (!empty($labeltouse)) {
-											$arraydefaultmessage = $formmail->getEMailTemplate($db, 'eventorganization_send', $user, $outputlangs, $labeltouse, 1, '');
+											$arraydefaultmessage = $formmail->getEMailTemplate($db, 'conferenceorbooth', $user, $outputlangs, $labeltouse, 1, '');
 										}
 
 										if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {

+ 73 - 55
htdocs/public/project/suggestbooth.php

@@ -81,9 +81,8 @@ $email = GETPOST("email");
 $societe = GETPOST("societe");
 $label = GETPOST("label");
 $note = GETPOST("note");
-$datestart = GETPOST("datestart");
-$dateend = GETPOST("dateend");
-
+$datestart = dol_mktime(0, 0, 0, GETPOST('datestartmonth', 'int'), GETPOST('datestartday', 'int'), GETPOST('datestartyear', 'int'));
+$dateend = dol_mktime(23, 59, 59, GETPOST('dateendmonth', 'int'), GETPOST('dateendday', 'int'), GETPOST('dateendyear', 'int'));
 $id = GETPOST('id');
 
 $project = new Project($db);
@@ -225,13 +224,19 @@ if (empty($reshook) && $action == 'add') {
 		$error++;
 		$errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Note"))."<br>\n";
 	}
-	if (!GETPOST("datestart")) {
+	if (empty($datestart)) {
 		$error++;
 		$errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateStart"))."<br>\n";
+	} elseif ($datestart < $project->date_start) {
+			$error++;
+			$errmsg .= $langs->trans("DateMustBeAfterThan", $langs->transnoentitiesnoconv("DateStart"), dol_print_date($project->date_start))."<br>\n";
 	}
-	if (!GETPOST("dateend")) {
+	if (empty($dateend)) {
 		$error++;
 		$errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd"))."<br>\n";
+	} elseif ($dateend > dol_mktime(23, 59, 59, dol_print_date($project->date_end, '%m'), dol_print_date($project->date_end, '%d'), dol_print_date($project->date_end, '%Y'))) {
+		$error++;
+		$errmsg .= $langs->trans("DateMustBeBeforeThan", $langs->transnoentitiesnoconv("DateEnd"), dol_print_date($project->date_end))."<br>\n";
 	}
 	if (!GETPOST("email")) {
 		$error++;
@@ -376,7 +381,7 @@ if (empty($reshook) && $action == 'add') {
 			$conforbooth->fk_project = $project->id;
 			$conforbooth->note = $note;
 			$conforbooth->fk_action = $eventtype;
-			$conforbooth->datep =$datestart;
+			$conforbooth->datep = $datestart;
 			$conforbooth->datep2 = $dateend;
 			$conforbooth->datec = dol_now();
 			$conforbooth->tms = dol_now();
@@ -423,7 +428,7 @@ if (empty($reshook) && $action == 'add') {
 								$error++;
 							} else {
 								$db->commit();
-								$facture->add_object_linked($contact->element, $contact->id);
+								$facture->add_object_linked($conforbooth->element, $conforbooth->id);
 							}
 						}
 
@@ -436,7 +441,7 @@ if (empty($reshook) && $action == 'add') {
 								$contact->errors = $facture->errors;
 								$error++;
 							}
-							if (!$error) {
+							/*if (!$error) {
 								$valid = true;
 								$sourcetouse = 'boothlocation';
 								$reftouse = $facture->id;
@@ -450,61 +455,63 @@ if (empty($reshook) && $action == 'add') {
 								}
 								Header("Location: ".$redirection);
 								exit;
-							}
+							}*/
 						}
 					} else {
 						// If no price has been set for the booth, we confirm it as suggested and we update
 						$conforbooth->status = ConferenceOrBooth::STATUS_SUGGESTED;
 						$conforbooth->update($user);
-						// Sending mail
-						require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
-						include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
-						$formmail = new FormMail($db);
-						// Set output language
-						$outputlangs = new Translate('', $conf);
-						$outputlangs->setDefaultLang(empty($thirdparty->default_lang) ? $mysoc->default_lang : $thirdparty->default_lang);
-						// Load traductions files required by page
-						$outputlangs->loadLangs(array("main", "members"));
-						// Get email content from template
-						$arraydefaultmessage = null;
-
-						$labeltouse = $conf->global->EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_BOOTH;
-						if (!empty($labeltouse)) {
-							$arraydefaultmessage = $formmail->getEMailTemplate($db, 'conferenceorbooth', $user, $outputlangs, $labeltouse, 1, '');
-						}
+					}
+				}
+			}
+		}
+	}
+	if (!$error) {
+		$db->commit();
 
-						if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
-							$subject = $arraydefaultmessage->topic;
-							$msg     = $arraydefaultmessage->content;
-						}
+		// Sending mail
+		require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
+		include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+		$formmail = new FormMail($db);
+		// Set output language
+		$outputlangs = new Translate('', $conf);
+		$outputlangs->setDefaultLang(empty($thirdparty->default_lang) ? $mysoc->default_lang : $thirdparty->default_lang);
+		// Load traductions files required by page
+		$outputlangs->loadLangs(array("main", "members"));
+		// Get email content from template
+		$arraydefaultmessage = null;
+
+		$labeltouse = $conf->global->EVENTORGANIZATION_TEMPLATE_EMAIL_ASK_BOOTH;
+		if (!empty($labeltouse)) {
+			$arraydefaultmessage = $formmail->getEMailTemplate($db, 'conferenceorbooth', $user, $outputlangs, $labeltouse, 1, '');
+		}
 
-						$substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $thirdparty);
-						complete_substitutions_array($substitutionarray, $outputlangs, $object);
+		if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
+			$subject = $arraydefaultmessage->topic;
+			$msg     = $arraydefaultmessage->content;
+		}
 
-						$subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
-						$texttosend = make_substitutions($msg, $substitutionarray, $outputlangs);
+		$substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $thirdparty);
+		complete_substitutions_array($substitutionarray, $outputlangs, $object);
 
-						$sendto = $thirdparty->email;
-						$from = $conf->global->MAILING_EMAIL_FROM;
-						$urlback = $_SERVER["REQUEST_URI"];
+		$subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
+		$texttosend = make_substitutions($msg, $substitutionarray, $outputlangs);
 
-						$ishtml = dol_textishtml($texttosend); // May contain urls
+		$sendto = $thirdparty->email;
+		$from = $conf->global->MAILING_EMAIL_FROM;
+		$urlback = $_SERVER["REQUEST_URI"];
 
-						$mailfile = new CMailFile($subjecttosend, $sendto, $from, $texttosend, array(), array(), array(), '', '', 0, $ishtml);
+		$ishtml = dol_textishtml($texttosend); // May contain urls
 
-						$result = $mailfile->sendfile();
-						if ($result) {
-							dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment');
-						} else {
-							dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment');
-						}
-					}
-				}
-			}
+		$mailfile = new CMailFile($subjecttosend, $sendto, $from, $texttosend, array(), array(), array(), '', '', 0, $ishtml);
+
+		$result = $mailfile->sendfile();
+		if ($result) {
+			dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment');
+		} else {
+			dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment');
 		}
-	}
-	if (!$error) {
-		$db->commit();
+
 		$securekeyurl = dol_hash($conf->global->EVENTORGANIZATION_SECUREKEY.'conferenceorbooth'.$id, 2);
 		$redirection = $dolibarr_main_url_root.'/public/eventorganization/subscriptionok.php?id='.$id.'&securekey='.$securekeyurl;
 		Header("Location: ".$redirection);
@@ -630,12 +637,23 @@ print '</td><td><input type="text" name="label" class="minwidth150" value="'.dol
 print '<tr><td>'.$langs->trans("Description").'<FONT COLOR="red">*</FONT></td>'."\n";
 print '<td><textarea name="note" id="note" wrap="soft" class="quatrevingtpercent" rows="'.ROWS_3.'">'.dol_escape_htmltag(GETPOST('note', 'restricthtml'), 0, 1).'</textarea></td></tr>'."\n";
 // Start Date
-print '<tr><td>'.$langs->trans("DateStart").'<FONT COLOR="red">*</FONT></td>'."\n";
-print '<td><input type="date" name="datestart" class="minwidth150" value="'.dol_escape_htmltag(GETPOST('datestart')).'"></td></tr>'."\n";
+print '<tr><td>'.$langs->trans("DateStart").'<FONT COLOR="red">*</FONT>';
+if (!empty($project->date_start)) {
+	print '('.$langs->trans('Min'). ' '.dol_print_date($project->date_start).')';
+}
+print '</td>'."\n";
+print '<td>';
+print $form->selectDate((empty($datestart)?$project->date_start:$datestart), 'datestart');
+print '</td></tr>'."\n";
 // End Date
-print '<tr><td>'.$langs->trans("DateEnd").'<FONT COLOR="red">*</FONT></td>'."\n";
-print '<td><input type="date" name="dateend" class="minwidth150" value="'.dol_escape_htmltag(GETPOST('dateend')).'"></td></tr>'."\n";
-
+print '<tr><td>'.$langs->trans("DateEnd").'<FONT COLOR="red">*</FONT>';
+if (!empty($project->date_end)) {
+	print '('.$langs->trans('Max'). ' '.dol_print_date($project->date_end).')';
+}
+print '</td>'."\n";
+print '<td>';
+print $form->selectDate(empty($dateend)?$project->date_end:$dateend, 'dateend');
+print '</td></tr>'."\n";
 
 print "</table>\n";