From 2539f0047fdbd4865427cb7bb481c4e7b85b1378 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Oct 2018 23:10:39 +0200 Subject: [PATCH] FIX Sending of reminder for expired subscriptions --- htdocs/adherents/class/adherent.class.php | 202 ++++++++++++---------- htdocs/core/lib/functions.lib.php | 9 +- htdocs/langs/en_US/members.lang | 4 +- 3 files changed, 122 insertions(+), 93 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index a7d350e971d..833afff415d 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -79,7 +79,6 @@ class Adherent extends CommonObject var $datec; var $datem; - var $datefin; var $datevalid; var $birth; @@ -95,6 +94,8 @@ class Adherent extends CommonObject var $fk_soc; + var $datefin; // From member table + // Fields loaded by fetch_subscriptions() var $first_subscription_date; var $first_subscription_amount; @@ -1188,11 +1189,9 @@ class Adherent extends CommonObject /** - * Fonction qui recupere pour un adherent les parametres - * first_subscription_date - * first_subscription_amount - * last_subscription_date - * last_subscription_amount + * Function to get member subscriptions data + * first_subscription_date, first_subscription_date_start, first_subscription_date_end, first_subscription_amount + * last_subscription_date, last_subscription_date_start, last_subscription_date_end, last_subscription_amount * * @return int <0 si KO, >0 si OK */ @@ -1222,11 +1221,15 @@ class Adherent extends CommonObject { if ($i==0) { - $this->first_subscription_date=$obj->dateh; - $this->first_subscription_amount=$obj->subscription; + $this->first_subscription_date=$this->db->jdate($obj->datec); + $this->first_subscription_date_start=$this->db->jdate($obj->dateh); + $this->first_subscription_date_end=$this->db->jdate($obj->datef); + $this->first_subscription_amount=$this->db->jdate($obj->subscription); } - $this->last_subscription_date=$obj->dateh; - $this->last_subscription_amount=$obj->subscription; + $this->last_subscription_date=$this->db->jdate($obj->datec); + $this->last_subscription_date_start=$this->db->jdate($obj->datef); + $this->last_subscription_date_end=$this->db->jdate($obj->datef); + $this->last_subscription_amount=$this->db->jdate($obj->subscription); $subscription=new Subscription($this->db); $subscription->id=$obj->rowid; @@ -1310,9 +1313,9 @@ class Adherent extends CommonObject { // Change properties of object (used by triggers) $this->last_subscription_date=dol_now(); - $this->last_subscription_amount=$amount; $this->last_subscription_date_start=$date; $this->last_subscription_date_end=$datefin; + $this->last_subscription_amount=$amount; } if (! $error) @@ -2241,8 +2244,13 @@ class Adherent extends CommonObject $this->need_subscription=0; $this->first_subscription_date=time(); + $this->first_subscription_date_start=$this->first_subscription_date; + $this->first_subscription_date_end=dol_time_plus_duree($this->first_subscription_date_start, 1, 'y'); $this->first_subscription_amount=10; - $this->last_subscription_date=time(); + + $this->last_subscription_date=$this->first_subscription_date; + $this->last_subscription_date_start=$this->first_subscription_date; + $this->last_subscription_date_end=dol_time_plus_duree($this->last_subscription_date_start, 1, 'y'); $this->last_subscription_amount=10; } @@ -2542,10 +2550,10 @@ class Adherent extends CommonObject * Send reminders by emails before subscription end * CAN BE A CRON TASK * - * @param int $daysbeforeend Nb of days before end of subscription (negative number = after subscription) - * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) + * @param string $daysbeforeendlist Nb of days before end of subscription (negative number = after subscription). Can be a list of delay, separated by a semicolon, for example '10;5;0;-5' + * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) */ - public function sendReminderForExpiredSubscription($daysbeforeend=10) + public function sendReminderForExpiredSubscription($daysbeforeendlist='10') { global $conf, $langs, $mysoc, $user; @@ -2563,96 +2571,110 @@ class Adherent extends CommonObject }*/ $now = dol_now(); + $nbok = 0; + $nbko = 0; - dol_syslog(__METHOD__, LOG_DEBUG); - - $tmp=dol_getdate($now); - $datetosearchfor = dol_time_plus_duree(dol_mktime(0, 0, 0, $tmp['mon'], $tmp['mday'], $tmp['year']), -1 * $daysbeforeend, 'd'); - - $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'adherent'; - $sql.= " WHERE datefin = '".$this->db->idate($datetosearchfor)."'"; - - $resql = $this->db->query($sql); - if ($resql) + $arraydaysbeforeend=explode(';',$daysbeforeendlist); + foreach($arraydaysbeforeend as $daysbeforeend) // Loop on each delay { - $num_rows = $this->db->num_rows($resql); + dol_syslog(__METHOD__.' - Process delta = '.$daysbeforeend, LOG_DEBUG); - include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; - $adherent = new Adherent($this->db); - $formmail = new FormMail($this->db); - - $i=0; - $nbok = 0; - $nbko = 0; - while ($i < $num_rows) + if (! is_numeric($daysbeforeend)) { - $obj = $this->db->fetch_object($resql); + $blockingerrormsg="Value for delta is not a positive or negative numeric"; + $nbko++; + break; + } - $adherent->fetch($obj->rowid); + $tmp=dol_getdate($now); + $datetosearchfor = dol_time_plus_duree(dol_mktime(0, 0, 0, $tmp['mon'], $tmp['mday'], $tmp['year']), $daysbeforeend, 'd'); - if (empty($adherent->email)) + $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.'adherent'; + $sql.= " WHERE datefin = '".$this->db->idate($datetosearchfor)."'"; + + $resql = $this->db->query($sql); + if ($resql) + { + $num_rows = $this->db->num_rows($resql); + + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $adherent = new Adherent($this->db); + $formmail = new FormMail($this->db); + + $i=0; + while ($i < $num_rows) { - $nbko++; - } - else - { - $adherent->fetch_thirdparty(); + $obj = $this->db->fetch_object($resql); - // Send reminder email - $outputlangs = new Translate('', $conf); - $outputlangs->setDefaultLang(empty($adherent->thirdparty->default_lang) ? $mysoc->default_lang : $adherent->thirdparty->default_lang); - $outputlangs->loadLangs(array("main", "members")); - dol_syslog("sendReminderForExpiredSubscription Language set to ".$outputlangs->defaultlang); + $adherent->fetch($obj->rowid, '', '', '', true, true); - $arraydefaultmessage=null; - $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION; - - if (! empty($labeltouse)) $arraydefaultmessage=$formmail->getEMailTemplate($this->db, 'member', $user, $outputlangs, 0, 1, $labeltouse); - - if (! empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) + if (empty($adherent->email)) { - $substitutionarray=getCommonSubstitutionArray($outputlangs, 0, null, $adherent); - //if (is_array($adherent->thirdparty)) $substitutionarraycomp = ... - complete_substitutions_array($substitutionarray, $outputlangs, $adherent); - - $subject = make_substitutions($arraydefaultmessage->topic, $substitutionarray, $outputlangs); - $msg = make_substitutions($arraydefaultmessage->content, $substitutionarray, $outputlangs); - $from = $conf->global->ADHERENT_MAIL_FROM; - $to = $adherent->email; - - $trackid = 'mem'.$adherent->id; - $moreinheader='X-Dolibarr-Info: sendReminderForExpiredSubscription'."\r\n"; - - include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $cmail = new CMailFile($subject, $to, $from, $msg, array(), array(), array(), '', '', 0, 1, '', '', $trackid, $moreinheader); - $result = $cmail->sendfile(); - if (! $result) - { - $error++; - $this->error = $cmail->error; - $this->errors += $cmail->errors; - $nbko++; - } - else - { - $nbok++; - } + $nbko++; } else { - $blockingerrormsg="Can't find email template, defined into member module setup, to use for reminding"; - $nbko++; - break; - } - } + $adherent->fetch_thirdparty(); - $i++; + // Send reminder email + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang(empty($adherent->thirdparty->default_lang) ? $mysoc->default_lang : $adherent->thirdparty->default_lang); + $outputlangs->loadLangs(array("main", "members")); + dol_syslog("sendReminderForExpiredSubscription Language set to ".$outputlangs->defaultlang); + + $arraydefaultmessage=null; + $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION; + + if (! empty($labeltouse)) $arraydefaultmessage=$formmail->getEMailTemplate($this->db, 'member', $user, $outputlangs, 0, 1, $labeltouse); + + if (! empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) + { + $substitutionarray=getCommonSubstitutionArray($outputlangs, 0, null, $adherent); + //if (is_array($adherent->thirdparty)) $substitutionarraycomp = ... + complete_substitutions_array($substitutionarray, $outputlangs, $adherent); + + $subject = make_substitutions($arraydefaultmessage->topic, $substitutionarray, $outputlangs); + $msg = make_substitutions($arraydefaultmessage->content, $substitutionarray, $outputlangs); + $from = $conf->global->ADHERENT_MAIL_FROM; + $to = $adherent->email; + + $trackid = 'mem'.$adherent->id; + $moreinheader='X-Dolibarr-Info: sendReminderForExpiredSubscription'."\r\n"; + + include_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $cmail = new CMailFile($subject, $to, $from, $msg, array(), array(), array(), '', '', 0, 1, '', '', $trackid, $moreinheader); + $result = $cmail->sendfile(); + if (! $result) + { + $error++; + $this->error = $cmail->error; + $this->errors += $cmail->errors; + $nbko++; + } + else + { + $nbok++; + + // TODO Add event email sent for member + + } + } + else + { + $blockingerrormsg="Can't find email template, defined into member module setup, to use for reminding"; + $nbko++; + break; + } + } + + $i++; + } + } + else + { + $this->error = $this->db->lasterror(); + return 1; } - } - else - { - $this->error = $this->db->lasterror(); - return 1; } if ($blockingerrormsg) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 512a4158ef0..abb069d6fce 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5938,6 +5938,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob $substitutionarray['__THIRDPARTY_ID__'] = '__THIRDPARTY_ID__'; $substitutionarray['__THIRDPARTY_NAME__'] = '__THIRDPARTY_NAME__'; + $substitutionarray['__THIRDPARTY_NAME_ALIAS__'] = '__THIRDPARTY_NAME_ALIAS__'; $substitutionarray['__THIRDPARTY_EMAIL__'] = '__THIRDPARTY_EMAIL__'; if (is_object($object) && $object->element == 'member') @@ -6000,6 +6001,12 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob $substitutionarray['__MEMBER_PHONE__']=$msgishtml?dol_htmlentitiesbr($object->phone):$object->phone; $substitutionarray['__MEMBER_PHONEPRO__']=$msgishtml?dol_htmlentitiesbr($object->phone_perso):$object->phone_perso; $substitutionarray['__MEMBER_PHONEMOBILE__']=$msgishtml?dol_htmlentitiesbr($object->phone_mobile):$object->phone_mobile; + $substitutionarray['__MEMBER_FIRST_SUBSCRIPTION_DATE__'] = dol_print_date($object->first_subscription_date, 'dayrfc'); + $substitutionarray['__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = dol_print_date($object->first_subscription_date_start, 'dayrfc'); + $substitutionarray['__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = dol_print_date($object->first_subscription_date_end, 'dayrfc'); + $substitutionarray['__MEMBER_LAST_SUBSCRIPTION_DATE__'] = dol_print_date($object->last_subscription_date, 'dayrfc'); + $substitutionarray['__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] = dol_print_date($object->last_subscription_date_start, 'dayrfc'); + $substitutionarray['__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] = dol_print_date($object->last_subscription_date_end, 'dayrfc'); if (is_object($object) && $object->element == 'societe') { @@ -6162,7 +6169,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob * @param array $substitutionarray Array with key->val to substitute. Example: array('__MYKEY__' => 'MyVal', ...) * @param Translate $outputlangs Output language * @return string Output string after substitutions - * @see complete_substitutions_array + * @see complete_substitutions_array, getCommonSubstitutionArray */ function make_substitutions($text, $substitutionarray, $outputlangs=null) { diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index 20695a1856e..b74ad44b45f 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -124,7 +124,7 @@ CardContent=Content of your member card ThisIsContentOfYourMembershipRequestWasReceived=We want to let you know that your membership request was received.

ThisIsContentOfYourMembershipWasValidated=We want to let you know that your membership was validated with the following information:

ThisIsContentOfYourSubscriptionWasRecorded=We want to let you know that your new subscription was recorded.

-ThisIsContentOfSubscriptionReminderEmail=We want to let you know thet your subscription is about to expire. We hope you can make a renewal of it.

+ThisIsContentOfSubscriptionReminderEmail=We want to let you know that your subscription is about to expire or is already expired (__MEMBER_LAST_SUBSCRIPTION_DATE_END__). We hope you can make a renewal of it.

ThisIsContentOfYourCard=This is a remind of the information we get about you. Feel free to contact us if something looks wrong.

DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Subject of the e-mail received in case of auto-inscription of a guest DescADHERENT_AUTOREGISTER_NOTIF_MAIL=E-mail received in case of auto-inscription of a guest @@ -194,4 +194,4 @@ SubscriptionRecorded=Subscription recorded NoEmailSentToMember=No email sent to member EmailSentToMember=Email sent to member at %s SendReminderForExpiredSubscriptionTitle=Send reminder by email for expired subscription -SendReminderForExpiredSubscription=Send reminder by email to members when subscription is about to expire (parameter is number of days before end of subscription to send the remind) +SendReminderForExpiredSubscription=Send reminder by email to members when subscription is about to expire (parameter is number of days before end of subscription to send the remind. It can be a list of days separated by a semicolon, for example '10;5;0;-5')