generate_invoices.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. from dateutil.relativedelta import relativedelta
  4. from django.http import HttpResponse
  5. from django.db.models import Q
  6. from coin.offers.models import Offer, OfferSubscription
  7. from coin.members.models import Member
  8. from coin.billing.models import Invoice, InvoiceDetail
  9. def generate_missing_invoices(request):
  10. """
  11. Pour chaque abonnement (OfferSubscription):
  12. Vérifie pour chaque période de facturation si elle a été facturée
  13. Sinon génère la facture correspondante
  14. """
  15. members = Member.objects.filter(
  16. Q(offersubscription__resign_date__isnull=True) | Q(offersubscription__resign_date__gte=datetime.date.today()))
  17. offer_subscriptions = OfferSubscription.objects.filter(
  18. Q(resign_date__isnull=True) | Q(resign_date__gte=datetime.date.today()))
  19. sortie = ""
  20. for member in members:
  21. sortie += '<br /> %s - %s' % (member,
  22. generate_invoice_for_a_period(member, datetime.date(2013,12,5)))
  23. return HttpResponse(sortie)
  24. def generate_invoice_for_a_period(member, date):
  25. """
  26. Génère si necessaire une facture pour un membre en prenant la date passée
  27. en paramètre comme premier mois de période. Renvoi la facture générée
  28. ou Non si aucune facture n'était necessaire.
  29. """
  30. invoice = None
  31. offer_subscriptions = OfferSubscription.objects.filter(
  32. Q(resign_date__isnull=True) | Q(resign_date__gte=datetime.date.today()),
  33. member__exact=member.pk)
  34. for offer_subscription in offer_subscriptions:
  35. offer = offer_subscription.offer
  36. invoice_test = Invoice.objects.filter(
  37. period_from__lte=date,
  38. period_to__gte=date,
  39. details__offer__exact=offer.pk,
  40. member__exact=member.pk)
  41. if not invoice_test.exists():
  42. if invoice == None:
  43. invoice = Invoice.objects.create(
  44. period_from=datetime.date(date.year,date.month,1),
  45. period_to=datetime.date(date.year,date.month,1),
  46. date_due=datetime.date.today(),
  47. member=member
  48. )
  49. new_period_to = (datetime.date(date.year,date.month,1) +
  50. relativedelta(months = +offer.billing_period) -
  51. relativedelta(days = +1))
  52. if new_period_to > invoice.period_to:
  53. invoice.period_to=new_period_to
  54. invoice.details.create(label=offer.name,
  55. amount=offer.period_fees,
  56. offer=offer)
  57. print invoice.period_to
  58. invoice.save();
  59. return invoice