Projet

Général

Profil

0002-toulouse_axel-update-family-endpoint-38124.patch

Lauréline Guérin, 12 décembre 2019 14:46

Télécharger (34,9 ko)

Voir les différences:

Subject: [PATCH 2/2] toulouse_axel: update family endpoint (#38124)

 functests/toulouse_axel/test_toulouse_axel.py |  24 +-
 passerelle/contrib/toulouse_axel/models.py    |  51 ++++-
 .../xsd/Dui/Q_FormMajFamilleDui.xsd           | 137 +++++++++++
 .../xsd/Dui/R_FormMajFamilleDui.xsd           |  21 ++
 .../flat_update_family_info.json              | 156 +++++++++++++
 .../toulouse_axel/update_family_info.json     | 214 ++++++++++++++++++
 tests/test_toulouse_axel.py                   | 109 +++++++--
 7 files changed, 697 insertions(+), 15 deletions(-)
 create mode 100644 passerelle/contrib/toulouse_axel/xsd/Dui/Q_FormMajFamilleDui.xsd
 create mode 100644 passerelle/contrib/toulouse_axel/xsd/Dui/R_FormMajFamilleDui.xsd
 create mode 100644 tests/data/toulouse_axel/flat_update_family_info.json
 create mode 100644 tests/data/toulouse_axel/update_family_info.json
functests/toulouse_axel/test_toulouse_axel.py
24 24
    url = conn + '/family_info?NameID=%s' % name_id
25 25
    resp = requests.get(url)
26 26
    resp.raise_for_status()
27
    data = resp.json()
28
    assert res['err'] == 0
29
    pprint.pprint(data)
30
    print('\n')
31

  
32
    payload = data['data']
33
    for key in ['SITUATIONFAMILIALE', 'NBENFANTACTIF', 'NBRLACTIF', 'IDDUI', 'CODEMISEAJOUR']:
34
        payload.pop(key)
35
    payload['N0TELEDOSSIER'] = '42'
36
    payload['DROITALIMAGE'] = 'NON'
37
    for key in ['MONTANTTOTAL', 'DATEVALIDITE', 'SFI', 'IREVENUS', 'RNF']:
38
        payload['REVENUS'].pop(key)
39
    payload['REVENUS']['CHOIXREVENU'] = ''
40
    for enfant in payload['ENFANT']:
41
        for key in ['NOM', 'DATENAISSANCE', 'SEXE', 'PRENOMPERE', 'PRENOMMERE', 'NOMPERE', 'NOMMERE', 'RATTACHEAUTREDUI', 'PRENOM']:
42
            enfant.pop(key)
43
        enfant['AUTORISATIONURGENCEMEDICALE'] = 'OUI'
44

  
45
    print("Update family info with the following payload:")
46
    pprint.pprint(payload)
47
    url = conn + '/update_family_info?NameID=%s' % name_id
48
    resp = requests.post(url, json=payload)
49
    resp.raise_for_status()
27 50
    res = resp.json()
28 51
    assert res['err'] == 0
29 52
    pprint.pprint(res)
30 53
    print('\n')
31 54

  
32
    data = res
33 55
    for child in data['data']['ENFANT']:
34 56
        print("GET child info")
35 57
        url = conn + '/child_info?NameID=%s&idpersonne=%s' % (name_id, child['IDPERSONNE'])
passerelle/contrib/toulouse_axel/models.py
91 91

  
92 92
    def __call__(self, resource, request_data):
93 93
        client = resource.soap_client()
94

  
94 95
        serialized_request = ET.tostring(
95 96
            self.request_converter.encode(request_data))
97
        try:
98
            self.request_converter.xml_schema.validate(serialized_request)
99
        except xmlschema.XMLSchemaValidationError as e:
100
            raise AxelError('invalid request', str(e))
101

  
96 102
        result = client.service.getData(
97 103
            self.operation,
98 104
            force_text(serialized_request),
......
106 112
        try:
107 113
            return self.response_converter.decode(ET.fromstring(result))
108 114
        except xmlschema.XMLSchemaValidationError as e:
109
            raise AxelError('invalid response', e)
115
            raise AxelError('invalid response', str(e))
110 116

  
111 117

  
112 118
ref_verif_dui = Operation('RefVerifDui')
113 119
ref_famille_dui = Operation('RefFamilleDui')
120
form_maj_famille_dui = Operation('FormMajFamilleDui')
114 121
ref_facture_a_payer = Operation('RefFactureAPayer')
115 122
ref_facture_pdf = Operation('RefFacturePDF', prefix='')
116 123

  
......
136 143
    LINK_SCHEMA['properties'].pop('IDPERSONNE')
137 144
    LINK_SCHEMA['required'].remove('IDPERSONNE')
138 145

  
146
    UPDATE_FAMILY_SCHEMA = copy.deepcopy(
147
        form_maj_famille_dui.request_schema['properties']['PORTAIL']['properties']['DUI'])
148
    UPDATE_FAMILY_SCHEMA['properties'].pop('IDDUI')
149
    UPDATE_FAMILY_SCHEMA['properties'].pop('DATEDEMANDE')
150
    UPDATE_FAMILY_SCHEMA['properties'].pop('QUIACTUALISEDUI')
151
    UPDATE_FAMILY_SCHEMA['required'].remove('IDDUI')
152
    UPDATE_FAMILY_SCHEMA['required'].remove('DATEDEMANDE')
153
    UPDATE_FAMILY_SCHEMA['required'].remove('QUIACTUALISEDUI')
154
    UPDATE_FAMILY_SCHEMA['unflatten'] = True
155

  
139 156
    @endpoint(
140 157
        description=_('Create link between user and Toulouse Axel'),
141 158
        perm='can_access',
......
226 243

  
227 244
        raise APIError('Child not found', err='not-found')
228 245

  
246
    @endpoint(
247
        description=_("Update information about user's family"),
248
        perm='can_access',
249
        parameters={
250
            'NameID': {'description': _('Publik ID')},
251
        },
252
        post={
253
            'request_body': {
254
                'schema': {
255
                    'application/json': UPDATE_FAMILY_SCHEMA,
256
                }
257
            }
258
        })
259
    def update_family_info(self, request, NameID, post_data):
260
        try:
261
            link = self.link_set.get(name_id=NameID)
262
        except Link.DoesNotExist:
263
            raise APIError('Person not found', err='not-found')
264

  
265
        post_data['IDDUI'] = link.dui
266
        post_data['DATEDEMANDE'] = datetime.date.today().strftime('%Y-%m-%d')
267
        if 'RL2' in post_data and post_data['RL2'].get('IDPERSONNE') == link.person_id:
268
            post_data['QUIACTUALISEDUI'] = '2'
269
        else:
270
            post_data['QUIACTUALISEDUI'] = '1'
271
        try:
272
            form_maj_famille_dui(self, {'PORTAIL': {'DUI': post_data}})
273
        except AxelError as e:
274
            raise APIError('Axel error: %s' % e, err='error')
275

  
276
        return {'updated': True, 'dui': link.dui}
277

  
229 278
    def get_invoices(self, name_id, error_status=200):
230 279
        link = self.get_link(name_id, error_status=error_status)
231 280
        try:
passerelle/contrib/toulouse_axel/xsd/Dui/Q_FormMajFamilleDui.xsd
1
<?xml version="1.0" encoding="utf-8" ?>
2
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:all="urn:AllAxelTypes" xmlns:adr="urn:AdresseDui">
3

  
4
	<xsd:import schemaLocation="../AllAxelTypes.xsd" namespace="urn:AllAxelTypes"  />
5
	
6
	<xsd:import schemaLocation="./AdresseDui.xsd" namespace="urn:AdresseDui"  />
7

  
8
	<xsd:include schemaLocation="./ResponsableDui.xsd"/>
9
	
10
	<xsd:include schemaLocation="./ContactDui.xsd"/>
11
	
12
	<xsd:include schemaLocation="./AssuranceDui.xsd"/>
13
	
14
	<xsd:include schemaLocation="./FicheSanitaireDui.xsd"/>
15

  
16
	<xsd:simpleType name="N0TELEDOSSIERType">
17
		<xsd:restriction base="xsd:string">
18
			<xsd:minLength value="1" />
19
			<xsd:maxLength value="12" />
20
		</xsd:restriction>
21
	</xsd:simpleType>
22
	
23
	<xsd:simpleType name="QUIACTUALISEDUIType">
24
		<xsd:restriction base="xsd:string">
25
			<xsd:enumeration value="1" />
26
			<xsd:enumeration value="2" />
27
		</xsd:restriction>
28
	</xsd:simpleType>
29
	
30
	<xsd:simpleType name="TYPEREGIMEType">
31
		<xsd:restriction base="xsd:string">
32
			<xsd:enumeration value="" />
33
			<xsd:enumeration value="GENE" />
34
			<xsd:enumeration value="ZAU" />
35
			<xsd:enumeration value="MSA" />
36
		</xsd:restriction>
37
	</xsd:simpleType>
38
	
39
	<xsd:simpleType name="NUMEROCAFType">
40
		<xsd:restriction base="xsd:string">
41
			<xsd:minLength value="0" />
42
			<xsd:maxLength value="7" />
43
		</xsd:restriction>
44
	</xsd:simpleType>
45
	
46
	<xsd:simpleType name="ALLOCATAIREType">
47
		<xsd:restriction base="xsd:string">
48
			<xsd:enumeration value="" />
49
			<xsd:enumeration value="1" />
50
			<xsd:enumeration value="2" />
51
		</xsd:restriction>
52
	</xsd:simpleType>
53

  
54
	<xsd:simpleType name="CHOIXREVENUType">
55
		<xsd:restriction base="xsd:string">
56
			<xsd:enumeration value="" />
57
			<xsd:enumeration value="rnf" />
58
			<xsd:enumeration value="cafprooui" />
59
			<xsd:enumeration value="RNF" />
60
			<xsd:enumeration value="CAFPROOUI" />
61
		</xsd:restriction>
62
	</xsd:simpleType>
63
		
64
	<xsd:complexType name="REVENUSType">
65
		<xsd:sequence>
66
			<xsd:element ref="TYPEREGIME" />
67
			<xsd:element ref="NUMEROCAF" />
68
			<xsd:element ref="ALLOCATAIRE" />
69
			<xsd:element ref="CHOIXREVENU" />
70
			<xsd:element ref="NBENFANTSACHARGE" />
71
		</xsd:sequence> 
72
	</xsd:complexType>
73
	
74
	<xsd:complexType name="ENFANTType">
75
		<xsd:sequence>
76
			<xsd:element ref="IDPERSONNE" />
77
			<xsd:element ref="AUTORISATIONURGENCEMEDICALE" />			
78
			<xsd:element ref="ASSURANCE" minOccurs="0" maxOccurs="1"/>
79
			<xsd:element ref="SANITAIRE" minOccurs="0" maxOccurs="1"/>
80
			<xsd:element ref="CONTACT" minOccurs="0" maxOccurs="3"/>
81
		</xsd:sequence> 
82
	</xsd:complexType>
83
	
84
	<xsd:complexType name="DUIType">
85
		<xsd:sequence>
86
			<xsd:element ref="DATEDEMANDE" />
87
			<xsd:element ref="N0TELEDOSSIER" />
88
			<xsd:element ref="IDDUI" />
89
			<xsd:element ref="QUIACTUALISEDUI" />
90
			<xsd:element ref="DROITALIMAGE" />
91
			<xsd:element ref="REACTUALISATIONENLIGNE" />
92
			<xsd:element ref="DEMATFACTURES" />
93
			<xsd:element ref="ADRESSE" minOccurs="1" maxOccurs="1"/>
94
			<xsd:element ref="TELFIXE" />
95
			<xsd:element ref="RL1" minOccurs="0" maxOccurs="1"/>
96
			<xsd:element ref="RL2" minOccurs="0" maxOccurs="1"/>
97
			<xsd:element ref="ENFANT" minOccurs="0" maxOccurs="6"/>
98
			<xsd:element ref="REVENUS" minOccurs="0" maxOccurs="1"/>
99
		</xsd:sequence> 
100
	</xsd:complexType>
101
	
102
	<xsd:complexType name="PORTAILType">
103
		<xsd:sequence>
104
				<xsd:element ref="DUI"/>
105
		</xsd:sequence>	
106
	</xsd:complexType>
107
	
108
	<xsd:element name="DATEDEMANDE" type="all:DATEType"/>
109
	<xsd:element name="N0TELEDOSSIER" type="N0TELEDOSSIERType"/>
110
	<xsd:element name="IDDUI" type="all:IDENTREQUIREDType"/>
111
	<xsd:element name="QUIACTUALISEDUI" type="QUIACTUALISEDUIType"/>
112
	<xsd:element name="DROITALIMAGE" type="all:OUINONREQUIREDType"/>
113
	<xsd:element name="REACTUALISATIONENLIGNE" type="all:OUINONREQUIREDType"/>
114
	<xsd:element name="DEMATFACTURES" type="all:OUINONREQUIREDType"/>
115
	<xsd:element name="ADRESSE" type="adr:ADRESSEType"/>
116
	<xsd:element name="TELFIXE" type="all:TELType"/>
117
	<xsd:element name="RL1" type="RESPONSABLE1Type"/>
118
	<xsd:element name="RL2" type="RESPONSABLE2Type"/>
119
	<xsd:element name="ENFANT" type="ENFANTType"/>
120
	<xsd:element name="REVENUS" type="REVENUSType"/>
121
	
122
	<xsd:element name="IDPERSONNE" type="all:IDENTREQUIREDType"/>
123
	<xsd:element name="AUTORISATIONURGENCEMEDICALE" type="all:OUINONREQUIREDType"/>
124
	<xsd:element name="ASSURANCE" type="ASSURANCEType"/>
125
	<xsd:element name="SANITAIRE" type="SANITAIREType"/>
126
	<xsd:element name="CONTACT" type="CONTACTType"/>
127
	
128
	<xsd:element name="TYPEREGIME" type="TYPEREGIMEType"/>
129
	<xsd:element name="NUMEROCAF" type="NUMEROCAFType"/>
130
	<xsd:element name="ALLOCATAIRE" type="ALLOCATAIREType"/>
131
	<xsd:element name="CHOIXREVENU" type="CHOIXREVENUType"/>
132
	<xsd:element name="NBENFANTSACHARGE" type="all:unsignedInt-or-empty"/>
133
	
134
	<xsd:element name="DUI" type="DUIType"/>
135
	
136
	<xsd:element name="PORTAIL" type="PORTAILType"/>
137
</xsd:schema>
passerelle/contrib/toulouse_axel/xsd/Dui/R_FormMajFamilleDui.xsd
1
<?xml version="1.0" encoding="utf-8" ?>
2
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3

  
4
	<xsd:redefine schemaLocation="../R_ShemaResultat.xsd">
5
	    <xsd:simpleType name="TYPEType">
6
			<xsd:restriction base="TYPEType">
7
				<xsd:enumeration value="FormMajFamilleDui" />
8
			</xsd:restriction>
9
	    </xsd:simpleType>
10
		
11
		<xsd:complexType name="PORTAILType">
12
			<xsd:complexContent>
13
				<xsd:extension base="PORTAILType">
14
					<xsd:sequence>
15
						<xsd:element name="DUI" type="xsd:string" minOccurs="0"/>
16
					</xsd:sequence>	
17
				</xsd:extension>
18
			 </xsd:complexContent>
19
		</xsd:complexType>
20
	</xsd:redefine>		
21
</xsd:schema>
tests/data/toulouse_axel/flat_update_family_info.json
1
{
2
  "ADRESSE/CODEINSEEVILLE": null,
3
  "ADRESSE/CODEPOSTAL": "31400",
4
  "ADRESSE/COMPLEMENT1": "foo",
5
  "ADRESSE/COMPLEMENT2": null,
6
  "ADRESSE/COMPLEMENTVOIE": null,
7
  "ADRESSE/NUMEROSTI": "1234",
8
  "ADRESSE/NUMVOIE": "42",
9
  "ADRESSE/VILLE": "TOULOUSE",
10
  "ADRESSE/VOIE": "RUE bar",
11
  "DEMATFACTURES": "NON",
12
  "DROITALIMAGE": "NON",
13
  "ENFANT/0/ASSURANCE/DATEFIN": "2020-12-31",
14
  "ENFANT/0/ASSURANCE/NOM": "foo",
15
  "ENFANT/0/ASSURANCE/NUMERO": "1234",
16
  "ENFANT/0/AUTORISATIONURGENCEMEDICALE": "OUI",
17
  "ENFANT/0/CONTACT/0/CHERCHERLENFANT": "OUI",
18
  "ENFANT/0/CONTACT/0/ENCASURGENCE": "OUI",
19
  "ENFANT/0/CONTACT/0/LIENPARENTE": null,
20
  "ENFANT/0/CONTACT/0/NOM": "foo",
21
  "ENFANT/0/CONTACT/0/PRENOM": "foo",
22
  "ENFANT/0/CONTACT/0/TELFIXE": "0505050505",
23
  "ENFANT/0/CONTACT/0/TELPORTABLE": "0606060606",
24
  "ENFANT/0/CONTACT/1/CHERCHERLENFANT": "OUI",
25
  "ENFANT/0/CONTACT/1/ENCASURGENCE": "OUI",
26
  "ENFANT/0/CONTACT/1/LIENPARENTE": null,
27
  "ENFANT/0/CONTACT/1/NOM": "foo",
28
  "ENFANT/0/CONTACT/1/PRENOM": "foo",
29
  "ENFANT/0/CONTACT/1/TELFIXE": "0505050505",
30
  "ENFANT/0/CONTACT/1/TELPORTABLE": "0606060606",
31
  "ENFANT/0/CONTACT/2/CHERCHERLENFANT": "OUI",
32
  "ENFANT/0/CONTACT/2/ENCASURGENCE": "OUI",
33
  "ENFANT/0/CONTACT/2/LIENPARENTE": null,
34
  "ENFANT/0/CONTACT/2/NOM": "foo",
35
  "ENFANT/0/CONTACT/2/PRENOM": "foo",
36
  "ENFANT/0/CONTACT/2/TELFIXE": "0505050505",
37
  "ENFANT/0/CONTACT/2/TELPORTABLE": "0606060606",
38
  "ENFANT/0/IDPERSONNE": "4242",
39
  "ENFANT/0/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
40
  "ENFANT/0/SANITAIRE/ALLERGIE/0/NOMALLERGIE": null,
41
  "ENFANT/0/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
42
  "ENFANT/0/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
43
  "ENFANT/0/SANITAIRE/ALLERGIE/1/NOMALLERGIE": null,
44
  "ENFANT/0/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
45
  "ENFANT/0/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
46
  "ENFANT/0/SANITAIRE/ALLERGIE/2/NOMALLERGIE": null,
47
  "ENFANT/0/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
48
  "ENFANT/0/SANITAIRE/AUTREDIFFICULTE": null,
49
  "ENFANT/0/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
50
  "ENFANT/0/SANITAIRE/ECOLESPECIALISEE": null,
51
  "ENFANT/0/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
52
  "ENFANT/0/SANITAIRE/INDICATEURECOLE": "NON",
53
  "ENFANT/0/SANITAIRE/INDICATEURHANDICAP": "NON",
54
  "ENFANT/0/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
55
  "ENFANT/0/SANITAIRE/INDICATEURPAI": "NON",
56
  "ENFANT/0/SANITAIRE/INFOUTILES": null,
57
  "ENFANT/0/SANITAIRE/MEDECIN/NOM": "foo",
58
  "ENFANT/0/SANITAIRE/MEDECIN/TELMEDECIN": "0505050505",
59
  "ENFANT/0/SANITAIRE/VACCIN/AUTRE": null,
60
  "ENFANT/0/SANITAIRE/VACCIN/BCGAJOUR": null,
61
  "ENFANT/0/SANITAIRE/VACCIN/COQAJOUR": null,
62
  "ENFANT/0/SANITAIRE/VACCIN/DAJOUR": null,
63
  "ENFANT/0/SANITAIRE/VACCIN/HBAJOUR": null,
64
  "ENFANT/0/SANITAIRE/VACCIN/HIBAJOUR": null,
65
  "ENFANT/0/SANITAIRE/VACCIN/IIPAJOUR": null,
66
  "ENFANT/0/SANITAIRE/VACCIN/MENINAJOUR": null,
67
  "ENFANT/0/SANITAIRE/VACCIN/PAJOUR": null,
68
  "ENFANT/0/SANITAIRE/VACCIN/RORAJOUR": null,
69
  "ENFANT/0/SANITAIRE/VACCIN/TAJOUR": null,
70
  "ENFANT/1/ASSURANCE/DATEFIN": "2020-12-31",
71
  "ENFANT/1/ASSURANCE/NOM": "foo",
72
  "ENFANT/1/ASSURANCE/NUMERO": "1234",
73
  "ENFANT/1/AUTORISATIONURGENCEMEDICALE": "OUI",
74
  "ENFANT/1/IDPERSONNE": "3535",
75
  "ENFANT/1/SANITAIRE/ALLERGIE/0/ALLERGIQUE": "OUI",
76
  "ENFANT/1/SANITAIRE/ALLERGIE/0/NOMALLERGIE": null,
77
  "ENFANT/1/SANITAIRE/ALLERGIE/0/TYPE": "ASTHME",
78
  "ENFANT/1/SANITAIRE/ALLERGIE/1/ALLERGIQUE": "OUI",
79
  "ENFANT/1/SANITAIRE/ALLERGIE/1/NOMALLERGIE": null,
80
  "ENFANT/1/SANITAIRE/ALLERGIE/1/TYPE": "MEDICAMENTEUSES",
81
  "ENFANT/1/SANITAIRE/ALLERGIE/2/ALLERGIQUE": "OUI",
82
  "ENFANT/1/SANITAIRE/ALLERGIE/2/NOMALLERGIE": null,
83
  "ENFANT/1/SANITAIRE/ALLERGIE/2/TYPE": "ALIMENTAIRES",
84
  "ENFANT/1/SANITAIRE/AUTREDIFFICULTE": null,
85
  "ENFANT/1/SANITAIRE/DATEFINVALIDITE": "2020-12-31",
86
  "ENFANT/1/SANITAIRE/ECOLESPECIALISEE": null,
87
  "ENFANT/1/SANITAIRE/INDICATEURAUXILIAIREVS": "NON",
88
  "ENFANT/1/SANITAIRE/INDICATEURECOLE": "NON",
89
  "ENFANT/1/SANITAIRE/INDICATEURHANDICAP": "NON",
90
  "ENFANT/1/SANITAIRE/INDICATEURNOTIFMDPH": "NON",
91
  "ENFANT/1/SANITAIRE/INDICATEURPAI": "NON",
92
  "ENFANT/1/SANITAIRE/INFOUTILES": null,
93
  "ENFANT/1/SANITAIRE/MEDECIN/NOM": "foo",
94
  "ENFANT/1/SANITAIRE/MEDECIN/TELMEDECIN": "0505050505",
95
  "ENFANT/1/SANITAIRE/VACCIN/AUTRE": null,
96
  "ENFANT/1/SANITAIRE/VACCIN/BCGAJOUR": null,
97
  "ENFANT/1/SANITAIRE/VACCIN/COQAJOUR": "OUI",
98
  "ENFANT/1/SANITAIRE/VACCIN/DAJOUR": "OUI",
99
  "ENFANT/1/SANITAIRE/VACCIN/HBAJOUR": "OUI",
100
  "ENFANT/1/SANITAIRE/VACCIN/HIBAJOUR": "OUI",
101
  "ENFANT/1/SANITAIRE/VACCIN/IIPAJOUR": "OUI",
102
  "ENFANT/1/SANITAIRE/VACCIN/MENINAJOUR": "OUI",
103
  "ENFANT/1/SANITAIRE/VACCIN/PAJOUR": "OUI",
104
  "ENFANT/1/SANITAIRE/VACCIN/RORAJOUR": "OUI",
105
  "ENFANT/1/SANITAIRE/VACCIN/TAJOUR": "OUI",
106
  "N0TELEDOSSIER": "42",
107
  "REACTUALISATIONENLIGNE": "NON",
108
  "REVENUS/ALLOCATAIRE": "2",
109
  "REVENUS/CHOIXREVENU": "",
110
  "REVENUS/NBENFANTSACHARGE": 2,
111
  "REVENUS/NUMEROCAF": "1234",
112
  "REVENUS/TYPEREGIME": "GENE",
113
  "RL1/ADREMPLOYEUR/CODEINSEEVILLE": null,
114
  "RL1/ADREMPLOYEUR/CODEPOSTAL": null,
115
  "RL1/ADREMPLOYEUR/COMPLEMENT1": null,
116
  "RL1/ADREMPLOYEUR/COMPLEMENT2": null,
117
  "RL1/ADREMPLOYEUR/COMPLEMENTVOIE": null,
118
  "RL1/ADREMPLOYEUR/NUMEROSTI": null,
119
  "RL1/ADREMPLOYEUR/NUMVOIE": null,
120
  "RL1/ADREMPLOYEUR/VILLE": null,
121
  "RL1/ADREMPLOYEUR/VOIE": null,
122
  "RL1/CIVILITE": "M",
123
  "RL1/COURRIEL": "foo@bar.com",
124
  "RL1/CSP": "ETU",
125
  "RL1/DATENAISSANCE": "1980-01-01",
126
  "RL1/IDPERSONNE": "42",
127
  "RL1/INDICATEURRL": "1",
128
  "RL1/NOM": "foo",
129
  "RL1/NOMEMPLOYEUR": "foo",
130
  "RL1/NOMJEUNEFILLE": null,
131
  "RL1/PRENOM": "foo",
132
  "RL1/PROFESSION": "ETUDIANT",
133
  "RL1/TELPORTABLE": "0606060606",
134
  "RL2/ADREMPLOYEUR/CODEINSEEVILLE": null,
135
  "RL2/ADREMPLOYEUR/CODEPOSTAL": null,
136
  "RL2/ADREMPLOYEUR/COMPLEMENT1": null,
137
  "RL2/ADREMPLOYEUR/COMPLEMENT2": null,
138
  "RL2/ADREMPLOYEUR/COMPLEMENTVOIE": null,
139
  "RL2/ADREMPLOYEUR/NUMEROSTI": null,
140
  "RL2/ADREMPLOYEUR/NUMVOIE": null,
141
  "RL2/ADREMPLOYEUR/VILLE": null,
142
  "RL2/ADREMPLOYEUR/VOIE": null,
143
  "RL2/CIVILITE": "MME",
144
  "RL2/COURRIEL": "foo@bar.com",
145
  "RL2/CSP": "EMP",
146
  "RL2/DATENAISSANCE": "1980-01-01",
147
  "RL2/IDPERSONNE": "35",
148
  "RL2/INDICATEURRL": "2",
149
  "RL2/NOM": "foo",
150
  "RL2/NOMEMPLOYEUR": "foo",
151
  "RL2/NOMJEUNEFILLE": null,
152
  "RL2/PRENOM": "foo",
153
  "RL2/PROFESSION": "foo",
154
  "RL2/TELPORTABLE": "0606060606",
155
  "TELFIXE": null
156
}
tests/data/toulouse_axel/update_family_info.json
1
{
2
    "ADRESSE": {
3
        "CODEINSEEVILLE": null,
4
        "CODEPOSTAL": "31400",
5
        "COMPLEMENT1": "foo",
6
        "COMPLEMENT2": null,
7
        "COMPLEMENTVOIE": null,
8
        "NUMEROSTI": "1234",
9
        "NUMVOIE": "42",
10
        "VILLE": "TOULOUSE",
11
        "VOIE": "RUE bar"
12
    },
13
    "DEMATFACTURES": "NON",
14
    "DROITALIMAGE": "NON",
15
    "ENFANT": [
16
        {
17
            "ASSURANCE": {
18
                "DATEFIN": "2020-12-31",
19
                "NOM": "foo",
20
                "NUMERO": "1234"
21
            },
22
            "AUTORISATIONURGENCEMEDICALE": "OUI",
23
            "CONTACT": [
24
                {
25
                    "CHERCHERLENFANT": "OUI",
26
                    "ENCASURGENCE": "OUI",
27
                    "LIENPARENTE": null,
28
                    "NOM": "foo",
29
                    "PRENOM": "foo",
30
                    "TELFIXE": "0505050505",
31
                    "TELPORTABLE": "0606060606"
32
                },
33
                {
34
                    "CHERCHERLENFANT": "OUI",
35
                    "ENCASURGENCE": "OUI",
36
                    "LIENPARENTE": null,
37
                    "NOM": "foo",
38
                    "PRENOM": "foo",
39
                    "TELFIXE": "0505050505",
40
                    "TELPORTABLE": "0606060606"
41
                },
42
                {
43
                    "CHERCHERLENFANT": "OUI",
44
                    "ENCASURGENCE": "OUI",
45
                    "LIENPARENTE": null,
46
                    "NOM": "foo",
47
                    "PRENOM": "foo",
48
                    "TELFIXE": "0505050505",
49
                    "TELPORTABLE": "0606060606"
50
                }
51
            ],
52
            "IDPERSONNE": "4242",
53
            "SANITAIRE": {
54
                "ALLERGIE": [
55
                    {
56
                        "ALLERGIQUE": "OUI",
57
                        "NOMALLERGIE": null,
58
                        "TYPE": "ASTHME"
59
                    },
60
                    {
61
                        "ALLERGIQUE": "OUI",
62
                        "NOMALLERGIE": null,
63
                        "TYPE": "MEDICAMENTEUSES"
64
                    },
65
                    {
66
                        "ALLERGIQUE": "OUI",
67
                        "NOMALLERGIE": null,
68
                        "TYPE": "ALIMENTAIRES"
69
                    }
70
                ],
71
                "AUTREDIFFICULTE": null,
72
                "DATEFINVALIDITE": "2020-12-31",
73
                "ECOLESPECIALISEE": null,
74
                "INDICATEURAUXILIAIREVS": "NON",
75
                "INDICATEURECOLE": "NON",
76
                "INDICATEURHANDICAP": "NON",
77
                "INDICATEURNOTIFMDPH": "NON",
78
                "INDICATEURPAI": "NON",
79
                "INFOUTILES": null,
80
                "MEDECIN": {
81
                    "NOM": "foo",
82
                    "TELMEDECIN": "0505050505"
83
                },
84
                "VACCIN": {
85
                    "AUTRE": null,
86
                    "BCGAJOUR": null,
87
                    "COQAJOUR": null,
88
                    "DAJOUR": null,
89
                    "HBAJOUR": null,
90
                    "HIBAJOUR": null,
91
                    "IIPAJOUR": null,
92
                    "MENINAJOUR": null,
93
                    "PAJOUR": null,
94
                    "RORAJOUR": null,
95
                    "TAJOUR": null
96
                }
97
            }
98
        },
99
        {
100
            "ASSURANCE": {
101
                "DATEFIN": "2020-12-31",
102
                "NOM": "foo",
103
                "NUMERO": "1234"
104
            },
105
            "AUTORISATIONURGENCEMEDICALE": "OUI",
106
            "IDPERSONNE": "3535",
107
            "SANITAIRE": {
108
                "ALLERGIE": [
109
                    {
110
                        "ALLERGIQUE": "OUI",
111
                        "NOMALLERGIE": null,
112
                        "TYPE": "ASTHME"
113
                    },
114
                    {
115
                        "ALLERGIQUE": "OUI",
116
                        "NOMALLERGIE": null,
117
                        "TYPE": "MEDICAMENTEUSES"
118
                    },
119
                    {
120
                        "ALLERGIQUE": "OUI",
121
                        "NOMALLERGIE": null,
122
                        "TYPE": "ALIMENTAIRES"
123
                    }
124
                ],
125
                "AUTREDIFFICULTE": null,
126
                "DATEFINVALIDITE": "2020-12-31",
127
                "ECOLESPECIALISEE": null,
128
                "INDICATEURAUXILIAIREVS": "NON",
129
                "INDICATEURECOLE": "NON",
130
                "INDICATEURHANDICAP": "NON",
131
                "INDICATEURNOTIFMDPH": "NON",
132
                "INDICATEURPAI": "NON",
133
                "INFOUTILES": null,
134
                "MEDECIN": {
135
                    "NOM": "foo",
136
                    "TELMEDECIN": "0505050505"
137
                },
138
                "VACCIN": {
139
                    "AUTRE": null,
140
                    "BCGAJOUR": null,
141
                    "COQAJOUR": "OUI",
142
                    "DAJOUR": "OUI",
143
                    "HBAJOUR": "OUI",
144
                    "HIBAJOUR": "OUI",
145
                    "IIPAJOUR": "OUI",
146
                    "MENINAJOUR": "OUI",
147
                    "PAJOUR": "OUI",
148
                    "RORAJOUR": "OUI",
149
                    "TAJOUR": "OUI"
150
                }
151
            }
152
        }
153
    ],
154
    "N0TELEDOSSIER": "42",
155
    "REACTUALISATIONENLIGNE": "NON",
156
    "REVENUS": {
157
        "ALLOCATAIRE": "2",
158
        "CHOIXREVENU": "",
159
        "NBENFANTSACHARGE": 2,
160
        "NUMEROCAF": "1234",
161
        "TYPEREGIME": "GENE"
162
    },
163
    "RL1": {
164
        "ADREMPLOYEUR": {
165
            "CODEINSEEVILLE": null,
166
            "CODEPOSTAL": null,
167
            "COMPLEMENT1": null,
168
            "COMPLEMENT2": null,
169
            "COMPLEMENTVOIE": null,
170
            "NUMEROSTI": null,
171
            "NUMVOIE": null,
172
            "VILLE": null,
173
            "VOIE": null
174
        },
175
        "CIVILITE": "M",
176
        "COURRIEL": "foo@bar.com",
177
        "CSP": "ETU",
178
        "DATENAISSANCE": "1980-01-01",
179
        "IDPERSONNE": "42",
180
        "INDICATEURRL": "1",
181
        "NOM": "foo",
182
        "NOMEMPLOYEUR": "foo",
183
        "NOMJEUNEFILLE": null,
184
        "PRENOM": "foo",
185
        "PROFESSION": "ETUDIANT",
186
        "TELPORTABLE": "0606060606"
187
    },
188
    "RL2": {
189
        "ADREMPLOYEUR": {
190
            "CODEINSEEVILLE": null,
191
            "CODEPOSTAL": null,
192
            "COMPLEMENT1": null,
193
            "COMPLEMENT2": null,
194
            "COMPLEMENTVOIE": null,
195
            "NUMEROSTI": null,
196
            "NUMVOIE": null,
197
            "VILLE": null,
198
            "VOIE": null
199
        },
200
        "CIVILITE": "MME",
201
        "COURRIEL": "foo@bar.com",
202
        "CSP": "EMP",
203
        "DATENAISSANCE": "1980-01-01",
204
        "IDPERSONNE": "35",
205
        "INDICATEURRL": "2",
206
        "NOM": "foo",
207
        "NOMEMPLOYEUR": "foo",
208
        "NOMJEUNEFILLE": null,
209
        "PRENOM": "foo",
210
        "PROFESSION": "foo",
211
        "TELPORTABLE": "0606060606"
212
    },
213
    "TELFIXE": null
214
}
tests/test_toulouse_axel.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17
from contextlib import contextmanager
18
import datetime
19
import json
18 20
import mock
19 21
import os
20 22

  
......
24 26
    AxelError,
25 27
    Link,
26 28
    ToulouseAxel,
29
    form_maj_famille_dui,
27 30
    ref_famille_dui,
28 31
    ref_facture_a_payer,
29 32
    ref_facture_pdf,
......
41 44

  
42 45

  
43 46
@pytest.fixture
44
def params():
47
def link_params():
45 48
    return {
46 49
        'IDDUI': 'XXX',
47 50
        'PRENOM': 'John',
......
50 53
    }
51 54

  
52 55

  
56
@pytest.fixture
57
def update_params():
58
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/update_family_info.json')
59
    with open(filepath) as jsonfile:
60
        content = jsonfile.read()
61
    return json.loads(content)
62

  
63

  
64
@pytest.fixture
65
def flat_update_params():
66
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/flat_update_family_info.json')
67
    with open(filepath) as jsonfile:
68
        content = jsonfile.read()
69
    return json.loads(content)
70

  
71

  
53 72
def test_operation_status_error(resource):
54 73
    resp = '''
55 74
    <?xml version="1.0"?>
......
70 89
            ref_verif_dui(resource, {
71 90
                'PORTAIL': {
72 91
                    'DUI': {
92
                        'IDDUI': 'XXX',
93
                        'IDPERSONNE': '42',
73 94
                        'PRENOM': 'John',
74 95
                        'NOM': 'Doe',
75 96
                        'NAISSANCE': '2010-10-10',
......
133 154
            })
134 155

  
135 156

  
157
@pytest.mark.parametrize('content', [
158
    '<PORTAIL><DUI/></PORTAIL>',
159
])
160
def test_operation_form_maj_famille_dui(resource, content):
161
    with mock_getdata(content, 'FormMajFamilleDui'):
162
        with pytest.raises(AxelError):
163
            form_maj_famille_dui(resource, {
164
                'PORTAIL': {
165
                    'DUI': {
166
                        'IDDUI': 'XXX',
167
                    }
168
                }
169
            })
170

  
171

  
136 172
@pytest.mark.parametrize('content', [
137 173
    '<PORTAIL><DUI/></PORTAIL>',
138 174
])
......
163 199
            })
164 200

  
165 201

  
166
def test_link_endpoint_nameid_empty(app, resource, params):
167
    resp = app.post_json('/toulouse-axel/test/link?NameID=', params=params, status=400)
202
def test_link_endpoint_nameid_empty(app, resource, link_params):
203
    resp = app.post_json('/toulouse-axel/test/link?NameID=', params=link_params, status=400)
168 204
    assert resp.json['err_desc'] == "NameID is empty"
169 205

  
170 206

  
171
def test_link_endpoint_axel_error(app, resource, params):
207
def test_link_endpoint_axel_error(app, resource, link_params):
172 208
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_verif_dui') as operation:
173 209
        operation.side_effect = AxelError('FooBar')
174
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
210
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
175 211
        assert resp.json['err_desc'] == "Axel error: FooBar"
176 212

  
177 213

  
......
180 216
    '<IDDUI>XXX</IDDUI><IDPERSONNE>42</IDPERSONNE><CODE>1</CODE>',
181 217
    '<IDDUI>XXX</IDDUI><IDPERSONNE>42</IDPERSONNE><CODE>4</CODE>',
182 218
])
183
def test_link_endpoint_no_result(app, resource, params, xml_response):
219
def test_link_endpoint_no_result(app, resource, link_params, xml_response):
184 220
    content = '''<PORTAIL>
185 221
    <DUI>
186 222
        %s
187 223
    </DUI>
188 224
</PORTAIL>''' % xml_response
189 225
    with mock_getdata(content, 'RefVerifDui'):
190
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
226
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
191 227
    assert resp.json['err_desc'] == "Person not found"
192 228

  
193 229

  
194
def test_link_endpoint_conflict(app, resource, params):
230
def test_link_endpoint_conflict(app, resource, link_params):
195 231
    content = '''<PORTAIL>
196 232
    <DUI>
197 233
        <IDDUI>XXX</IDDUI>
......
202 238
    # existing link but dui is wrong
203 239
    link = Link.objects.create(resource=resource, name_id='yyy', dui='YYY', person_id='42')
204 240
    with mock_getdata(content, 'RefVerifDui'):
205
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
241
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
206 242
    assert resp.json['err_desc'] == "Data conflict"
207 243

  
208 244
    # existing link but person_id is wrong
......
210 246
    link.person_id = '35'
211 247
    link.save()
212 248
    with mock_getdata(content, 'RefVerifDui'):
213
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
249
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
214 250
    assert resp.json['err_desc'] == "Data conflict"
215 251

  
216 252

  
217 253
@pytest.mark.parametrize('code', [2, 3])
218
def test_link_endpoint(app, resource, params, code):
254
def test_link_endpoint(app, resource, link_params, code):
219 255
    content = '''<PORTAIL>
220 256
    <DUI>
221 257
        <IDDUI>XXX</IDDUI>
......
224 260
    </DUI>
225 261
</PORTAIL>''' % code
226 262
    with mock_getdata(content, 'RefVerifDui'):
227
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
263
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
228 264
    assert set(resp.json.keys()) == set([
229 265
        'err', 'link', 'created', 'dui'])
230 266
    assert resp.json['err'] == 0
......
233 269

  
234 270
    # again
235 271
    with mock_getdata(content, 'RefVerifDui'):
236
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=params)
272
        resp = app.post_json('/toulouse-axel/test/link?NameID=yyy', params=link_params)
237 273
    assert set(resp.json.keys()) == set([
238 274
        'err', 'link', 'created', 'dui'])
239 275
    assert resp.json['err'] == 0
......
340 376
    ])
