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)
 	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 
 	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
 	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(),
 					date_due=datetime.date.today(),
 					member=member
 					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
 			# Période de facturation de l'item par defaut
 			# - Du début du mois de la date passée en paramètre
 			# - 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
 			# - 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.members.models import Member, LdapUser
 from coin.billing.models import Invoice
 from coin.billing.models import Invoice
 from coin.offers.models import Offer, Service, OfferSubscription
 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):
 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):
 	def test_subscription_cant_be_charged_twice(self):
 		"""
 		"""
 		Test qu'un abonnement ne peut pas être facturé deux fois pendant une
 		Test qu'un abonnement ne peut pas être facturé deux fois pendant une
@@ -32,10 +62,10 @@ class BillingInvoiceCreationTests(TestCase):
 			member=member,
 			member=member,
 			offer=offer)
 			offer=offer)
 		subscription.save()
 		subscription.save()
+		
 		# Créé une facture
 		# Créé une facture
 		invoice = Invoice(member=member)
 		invoice = Invoice(member=member)
 		invoice.save()
 		invoice.save()
-
 		# Créé une facturation pour cette offre pour la première période
 		# Créé une facturation pour cette offre pour la première période
 		# de janvier à mars
 		# de janvier à mars
 		invoice.details.create(label=offer.name,
 		invoice.details.create(label=offer.name,
@@ -53,18 +83,18 @@ class BillingInvoiceCreationTests(TestCase):
 				period_to=datetime.date(2014,8,31))
 				period_to=datetime.date(2014,8,31))
 
 
 		# Demande la génération d'une facture pour février
 		# 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
 		# 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)
 		self.assertEqual(invoice_test_1, None)
 
 
 		# Demande la création d'une facture pour avril
 		# Demande la création d'une facture pour avril
 		# Elle doit fonctionner, mais devrait avoir une période de facturation
 		# 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
 		# que de 2 mois, d'avril à mai car il y a déjà une facture pour
 		# la période de juin à aout
 		# 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,
 		self.assertEqual(invoice_test_2.details.first().period_from,
 						 datetime.date(2014,4,1))
 						 datetime.date(2014,4,1))
 		self.assertEqual(invoice_test_2.details.first().period_to,
 		self.assertEqual(invoice_test_2.details.first().period_to,