From a74b237a7bcede0a536dc21263cb8ae95ee71c4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 19 Apr 2021 10:35:19 +0200 Subject: [PATCH] Add a schedule dtask to send reminder by email on date due. --- htdocs/comm/action/class/actioncomm.class.php | 5 +- htdocs/compta/facture/class/facture.class.php | 134 ++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index e105d011e96..86011980c80 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -2290,10 +2290,11 @@ class ActionComm extends CommonObject $this->db->begin(); - //Select all action comm reminder + //Select all action comm reminders $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."actioncomm_reminder"; $sql .= " WHERE typeremind = 'email' AND status = 0"; - $sql .= " AND dateremind <= '".$this->db->idate(dol_now())."'"; + $sql .= " AND dateremind <= '".$this->db->idate($now)."'"; + $sql .= " AND entity IN (".getEntity('actioncomm').")"; $sql .= $this->db->order("dateremind", "ASC"); $resql = $this->db->query($sql); diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 350b7a64779..45423053651 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -5604,4 +5604,138 @@ class FactureLigne extends CommonInvoiceLine } } } + + + /** + * Send reminders by emails for ivoices that are due + * CAN BE A CRON TASK + * + * @param int $nbdays Delay after due date (or before if delay is negative) + * @param int $idtemplate Id or name of of email template (Must be a template of type 'invoice') + * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) + */ + public function sendEmailsReminderOnDueDate($nbdays = 0, $idtemplate = 0) + { + global $conf, $langs, $user; + + $error = 0; + $this->output = ''; + $this->error = ''; + $nbMailSend = 0; + $errorsMsg = array(); + + if (empty($conf->facture->enabled)) { // Should not happen. If module disabled, cron job should not be visible. + $langs->load("bills"); + $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Facture")); + return 0; + } + if (empty($conf->global->FACTURE_REMINDER_EMAIL)) { + $langs->load("bills"); + $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Facture")); + return 0; + } + + $now = dol_now(); + $tmpinvoice = new Facture($this->db); + + dol_syslog(__METHOD__, LOG_DEBUG); + + $this->db->begin(); + + //Select all action comm reminder + $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."facture"; + $sql .= " WHERE paye = 0"; + $sql .= " AND date_lim_reglement = '".$this->db->idate(dol_time_plus_duree($now, -1 * $nbdays, 'd'))."'"; // TODO Remove hours into filter + $sql .= " AND entity IN (".getEntity('facture').")"; + // TODO Add filter to check there is no payment started + $sql .= $this->db->order("date_lim_reglement", "ASC"); + $resql = $this->db->query($sql); + + if ($resql) { + $formmail = new FormMail($this->db); + + while ($obj = $this->db->fetch_object($resql)) { + if (!$error) { + //Select email template + $arraymessage = $formmail->getEMailTemplate($this->db, 'facture', $user, $langs, $idtemplate, 1); + + // Load event + $res = $tmpinvoice->fetch($obj->id); + if ($res > 0) { + // PREPARE EMAIL + $errormesg = ''; + + // Make substitution in email content + $substitutionarray = getCommonSubstitutionArray($langs, 0, '', $this); + + complete_substitutions_array($substitutionarray, $langs, $this); + + // Content + $sendContent = make_substitutions($langs->trans($arraymessage->content), $substitutionarray); + + //Topic + $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : html_entity_decode($langs->trans('EventReminder')); + + // Recipient + $res = $tmpinvoice->fetch_thirdparty(); + $recipient = $tmpinvoice->thirdparty; + if ($res > 0) { + if (!empty($recipient->email)) { + $to = $recipient->email; + } else { + $errormesg = "Failed to send remind to thirdparty id=".$tmpinvoice->fk_soc.". No email defined for user."; + $error++; + } + } else { + $errormesg = "Failed to load recipient with thirdparty id=".$tmpinvoice->fk_soc; + $error++; + } + + // Sender + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + if (empty($from)) { + $errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM"; + $error++; + } + + if (!$error) { + // Errors Recipient + $errors_to = $conf->global->MAIN_MAIL_ERRORS_TO; + + $trackid = 'inv'.$tmpinvoice->id; + // Mail Creation + $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', $trackid, '', '', ''); + + // Sending Mail + if ($cMailFile->sendfile()) { + $nbMailSend++; + } else { + $errormesg = $cMailFile->error.' : '.$to; + $error++; + } + } + + if ($errormesg) { + $errorsMsg[] = $errormesg; + } + } else { + $errorsMsg[] = 'Failed to fetch record invoice with ID = '.$obj->id; + $error++; + } + } + } + } else { + $error++; + } + + if (!$error) { + $this->output = 'Nb of emails sent : '.$nbMailSend; + $this->db->commit(); + return 0; + } else { + $this->db->commit(); // We commit also on error, to have the error message recorded. + $this->error = 'Nb of emails sent : '.$nbMailSend.', '.(!empty($errorsMsg)) ? join(', ', $errorsMsg) : $error; + return $error; + } + } }