Projet

Général

Profil

0001-contrib.teamnet_axel-invoice-payment-notify-endpoint.patch

Serghei Mihai, 21 septembre 2015 14:21

Télécharger (7,58 ko)

Voir les différences:

Subject: [PATCH] contrib.teamnet_axel: invoice payment notify endpoint (#8201)

 .../migrations/0002_management_billing_regies.py   | 21 ++++++++++++++++
 passerelle/contrib/teamnet_axel/models.py          | 26 ++++++++++++++++++++
 .../passerelle/contrib/teamnet_axel/detail.html    |  6 +++++
 passerelle/contrib/teamnet_axel/urls.py            |  7 +++---
 passerelle/contrib/teamnet_axel/views.py           | 28 ++++++++++++++++++++--
 5 files changed, 82 insertions(+), 6 deletions(-)
 create mode 100644 passerelle/contrib/teamnet_axel/migrations/0002_management_billing_regies.py
passerelle/contrib/teamnet_axel/migrations/0002_management_billing_regies.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import models, migrations
5
import jsonfield.fields
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('teamnet_axel', '0001_initial'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='management',
17
            name='billing_regies',
18
            field=jsonfield.fields.JSONField(default=dict, verbose_name='Mapping between regie ids and billing ids'),
19
            preserve_default=True,
20
        ),
21
    ]
passerelle/contrib/teamnet_axel/models.py
17 17
import logging
18 18
import base64
19 19
import xml.etree.ElementTree as ET
20
from datetime import datetime
20 21

  
21 22
from django.core.urlresolvers import reverse
22 23
from django.db import models
23 24
from django.utils.translation import ugettext_lazy as _
24 25

  
26
from jsonfield import JSONField
27

  
25 28
from passerelle.base.models import BaseResource
26 29

  
27 30
from . import soap, utils
......
47 50
            verbose_name=_('Keystore'),
48 51
            help_text=_('Certificate and private key in PEM format'))
49 52

  
53
    billing_regies = JSONField(_('Mapping between regie ids and billing ids'))
54

  
50 55
    category = _('Business Process Connectors')
51 56

  
52 57
    class Meta:
......
162 167
        return base64.b64decode(pdf.get('FILE'))
163 168

  
164 169

  
170
    def pay_invoice(self, regie_id, family_id, invoice, email=None):
171
        payment_xml = ET.Element('PAIEMENT')
172
        ET.SubElement(payment_xml, 'IDDEMANDE')
173
        ET.SubElement(payment_xml, 'IDFAMILLE').text = family_id
174
        ET.SubElement(payment_xml, 'IDREGIEENC').text = self.billing_regies.get(regie_id)
175
        ET.SubElement(payment_xml, 'MODEREGLEMENT').text = 'PAY'
176
        ET.SubElement(payment_xml, 'MONTANT').text = str(invoice['amount'])
177
        ET.SubElement(payment_xml, 'URL')
178
        if email:
179
            ET.SubElement(payment_xml, 'COURRIEL').text = email
180
        else:
181
            ET.SubElement(payment_xml, 'COURRIEL')
182
        ET.SubElement(payment_xml, 'REFPAIEMENT')
183
        ET.SubElement(payment_xml, 'DATEENVOI').text = datetime.now().strftime('%d/%m/%Y %H:%M:%S')
184
        ET.SubElement(payment_xml, 'DATERETOUR').text = datetime.now().strftime('%d/%m/%Y %H:%M:%S')
185
        ET.SubElement(payment_xml, 'CODERETOUR')
186
        ET.SubElement(ET.SubElement(payment_xml, 'FACTURE'), 'NOFACTURE').text = invoice['display_id']
187
        data = self.get_data('PaiementFactures', payment_xml)
188
        return data.text
189

  
190

  
165 191
class Link(models.Model):
166 192
    resource = models.ForeignKey(Management)
167 193
    nameid = models.CharField(blank=False, max_length=256)
