Browse Source

Add a --antidate option to charge_subscriptions action

Alexandre Aubin 7 years ago
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 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
     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 = []
 
     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:
             invoices.append(invoice)
 
     return invoices
 
 @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
     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:
         invoice.save()
         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
     else:
         transaction.savepoint_rollback(sid)

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

@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 import datetime
+
+from argparse import RawTextHelpFormatter
 from django.core.management.base import BaseCommand, CommandError
 from django.conf import settings
 
@@ -8,13 +10,39 @@ from coin.billing.create_subscriptions_invoices import create_all_members_invoic
 
 
 class Command(BaseCommand):
-    args = '[date=2011-07-04]'
+
     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):
         verbosity = int(options['verbosity'])
+        antidate = options['antidate']
+        date = options["date"]
+
         try:
-            date = datetime.datetime.strptime(args[0], '%Y-%m-%d').date()
+            date = datetime.datetime.strptime(date, '%Y-%m-%d').date()
         except IndexError:
             date = datetime.date.today()
         except ValueError:
@@ -25,7 +53,7 @@ class Command(BaseCommand):
             self.stdout.write(
                 'Create invoices for all members for the date : %s' % date)
         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:
             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)
 
     @transaction.atomic
-    def validate(self):
+    def validate(self, custom_date=None):
         """
         Switch invoice to validate mode. This set to False the draft field
         and generate the pdf
         """
-        self.date = datetime.date.today()
+
+        self.date = custom_date or datetime.date.today()
+
         if not self.date_due:
             self.date_due = self.date + datetime.timedelta(days=settings.PAYMENT_DELAY)
         old_number = self.number