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')