toulouse-maelis: add endpoint for invoice debit order (#72288)

This commit is contained in:
Nicolas Roche 2022-12-13 19:26:12 +01:00
parent 81905db4dd
commit 910e2e765c
6 changed files with 304 additions and 1 deletions

View File

@ -0,0 +1,106 @@
# Copyright (C) 2022 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
PERSON_BANK_SCHEMA = {
'$schema': 'http://json-schema.org/draft-04/schema#',
'title': 'Person bank',
'description': "Coordonnées du compte à débiter (coordonnées bancaires)",
'type': 'object',
'required': ['bankBIC', 'bankIBAN', 'bankRUM', 'dateStart', 'bankAddress', 'lastName', 'firstName'],
'properties': {
'bankBIC': {
'description': 'BIC',
'type': 'string',
},
'bankIBAN': {
'description': 'IBAN',
'type': 'string',
},
'bankRUM': {
'description': 'RUM',
'type': 'string',
},
'dateStart': {
'description': 'date de début',
'type': 'string',
'pattern': '^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
},
'bankAddress': {
'description': 'Adresse de la banque',
'type': 'string',
},
'civility': {
'description': 'civility',
'oneOf': [{'type': 'string'}, {'type': 'null'}],
},
'lastName': {
'description': 'Nom',
'type': 'string',
},
'firstName': {
'description': 'Prénom',
'type': 'string',
},
},
}
ADD_DIRECT_DEBIT_ORDER_SCHEMA = {
'$schema': 'http://json-schema.org/draft-04/schema#',
'title': 'Add direct debit order',
'description': "Ajout d'autorisation de prélèvement",
'type': 'object',
'required': ['numPerson', 'bank', 'codeRegie'],
'properties': {
'numPerson': {
'description': 'Numéro MAELIS de la personne',
'type': 'string',
},
'bank': PERSON_BANK_SCHEMA,
'codeRegie': {
'description': 'Code de la régie',
'type': 'string',
},
},
'additionalProperties': False,
'unflatten': True,
}
GET_DIRECT_DEBIT_ORDER_SCHEMA = {
'$schema': 'http://json-schema.org/draft-04/schema#',
'title': 'Get direct debit order',
'description': "Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
'type': 'object',
'required': ['numPerson', 'codeRegie', 'dateRef'],
'properties': {
'numPerson': {
'description': 'Numéro MAELIS de la personne',
'type': 'string',
},
'codeRegie': {
'description': 'Code de la régie',
'type': 'string',
},
'dateRef': {
'description': 'Date de référence ',
'type': 'string',
'pattern': '^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
},
},
'additionalProperties': False,
'unflatten': True,
}

View File

@ -28,7 +28,7 @@ from passerelle.utils.conversion import simplify
from passerelle.utils.jsonresponse import APIError
from passerelle.utils.templates import render_to_string
from . import family_schemas, schemas
from . import family_schemas, invoice_schemas, schemas
class UpdateError(Exception):
@ -1522,6 +1522,38 @@ class ToulouseMaelis(BaseResource, HTTPResource):
self.call('Family', 'updatePersonIndicatorList', numPerson=child_id, **post_data)
return {'data': 'ok'}
@endpoint(
display_category='Facture',
description="Ajout d'autorisation de prélèvement",
name='add-direct-debit-order',
perm='can_access',
parameters={'NameID': {'description': 'Publik NameID'}},
post={
'request_body': {'schema': {'application/json': invoice_schemas.ADD_DIRECT_DEBIT_ORDER_SCHEMA}}
},
)
def add_direct_debit_order(self, request, NameID, post_data):
family_id = self.get_link(NameID).family_id
self.call('Invoice', 'addDirectDebitOrder', dossierNumber=family_id, **post_data)
return {'data': 'ok'}
@endpoint(
display_category='Facture',
description="Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
name='get-direct-debit-order',
perm='can_access',
parameters={'NameID': {'description': 'Publik NameID'}},
post={
'request_body': {'schema': {'application/json': invoice_schemas.GET_DIRECT_DEBIT_ORDER_SCHEMA}}
},
)
def get_direct_debit_order(self, request, NameID, post_data):
family_id = self.get_link(NameID).family_id
response = self.call('Invoice', 'getDirectDebitOrder', dossierNumber=family_id, **post_data)
data = serialize_object(response)
return {'data': data}
class Link(models.Model):
resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)

View File

