Projet

Général

Profil

0002-toulouse-maelis-apply-direct-debit-order-WS-on-RL1-7.patch

Nicolas Roche, 20 décembre 2022 13:12

Télécharger (16,2 ko)

Voir les différences:

Subject: [PATCH 2/3] toulouse-maelis: apply direct debit order WS on RL1
 (#72563)

 ...n => test_get_rl1_direct_debit_order.json} |  0
 functests/toulouse_maelis/test_invoice.py     |  8 +-
 .../toulouse_maelis/invoice_schemas.py        | 12 +--
 passerelle/contrib/toulouse_maelis/models.py  | 13 ++-
 tests/test_toulouse_maelis.py                 | 98 ++++++++++++++-----
 5 files changed, 85 insertions(+), 46 deletions(-)
 rename functests/toulouse_maelis/data/{test_get_direct_debit_order.json => test_get_rl1_direct_debit_order.json} (100%)
functests/toulouse_maelis/test_invoice.py
2 2

  
3 3
from .conftest import diff, link, unlink
4 4

  
5 5

  
6 6
def test_direct_debit_order(conn, create_data):
7 7
    unlink(conn, create_data['name_id'])
8 8
    link(conn, create_data)
9 9

  
10
    url = conn + '/add-direct-debit-order?NameID=%s' % create_data['name_id']
10
    url = conn + '/add-rl1-direct-debit-order?NameID=%s' % create_data['name_id']
11 11
    payload = {
12
        'numPerson': create_data['rl1_num'],
13 12
        'codeRegie': '1',
14 13
        'bank/bankBIC': 'BDFEFR2T',
15 14
        'bank/bankIBAN': 'FR7630001007941234567890185',
16 15
        'bank/bankRUM': 'xxx',
17 16
        'bank/dateStart': '2023-01-01',
18 17
        'bank/bankAddress': '75049 PARIS cedex 01',
19 18
        'bank/civility': 'x',
20 19
        'bank/lastName': 'Ewing',
21 20
        'bank/firstName': 'John Ross',
22 21
    }
23 22
    resp = requests.post(url, json=payload)
24 23
    resp.raise_for_status()
25 24
    res = resp.json()
26 25
    assert res['data'] == 'ok'
27 26

  
28
    url = conn + '/get-direct-debit-order?NameID=%s' % create_data['name_id']
27
    url = conn + '/get-rl1-direct-debit-order?NameID=%s' % create_data['name_id']
29 28
    payload = {
30
        'numPerson': create_data['rl1_num'],
31 29
        'codeRegie': '1',
32 30
        'dateRef': '2023-01-01',
33 31
    }
34 32
    resp = requests.post(url, json=payload)
35 33
    resp.raise_for_status()
36 34
    res = resp.json()
37 35
    res['data']['numPerson'] = 'N/A'
38
    assert diff(res['data'], 'test_get_direct_debit_order.json')
36
    assert diff(res['data'], 'test_get_rl1_direct_debit_order.json')
