123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- # -*- coding: utf-8 -*-
- import datetime
- from dateutil.relativedelta import relativedelta
- from django.http import HttpResponse
- from django.db.models import Q
- from coin.offers.models import Offer, OfferSubscription
- from coin.members.models import Member
- from coin.billing.models import Invoice, InvoiceDetail
- def generate_missing_invoices(request):
- """
- TODO
- Pour chaque abonnement (OfferSubscription):
- Vérifie pour chaque période de facturation si elle a été facturée
- Sinon génère la facture correspondante
- """
- members = Member.objects.filter(
- Q(offersubscription__resign_date__isnull=True) | Q(offersubscription__resign_date__gte=datetime.date.today()))
- offer_subscriptions = OfferSubscription.objects.filter(
- Q(resign_date__isnull=True) | Q(resign_date__gte=datetime.date.today()))
- sortie = ""
- for member in members:
- sortie += '<br /> %s - %s' % (member,
- generate_invoice_for_a_period(member, datetime.date(2014,5,17)))
- return HttpResponse(sortie)
- def generate_invoice_for_a_period(member, date):
- """
- Génère 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
- ou None si aucune facture n'était necessaire.
- """
- invoice = None
- # Récupère les abonnements en cours du membre
- offer_subscriptions = (
- OfferSubscription.get_member_offer_subscriptions(member,date))
- #Pour chaque abonnement
- for offer_subscription in offer_subscriptions:
- #Récupère l'offre de l'abonnement
- offer = offer_subscription.offer
- # Recherche les factures déjà existantes de ce membre ayant cette offre
- # comme item pour lesquels la période de facturation englobe la date
- invoice_test = Invoice.objects.filter(
- details__offer__exact=offer.pk,
- details__period_from__lte=date,
- details__period_to__gte=date,
- member__exact=member.pk)
- #Si une telle facture n'existe pas
- if not invoice_test.exists():
- #Si l'object facture n'a pas encore été créé, le créé
- if invoice == None:
- invoice = Invoice.objects.create(
- date_due=datetime.date.today(),
- member=member
- )
- #Ajout l'item de l'offre correspondant à l'abonnement à la facture
- invoice.details.create(label=offer.name,
- amount=offer.period_fees,
- offer=offer,
- period_from=datetime.date(date.year,date.month,1),
- period_to=(datetime.date(date.year,date.month,1) +
- relativedelta(months = +offer.billing_period) -
- relativedelta(days = +1)))
- invoice.save();
- return invoice
|