From b21fdbb21ee076922493d5518f89db08377b35ad Mon Sep 17 00:00:00 2001 From: Thomas Negre Date: Fri, 4 Feb 2022 15:31:28 +0100 Subject: [PATCH 1/3] add a field date_last_msg_sent in ticket.sql install file modify migration script --- htdocs/install/mysql/migration/15.0.0-16.0.0.sql | 1 + htdocs/install/mysql/tables/llx_ticket.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql index d0aac914cb9..55218730381 100644 --- a/htdocs/install/mysql/migration/15.0.0-16.0.0.sql +++ b/htdocs/install/mysql/migration/15.0.0-16.0.0.sql @@ -87,6 +87,7 @@ INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) value INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_MODIFY','Expense report modified','Executed when an expense report is modified','expensereport',202); INSERT INTO llx_c_action_trigger (code,label,description,elementtype,rang) values ('HOLIDAY_MODIFY','Expense report modified','Executed when an expense report is modified','expensereport',212); +ALTER TABLE llx_ticket ADD COLUMN date_last_msg_sent datetime AFTER date_read; CREATE TABLE llx_stock_mouvement_extrafields ( rowid integer AUTO_INCREMENT PRIMARY KEY, diff --git a/htdocs/install/mysql/tables/llx_ticket.sql b/htdocs/install/mysql/tables/llx_ticket.sql index d891a65d502..d079fdf3964 100644 --- a/htdocs/install/mysql/tables/llx_ticket.sql +++ b/htdocs/install/mysql/tables/llx_ticket.sql @@ -36,6 +36,7 @@ CREATE TABLE llx_ticket severity_code varchar(32), datec datetime, date_read datetime, + date_last_msg_sent datetime, date_close datetime, notify_tiers_at_create tinyint, email_msgid varchar(255), -- if ticket is created by email collector, we store here MSG ID From 26648e4f123f1a3a42f7b242cb4e3fba563d6f6e Mon Sep 17 00:00:00 2001 From: Thomas Negre Date: Fri, 4 Feb 2022 16:14:41 +0100 Subject: [PATCH 2/3] ticket : update date_last_msg_sent on message sending from backend or public interface --- ...terface_50_modTicket_TicketEmail.class.php | 5 ++++- htdocs/ticket/class/ticket.class.php | 22 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php index cab6779bf8c..13d6676a8e3 100644 --- a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php +++ b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php @@ -279,7 +279,10 @@ class InterfaceTicketEmail extends DolibarrTriggers if ($mailfile->error) { dol_syslog($mailfile->error, LOG_DEBUG); } else { - $result = $mailfile->sendfile(); + $result = $mailfile->sendfile(); + // update last_msg_sent date + $object->date_last_msg_sent = dol_now(); + $object->update($user); } if (!empty($conf->global->TICKET_DISABLE_MAIL_AUTOCOPY_TO)) { $conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 9ee7d2c81b6..f246fb546c3 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -177,6 +177,11 @@ class Ticket extends CommonObject */ public $date_read = ''; + /** + * @var int Last message date + */ + public $date_last_msg_sent = ''; + /** * @var int Close ticket date */ @@ -266,6 +271,7 @@ class Ticket extends CommonObject //'timing' => array('type'=>'varchar(20)', 'label'=>'Timing', 'visible'=>-1, 'enabled'=>1, 'position'=>42, 'notnull'=>-1, 'help'=>""), // what is this ? 'datec' => array('type'=>'datetime', 'label'=>'DateCreation', 'visible'=>1, 'enabled'=>1, 'position'=>500, 'notnull'=>1), 'date_read' => array('type'=>'datetime', 'label'=>'TicketReadOn', 'visible'=>-1, 'enabled'=>1, 'position'=>501, 'notnull'=>1), + 'date_last_msg_sent' => array('type'=>'datetime', 'label'=>'TicketLastMessageDate', 'visible'=>0, 'enabled'=>1, 'position'=>502, 'notnull'=>-1), 'fk_user_assign' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'AssignedTo', 'visible'=>1, 'enabled'=>1, 'position'=>505, 'notnull'=>1, 'css'=>'tdoverflowmax125'), 'date_close' => array('type'=>'datetime', 'label'=>'TicketCloseOn', 'visible'=>-1, 'enabled'=>1, 'position'=>510, 'notnull'=>1), 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'visible'=>-1, 'enabled'=>1, 'position'=>520, 'notnull'=>1), @@ -568,6 +574,7 @@ class Ticket extends CommonObject $sql .= " t.severity_code,"; $sql .= " t.datec,"; $sql .= " t.date_read,"; + $sql .= " t.date_last_msg_sent,"; $sql .= " t.date_close,"; $sql .= " t.tms,"; $sql .= " type.label as type_label, category.label as category_label, severity.label as severity_label"; @@ -635,6 +642,7 @@ class Ticket extends CommonObject $this->date_creation = $this->db->jdate($obj->datec); $this->date_read = $this->db->jdate($obj->date_read); $this->date_validation = $this->db->jdate($obj->date_read); + $this->date_last_msg_sent = $this->db->jdate($obj->date_last_msg_sent); $this->date_close = $this->db->jdate($obj->date_close); $this->tms = $this->db->jdate($obj->tms); $this->date_modification = $this->db->jdate($obj->tms); @@ -695,6 +703,7 @@ class Ticket extends CommonObject $sql .= " t.severity_code,"; $sql .= " t.datec,"; $sql .= " t.date_read,"; + $sql .= " t.date_last_msg_sent,"; $sql .= " t.date_close,"; $sql .= " t.tms"; $sql .= ", type.label as type_label, category.label as category_label, severity.label as severity_label"; @@ -801,6 +810,7 @@ class Ticket extends CommonObject $line->datec = $this->db->jdate($obj->datec); $line->date_read = $this->db->jdate($obj->date_read); + $line->date_last_msg_sent = $this->db->jdate($obj->date_last_msg_sent); $line->date_close = $this->db->jdate($obj->date_close); // Extra fields @@ -923,6 +933,7 @@ class Ticket extends CommonObject $sql .= " severity_code=".(isset($this->severity_code) ? "'".$this->db->escape($this->severity_code)."'" : "null").","; $sql .= " datec=".(dol_strlen($this->datec) != 0 ? "'".$this->db->idate($this->datec)."'" : 'null').","; $sql .= " date_read=".(dol_strlen($this->date_read) != 0 ? "'".$this->db->idate($this->date_read)."'" : 'null').","; + $sql .= " date_last_msg_sent=".(dol_strlen($this->date_last_msg_sent) != 0 ? "'".$this->db->idate($this->date_last_msg_sent)."'" : 'null').","; $sql .= " date_close=".(dol_strlen($this->date_close) != 0 ? "'".$this->db->idate($this->date_close)."'" : 'null').""; $sql .= " WHERE rowid=".((int) $this->id); @@ -1116,6 +1127,7 @@ class Ticket extends CommonObject $this->severity_code = 'SEVERITYCODE'; $this->datec = ''; $this->date_read = ''; + $this->date_last_msg_sent = ''; $this->date_close = ''; $this->tms = ''; return 1; @@ -2747,6 +2759,10 @@ class Ticket extends CommonObject $this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames); } } + + // update last_msg_sent date + $object->date_last_msg_sent = dol_now(); + $object->update($user); } } } @@ -2755,7 +2771,6 @@ class Ticket extends CommonObject if ($object->fk_statut < 3 && !$user->socid) { $object->setStatut(3); } - return 1; } else { setEventMessages($object->error, $object->errors, 'errors'); @@ -3093,6 +3108,11 @@ class TicketsLine */ public $date_read = ''; + /** + * @var int Last message date + */ + public $date_last_msg_sent = ''; + /** * Close ticket date */ From b6b5eb633b716077a3435c51fd86973eb141a410 Mon Sep 17 00:00:00 2001 From: Thomas Negre Date: Mon, 7 Feb 2022 17:38:32 +0100 Subject: [PATCH 3/3] only update last_msg_date if a message is really sent. --- ...nterface_50_modTicket_TicketEmail.class.php | 8 +++++--- htdocs/ticket/class/ticket.class.php | 18 +++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php index 13d6676a8e3..dfd83022393 100644 --- a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php +++ b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php @@ -280,9 +280,11 @@ class InterfaceTicketEmail extends DolibarrTriggers dol_syslog($mailfile->error, LOG_DEBUG); } else { $result = $mailfile->sendfile(); - // update last_msg_sent date - $object->date_last_msg_sent = dol_now(); - $object->update($user); + if ($result) { + // update last_msg_sent date + $object->date_last_msg_sent = dol_now(); + $object->update($user); + } } if (!empty($conf->global->TICKET_DISABLE_MAIL_AUTOCOPY_TO)) { $conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index f246fb546c3..14c1e0719a3 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2756,13 +2756,14 @@ class Ticket extends CommonObject // altairis: dont try to send email when no recipient if (!empty($sendto)) { - $this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames); + $result = $this->sendTicketMessageByEmail($subject, $message, '', $sendto, $listofpaths, $listofmimes, $listofnames); + if ($result) { + // update last_msg_sent date + $object->date_last_msg_sent = dol_now(); + $object->update($user); + } } } - - // update last_msg_sent date - $object->date_last_msg_sent = dol_now(); - $object->update($user); } } } @@ -2793,7 +2794,7 @@ class Ticket extends CommonObject * @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 + * @return boolean True if mail sent to at least one receiver, false otherwise */ public function sendTicketMessageByEmail($subject, $message, $send_internal_cc = 0, $array_receiver = array(), $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array()) { @@ -2801,7 +2802,7 @@ class Ticket extends CommonObject if ($conf->global->TICKET_DISABLE_ALL_MAILS) { dol_syslog(get_class($this).'::sendTicketMessageByEmail: Emails are disable into ticket setup by option TICKET_DISABLE_ALL_MAILS', LOG_WARNING); - return ''; + return false; } $langs->load("mails"); @@ -2820,6 +2821,7 @@ class Ticket extends CommonObject } $from = $conf->global->TICKET_NOTIFICATION_EMAIL_FROM; + $is_sent = false; if (is_array($array_receiver) && count($array_receiver) > 0) { foreach ($array_receiver as $key => $receiver) { $deliveryreceipt = 0; @@ -2841,6 +2843,7 @@ class Ticket extends CommonObject $result = $mailfile->sendfile(); if ($result) { setEventMessages($langs->trans('MailSuccessfulySent', $mailfile->getValidAddress($from, 2), $mailfile->getValidAddress($receiver, 2)), null, 'mesgs'); + $is_sent = true; } else { $langs->load("other"); if ($mailfile->error) { @@ -2859,6 +2862,7 @@ class Ticket extends CommonObject $langs->load("other"); setEventMessages($langs->trans('ErrorMailRecipientIsEmptyForSendTicketMessage'), null, 'warnings'); } + return $is_sent; } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps