Browse Source

Improve subscription invoice creation by charging initial_fees for the first invoice created for a subscription

Fabs 11 years ago
parent
commit
f94db055cf
2 changed files with 51 additions and 8 deletions
  1. 14 1
      coin/billing/create_subscriptions_invoices.py
  2. 37 7
      coin/billing/tests.py

+ 14 - 1
coin/billing/create_subscriptions_invoices.py

@@ -28,7 +28,7 @@ def create_missing_invoices(request):
 	return HttpResponse(sortie)
 
 
-def create_invoice_for_a_period(member, date):
+def create_member_invoice_for_a_period(member, date):
 	"""
 	Créé si necessaire 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
@@ -63,6 +63,19 @@ def create_invoice_for_a_period(member, date):
 					date_due=datetime.date.today(),
 					member=member
 				)
+			
+			# Vérifie s'il s'agit de la première facture d'un abonnement,
+			# Alors facture en plus les frais de mise en service
+			invoicedetail_test_first = InvoiceDetail.objects.filter(
+				offer__exact=offer.pk,
+				invoice__member__exact=member.pk)
+			if not invoicedetail_test_first.exists():
+				invoice.details.create(label=offer.name + " - Frais de mise en service",
+					amount=offer.initial_fees,
+					offer=offer,
+					period_from=None,
+					period_to=None)
+
 			# Période de facturation de l'item par defaut
 			# - Du début du mois de la date passée en paramètre
 			# - Jusqu'à la fin du mois de la période de facturation de l'offre

+ 37 - 7
coin/billing/tests.py

@@ -5,10 +5,40 @@ from coin.members.tests import MemberTestsUtils
 from coin.members.models import Member, LdapUser
 from coin.billing.models import Invoice
 from coin.offers.models import Offer, Service, OfferSubscription
-from coin.billing.create_subscriptions_invoices import create_invoice_for_a_period
+from coin.billing.create_subscriptions_invoices import create_member_invoice_for_a_period
 
 class BillingInvoiceCreationTests(TestCase):
 
+	def test_first_subscription_invoice_has_initial_fees(self):
+		"""
+		Test que la première facture générée pour un abonnement possède les
+		frais de mise en servic
+		"""
+		# Créé une offre
+		service = Service(name='ServiceTest')
+		service.save()
+		offer = Offer(name='Offre', billing_period=3, period_fees=30, 
+					  initial_fees=50, service=service)
+		offer.save()
+		# Créé un membre
+		ldap_cn = MemberTestsUtils.get_random_ldap_cn()
+		member = Member(first_name = 'Balthazar', last_name = 'Picsou',
+		                ldap_cn = ldap_cn)
+		member.save()
+		# Créé un abonnement
+		subscription = OfferSubscription(
+			subscription_date=datetime.date(2014,1,1),
+			member=member,
+			offer=offer)
+		subscription.save()
+		# Demande la création de la première facture
+		invoice = create_member_invoice_for_a_period(member, datetime.date(2014,1,1))
+		# La facture doit avoir les frais de mise en service
+		# Pour tester cela on tri par montant d'item décroissant.
+		# Comme les initial_fees sont plus élevées que les period_fees, il doit
+		# sortie en premier
+		self.assertEqual(invoice.details.order_by('-amount').first().amount, 50)
+
 	def test_subscription_cant_be_charged_twice(self):
 		"""
 		Test qu'un abonnement ne peut pas être facturé deux fois pendant une
@@ -32,10 +62,10 @@ class BillingInvoiceCreationTests(TestCase):
 			member=member,
 			offer=offer)
 		subscription.save()
+		
 		# Créé une facture
 		invoice = Invoice(member=member)
 		invoice.save()
-
 		# Créé une facturation pour cette offre pour la première période
 		# de janvier à mars
 		invoice.details.create(label=offer.name,
@@ -53,18 +83,18 @@ class BillingInvoiceCreationTests(TestCase):
 				period_to=datetime.date(2014,8,31))
 
 		# Demande la génération d'une facture pour février
-		# Elle doit échouer et renvoyer None car l'offre est déjà facturée de
+		# Elle doit renvoyer None car l'offre est déjà facturée de
 		# janvier à mars
-		invoice_test_1 = create_invoice_for_a_period(member,
-													 datetime.date(2014,2,1))
+		invoice_test_1 = create_member_invoice_for_a_period(
+			member,datetime.date(2014,2,1))
 		self.assertEqual(invoice_test_1, None)
 
 		# Demande la création d'une facture pour avril
 		# Elle doit fonctionner, mais devrait avoir une période de facturation
 		# que de 2 mois, d'avril à mai car il y a déjà une facture pour
 		# la période de juin à aout
-		invoice_test_2 = create_invoice_for_a_period(member,
-													 datetime.date(2014,4,1))
+		invoice_test_2 = create_member_invoice_for_a_period(
+			member, datetime.date(2014,4,1))
 		self.assertEqual(invoice_test_2.details.first().period_from,
 						 datetime.date(2014,4,1))
 		self.assertEqual(invoice_test_2.details.first().period_to,