341 377

  
342 378

  
379
def test_update_family_info_endpoint_axel_error(app, resource, update_params):
380
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
381
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
382
        operation.side_effect = AxelError('FooBar')
383
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
384
        assert resp.json['err_desc'] == "Axel error: FooBar"
385

  
386

  
387
def test_update_family_info_endpoint_no_result(app, resource, update_params):
388
    resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
389
    assert resp.json['err_desc'] == "Person not found"
390

  
391

  
392
def test_update_family_info_endpoint(app, resource, update_params):
393
    link = Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
394
    content = "<PORTAIL/>"
395
    with mock_getdata(content, 'FormMajFamilleDui'):
396
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
397
    assert resp.json['err'] == 0
398
    assert resp.json['dui'] == 'XXX'
399
    assert resp.json['updated'] is True
400

  
401
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
402
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
403
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['IDDUI'] == 'XXX'
404
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['DATEDEMANDE'] == datetime.date.today().strftime('%Y-%m-%d')
405
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['QUIACTUALISEDUI'] == '1'
406

  
407
    link.person_id = '35'
408
    link.save()
409
    with mock.patch('passerelle.contrib.toulouse_axel.models.form_maj_famille_dui') as operation:
410
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=update_params)
411
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['IDDUI'] == 'XXX'
412
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['DATEDEMANDE'] == datetime.date.today().strftime('%Y-%m-%d')
413
    assert operation.call_args_list[0][0][1]['PORTAIL']['DUI']['QUIACTUALISEDUI'] == '2'
414

  
415

  
416
def test_update_family_info_flat_endpoint(app, resource, flat_update_params):
417
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
418
    content = "<PORTAIL/>"
419
    with mock_getdata(content, 'FormMajFamilleDui'):
420
        resp = app.post_json('/toulouse-axel/test/update_family_info?NameID=yyy', params=flat_update_params)
421
    assert resp.json['err'] == 0
422
    assert resp.json['dui'] == 'XXX'
423
    assert resp.json['updated'] is True
424

  
425

  
343 426
def test_invoices_endpoint_axel_error(app, resource):
344 427
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
345 428
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_facture_a_payer') as operation:
346
-