generate_invoices.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. TODO
  12. Pour chaque abonnement (OfferSubscription):
  13. Vérifie pour chaque période de facturation si elle a été facturée
  14. Sinon génère la facture correspondante
  15. """
  16. members = Member.objects.filter(
  17. Q(offersubscription__resign_date__isnull=True) | Q(offersubscription__resign_date__gte=datetime.date.today()))
  18. offer_subscriptions = OfferSubscription.objects.filter(
  19. Q(resign_date__isnull=True) | Q(resign_date__gte=datetime.date.today()))
  20. sortie = ""
  21. for member in members:
  22. sortie += '<br /> %s - %s' % (member,
  23. generate_invoice_for_a_period(member, datetime.date(2014,5,17)))
  24. return HttpResponse(sortie)
  25. def generate_invoice_for_a_period(member, date):
  26. """
  27. Génère si necessaire une facture pour un membre en prenant la date passée
  28. en paramètre comme premier mois de période. Renvoi la facture générée
  29. ou None si aucune facture n'était necessaire.
  30. """
  31. invoice = None
  32. # Récupère les abonnements en cours du membre
  33. offer_subscriptions = (
  34. OfferSubscription.get_member_offer_subscriptions(member,date))
  35. #Pour chaque abonnement
  36. for offer_subscription in offer_subscriptions:
  37. #Récupère l'offre de l'abonnement
  38. offer = offer_subscription.offer
  39. # Recherche les factures déjà existantes de ce membre ayant cette offre
  40. # comme item pour lesquels la période de facturation englobe la date
  41. invoice_test = Invoice.objects.filter(
  42. details__offer__exact=offer.pk,
  43. details__period_from__lte=date,
  44. details__period_to__gte=date,
  45. member__exact=member.pk)
  46. #Si une telle facture n'existe pas
  47. if not invoice_test.exists():
  48. #Si l'object facture n'a pas encore été créé, le créé
  49. if invoice == None:
  50. invoice = Invoice.objects.create(
  51. date_due=datetime.date.today(),
  52. member=member
  53. )
  54. #Ajout l'item de l'offre correspondant à l'abonnement à la facture
  55. invoice.details.create(label=offer.name,
  56. amount=offer.period_fees,
  57. offer=offer,
  58. period_from=datetime.date(date.year,date.month,1),
  59. period_to=(datetime.date(date.year,date.month,1) +
  60. relativedelta(months = +offer.billing_period) -
  61. relativedelta(days = +1)))
  62. invoice.save();
  63. return invoice