@ -0,0 +1,5 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:addDirectDebitOrderResponse xmlns:ns2="ws.maelis.sigec.com"/>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,13 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis</faultstring>
<detail>
<ns1:MaelisAccountException xmlns:ns1="ws.maelis.sigec.com">
<message xmlns:ns2="ws.maelis.sigec.com">E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis</message>
</ns1:MaelisAccountException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>

View File

@ -0,0 +1,16 @@
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getDirectDebitOrderResponse xmlns:ns2="ws.maelis.sigec.com">
<return>
<bankBIC>BDFEFR2T</bankBIC>
<bankIBAN>FR7630001007941234567890185</bankIBAN>
<bankRUM>xxx</bankRUM>
<dateStart>2023-01-01T00:00:00+01:00</dateStart>
<bankAddress>75049 PARIS cedex 01</bankAddress>
<civility>x</civility>
<lastName>Ewing</lastName>
<firstName>John Ross</firstName>
</return>
</ns2:getDirectDebitOrderResponse>
</soap:Body>
</soap:Envelope>

View File

@ -3145,3 +3145,134 @@ def test_update_child_indicator_wrong_referential_key_error(con, app):
resp.json['err_desc']
== "indicatorList/0/code key value 'plop' do not belong to 'ChildIndicator' required referential"
)
def test_add_direct_debit_order(invoice_service, con, app):
def request_check(request):
assert request.dossierNumber == 1312
invoice_service.add_soap_response(
'addDirectDebitOrder', get_xml_file('R_add_direct_debit_order.xml'), request_check=request_check
)
url = get_endpoint('add-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '22',
'bank/bankBIC': 'BDFEFR2T',
'bank/bankIBAN': 'FR7630001007941234567890185',
'bank/bankRUM': 'xxx',
'bank/dateStart': '2023-01-01',
'bank/bankAddress': '75049 PARIS cedex 01',
'bank/civility': 'x',
'bank/lastName': 'Ewing',
'bank/firstName': 'John Ross',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == 'ok'
def test_add_direct_debit_order_not_linked_error(con, app):
url = get_endpoint('add-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '22',
'bank/bankBIC': 'BDFEFR2T',
'bank/bankIBAN': 'FR7630001007941234567890185',
'bank/bankRUM': 'xxx',
'bank/dateStart': '2023-01-01',
'bank/bankAddress': '75049 PARIS cedex 01',
'bank/civility': 'x',
'bank/lastName': 'Ewing',
'bank/firstName': 'John Ross',
}
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 'not-linked'
assert resp.json['err_desc'] == 'User not linked to family'
def test_add_direct_debit_order_soap_error(invoice_service, con, app):
invoice_service.add_soap_response(
'addDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
)
url = get_endpoint('add-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '12345',
'bank/bankBIC': 'BDFEFR2T',
'bank/bankIBAN': 'FR7630001007941234567890185',
'bank/bankRUM': 'xxx',
'bank/dateStart': '2023-01-01',
'bank/bankAddress': '75049 PARIS cedex 01',
'bank/civility': 'x',
'bank/lastName': 'Ewing',
'bank/firstName': 'John Ross',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 'Invoice-addDirectDebitOrder-soap:Server'
assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
def test_get_direct_debit_order(invoice_service, con, app):
def request_check(request):
assert request.dossierNumber == 1312
invoice_service.add_soap_response(
'getDirectDebitOrder', get_xml_file('R_get_direct_debit_order.xml'), request_check=request_check
)
url = get_endpoint('get-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '22',
'dateRef': '2023-01-01',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 0
assert resp.json['data'] == {
'bankBIC': 'BDFEFR2T',
'bankIBAN': 'FR7630001007941234567890185',
'bankRUM': 'xxx',
'dateStart': '2023-01-01T00:00:00+01:00',
'bankAddress': '75049 PARIS cedex 01',
'civility': 'x',
'lastName': 'Ewing',
'firstName': 'John Ross',
}
def test_get_direct_debit_order_not_linked_error(con, app):
url = get_endpoint('get-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '22',
'dateRef': '2023-01-01',
}
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 'not-linked'
assert resp.json['err_desc'] == 'User not linked to family'
def test_get_direct_debit_order_soap_error(invoice_service, con, app):
invoice_service.add_soap_response(
'getDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
)
url = get_endpoint('get-direct-debit-order')
params = {
'numPerson': '613878',
'codeRegie': '12345',
'dateRef': '2023-01-01',
}
Link.objects.create(resource=con, family_id='1312', name_id='local')
resp = app.post_json(url + '?NameID=local', params=params)
assert resp.json['err'] == 'Invoice-getDirectDebitOrder-soap:Server'
assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"