From efa40bddf1621926382c72ba7d617c1570097600 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 27 Jun 2017 09:52:20 +0200 Subject: [PATCH] nanterre: permettre de payer plusieurs factures (fixes #17199) --- tests/test_nanterre_saga.py | 15 +++++++++++---- zoo/zoo_nanterre/api_views.py | 26 +++++++++++++++----------- zoo/zoo_nanterre/saga.py | 9 ++++++--- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/tests/test_nanterre_saga.py b/tests/test_nanterre_saga.py index fa6df5c..0c7c9fb 100644 --- a/tests/test_nanterre_saga.py +++ b/tests/test_nanterre_saga.py @@ -23,7 +23,6 @@ def test_tiers_saga(app, settings, nanterre_classic_family): elt.attrib['xmlns'] = 'ns' sub = ET.SubElement(elt, node) sub.text = content - print ET.tostring(elt) return ET.tostring(elt) f['jean'].content['cles_de_federation']['technocarte'] = '1234' @@ -54,11 +53,18 @@ def test_tiers_saga(app, settings, nanterre_classic_family): + reste_a_payer="1.0" num="34"> + + + + + ''') elif 'Transaction' in request.body: return xml_literal('TransactionReturn', @@ -77,15 +83,16 @@ def test_tiers_saga(app, settings, nanterre_classic_family): 'identifier': f['jean'].id, })) assert response.json['err'] == 0 - assert len(response.json['data']) == 1 + assert len(response.json['data']) == 2 num = response.json['data'][0]['num'] + num2 = response.json['data'][1]['num'] response = app.post_json( reverse('rsu-api-saga-transaction', kwargs={ 'identifier': f['jean'].id, }), params={ - 'num_facture': num, + 'num_factures': [num, num2], 'urlretour_asynchrone': 'http://async.example.com/coin', 'urlretour_synchrone': 'http://async.example.com/coin', 'email': 'john.doe@example.com', diff --git a/zoo/zoo_nanterre/api_views.py b/zoo/zoo_nanterre/api_views.py index 649c836..236741b 100644 --- a/zoo/zoo_nanterre/api_views.py +++ b/zoo/zoo_nanterre/api_views.py @@ -1418,7 +1418,7 @@ saga_factures = SagaFactures.as_view() class TransactionSagaSerializer(serializers.Serializer): - num_facture = serializers.CharField() + num_factures = serializers.ListField(child=serializers.CharField()) urlretour_asynchrone = serializers.URLField() urlretour_synchrone = serializers.URLField() email = serializers.EmailField(required=False) @@ -1426,11 +1426,6 @@ class TransactionSagaSerializer(serializers.Serializer): class SagaTransaction(SagaFactures): def post(self, request, identifier, format=None): - factures, error_response = self.get_factures(identifier) - - if error_response: - return error_response - serializer = TransactionSagaSerializer(data=request.data) if not serializer.is_valid(): return Response({ @@ -1438,21 +1433,30 @@ class SagaTransaction(SagaFactures): 'errors': flatten_errors(serializer.errors), }, status=400) + data = serializer.validated_data + + factures, error_response = self.get_factures(identifier) + + if error_response: + return error_response + + factures_a_payer = [] + for facture in factures: - if facture.num == serializer.validated_data['num_facture']: - break - else: + if facture.num in data['num_factures']: + factures_a_payer.append(facture) + if not factures_a_payer: return Response({ 'err': 1, 'errors': [ - 'numéro de facture inconnu', + u'numéro(s) de facture inconnu', ] }) data = serializer.validated_data email = data.get('email') or self.individu.content['email'] or '' url, error = self.ws.transaction( - facture=facture, + factures=factures_a_payer, urlretour_asynchrone=data['urlretour_asynchrone'], urlretour_synchrone=data['urlretour_synchrone'], email=email) diff --git a/zoo/zoo_nanterre/saga.py b/zoo/zoo_nanterre/saga.py index 2e1e694..8e94cec 100644 --- a/zoo/zoo_nanterre/saga.py +++ b/zoo/zoo_nanterre/saga.py @@ -149,7 +149,7 @@ class Saga(object): yield facture return list(helper()), None - def transaction(self, facture, urlretour_asynchrone, urlretour_synchrone, email): + def transaction(self, factures, urlretour_asynchrone, urlretour_synchrone, email): body = ''' {num_service} @@ -159,11 +159,14 @@ class Saga(object): {email} {urlretour_synchrone} ''' + assert factures, u'factures ne doit pas être vide' + id_facture = u'--'.join(unicode(facture.num) for facture in factures) + montant = sum(facture.reste_a_payer for facture in factures) tree, error = self.soap_call( self.paiement_url, body, 'TransactionReturn', num_service=self.num_service, - id_facture=facture.num, - montant=facture.reste_a_payer, + id_facture=id_facture, + montant=montant, urlretour_asynchrone=urlretour_asynchrone, urlretour_synchrone=urlretour_synchrone, email=email) -- 2.1.4