FIX Attachement of linked files on ticket when sending a message

This commit is contained in:
Laurent Destailleur 2019-10-04 19:41:35 +02:00
parent 503973cec9
commit 8bf9afb7ca
3 changed files with 112 additions and 76 deletions

View File

@ -212,7 +212,7 @@ class FormMail extends Form
/**
* Remove a file from the list of attached files (stored in SECTION array)
*
* @param string $keytodelete Key in file array (0, 1, 2, ...)
* @param string $keytodelete Key index in file array (0, 1, 2, ...)
* @return void
*/
public function remove_attached_files($keytodelete)

View File

@ -371,7 +371,7 @@ if ($action == "assign_user" && GETPOST('btn_assign_user', 'aplha') && $user->ri
$action = 'view';
}
if ($action == "add_message" && GETPOST('btn_add_message') && $user->rights->ticket->read) {
if ($action == 'add_message' && GETPOSTISSET('btn_add_message') && $user->rights->ticket->read) {
$ret = $object->newMessage($user, $action, (GETPOST('private_message', 'alpha') == "on" ? 1 : 0));
if ($ret > 0) {
@ -1290,10 +1290,8 @@ if (empty($action) || $action == 'view' || $action == 'addlink' || $action == 'd
//$formticket->param['socid']=$object->fk_soc;
$formticket->param['returnurl']=$_SERVER["PHP_SELF"].'?track_id='.$object->track_id;
$formticket->withsubstit = 1;
$formticket->substit = $substitutionarray;
$formticket->showMessageForm('100%');
print '</div>';
}

View File

@ -1602,13 +1602,16 @@ class Ticket extends CommonObject
}
/**
* Add message into database
* Add message into database
*
* @param User $user User that creates
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @return int <0 if KO, Id of created object if OK
* @param User $user User that creates
* @param int $notrigger 0=launch triggers after, 1=disable triggers
* @param array $filename_list List of files to attach (full path of filename on file system)
* @param array $mimetype_list List of MIME type of attached files
* @param array $mimefilename_list List of attached file name in message
* @return void
*/
public function createTicketMessage($user, $notrigger = 0)
public function createTicketMessage($user, $notrigger = 0, $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array())
{
global $conf, $langs;
$error = 0;
@ -1633,7 +1636,7 @@ class Ticket extends CommonObject
$actioncomm->code = 'TICKET_MSG';
$actioncomm->socid = $this->socid;
$actioncomm->label = $this->subject;
$actioncomm->note = $this->message;
$actioncomm->note_private = $this->message;
$actioncomm->userassigned = array($user->id);
$actioncomm->userownerid = $user->id;
$actioncomm->datep = $now;
@ -1641,6 +1644,19 @@ class Ticket extends CommonObject
$actioncomm->elementtype = 'ticket';
$actioncomm->fk_element = $this->id;
$attachedfiles = array();
$attachedfiles['paths'] = $filename_list;
$attachedfiles['names'] = $mimefilename_list;
$attachedfiles['mimes'] = $mimetype_list;
if (is_array($attachedfiles) && count($attachedfiles)>0) {
$actioncomm->attachedfiles = $attachedfiles;
}
if (! empty($mimefilename_list) && is_array($mimefilename_list))
{
$actioncomm->note_private=dol_concatdesc($actioncomm->note_private, "\n".$langs->transnoentities("AttachedFiles").': '.join(';', $mimefilename_list));
}
$actionid = $actioncomm->create($user);
if ($actionid <= 0)
{
@ -2389,10 +2405,11 @@ class Ticket extends CommonObject
/**
* Copy files into ticket directory
* Used for files linked into messages
* Copy files defined into $_SESSION array into the ticket directory of attached files.
* Used for files linked into messages.
* Files may be renamed during copy to avoid overwriting existing files.
*
* @return void
* @return array Array with final path/name/mime of files.
*/
public function copyFilesForTicket()
{
@ -2422,23 +2439,42 @@ class Ticket extends CommonObject
if (!dol_is_dir($destdir)) {
dol_mkdir($destdir);
}
$listofpaths = array();
$listofnames = array();
foreach ($filename as $i => $val) {
$res = dol_move($filepath[$i], $destdir . '/' . $filename[$i]);
if (image_format_supported($destdir . '/' . $filename[$i]) == 1) {
$destfile = $destdir . '/' . $filename[$i];
// If destination file already exists, we add a suffix to avoid to overwrite
if (is_file($destfile))
{
$now = dol_now();
$destfile.='.'.dol_print_date($now, 'dayhourlog');
}
$res = dol_move($filepath[$i], $destfile, 0, 1);
if (image_format_supported($destfile) == 1) {
// Create small thumbs for image (Ratio is near 16/9)
// Used on logon for example
$imgThumbSmall = vignette($destdir . '/' . $filename[$i], $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs");
$imgThumbSmall = vignette($destfile, $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs");
// Create mini thumbs for image (Ratio is near 16/9)
// Used on menu or for setup page for example
$imgThumbMini = vignette($destdir . '/' . $filename[$i], $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs");
$imgThumbMini = vignette($destfile, $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs");
}
$formmail->remove_attached_files($i);
// Fill array with new names
$listofpaths[$i] = $destfile;
$listofnames[$i] = basename($destfile);
}
return array('listofpaths'=>$listofpaths, 'listofnames'=>$listofnames, 'listofmimes'=>$mimetype);
}
/**
* Add new message on a ticket (private area)
* Add new message on a ticket (private area). Can also send it be email if GETPOST('send_email', 'int') is set.
*
* @param User $user User for action
* @param string $action Action string
@ -2449,19 +2485,15 @@ class Ticket extends CommonObject
{
global $mysoc, $conf, $langs;
if (!class_exists('Contact')) {
include_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php';
}
$contactstatic = new Contact($this->db);
$object = new Ticket($this->db);
$error = 0;
$object = new Ticket($this->db);
$ret = $object->fetch('', '', GETPOST('track_id', 'alpha'));
$object->socid = $object->fk_soc;
$object->fetch_thirdparty();
if ($ret < 0) {
$error++;
array_push($this->errors, $langs->trans("ErrorTicketIsNotValid"));
@ -2478,9 +2510,17 @@ class Ticket extends CommonObject
$object->subject = GETPOST('subject', 'alphanohtml');
$object->message = GETPOST("message", "none");
$object->private = GETPOST("private_message", "alpha");
$send_email = GETPOST('send_email', 'int');
$id = $object->createTicketMessage($user);
// Copy attached files (saved into $_SESSION) as linked files to ticket. Return array with final name used.
$resarray = $object->copyFilesForTicket();
$listofpaths = $resarray['listofpaths'];
$listofnames = $resarray['listofnames'];
$listofmimes = $resarray['listofmimes'];
$id = $object->createTicketMessage($user, 0, $listofpaths, $listofmimes, $listofnames);
if ($id <= 0) {
$error++;
$this->errors = $object->error;
@ -2491,24 +2531,27 @@ class Ticket extends CommonObject
if (!$error && $id > 0) {
setEventMessages($langs->trans('TicketMessageSuccessfullyAdded'), null, 'mesgs');
//var_dump($_SESSION); var_dump($listofpaths);exit;
/*
* Send email to linked contacts
* Send emails to internal users (linked contacts)
*/
if ($send_email > 0) {
// Retrieve internal contact datas
$internal_contacts = $object->getInfosTicketInternalContact();
$sendto = array();
if (is_array($internal_contacts) && count($internal_contacts) > 0) {
// altairis: set default subject
$label_title = empty($conf->global->MAIN_APPLICATION_TITLE) ? $mysoc->name : $conf->global->MAIN_APPLICATION_TITLE;
$subject = GETPOST('subject') ? GETPOST('subject') : '[' . $label_title . '- ticket #' . $object->track_id . '] ' . $langs->trans('TicketNewMessage');
$subject = GETPOST('subject', 'nohtml') ? GETPOST('subject', 'nohtml') : '[' . $label_title . '- ticket #' . $object->track_id . '] ' . $langs->trans('TicketNewMessage');
$message_intro = $langs->trans('TicketNotificationEmailBody', "#" . $object->id);
$message_signature = GETPOST('mail_signature') ? GETPOST('mail_signature') : $conf->global->TICKET_MESSAGE_MAIL_SIGNATURE;
$message = $langs->trans('TicketMessageMailIntroText');
$message .= "\n\n";
$message .= GETPOST('message');
$message .= GETPOST('message', 'restricthtml');
// Coordonnées client
$message .= "\n\n";
@ -2547,12 +2590,12 @@ class Ticket extends CommonObject
// altairis: dont try to send email if no recipient
if (!empty($sendto)) {
$this->sendTicketMessageByEmail($subject, $message, '', $sendto);
$this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames);
}
}
/*
* Email for externals users if not private
* Send emails for externals users if not private (linked contacts)
*/
if (empty($object->private)) {
// Retrieve email of all contacts (external)
@ -2599,47 +2642,42 @@ class Ticket extends CommonObject
// If public interface is not enable, use link to internal page into mail
$url_public_ticket = (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) ?
(!empty($conf->global->TICKET_URL_PUBLIC_INTERFACE) ?
$conf->global->TICKET_URL_PUBLIC_INTERFACE . '/view.php' :
dol_buildpath('/public/ticket/view.php', 2)
) :
dol_buildpath('/ticket/card.php', 2)
) . '?track_id=' . $object->track_id;
$message .= "\n" . $langs->trans('TicketNewEmailBodyInfosTrackUrlCustomer') . ' : ' . '<a href="' . $url_public_ticket . '">' . $object->track_id . '</a>' . "\n";
(!empty($conf->global->TICKET_URL_PUBLIC_INTERFACE) ? $conf->global->TICKET_URL_PUBLIC_INTERFACE . '/view.php' : dol_buildpath('/public/ticket/view.php', 2)) :
dol_buildpath('/ticket/card.php', 2)) . '?track_id=' . $object->track_id;
$message .= "\n" . $langs->trans('TicketNewEmailBodyInfosTrackUrlCustomer') . ' : ' . '<a href="' . $url_public_ticket . '">' . $object->track_id . '</a>' . "\n";
// Build final message
$message = $message_intro . $message;
// Build final message
$message = $message_intro . $message;
// Add signature
$message .= '<br>' . $message_signature;
// Add signature
$message .= '<br>' . $message_signature;
if (!empty($object->origin_email)) {
$sendto[] = $object->origin_email;
}
if (!empty($object->origin_email)) {
$sendto[] = $object->origin_email;
}
if ($object->fk_soc > 0 && ! in_array($object->origin_email, $sendto)) {
$object->socid = $object->fk_soc;
$object->fetch_thirdparty();
if(!empty($object->thirdparty->email)) $sendto[] = $object->thirdparty->email;
}
if ($object->fk_soc > 0 && ! in_array($object->origin_email, $sendto)) {
$object->socid = $object->fk_soc;
$object->fetch_thirdparty();
if(!empty($object->thirdparty->email)) $sendto[] = $object->thirdparty->email;
}
// altairis: Add global email address reciepient
if ($conf->global->TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS && !in_array($conf->global->TICKET_NOTIFICATION_EMAIL_TO, $sendto)) {
if(!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO)) $sendto[] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
}
// altairis: Add global email address reciepient
if ($conf->global->TICKET_NOTIFICATION_ALSO_MAIN_ADDRESS && !in_array($conf->global->TICKET_NOTIFICATION_EMAIL_TO, $sendto)) {
if(!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO)) $sendto[] = $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
}
// altairis: dont try to send email when no recipient
if (!empty($sendto)) {
$this->sendTicketMessageByEmail($subject, $message, '', $sendto);
}
// altairis: dont try to send email when no recipient
if (!empty($sendto)) {
$this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames);
}
}
}
}
$object->copyFilesForTicket();
// Set status to "answered" if not set yet, only for internal users
if ($object->fk_statut < 3 && !$user->societe_id) {
// Set status to "answered" if not set yet, but only if internal user
if ($object->fk_statut < 3 && ! $user->socid)
{
$object->setStatut(3);
}
@ -2658,13 +2696,16 @@ class Ticket extends CommonObject
/**
* Send ticket by email to linked contacts
*
* @param string $subject Email subject
* @param string $message Email message
* @param int $send_internal_cc Receive a copy on internal email ($conf->global->TICKET_NOTIFICATION_EMAIL_FROM)
* @param array $array_receiver Array of receiver. exemple array('name' => 'John Doe', 'email' => 'john@doe.com', etc...)
* @param string $subject Email subject
* @param string $message Email message
* @param int $send_internal_cc Receive a copy on internal email ($conf->global->TICKET_NOTIFICATION_EMAIL_FROM)
* @param array $array_receiver Array of receiver. exemple array('name' => 'John Doe', 'email' => 'john@doe.com', etc...)
* @param array $filename_list List of files to attach (full path of filename on file system)
* @param array $mimetype_list List of MIME type of attached files
* @param array $mimefilename_list List of attached file name in message
* @return void
*/
public function sendTicketMessageByEmail($subject, $message, $send_internal_cc = 0, $array_receiver = array())
public function sendTicketMessageByEmail($subject, $message, $send_internal_cc = 0, $array_receiver = array(), $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array())
{
global $conf, $langs;
@ -2690,15 +2731,12 @@ class Ticket extends CommonObject
$from = $conf->global->TICKET_NOTIFICATION_EMAIL_FROM;
if (is_array($array_receiver) && count($array_receiver) > 0) {
foreach ($array_receiver as $key => $receiver) {
// Create form object
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php';
$formmail = new FormMail($this->db);
$attachedfiles = $formmail->get_attached_files();
$filepath = $attachedfiles['paths'];
$filename = $attachedfiles['names'];
$mimetype = $attachedfiles['mimes'];
foreach ($array_receiver as $key => $receiver)
{
$deliveryreceipt = 0;
$filepath = $filename_list;
$filename = $mimefilename_list;
$mimetype = $mimetype_list;
$message_to_send = dol_nl2br($message);