diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php
index b34e39872ac..57e510719bb 100644
--- a/htdocs/adherents/card.php
+++ b/htdocs/adherents/card.php
@@ -655,7 +655,7 @@ if (empty($reshook)) {
$action = '';
}
- if ($user->rights->adherent->supprimer && $action == 'confirm_resign') {
+ if ($user->rights->adherent->supprimer && $action == 'confirm_resiliate') {
$error = 0;
if ($confirm == 'yes') {
@@ -726,6 +726,77 @@ if (empty($reshook)) {
}
}
+ if ($user->rights->adherent->supprimer && $action == 'confirm_exclude') {
+ $error = 0;
+
+ if ($confirm == 'yes') {
+ $adht = new AdherentType($db);
+ $adht->fetch($object->typeid);
+
+ $result = $object->exclude($user);
+
+ if ($result >= 0 && !count($object->errors)) {
+ if ($object->email && GETPOST("send_mail")) {
+ $subject = '';
+ $msg = '';
+
+ // Send subscription email
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+ $formmail = new FormMail($db);
+ // Set output language
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
+ // Load traductions files required by page
+ $outputlangs->loadLangs(array("main", "members"));
+ // Get email content from template
+ $arraydefaultmessage = null;
+ $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_EXCLUSION;
+
+ if (!empty($labeltouse)) {
+ $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
+ }
+
+ if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
+ $subject = $arraydefaultmessage->topic;
+ $msg = $arraydefaultmessage->content;
+ }
+
+ if (empty($labeltouse) || (int) $labeltouse === -1) {
+ //fallback on the old configuration.
+ setEventMessages('WarningMandatorySetupNotComplete', null, 'errors');
+ $error++;
+ } else {
+ $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
+ complete_substitutions_array($substitutionarray, $outputlangs, $object);
+ $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
+ $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
+
+ $moreinheader = 'X-Dolibarr-Info: send_an_email by adherents/card.php'."\r\n";
+
+ $result = $object->send_an_email($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
+ if ($result < 0) {
+ $error++;
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ }
+ }
+ } else {
+ $error++;
+
+ if ($object->error) {
+ setEventMessages($object->error, $object->errors, 'errors');
+ } else {
+ setEventMessages($object->error, $object->errors, 'errors');
+ }
+ $action = '';
+ }
+ }
+ if (!empty($backtopage) && !$error) {
+ header("Location: ".$backtopage);
+ exit;
+ }
+ }
+
// SPIP Management
if ($user->rights->adherent->supprimer && $action == 'confirm_del_spip' && $confirm == 'yes') {
if (!count($object->errors)) {
@@ -1434,8 +1505,8 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ValidateMember"), $langs->trans("ConfirmValidateMember"), "confirm_valid", $formquestion, 'yes', 1, 220);
}
- // Confirm terminate
- if ($action == 'resign') {
+ // Confirm resiliate
+ if ($action == 'resiliate') {
$langs->load("mails");
$adht = new AdherentType($db);
@@ -1491,7 +1562,67 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
if ($backtopage) {
$formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
}
- print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resign", $formquestion, 'no', 1, 240);
+ print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resiliate", $formquestion, 'no', 1, 240);
+ }
+
+ // Confirm exclude
+ if ($action == 'exclude') {
+ $langs->load("mails");
+
+ $adht = new AdherentType($db);
+ $adht->fetch($object->typeid);
+
+ $subject = '';
+ $msg = '';
+
+ // Send subscription email
+ include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
+ $formmail = new FormMail($db);
+ // Set output language
+ $outputlangs = new Translate('', $conf);
+ $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
+ // Load traductions files required by page
+ $outputlangs->loadLangs(array("main", "members"));
+ // Get email content from template
+ $arraydefaultmessage = null;
+ $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_EXCLUSION;
+
+ if (!empty($labeltouse)) {
+ $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
+ }
+
+ if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
+ $subject = $arraydefaultmessage->topic;
+ $msg = $arraydefaultmessage->content;
+ }
+
+ $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
+ complete_substitutions_array($substitutionarray, $outputlangs, $object);
+ $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
+ $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnExclude()), $substitutionarray, $outputlangs);
+
+ $tmp = $langs->trans("SendingAnEMailToMember");
+ $tmp .= '
('.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', ';
+ $tmp .= $langs->trans("MailRecipient").': '.$object->email.')';
+ $helpcontent = '';
+ $helpcontent .= ''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n";
+ $helpcontent .= ''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n";
+ $helpcontent .= ''.$langs->trans("Subject").':
'."\n";
+ $helpcontent .= $subjecttosend."\n";
+ $helpcontent .= "
";
+ $helpcontent .= ''.$langs->trans("Content").':
';
+ $helpcontent .= dol_htmlentitiesbr($texttosend)."\n";
+ $label = $form->textwithpicto($tmp, $helpcontent, 1, 'help');
+
+ // Create an array
+ $formquestion = array();
+ if ($object->email) {
+ $formquestion[] = array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (!empty($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL) ? 'true' : 'false'));
+ }
+ if ($backtopage) {
+ $formquestion[] = array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"]));
+ }
+ print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ExcludeMember"), $langs->trans("ConfirmExcludeMember"), "confirm_exclude", $formquestion, 'no', 1, 240);
}
// Confirm remove member
@@ -1584,12 +1715,12 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
} elseif (!$adht->subscription) {
print $langs->trans("SubscriptionNotRecorded");
if ($object->statut > 0) {
- print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft and not terminated
+ print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
}
} else {
print $langs->trans("SubscriptionNotReceived");
if ($object->statut > 0) {
- print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft and not terminated
+ print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft, not excluded and not resiliated
}
}
}
@@ -1740,7 +1871,7 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
// Reactivate
- if ($object->statut == 0) {
+ if ($object->statut == 0 || $object->statut == -2) {
if ($user->rights->adherent->creer) {
print '
\n";
} else {
@@ -1748,15 +1879,24 @@ if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) {
}
}
- // Terminate
+ // Resiliate
if ($object->statut >= 1) {
if ($user->rights->adherent->supprimer) {
- print '\n";
+ print '\n";
} else {
print ''.$langs->trans("Resiliate")."
";
}
}
+ // Exclude
+ if ($object->statut >= 1) {
+ if ($user->rights->adherent->supprimer) {
+ print '\n";
+ } else {
+ print ''.$langs->trans("Exclude")."
";
+ }
+ }
+
// Create third party
if (!empty($conf->societe->enabled) && !$object->socid) {
if ($user->rights->societe->creer) {
diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php
index 8ee02238f1e..bb56eaf4947 100644
--- a/htdocs/adherents/class/adherent.class.php
+++ b/htdocs/adherents/class/adherent.class.php
@@ -1918,7 +1918,10 @@ class Adherent extends CommonObject
}
/**
- * Fonction qui exclu un adherent
+ * Functiun to exlude (set adherent.status to -2) a member
+ * TODO
+ * A private note should be added to know why the member has been excluded
+ * For historical purpose it add an "extra-subscription" type excluded
*
* @param User $user User making change
* @return int <0 if KO, >0 if OK
diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php
index 6c7dddecaa6..c4402a157bd 100644
--- a/htdocs/adherents/class/adherent_type.class.php
+++ b/htdocs/adherents/class/adherent_type.class.php
@@ -103,8 +103,8 @@ class AdherentType extends CommonObject
/** @var string Email sent after resiliation */
public $mail_resiliate = '';
- /** @var string Email sent after exclusion */
- public $mail_exclusion = '';
+ /** @var string Email sent after exclude */
+ public $mail_exclude = '';
/** @var array Array of members */
public $members = array();
@@ -825,15 +825,15 @@ class AdherentType extends CommonObject
}
/**
- * getMailOnExclusion
+ * getMailOnExclude
*
* @return string Return mail model content of type or empty
*/
- public function getMailOnExclusion()
+ public function getMailOnExclude()
{
- // NOTE mail_exclusion not defined so never used
- if (!empty($this->mail_exclusion) && trim(dol_htmlentitiesbr_decode($this->mail_exclusion))) { // Property not yet defined
- return $this->mail_exclusion;
+ // NOTE mail_exclude not defined so never used
+ if (!empty($this->mail_exclude) && trim(dol_htmlentitiesbr_decode($this->mail_exclude))) { // Property not yet defined
+ return $this->mail_exclude;
}
return '';
diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php
index c0599561df0..f5c5b1100a4 100644
--- a/htdocs/adherents/index.php
+++ b/htdocs/adherents/index.php
@@ -82,8 +82,8 @@ print load_fiche_titre($langs->trans("MembersArea"), $resultboxes['selectboxlist
$MembersValidated = array();
$MembersToValidate = array();
$MembersUpToDate = array();
-$MembersResiliated = array();
$MembersExcluded = array();
+$MembersResiliated = array();
$AdherentType = array();
@@ -117,12 +117,12 @@ if ($result) {
if ($objp->statut == 1) {
$MembersValidated[$objp->rowid] = $objp->somme;
}
- if ($objp->statut == 0) {
- $MembersResiliated[$objp->rowid] = $objp->somme;
- }
if ($objp->statut == -2) {
$MembersExcluded[$objp->rowid] = $objp->somme;
}
+ if ($objp->statut == 0) {
+ $MembersResiliated[$objp->rowid] = $objp->somme;
+ }
$i++;
}
@@ -203,7 +203,6 @@ if ($conf->use_javascript_ajax) {
$SumResiliated = 0;
$SumExcluded = 0;
-
$total = 0;
$dataval = array();
$i = 0;
@@ -211,17 +210,17 @@ if ($conf->use_javascript_ajax) {
$dataval['draft'][] = array($i, isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0);
$dataval['notuptodate'][] = array($i, isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : 0);
$dataval['uptodate'][] = array($i, isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0);
- $dataval['resiliated'][] = array($i, isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0);
$dataval['excluded'][] = array($i, isset($MembersExcluded[$key]) ? $MembersExcluded[$key] : 0);
+ $dataval['resiliated'][] = array($i, isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0);
$SumToValidate += isset($MembersToValidate[$key]) ? $MembersToValidate[$key] : 0;
$SumValidated += isset($MembersValidated[$key]) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : 0;
$SumUpToDate += isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0;
- $SumResiliated += isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0;
$SumExcluded += isset($MembersExcluded[$key]) ? $MembersExcluded [$key] : 0;
+ $SumResiliated += isset($MembersResiliated[$key]) ? $MembersResiliated[$key] : 0;
$i++;
}
- $total = $SumToValidate + $SumValidated + $SumUpToDate + $SumResiliated + $SumExcluded;
+ $total = $SumToValidate + $SumValidated + $SumUpToDate + $SumExcluded + $SumResiliated;
$dataseries = array();
$dataseries[] = array($langs->transnoentitiesnoconv("OutOfDate"), round($SumValidated));
$dataseries[] = array($langs->transnoentitiesnoconv("UpToDate"), round($SumUpToDate));
@@ -244,8 +243,7 @@ if ($conf->use_javascript_ajax) {
$boxgraph .= '';
$boxgraph .= '| '.$langs->trans("Total").' | ';
-
- $boxgraph .= $SumToValidate + $SumValidated + $SumUpToDate + $SumResiliated + $SumExcluded;
+ $boxgraph .= $SumToValidate + $SumValidated + $SumUpToDate + $SumExcluded + $SumResiliated;
$boxgraph .= ' |
';
$boxgraph .= '';
$boxgraph .= '';
@@ -481,27 +479,27 @@ print ''.$langs->trans("MembersTypes").' | ';
print ''.$langs->trans("MembersStatusToValid").' | ';
print ''.$langs->trans("OutOfDate").' | ';
print ''.$langs->trans("UpToDate").' | ';
-print ''.$langs->trans("MembersStatusResiliated").' | ';
print ''.$langs->trans("MembersStatusExcluded").' | ';
+print ''.$langs->trans("MembersStatusResiliated").' | ';
print "\n";
foreach ($AdherentType as $key => $adhtype) {
print '';
print '| '.$adhtype->getNomUrl(1, dol_size(32)).' | ';
print ''.(isset($MembersToValidate[$key]) && $MembersToValidate[$key] > 0 ? $MembersToValidate[$key] : '').' '.$staticmember->LibStatut(-1, $adhtype->subscription, 0, 3).' | ';
- print ''.(isset($MembersValidated[$key]) && ($MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) > 0) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : '').' '.$staticmember->LibStatut(1, $adhtype->subscription, 0, 3).' | ';
- print ''.(isset($MembersUpToDate[$key]) && $MembersUpToDate[$key] > 0 ? $MembersUpToDate[$key] : '').' '.$staticmember->LibStatut(1, $adhtype->subscription, $now, 3).' | ';
- print ''.(isset($MembersResiliated[$key]) && $MembersResiliated[$key] > 0 ? $MembersResiliated[$key] : '').' '.$staticmember->LibStatut(0, $adhtype->subscription, 0, 3).' | ';
+ print ''.(isset($MembersValidated[$key]) && ($MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) > 0) ? $MembersValidated[$key] - (isset($MembersUpToDate[$key]) ? $MembersUpToDate[$key] : 0) : '').' '.$staticmember->LibStatut(1, 1, 0, 3).' | ';
+ print ''.(isset($MembersUpToDate[$key]) && $MembersUpToDate[$key] > 0 ? $MembersUpToDate[$key] : '').' '.$staticmember->LibStatut(1, $adhtype->subscription, $now+10, 3).' | ';
print ''.(isset($MembersExcluded[$key]) && $MembersExcluded[$key] > 0 ? $MembersExcluded[$key] : '').' '.$staticmember->LibStatut(-2, $adhtype->subscription, 0, 3).' | ';
+ print ''.(isset($MembersResiliated[$key]) && $MembersResiliated[$key] > 0 ? $MembersResiliated[$key] : '').' '.$staticmember->LibStatut(0, $adhtype->subscription, 0, 3).' | ';
print "
\n";
}
print '';
print '| '.$langs->trans("Total").' | ';
-print ''.$SumToValidate.' '.$staticmember->LibStatut(-1, $adhtype->subscription, 0, 3).' | ';
-print ''.$SumValidated.' '.$staticmember->LibStatut(1, $adhtype->subscription, 0, 3).' | ';
-print ''.$SumUpToDate.' '.$staticmember->LibStatut(1, $adhtype->subscription, $now, 3).' | ';
-print ''.$SumResiliated.' '.$staticmember->LibStatut(0, $adhtype->subscription, 0, 3).' | ';
-print ''.$SumExcluded.' '.$staticmember->LibStatut(-2, $adhtype->subscription, 0, 3).' | ';
+print ''.$SumToValidate.' '.$staticmember->LibStatut(-1, 1, 0, 3).' | ';
+print ''.$SumValidated.' '.$staticmember->LibStatut(1, 1, 0, 3).' | ';
+print ''.$SumUpToDate.' '.$staticmember->LibStatut(1, 1, $now+10, 3).' | ';
+print ''.$SumExcluded.' '.$staticmember->LibStatut(-2, 1, 0, 3).' | ';
+print ''.$SumResiliated.' '.$staticmember->LibStatut(0, 1, 0, 3).' | ';
print '
';
print "\n";
diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang
index 5812248b129..31d0790b331 100644
--- a/htdocs/langs/en_US/members.lang
+++ b/htdocs/langs/en_US/members.lang
@@ -21,10 +21,12 @@ MembersListToValid=List of draft members (to be validated)
MembersListValid=List of valid members
MembersListUpToDate=List of valid members with up-to-date subscription
MembersListNotUpToDate=List of valid members with out-of-date subscription
+MembersListExcluded=List of excluded members
MembersListResiliated=List of terminated members
MembersListQualified=List of qualified members
MenuMembersToValidate=Draft members
MenuMembersValidated=Validated members
+MenuMembersExcluded=Excluded members
MenuMembersResiliated=Terminated members
MembersWithSubscriptionToReceive=Members with subscription to receive
MembersWithSubscriptionToReceiveShort=Subscription to receive
@@ -47,9 +49,12 @@ MemberStatusActiveLate=Subscription expired
MemberStatusActiveLateShort=Expired
MemberStatusPaid=Subscription up to date
MemberStatusPaidShort=Up to date
+MemberStatusExcluded=Excluded member
+MemberStatusExcludedShort=Excluded
MemberStatusResiliated=Terminated member
MemberStatusResiliatedShort=Terminated
MembersStatusToValid=Draft members
+MembersStatusExcluded=Excluded members
MembersStatusResiliated=Terminated members
MemberStatusNoSubscription=Validated (no subscription needed)
MemberStatusNoSubscriptionShort=Validated
@@ -82,6 +87,8 @@ Physical=Physical
Moral=Moral
MorAndPhy=Moral and Physical
Reenable=Reenable
+ExcludeMember=Exclude a member
+ConfirmExcludeMember=Are you sure you want to exclude this member ?
ResiliateMember=Terminate a member
ConfirmResiliateMember=Are you sure you want to terminate this member?
DeleteMember=Delete a member