Parcourir la source

Add a --antidate option to charge_subscriptions action

Alexandre Aubin il y a 7 ans
Parent
commit
002d01e688

+ 9 - 4
coin/billing/create_subscriptions_invoices.py

@@ -13,7 +13,7 @@ from coin.members.models import Member
 from coin.billing.models import Invoice, InvoiceDetail
 from coin.billing.models import Invoice, InvoiceDetail
 from django.conf import settings
 from django.conf import settings
 
 
-def create_all_members_invoices_for_a_period(date=None):
+def create_all_members_invoices_for_a_period(date=None, antidate=False):
     """
     """
     Pour chaque membre ayant au moins un abonnement actif, génère les factures
     Pour chaque membre ayant au moins un abonnement actif, génère les factures
     en prenant la date comme premier mois de la période de facturation
     en prenant la date comme premier mois de la période de facturation
@@ -27,14 +27,14 @@ def create_all_members_invoices_for_a_period(date=None):
     invoices = []
     invoices = []
 
 
     for member in members:
     for member in members:
-        invoice = create_member_invoice_for_a_period(member, date)
+        invoice = create_member_invoice_for_a_period(member, date, antidate)
         if invoice is not None:
         if invoice is not None:
             invoices.append(invoice)
             invoices.append(invoice)
 
 
     return invoices
     return invoices
 
 
 @transaction.atomic
 @transaction.atomic
-def create_member_invoice_for_a_period(member, date):
+def create_member_invoice_for_a_period(member, date, antidate):
     """
     """
     Créé si nécessaire une facture pour un membre en prenant la date passée
     Créé si nécessaire une facture pour un membre en prenant la date passée
     en paramètre comme premier mois de période. Renvoi la facture générée
     en paramètre comme premier mois de période. Renvoi la facture générée
@@ -157,7 +157,12 @@ def create_member_invoice_for_a_period(member, date):
     if invoice.details.count() > 0:
     if invoice.details.count() > 0:
         invoice.save()
         invoice.save()
         transaction.savepoint_commit(sid)
         transaction.savepoint_commit(sid)
-        invoice.validate() # Valide la facture et génère le PDF
+        # Valide la facture et génère le PDF
+        if antidate:
+            invoice.date_due = None # (reset the due date, will automatically be redefined when validating)
+            invoice.validate(period_to)
+        else:
+            invoice.validate()
         return invoice
         return invoice
     else:
     else:
         transaction.savepoint_rollback(sid)
         transaction.savepoint_rollback(sid)

+ 31 - 3
coin/billing/management/commands/charge_subscriptions.py

@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 import datetime
 import datetime
+
+from argparse import RawTextHelpFormatter
 from django.core.management.base import BaseCommand, CommandError
 from django.core.management.base import BaseCommand, CommandError
 from django.conf import settings
 from django.conf import settings
 
 
@@ -8,13 +10,39 @@ from coin.billing.create_subscriptions_invoices import create_all_members_invoic
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):
-    args = '[date=2011-07-04]'
+
     help = 'Create invoices for members subscriptions for date specified (or today if no date passed)'
     help = 'Create invoices for members subscriptions for date specified (or today if no date passed)'
 
 
+    def create_parser(self, *args, **kwargs):
+        parser = super(Command, self).create_parser(*args, **kwargs)
+        parser.formatter_class = RawTextHelpFormatter
+        return parser
+
+    def add_arguments(self, parser):
+
+        parser.add_argument(
+            'date',
+            type=str,
+            help="The date for the period for which to charge subscription (e.g. 2011-07-04)"
+        )
+
+        parser.add_argument(
+            '--antidate',
+            action='store_true',
+            dest='antidate',
+            default=False,
+            help="'Antidate' invoices, in the sense that invoices won't be validated with today's date but using the date of the end of the service. Meant to be use to charge subscription from a few months in the past..."
+        )
+
+
+
     def handle(self, *args, **options):
     def handle(self, *args, **options):
         verbosity = int(options['verbosity'])
         verbosity = int(options['verbosity'])
+        antidate = options['antidate']
+        date = options["date"]
+
         try:
         try:
-            date = datetime.datetime.strptime(args[0], '%Y-%m-%d').date()
+            date = datetime.datetime.strptime(date, '%Y-%m-%d').date()
         except IndexError:
         except IndexError:
             date = datetime.date.today()
             date = datetime.date.today()
         except ValueError:
         except ValueError:
@@ -25,7 +53,7 @@ class Command(BaseCommand):
             self.stdout.write(
             self.stdout.write(
                 'Create invoices for all members for the date : %s' % date)
                 'Create invoices for all members for the date : %s' % date)
         with respect_language(settings.LANGUAGE_CODE):
         with respect_language(settings.LANGUAGE_CODE):
-            invoices = create_all_members_invoices_for_a_period(date)
+            invoices = create_all_members_invoices_for_a_period(date, antidate)
 
 
         if len(invoices) > 0 or verbosity >= 2:
         if len(invoices) > 0 or verbosity >= 2:
             self.stdout.write(
             self.stdout.write(

+ 4 - 2
coin/billing/models.py

@@ -209,12 +209,14 @@ class Invoice(models.Model):
         self.pdf.save('%s.pdf' % self.number, pdf_file)
         self.pdf.save('%s.pdf' % self.number, pdf_file)
 
 
     @transaction.atomic
     @transaction.atomic
-    def validate(self):
+    def validate(self, custom_date=None):
         """
         """
         Switch invoice to validate mode. This set to False the draft field
         Switch invoice to validate mode. This set to False the draft field
         and generate the pdf
         and generate the pdf
         """
         """
-        self.date = datetime.date.today()
+
+        self.date = custom_date or datetime.date.today()
+
         if not self.date_due:
         if not self.date_due:
             self.date_due = self.date + datetime.timedelta(days=settings.PAYMENT_DELAY)
             self.date_due = self.date + datetime.timedelta(days=settings.PAYMENT_DELAY)
         old_number = self.number
         old_number = self.number