Browse Source

Add a call for membership fees email sending system including a management command to send it automatically (1 month before end date of membership, at anniversary date, once a month for 3 months after end date)

Fabs 10 years ago
parent
commit
96c4cd12a9

+ 48 - 0
coin/members/management/commands/call_for_membership_fees.py

@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import datetime
+from dateutil.relativedelta import relativedelta
+from django.core.management.base import BaseCommand, CommandError
+from django.conf import settings
+
+from coin.utils import respect_language
+from coin.members.models import Member, MembershipFee
+
+class Command(BaseCommand):
+    args = '[date=2011-07-04]'
+    help = """Send a call for membership email to members.
+              A mail is sent when end date of membership 
+              reach the anniversary date, 1 month before and once a month 
+              for 3 months.
+              By default, today is used to compute relative dates, but a date
+              can be passed as argument."""
+
+    def handle(self, *args, **options):
+        try:
+            date = datetime.datetime.strptime(args[0], '%Y-%m-%d').date()
+        except IndexError:
+            date = datetime.date.today()
+        except ValueError:
+            raise CommandError(
+                'Please enter a valid date : YYYY-mm-dd (ex: 2011-07-04)')
+
+        # Get membership_fees filtered by end date of membership at specific date relative to today
+        call_dates = [date + relativedelta(months=-3),
+                      date + relativedelta(months=-2),
+                      date + relativedelta(months=-1),
+                      date,
+                      date + relativedelta(months=+1)]
+
+        self.stdout.write(
+            'Select membership fees for following end dates : %s' % call_dates)
+
+        fees = MembershipFee.objects.filter(end_date__in=call_dates)
+
+        with respect_language(settings.LANGUAGE_CODE):
+            for fee in fees:
+                # Don't send if member is paid up 1 month and 1 day after today.
+                if not fee.member.is_paid_up(date + relativedelta(months=+1, days=+1)):
+                    self.stdout.write(
+                    'Send call for membership fees email to %s' % fee.member)
+                    fee.member.send_call_for_membership_fees_email()

+ 14 - 3
coin/members/models.py

@@ -114,12 +114,12 @@ class Member(CoinLdapSyncMixin, AbstractUser):
             return None
     end_date_of_membership.short_description = "Date de fin d'adhésion"
 
-    def is_paid_up(self):
+    def is_paid_up(self, date=datetime.date.today()):
         """
-        True si le membre est à jour de cotisation. False sinon
+        True si le membre est à jour de cotisation à la date passée. False sinon
         """
         if self.end_date_of_membership() \
-                and self.end_date_of_membership() >= datetime.date.today():
+                and self.end_date_of_membership() >= date:
             return True
         else:
             return False
@@ -253,6 +253,17 @@ class Member(CoinLdapSyncMixin, AbstractUser):
                                    body_template='members/emails/welcome_email.html',
                                    context={'member': self, 'branding':ISPInfo.objects.first()})
 
+    def send_call_for_membership_fees_email(self):
+        """ Envoi le courriel d'appel à cotisation du membre """
+        from coin.isp_database.models import ISPInfo
+
+        utils.send_templated_email(to=self.email,
+                                   subject_template='members/emails/call_for_membership_fees_subject.txt',
+                                   body_template='members/emails/call_for_membership_fees.html',
+                                   context={'member': self, 'branding':ISPInfo.objects.first(),
+                                            'membership_info_url': settings.MEMBER_MEMBERSHIP_INFO_URL,
+                                            'today': datetime.date.today})       
+
     class Meta:
         verbose_name = 'membre'
 

+ 16 - 0
coin/members/templates/members/emails/call_for_membership_fees.html

@@ -0,0 +1,16 @@
+<p>Bonjour {{ member }},</p>
+
+<p>Ta cotisation annuelle à l'association {{ branding.shortname|capfirst }} 
+{% if member.end_date_of_membership >= today %}sera à renouveller à partir du{% else %}est à renouveller depuis le{% endif %} {{ member.end_date_of_membership }}.</p>
+
+<p>Un renouvellement ne necessite pas de remplir une nouvelle fois 
+le formulaire d'adhésion, tu trouveras toutes les instructions 
+à cette adresse :<br />
+{{ membership_info_url }}</p>
+
+<p>Ce courriel automatique est envoyé 
+un mois avant la date anniversaire de ton adhésion, 
+à la date anniversire et
+une fois par mois pendant les trois mois suivant la date anniversaire.</p>
+
+<p>L'équipe de l'association {{ branding.shortname|capfirst }}</p>

+ 1 - 0
coin/members/templates/members/emails/call_for_membership_fees_subject.txt

@@ -0,0 +1 @@
+Renouvellement de cotisation {{ branding.shortname|capfirst }}