From e6db84e9acac9bae3a1e07eabd6d1129a9fd6f6a Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Fri, 2 Aug 2024 23:02:44 +0200 Subject: [PATCH] fix: handle multiple situations on a CPS --- crates/sesam-vitale/src/cps.rs | 82 +++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/crates/sesam-vitale/src/cps.rs b/crates/sesam-vitale/src/cps.rs index b9025f9..9cb7782 100644 --- a/crates/sesam-vitale/src/cps.rs +++ b/crates/sesam-vitale/src/cps.rs @@ -116,7 +116,7 @@ fn decode_carte_ps(groups: Vec) -> Result { let byte = field.content[0]; carte_ps.titulaire.categorie_carte = byte as char; } - (2, 1) => { + (2..=16, 1) => { carte_ps.situations.push(SituationPS::default()); carte_ps .situations @@ -124,19 +124,19 @@ fn decode_carte_ps(groups: Vec) -> Result { .unwrap() .numero_logique_de_la_situation_de_facturation_du_ps = field.content[0]; } - (2, 2) => { + (2..=16, 2) => { carte_ps.situations.last_mut().unwrap().mode_d_exercice = String::from_utf8_lossy(field.content).to_string(); } - (2, 3) => { + (2..=16, 3) => { carte_ps.situations.last_mut().unwrap().statut_d_exercice = String::from_utf8_lossy(field.content).to_string(); } - (2, 4) => { + (2..=16, 4) => { carte_ps.situations.last_mut().unwrap().secteur_d_activite = String::from_utf8_lossy(field.content).to_string(); } - (2, 5) => { + (2..=16, 5) => { carte_ps .situations .last_mut() @@ -144,7 +144,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .type_d_identification_structure = String::from_utf8_lossy(field.content).to_string(); } - (2, 6) => { + (2..=16, 6) => { carte_ps .situations .last_mut() @@ -152,7 +152,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .numero_d_identification_structure = String::from_utf8_lossy(field.content).to_string(); } - (2, 7) => { + (2..=16, 7) => { carte_ps .situations .last_mut() @@ -160,7 +160,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .cle_du_numero_d_identification_structure = String::from_utf8_lossy(field.content).to_string(); } - (2, 8) => { + (2..=16, 8) => { carte_ps .situations .last_mut() @@ -168,7 +168,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .raison_sociale_structure = String::from_utf8_lossy(field.content).to_string(); } - (2, 9) => { + (2..=16, 9) => { carte_ps .situations .last_mut() @@ -176,7 +176,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .numero_d_identification_de_facturation_du_ps = String::from_utf8_lossy(field.content).to_string(); } - (2, 10) => { + (2..=16, 10) => { carte_ps .situations .last_mut() @@ -184,7 +184,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .cle_du_numero_d_identification_de_facturation_du_ps = String::from_utf8_lossy(field.content).to_string(); } - (2, 11) => { + (2..=16, 11) => { carte_ps .situations .last_mut() @@ -192,7 +192,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .numero_d_identification_du_ps_remplaçant = String::from_utf8_lossy(field.content).to_string(); } - (2, 12) => { + (2..=16, 12) => { carte_ps .situations .last_mut() @@ -200,35 +200,35 @@ fn decode_carte_ps(groups: Vec) -> Result { .cle_du_numero_d_identification_du_ps_remplaçant = String::from_utf8_lossy(field.content).to_string(); } - (2, 13) => { + (2..=16, 13) => { carte_ps.situations.last_mut().unwrap().code_conventionnel = String::from_utf8_lossy(field.content).to_string(); } - (2, 14) => { + (2..=16, 14) => { carte_ps.situations.last_mut().unwrap().code_specialite = String::from_utf8_lossy(field.content).to_string(); } - (2, 15) => { + (2..=16, 15) => { carte_ps.situations.last_mut().unwrap().code_zone_tarifaire = String::from_utf8_lossy(field.content).to_string(); } - (2, 16) => { + (2..=16, 16) => { carte_ps.situations.last_mut().unwrap().code_zone_ik = String::from_utf8_lossy(field.content).to_string(); } - (2, 17) => { + (2..=16, 17) => { carte_ps.situations.last_mut().unwrap().code_agrement_1 = String::from_utf8_lossy(field.content).to_string(); } - (2, 18) => { + (2..=16, 18) => { carte_ps.situations.last_mut().unwrap().code_agrement_2 = String::from_utf8_lossy(field.content).to_string(); } - (2, 19) => { + (2..=16, 19) => { carte_ps.situations.last_mut().unwrap().code_agrement_3 = String::from_utf8_lossy(field.content).to_string(); } - (2, 20) => { + (2..=16, 20) => { carte_ps .situations .last_mut() @@ -236,7 +236,7 @@ fn decode_carte_ps(groups: Vec) -> Result { .habilitation_à_signer_une_facture = String::from_utf8_lossy(field.content).to_string(); } - (2, 21) => { + (2..=16, 21) => { carte_ps .situations .last_mut() @@ -348,6 +348,46 @@ mod test_decode_carte_ps { assert_eq!(carte_ps.situations[0].habilitation_à_signer_un_lot, "1"); } + #[test] + fn test_multiple_situations() { + let bytes: &[u8] = &[ + 0, 1, 51, // Block 01, Content size 51 + 1, 48, 1, 56, 11, 57, 57, 55, 48, 48, 53, 50, 52, 49, 57, 52, 1, 52, 2, 50, 50, 17, 80, + 72, 65, 82, 77, 65, 67, 73, 69, 78, 48, 48, 53, 50, 52, 49, 57, 9, 70, 82, 65, 78, 67, + 79, 73, 83, 69, 1, 84, 0, 2, 83, // Block 02, Content size 83 + 1, 1, 1, 48, 1, 49, 2, 56, 54, 1, 49, 9, 48, 66, 48, 50, 50, 49, 57, 53, 56, 1, 56, 24, + 80, 72, 65, 82, 77, 65, 67, 73, 69, 32, 68, 85, 32, 67, 69, 78, 84, 82, 69, 50, 50, 49, + 57, 53, 8, 48, 48, 50, 48, 50, 52, 49, 57, 1, 56, 0, 1, 48, 1, 49, 2, 53, 48, 2, 49, + 48, 2, 48, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 0, 3, + 83, // Block 03, Content size 83 + 1, 1, 1, 48, 1, 49, 2, 56, 54, 1, 49, 9, 48, 66, 48, 50, 50, 49, 57, 53, 56, 1, 56, 24, + 80, 72, 65, 82, 77, 65, 67, 73, 69, 32, 68, 85, 32, 67, 69, 78, 84, 82, 69, 50, 50, 49, + 57, 53, 8, 48, 48, 50, 48, 50, 52, 49, 57, 1, 56, 0, 1, 48, 1, 49, 2, 53, 48, 2, 49, + 48, 2, 48, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 0, 4, + 83, // Block 04, Content size 83 + 1, 1, 1, 48, 1, 49, 2, 56, 54, 1, 49, 9, 48, 66, 48, 50, 50, 49, 57, 53, 56, 1, 56, 24, + 80, 72, 65, 82, 77, 65, 67, 73, 69, 32, 68, 85, 32, 67, 69, 78, 84, 82, 69, 50, 50, 49, + 57, 53, 8, 48, 48, 50, 48, 50, 52, 49, 57, 1, 56, 0, 1, 48, 1, 49, 2, 53, 48, 2, 49, + 48, 2, 48, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, + ]; + let blocks = decode_ssv_memory(bytes, bytes.len()); + let carte_ps = decode_carte_ps(blocks).unwrap(); + + assert_eq!(carte_ps.situations.len(), 3); + assert_eq!( + carte_ps.situations[0].raison_sociale_structure, + "PHARMACIE DU CENTRE22195" + ); + assert_eq!( + carte_ps.situations[1].raison_sociale_structure, + "PHARMACIE DU CENTRE22195" + ); + assert_eq!( + carte_ps.situations[2].raison_sociale_structure, + "PHARMACIE DU CENTRE22195" + ); + } + #[test] #[should_panic] fn test_missing_field() {