passerelle/contrib/teamnet_axel/templates/passerelle/contrib/teamnet_axel/detail.html
64 64
    {{ site_base_uri }}{{ invoice_download_url }}
65 65
  </a>
66 66
</li>
67
<li>{% trans 'Pay invoice:' %}
68
  {% url 'teamnet-axel-invoice-payment' slug=object.slug regie_id='42' invoice_id='2345-20150808' as payment_url %}
69
  <a href="{{ payment_url }}">
70
    {{ site_base_uri }}{{ payment_url }}?NameID=...
71
  </a>
72
</li>
67 73
</ul>
68 74
</div>
69 75

  
passerelle/contrib/teamnet_axel/urls.py
43 43
        name='teamnet-axel-invoice'),
44 44
    url(r'^(?P<slug>[\w,-]+)/regie/(?P<regie_id>[\w,-]+)/invoice/(?P<invoice_id>[\w,-]+)/pdf/$', InvoicePDFView.as_view(),
45 45
        name='teamnet-axel-invoice-pdf'),
46
    #url(r'^(?P<slug>[\w,-]+)/invoice-pdf/(?P<id>[\w,-]+)/$', InvoicePDFView.as_view(),
47
    #    name='teamnet-axel-unlink'),
48
    #url(r'^(?P<slug>[\w,-]+)/invoice-paid/(?P<id>[\w,-]+)/$', InvoicePayView.as_view(),
49
    #    name='teamnet-axel-unlink'),
46
    url(r'^(?P<slug>[\w,-]+)/regie/(?P<regie_id>[\w,-]+)/invoice/(?P<invoice_id>[\w,-]+)/pay/$',
47
        InvoicePayView.as_view(),
48
        name='teamnet-axel-invoice-payment'),
50 49
)
51 50

  
52 51
management_urlpatterns = patterns('',
passerelle/contrib/teamnet_axel/views.py
19 19
from django.views.generic import DetailView as GenericDetailView
20 20
from django.views.generic.edit import CreateView, UpdateView, DeleteView
21 21
from django.http import HttpResponse, Http404
22
from django.views.decorators.csrf import csrf_exempt
22 23

  
23 24
from passerelle import utils
24 25

  
......
57 58
    def get_data(self, request, *args, **kwargs):
58 59
        raise NotImplementedError
59 60

  
60
    @utils.protected_api('can_access')
61
    def post_data(self, request, *args, **kwargs):
62
        raise NotImplementedError
63

  
61 64
    @utils.to_json('api')
62 65
    def get(self, request, *args, **kwargs):
63
        self.object = self.get_object()
64 66
        return self.get_data(request, *args, **kwargs)
65 67

  
68
    @csrf_exempt
69
    @utils.protected_api('can_access')
70
    def dispatch(self, request, *args, **kwargs):
71
        self.object = self.get_object()
72
        return super(DetailView, self).dispatch(request, *args, **kwargs)
73

  
74
    @utils.to_json('api')
75
    def post(self, request, *args, **kwargs):
76
        return self.post_data(request, *args, **kwargs)
77

  
66 78

  
67 79
class PingView(DetailView):
68 80
    def get_data(self, request, *args, **kwargs):
......
180 192
        response['Content-Disposition'] = 'attachment; filename="%s.pdf"' % invoice_id
181 193
        response.write(pdf)
182 194
        return response
195

  
196

  
197
class InvoicePayView(DetailView):
198

  
199
    def post_data(self, request, *args, **kwargs):
200
        family_id, invoice_id = kwargs['invoice_id'].split('-', 1)
201
        regie_id = kwargs['regie_id']
202

  
203
        invoices = self.object.get_invoices(regie_id, family_id)
204
        for invoice in invoices:
205
            if invoice['id'] == kwargs['invoice_id'] and invoice['online_payment']:
206
                return self.object.pay_invoice(regie_id, family_id, invoice)
183
-