|
@@ -1,86 +1,94 @@
|
|
# -*- coding: utf-8 -*-
|
|
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
import datetime
|
|
|
|
+from decimal import Decimal
|
|
from django.test import TestCase, Client
|
|
from django.test import TestCase, Client
|
|
from coin.members.tests import MemberTestsUtils
|
|
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_member_invoice_for_a_period
|
|
from coin.billing.create_subscriptions_invoices import create_member_invoice_for_a_period
|
|
|
|
+from coin.billing.create_subscriptions_invoices import create_all_members_invoices_for_a_period
|
|
|
|
|
|
|
|
|
|
class BillingInvoiceCreationTests(TestCase):
|
|
class BillingInvoiceCreationTests(TestCase):
|
|
|
|
|
|
|
|
+ def setUp(self):
|
|
|
|
+ # Créé une offre
|
|
|
|
+ self.service = Service(name='ServiceTest')
|
|
|
|
+ self.service.save()
|
|
|
|
+ self.offer = Offer(name='Offre', billing_period=3, period_fees=30,
|
|
|
|
+ initial_fees=50, service=self.service)
|
|
|
|
+ self.offer.save()
|
|
|
|
+ # Créé un membre
|
|
|
|
+ self.ldap_cn = MemberTestsUtils.get_random_ldap_cn()
|
|
|
|
+ self.member = Member(first_name='Balthazar', last_name='Picsou',
|
|
|
|
+ ldap_cn=self.ldap_cn)
|
|
|
|
+ self.member.save()
|
|
|
|
+ # Créé un abonnement
|
|
|
|
+ self.subscription = OfferSubscription(
|
|
|
|
+ subscription_date=datetime.date(2014, 1, 10),
|
|
|
|
+ member=self.member,
|
|
|
|
+ offer=self.offer)
|
|
|
|
+ self.subscription.save()
|
|
|
|
+
|
|
|
|
+ def tearDown(self):
|
|
|
|
+ # Supprime l'utilisateur LDAP créé
|
|
|
|
+ LdapUser.objects.get(pk=self.ldap_cn).delete()
|
|
|
|
+
|
|
def test_first_subscription_invoice_has_initial_fees(self):
|
|
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
|
|
Test que la première facture générée pour un abonnement possède les
|
|
frais de mise en service
|
|
frais de mise en service
|
|
"""
|
|
"""
|
|
- # 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
|
|
# Demande la création de la première facture
|
|
invoice = create_member_invoice_for_a_period(
|
|
invoice = create_member_invoice_for_a_period(
|
|
- member, datetime.date(2014, 1, 1))
|
|
|
|
|
|
+ self.member, datetime.date(2014, 1, 1))
|
|
# La facture doit avoir les frais de mise en service
|
|
# La facture doit avoir les frais de mise en service
|
|
# Pour tester cela on tri par montant d'item décroissant.
|
|
# Pour tester cela on tri par montant d'item décroissant.
|
|
# Comme dans l'offre créé, les initial_fees sont plus élevées que
|
|
# Comme dans l'offre créé, les initial_fees sont plus élevées que
|
|
# les period_fees, il doit sortir en premier
|
|
# les period_fees, il doit sortir en premier
|
|
self.assertEqual(invoice.details.order_by('-amount').first().amount, 50)
|
|
self.assertEqual(invoice.details.order_by('-amount').first().amount, 50)
|
|
|
|
|
|
|
|
+ def test_prorata_for_first_month_subscription(self):
|
|
|
|
+ """
|
|
|
|
+ Test que la première facture d'un abonnement est facturée au prorata du
|
|
|
|
+ nombre de jours restants
|
|
|
|
+ """
|
|
|
|
+ #Créé la facture pour le mois de janvier
|
|
|
|
+ invoice = create_member_invoice_for_a_period(self.member, datetime.date(2014,1,1))
|
|
|
|
+ #Comme l'abonnement a été souscris le 10/01 et que la période de
|
|
|
|
+ #facturation est de 3 mois, alors le prorata doit être :
|
|
|
|
+ #janvier : 22j (31-9)
|
|
|
|
+ #fevrier : 28j
|
|
|
|
+ #mars : 31j
|
|
|
|
+ #22+28+31 / 31+28+31
|
|
|
|
+ quantity = Decimal((22.0+28.0+31.0)/(31.0+28.0+31.0))
|
|
|
|
+ for detail in invoice.details.all():
|
|
|
|
+ if detail.amount != 50:
|
|
|
|
+ self.assertEqual(detail.quantity.quantize(Decimal('0.01')),
|
|
|
|
+ quantity.quantize(Decimal('0.01')))
|
|
|
|
+
|
|
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
|
|
Test qu'un abonnement ne peut pas être facturé deux fois
|
|
(pas de chevauchement possible)
|
|
(pas de chevauchement possible)
|
|
"""
|
|
"""
|
|
-
|
|
|
|
- # Créé une offre
|
|
|
|
- service = Service(name='ServiceTest')
|
|
|
|
- service.save()
|
|
|
|
- offer = Offer(name='Offre', billing_period=3, period_fees=30,
|
|
|
|
- initial_fees=0, 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()
|
|
|
|
-
|
|
|
|
# Créé une facture
|
|
# Créé une facture
|
|
- invoice = Invoice(member=member)
|
|
|
|
|
|
+ invoice = Invoice(member=self.member)
|
|
invoice.save()
|
|
invoice.save()
|
|
# Créé une facturation pour cet abonnement pour la première période
|
|
# Créé une facturation pour cet abonnement pour la première période
|
|
# de janvier à mars
|
|
# de janvier à mars
|
|
- invoice.details.create(label=offer.name,
|
|
|
|
- amount=offer.period_fees,
|
|
|
|
- offersubscription=subscription,
|
|
|
|
|
|
+ invoice.details.create(label=self.offer.name,
|
|
|
|
+ amount=self.offer.period_fees,
|
|
|
|
+ offersubscription=self.subscription,
|
|
period_from=datetime.date(2014, 1, 1),
|
|
period_from=datetime.date(2014, 1, 1),
|
|
period_to=datetime.date(2014, 3, 31))
|
|
period_to=datetime.date(2014, 3, 31))
|
|
|
|
|
|
# Créé une facturation pour cet abonnement pour une seconde période
|
|
# Créé une facturation pour cet abonnement pour une seconde période
|
|
# de juin à aout
|
|
# de juin à aout
|
|
- invoice.details.create(label=offer.name,
|
|
|
|
- amount=offer.period_fees,
|
|
|
|
- offersubscription=subscription,
|
|
|
|
|
|
+ invoice.details.create(label=self.offer.name,
|
|
|
|
+ amount=self.offer.period_fees,
|
|
|
|
+ offersubscription=self.subscription,
|
|
period_from=datetime.date(2014, 6, 1),
|
|
period_from=datetime.date(2014, 6, 1),
|
|
period_to=datetime.date(2014, 8, 31))
|
|
period_to=datetime.date(2014, 8, 31))
|
|
|
|
|
|
@@ -88,7 +96,7 @@ class BillingInvoiceCreationTests(TestCase):
|
|
# Elle doit 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_member_invoice_for_a_period(
|
|
invoice_test_1 = create_member_invoice_for_a_period(
|
|
- member, datetime.date(2014, 2, 1))
|
|
|
|
|
|
+ self.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
|
|
@@ -96,14 +104,12 @@ class BillingInvoiceCreationTests(TestCase):
|
|
# 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_member_invoice_for_a_period(
|
|
invoice_test_2 = create_member_invoice_for_a_period(
|
|
- member, datetime.date(2014, 4, 1))
|
|
|
|
|
|
+ self.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,
|
|
datetime.date(2014, 5, 31))
|
|
datetime.date(2014, 5, 31))
|
|
|
|
|
|
- LdapUser.objects.get(pk=ldap_cn).delete()
|
|
|
|
-
|
|
|
|
|
|
|
|
class BillingPDFTests(TestCase):
|
|
class BillingPDFTests(TestCase):
|
|
|
|
|
|
@@ -139,7 +145,7 @@ class BillingPDFTests(TestCase):
|
|
Test qu'une erreur 403 est bien retournée en cas de tentative
|
|
Test qu'une erreur 403 est bien retournée en cas de tentative
|
|
infructueuse
|
|
infructueuse
|
|
"""
|
|
"""
|
|
- # Créé un membre B
|
|
|
|
|
|
+ # Créé un membre A
|
|
member_a_login = MemberTestsUtils.get_random_ldap_cn()
|
|
member_a_login = MemberTestsUtils.get_random_ldap_cn()
|
|
member_a_pwd = '1234'
|
|
member_a_pwd = '1234'
|
|
member_a = Member(first_name='A', last_name='A',
|
|
member_a = Member(first_name='A', last_name='A',
|