passerelle/contrib/toulouse_maelis/invoice_schemas.py
58 58
}
59 59

  
60 60

  
61 61
ADD_DIRECT_DEBIT_ORDER_SCHEMA = {
62 62
    '$schema': 'http://json-schema.org/draft-04/schema#',
63 63
    'title': 'Add direct debit order',
64 64
    'description': "Ajout d'autorisation de prélèvement",
65 65
    'type': 'object',
66
    'required': ['numPerson', 'bank', 'codeRegie'],
66
    'required': ['bank', 'codeRegie'],
67 67
    'properties': {
68
        'numPerson': {
69
            'description': 'Numéro MAELIS de la personne',
70
            'type': 'string',
71
        },
72 68
        'bank': PERSON_BANK_SCHEMA,
73 69
        'codeRegie': {
74 70
            'description': 'Code de la régie',
75 71
            'type': 'string',
76 72
        },
77 73
    },
78 74
    'additionalProperties': False,
79 75
    'unflatten': True,
80 76
}
81 77

  
82 78

  
83 79
GET_DIRECT_DEBIT_ORDER_SCHEMA = {
84 80
    '$schema': 'http://json-schema.org/draft-04/schema#',
85 81
    'title': 'Get direct debit order',
86 82
    'description': "Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
87 83
    'type': 'object',
88
    'required': ['numPerson', 'codeRegie', 'dateRef'],
84
    'required': ['codeRegie', 'dateRef'],
89 85
    'properties': {
90
        'numPerson': {
91
            'description': 'Numéro MAELIS de la personne',
92
            'type': 'string',
93
        },
94 86
        'codeRegie': {
95 87
            'description': 'Code de la régie',
96 88
            'type': 'string',
97 89
        },
98 90
        'dateRef': {
99 91
            'description': 'Date de référence ',
100 92
            'type': 'string',
101 93
            'pattern': '^[0-9]{4}-[0-9]{2}-[0-9]{2}$',
passerelle/contrib/toulouse_maelis/models.py
1544 1544
        self.assert_update_indicator_payload_in_referential('ChildIndicator', post_data)
1545 1545

  
1546 1546
        self.call('Family', 'updatePersonIndicatorList', numPerson=child_id, **post_data)
1547 1547
        return {'data': 'ok'}
1548 1548

  
1549 1549
    @endpoint(
1550 1550
        display_category='Facture',
1551 1551
        description="Ajout d'autorisation de prélèvement",
1552
        name='add-direct-debit-order',
1552
        name='add-rl1-direct-debit-order',
1553 1553
        perm='can_access',
1554 1554
        parameters={'NameID': {'description': 'Publik NameID'}},
1555 1555
        post={
1556 1556
            'request_body': {'schema': {'application/json': invoice_schemas.ADD_DIRECT_DEBIT_ORDER_SCHEMA}}
1557 1557
        },
1558 1558
    )
1559
    def add_direct_debit_order(self, request, NameID, post_data):
1559
    def add_rl1_direct_debit_order(self, request, NameID, post_data):
1560 1560
        family_id = self.get_link(NameID).family_id
1561
        family = self.get_family_raw(family_id)
1562

  
1563
        post_data['numPerson'] = family['RL1']['num']
1561 1564
        self.call('Invoice', 'addDirectDebitOrder', dossierNumber=family_id, **post_data)
1562 1565
        return {'data': 'ok'}
1563 1566

  
1564 1567
    @endpoint(
1565 1568
        display_category='Facture',
1566 1569
        description="Lecture des informations relatives à l'autorisation de prélèvement en cours à la date de référence",
1567
        name='get-direct-debit-order',
1570
        name='get-rl1-direct-debit-order',
1568 1571
        perm='can_access',
1569 1572
        parameters={'NameID': {'description': 'Publik NameID'}},
1570 1573
        post={
1571 1574
            'request_body': {'schema': {'application/json': invoice_schemas.GET_DIRECT_DEBIT_ORDER_SCHEMA}}
1572 1575
        },
1573 1576
    )
1574
    def get_direct_debit_order(self, request, NameID, post_data):
1577
    def get_rl1_direct_debit_order(self, request, NameID, post_data):
1575 1578
        family_id = self.get_link(NameID).family_id
1579
        family = self.get_family_raw(family_id)
1576 1580

  
1581
        post_data['numPerson'] = family['RL1']['num']
1577 1582
        response = self.call('Invoice', 'getDirectDebitOrder', dossierNumber=family_id, **post_data)
1578 1583
        data = serialize_object(response)
1579 1584
        return {'data': data}
1580 1585

  
1581 1586

  
1582 1587
class Link(models.Model):
1583 1588
    resource = models.ForeignKey(ToulouseMaelis, on_delete=models.CASCADE)
1584 1589
    name_id = models.CharField(blank=False, max_length=256)
tests/test_toulouse_maelis.py
75 75
    with ResponsesSoap(
76 76
        wsdl_url='https://example.org/InvoiceService?wsdl',
77 77
        wsdl_content=get_xml_file('InvoiceService.wsdl'),
78 78
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
79 79
    )() as mock:
80 80
        yield mock
81 81

  
82 82

  
83
@pytest.fixture()
84
def all_services():
85
    family_service = ResponsesSoap(
86
        wsdl_url='https://example.org/FamilyService?wsdl',
87
        wsdl_content=get_xml_file('FamilyService.wsdl'),
88
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
89
    )
90
    invoice_service = ResponsesSoap(
91
        wsdl_url='https://example.org/InvoiceService?wsdl',
92
        wsdl_content=get_xml_file('InvoiceService.wsdl'),
93
        settings=Settings(strict=False, xsd_ignore_sequence_order=True),
94
    )
95
    with responses.RequestsMock() as mock:
96
        mock.add(responses.GET, family_service.wsdl_url, body=family_service.wsdl_content, status=200)
97
        mock.add(responses.GET, invoice_service.wsdl_url, body=invoice_service.wsdl_content, status=200)
98

  
99
        def add_soap_response(service, *args, **kwargs):
100
            if service == 'family':
101
                family_service.add_soap_response(mock, *args, **kwargs)
102
            elif service == 'invoice':
103
                invoice_service.add_soap_response(mock, *args, **kwargs)
104
            else:
105
                assert False, 'service not defined'
106

  
107
        mock.add_soap_response = add_soap_response
108
        yield mock
109

  
110

  
83 111
@pytest.fixture(scope='module')
84 112
def django_db_setup(django_db_setup, django_db_blocker):
85 113
    with django_db_blocker.unblock():
86 114
        con = setup_access_rights(
87 115
            ToulouseMaelis.objects.get_or_create(
88 116
                slug='test',
89 117
                base_wsdl_url='https://example.org/',
90 118
                zeep_wsse_username='maelis-webservice',
......
3267 3295
    resp = app.post_json(url + '?NameID=local&child_id=613880', params=params)
3268 3296
    assert resp.json['err'] == 'wrong-key'
3269 3297
    assert (
3270 3298
        resp.json['err_desc']
3271 3299
        == "indicatorList/0/code key value 'plop' do not belong to 'ChildIndicator' required referential"
3272 3300
    )
3273 3301

  
3274 3302

  
3275
def test_add_direct_debit_order(invoice_service, con, app):
3303
def test_add_rl1_direct_debit_order(all_services, con, app):
3276 3304
    def request_check(request):
3277 3305
        assert request.dossierNumber == 1312
3278 3306

  
3279
    invoice_service.add_soap_response(
3280
        'addDirectDebitOrder', get_xml_file('R_add_direct_debit_order.xml'), request_check=request_check
3307
    all_services.add_soap_response('family', 'readFamily', get_xml_file('R_read_family.xml'))
3308
    all_services.add_soap_response(
3309
        'invoice',
3310
        'addDirectDebitOrder',
3311
        get_xml_file('R_add_direct_debit_order.xml'),
3312
        request_check=request_check,
3281 3313
    )
3282
    url = get_endpoint('add-direct-debit-order')
3314
    url = get_endpoint('add-rl1-direct-debit-order')
3283 3315
    params = {
3284
        'numPerson': '613878',
3285 3316
        'codeRegie': '22',
3286 3317
        'bank/bankBIC': 'BDFEFR2T',
3287 3318
        'bank/bankIBAN': 'FR7630001007941234567890185',
3288 3319
        'bank/bankRUM': 'xxx',
3289 3320
        'bank/dateStart': '2023-01-01',
3290 3321
        'bank/bankAddress': '75049 PARIS cedex 01',
3291 3322
        'bank/civility': 'x',
3292 3323
        'bank/lastName': 'Ewing',
......
3294 3325
    }
3295 3326

  
3296 3327
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3297 3328
    resp = app.post_json(url + '?NameID=local', params=params)
3298 3329
    assert resp.json['err'] == 0
3299 3330
    assert resp.json['data'] == 'ok'
3300 3331

  
3301 3332

  
3302
def test_add_direct_debit_order_not_linked_error(con, app):
3303
    url = get_endpoint('add-direct-debit-order')
3333
def test_add_rl1_direct_debit_order_not_linked_error(con, app):
3334
    url = get_endpoint('add-rl1-direct-debit-order')
3304 3335
    params = {
3305
        'numPerson': '613878',
3306 3336
        'codeRegie': '22',
3307 3337
        'bank/bankBIC': 'BDFEFR2T',
3308 3338
        'bank/bankIBAN': 'FR7630001007941234567890185',
3309 3339
        'bank/bankRUM': 'xxx',
3310 3340
        'bank/dateStart': '2023-01-01',
3311 3341
        'bank/bankAddress': '75049 PARIS cedex 01',
3312 3342
        'bank/civility': 'x',
3313 3343
        'bank/lastName': 'Ewing',
3314 3344
        'bank/firstName': 'John Ross',
3315 3345
    }
3316 3346

  
3317 3347
    resp = app.post_json(url + '?NameID=local', params=params)
3318 3348
    assert resp.json['err'] == 'not-linked'
3319 3349
    assert resp.json['err_desc'] == 'User not linked to family'
3320 3350

  
3321 3351

  
3322
def test_add_direct_debit_order_soap_error(invoice_service, con, app):
3323
    invoice_service.add_soap_response(
3324
        'addDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3352
def test_add_rl1_direct_debit_order_soap_error(all_services, con, app):
3353
    all_services.add_soap_response('family', 'readFamily', get_xml_file('R_read_family.xml'))
3354
    all_services.add_soap_response(
3355
        'invoice', 'addDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3325 3356
    )
3326

  
3327
    url = get_endpoint('add-direct-debit-order')
3357
    url = get_endpoint('add-rl1-direct-debit-order')
3328 3358
    params = {
3329
        'numPerson': '613878',
3330 3359
        'codeRegie': '12345',
3331 3360
        'bank/bankBIC': 'BDFEFR2T',
3332 3361
        'bank/bankIBAN': 'FR7630001007941234567890185',
3333 3362
        'bank/bankRUM': 'xxx',
3334 3363
        'bank/dateStart': '2023-01-01',
3335 3364
        'bank/bankAddress': '75049 PARIS cedex 01',
3336 3365
        'bank/civility': 'x',
3337 3366
        'bank/lastName': 'Ewing',
......
3339 3368
    }
3340 3369

  
3341 3370
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3342 3371
    resp = app.post_json(url + '?NameID=local', params=params)
3343 3372
    assert resp.json['err'] == 'Invoice-addDirectDebitOrder-soap:Server'
3344 3373
    assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
3345 3374

  
3346 3375

  
3347
def test_get_direct_debit_order(invoice_service, con, app):
3376
def test_get_rl1_direct_debit_order(all_services, con, app):
3348 3377
    def request_check(request):
3349 3378
        assert request.dossierNumber == 1312
3350 3379

  
3351
    invoice_service.add_soap_response(
3352
        'getDirectDebitOrder', get_xml_file('R_get_direct_debit_order.xml'), request_check=request_check
3380
    all_services.add_soap_response('family', 'readFamily', get_xml_file('R_read_family.xml'))
3381
    all_services.add_soap_response(
3382
        'invoice',
3383
        'getDirectDebitOrder',
3384
        get_xml_file('R_get_direct_debit_order.xml'),
3385
        request_check=request_check,
3353 3386
    )
3354
    url = get_endpoint('get-direct-debit-order')
3387
    url = get_endpoint('get-rl1-direct-debit-order')
3355 3388
    params = {
3356
        'numPerson': '613878',
3357 3389
        'codeRegie': '22',
3358 3390
        'dateRef': '2023-01-01',
3359 3391
    }
3360 3392

  
3361 3393
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3362 3394
    resp = app.post_json(url + '?NameID=local', params=params)
3363 3395
    assert resp.json['err'] == 0
3364 3396
    assert resp.json['data'] == {
......
3368 3400
        'dateStart': '2023-01-01T00:00:00+01:00',
3369 3401
        'bankAddress': '75049 PARIS cedex 01',
3370 3402
        'civility': 'x',
3371 3403
        'lastName': 'Ewing',
3372 3404
        'firstName': 'John Ross',
3373 3405
    }
3374 3406

  
3375 3407

  
3376
def test_get_direct_debit_order_not_linked_error(con, app):
3377
    url = get_endpoint('get-direct-debit-order')
3408
def test_get_rl1_direct_debit_order_parameter_error(con, app):
3409
    url = get_endpoint('get-rl1-direct-debit-order')
3410
    params = {
3411
        'codeRegie': '22',
3412
        'dateRef': 'plop',
3413
    }
3414

  
3415
    resp = app.post_json(url + '?NameID=local', params=params, status=400)
3416
    assert resp.json['err'] == 1
3417
    assert resp.json['err_class'] == 'passerelle.utils.jsonresponse.APIError'
3418
    assert resp.json['err_desc'] == "dateRef: 'plop' does not match '^[0-9]{4}-[0-9]{2}-[0-9]{2}$'"
3419

  
3420

  
3421
def test_get_rl1_direct_debit_order_not_linked_error(con, app):
3422
    url = get_endpoint('get-rl1-direct-debit-order')
3378 3423
    params = {
3379
        'numPerson': '613878',
3380 3424
        'codeRegie': '22',
3381 3425
        'dateRef': '2023-01-01',
3382 3426
    }
3383 3427

  
3384 3428
    resp = app.post_json(url + '?NameID=local', params=params)
3385 3429
    assert resp.json['err'] == 'not-linked'
3386 3430
    assert resp.json['err_desc'] == 'User not linked to family'
3387 3431

  
3388 3432

  
3389
def test_get_direct_debit_order_soap_error(invoice_service, con, app):
3390
    invoice_service.add_soap_response(
3391
        'getDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3433
def test_get_rl1_direct_debit_order_soap_error(all_services, con, app):
3434
    all_services.add_soap_response('family', 'readFamily', get_xml_file('R_read_family.xml'))
3435
    all_services.add_soap_response(
3436
        'invoice', 'getDirectDebitOrder', get_xml_file('R_direct_debit_order_soap_error.xml'), status=500
3392 3437
    )
3393
    url = get_endpoint('get-direct-debit-order')
3438
    url = get_endpoint('get-rl1-direct-debit-order')
3394 3439
    params = {
3395
        'numPerson': '613878',
3396 3440
        'codeRegie': '12345',
3397 3441
        'dateRef': '2023-01-01',
3398 3442
    }
3399 3443

  
3400 3444
    Link.objects.create(resource=con, family_id='1312', name_id='local')
3401 3445
    resp = app.post_json(url + '?NameID=local', params=params)
3402 3446
    assert resp.json['err'] == 'Invoice-getDirectDebitOrder-soap:Server'
3403 3447
    assert resp.json['err_desc'] == "E520 : La REGIE CS [{0}] n''existe pas dans la base Maelis"
3404
-