0001-contrib.teamnet_axel-invoice-payment-notify-endpoint.patch
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='Correspondence between regie ids and billing ids'), |
|
19 |
preserve_default=True, |
|
20 |
), |
|
21 |
] |
passerelle/contrib/teamnet_axel/models.py | ||
---|---|---|
16 | 16 | |
17 | 17 |
import logging |
18 | 18 |
import xml.etree.ElementTree as ET |
19 |
from datetime import datetime |
|
19 | 20 | |
20 | 21 |
from django.core.urlresolvers import reverse |
21 | 22 |
from django.db import models |
22 | 23 |
from django.utils.translation import ugettext_lazy as _ |
23 | 24 | |
25 |
from jsonfield import JSONField |
|
26 | ||
24 | 27 |
from passerelle.base.models import BaseResource |
25 | 28 | |
26 | 29 |
from . import soap, utils |
... | ... | |
46 | 49 |
verbose_name=_('Keystore'), |
47 | 50 |
help_text=_('Certificate and private key in PEM format')) |
48 | 51 | |
52 |
billing_regies = JSONField(_('Correspondence between regie ids and billing ids')) |
|
53 | ||
49 | 54 |
category = _('Business Process Connectors') |
50 | 55 | |
51 | 56 |
class Meta: |
... | ... | |
160 | 165 |
pdf = data.find('PORTAIL/PDF') |
161 | 166 |
return pdf.get('FILE') |
162 | 167 | |
168 |
def pay_invoice(self, regie_id, family_id, invoice, email=None): |
|
169 |
payment_xml = ET.Element('PAIEMENT') |
|
170 |
ET.SubElement(payment_xml, 'IDDEMANDE') |
|
171 |
ET.SubElement(payment_xml, 'IDFAMILLE').text = family_id |
|
172 |
ET.SubElement(payment_xml, 'IDREGIEENC').text = self.billing_regies.get(regie_id) |
|
173 |
ET.SubElement(payment_xml, 'MODEREGLEMENT').text = 'PAY' |
|
174 |
ET.SubElement(payment_xml, 'MONTANT').text = str(invoice['amount']) |
|
175 |
ET.SubElement(payment_xml, 'URL') |
|
176 |
if email: |
|
177 |
ET.SubElement(payment_xml, 'COURRIEL').text = email |
|
178 |
else: |
|
179 |
ET.SubElement(payment_xml, 'COURRIEL') |
|
180 |
ET.SubElement(payment_xml, 'REFPAIEMENT') |
|
181 |
ET.SubElement(payment_xml, 'DATEENVOI').text = datetime.now().strftime('%d/%m/%Y %H:%M:%S') |
|
182 |
ET.SubElement(payment_xml, 'DATERETOUR').text = datetime.now().strftime('%d/%m/%Y %H:%M:%S') |
|
183 |
ET.SubElement(payment_xml, 'CODERETOUR') |
|
184 |
ET.SubElement(ET.SubElement(payment_xml, 'FACTURE'), 'NOFACTURE').text = invoice['display_id'] |
|
185 |
data = self.get_data('PaiementFactures', payment_xml) |
|
186 |
return data.text |
|
187 | ||
188 | ||
163 | 189 |
class Link(models.Model): |
164 | 190 |
resource = models.ForeignKey(Management) |
165 | 191 |
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 | ||
---|---|---|
182 | 182 |
response['Content-Disposition'] = 'attachment; filename="%s.pdf"' % invoice_id |
183 | 183 |
response.write(base64.b64decode(pdf)) |
184 | 184 |
return response |
185 | ||
186 | ||
187 |
class InvoicePayView(DetailView): |
|
188 | ||
189 |
def get_data(self, request, *args, **kwargs): |
|
190 |
family_id, invoice_id = kwargs['invoice_id'].split('-', 1) |
|
191 |
regie_id = kwargs['regie_id'] |
|
192 | ||
193 |
invoices = self.object.get_invoices(regie_id, family_id) |
|
194 |
for invoice in invoices: |
|
195 |
if invoice['id'] == kwargs['invoice_id'] and invoice['online_payment']: |
|
196 |
return self.object.pay_invoice(regie_id, family_id, invoice) |
|
185 |
- |