From 4892a48af1f510fa697fba14f4597ac7e0ebb719 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Thu, 13 Aug 2015 18:30:27 +0200 Subject: [PATCH 1/2] contrib.teamnet_axel: past and active invoices retrieval endpoints --- passerelle/contrib/teamnet_axel/models.py | 24 ++++++++++-------- .../passerelle/contrib/teamnet_axel/detail.html | 15 ++++++++--- passerelle/contrib/teamnet_axel/urls.py | 6 +++-- passerelle/contrib/teamnet_axel/utils.py | 14 +++++++++++ passerelle/contrib/teamnet_axel/views.py | 29 +++++++++++++++++----- 5 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 passerelle/contrib/teamnet_axel/utils.py diff --git a/passerelle/contrib/teamnet_axel/models.py b/passerelle/contrib/teamnet_axel/models.py index 59d7b9c..755b5ad 100644 --- a/passerelle/contrib/teamnet_axel/models.py +++ b/passerelle/contrib/teamnet_axel/models.py @@ -23,7 +23,7 @@ from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource -from . import soap +from . import soap, utils logger = logging.getLogger('passerelle.contrib.teamnet_axel') @@ -134,20 +134,22 @@ class Management(BaseResource): 'enfants': enfants, } - def get_factures(self, regie_id, family_id, months=None): + def get_invoices(self, regie_id, family_id, months=None): + if not family_id: + [] operation = 'FacturesApayerRegie' - xml_factures = ET.Element('LISTFACTURE') - ET.SubElement(xml_factures, 'IDREGIE').text = regie_id - ET.SubElement(xml_factures, 'IDFAMILLE').text = family_id + xml_invoices = ET.Element('LISTFACTURE') + ET.SubElement(xml_invoices, 'IDREGIE').text = regie_id + ET.SubElement(xml_invoices, 'IDFAMILLE').text = family_id if months: operation = 'HistoriqueFacturesRegie' - ET.SubElement(xml_factures, 'NBMOIS').text = months - data = self.get_data(operation, xml_factures) - xml_factures = data.findall('PORTAIL/FACTURES') - if not xml_factures: + ET.SubElement(xml_invoices, 'NBMOIS').text = str(months) + data = self.get_data(operation, xml_invoices) + xml_invoices = data.findall('PORTAIL/FACTURES') + if not xml_invoices: raise AxelException('PORTAIL/FACTURES empty') - factures = [dict((k.lower(), v) for k, v in i.attrib.items()) for i in xml_factures] - return {'factures': factures} + invoices = [utils.normalize_invoice(i.attrib, family_id) for i in xml_invoices] + return sorted(invoices, key=lambda i: i['created'], reverse=True) class Link(models.Model): diff --git a/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html b/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html index 169bb8c..2028072 100644 --- a/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html +++ b/passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html @@ -37,10 +37,17 @@ {{ site_base_uri }}{% url 'teamnet-axel-family-filtered' slug=object.slug key='key' %}?NameID=... key is responsables or enfants -
  • {% trans 'Get family invoice list:' %} - - {{ site_base_uri }}{% url 'teamnet-axel-invoices' slug=object.slug %}?NameID=...&regie=...&months=... - +
  • {% trans 'Get past invoice list:' %} + {% url 'teamnet-axel-past-invoices' regie_id='42' slug=object.slug as past_invoices_url %} + + {{ site_base_uri }}{{ past_invoices_url }}?NameID=... + 42 {% trans 'is regie identifier' %} +
  • +
  • {% trans 'Get active invoice list:' %} + {% url 'teamnet-axel-active-invoices' regie_id='42' slug=object.slug as active_invoices_url %} + + {{ site_base_uri }}{{ active_invoices_url }}?NameID=... + 42 {% trans 'is regie identifier' %}
  • diff --git a/passerelle/contrib/teamnet_axel/urls.py b/passerelle/contrib/teamnet_axel/urls.py index 83213a1..6b80204 100644 --- a/passerelle/contrib/teamnet_axel/urls.py +++ b/passerelle/contrib/teamnet_axel/urls.py @@ -35,8 +35,10 @@ public_urlpatterns = patterns('', name='teamnet-axel-family'), url(r'^(?P[\w,-]+)/family/(?P[\w,-]+)/$', FamilyView.as_view(), name='teamnet-axel-family-filtered'), - url(r'^(?P[\w,-]+)/invoices/$', InvoicesView.as_view(), - name='teamnet-axel-invoices'), + url(r'^(?P[\w,-]+)/regie/(?P[\w,-]+)/invoices/history$', PastInvoicesView.as_view(), + name='teamnet-axel-past-invoices'), + url(r'^(?P[\w,-]+)/regie/(?P[\w,-]+)/invoices/$', ActiveInvoicesView.as_view(), + name='teamnet-axel-active-invoices'), #url(r'^(?P[\w,-]+)/invoice/(?P[\w,-]+)/$', InvoiceView.as_view(), # name='teamnet-axel-invoice'), #url(r'^(?P[\w,-]+)/invoice-pdf/(?P[\w,-]+)/$', InvoicePDFView.as_view(), diff --git a/passerelle/contrib/teamnet_axel/utils.py b/passerelle/contrib/teamnet_axel/utils.py new file mode 100644 index 0000000..90730d4 --- /dev/null +++ b/passerelle/contrib/teamnet_axel/utils.py @@ -0,0 +1,14 @@ +from datetime import datetime +from decimal import Decimal + +def normalize_invoice(invoice, family_id): + invoice['total_amount'] = Decimal(invoice['FMONTANT']) + invoice['amount'] = Decimal(invoice['RESTEAPAYER']) + invoice['id'] = invoice['NOFACTURE'] + invoice['slug'] = '%s-%s' % (family_id, invoice['NOFACTURE']) + invoice['has_pdf'] = invoice['FPDF'] == 'O' + invoice['online_payment'] = Decimal(invoice['RESTEAPAYER']) != 0 + invoice['created'] = datetime.strptime(invoice['FEMISSION'], '%d/%m/%Y') + invoice['label'] = invoice['FLIBELLE'] + invoice['pay_limit_date'] = datetime.strptime(invoice['FECHEANCE'], '%d/%m/%Y') + return invoice diff --git a/passerelle/contrib/teamnet_axel/views.py b/passerelle/contrib/teamnet_axel/views.py index 8a49ced..53cea2c 100644 --- a/passerelle/contrib/teamnet_axel/views.py +++ b/passerelle/contrib/teamnet_axel/views.py @@ -135,10 +135,27 @@ class FamilyView(DetailView): else: return famille.get(kwargs['key']) -class InvoicesView(FamilyView): - def get_data(self, request, *args, **kwargs): - regie = request.GET.get('regie') - months = request.GET.get('months') - factures = self.object.get_factures(regie, self.get_family_id(request), months) - return factures +class InvoicesMixin(object): + def get_data(self, request, regie_id, months=None, **kwargs): + try: + return self.object.get_invoices(regie_id, self.get_family_id(request), + months) + except AxelException: + return [] + + +class ActiveInvoicesView(InvoicesMixin, FamilyView): + + def get_data(self, request, regie_id, **kwargs): + return super(ActiveInvoicesView, self).get_data(request, regie_id, + **kwargs) + + +class PastInvoicesView(InvoicesMixin, FamilyView): + + def get_data(self, request, regie_id, months=12, **kwargs): + past = super(PastInvoicesView, self).get_data(request, regie_id, + months, **kwargs) + active = super(PastInvoicesView, self).get_data(request, regie_id, **kwargs) + return [p for p in past if p not in active] -- 2.5.1