Ajout de la lecture de carte CPS dans le moteur SESAM-Vitale #29

Merged
florian_briand merged 11 commits from feature_ssv_lire_carte_ps into main 2024-08-03 14:57:58 +02:00
Showing only changes of commit 83aef34750 - Show all commits

View File

@ -116,7 +116,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
let byte = field.content[0]; let byte = field.content[0];
carte_ps.titulaire.categorie_carte = byte as char; carte_ps.titulaire.categorie_carte = byte as char;
} }
(2, 1) => { (2..=16, 1) => {
carte_ps.situations.push(SituationPS::default()); carte_ps.situations.push(SituationPS::default());
carte_ps carte_ps
.situations .situations
florian_briand marked this conversation as resolved
Review
  • Gérer les index de groupe supérieurs à 2 (on peut avoir jusqu'à 16 situations)
- [x] Gérer les index de groupe supérieurs à 2 (on peut avoir jusqu'à 16 situations)
@ -124,19 +124,19 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.unwrap() .unwrap()
.numero_logique_de_la_situation_de_facturation_du_ps = field.content[0]; .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 = carte_ps.situations.last_mut().unwrap().mode_d_exercice =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 3) => { (2..=16, 3) => {
carte_ps.situations.last_mut().unwrap().statut_d_exercice = carte_ps.situations.last_mut().unwrap().statut_d_exercice =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 4) => { (2..=16, 4) => {
carte_ps.situations.last_mut().unwrap().secteur_d_activite = carte_ps.situations.last_mut().unwrap().secteur_d_activite =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 5) => { (2..=16, 5) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -144,7 +144,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.type_d_identification_structure = .type_d_identification_structure =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 6) => { (2..=16, 6) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -152,7 +152,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.numero_d_identification_structure = .numero_d_identification_structure =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 7) => { (2..=16, 7) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -160,7 +160,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.cle_du_numero_d_identification_structure = .cle_du_numero_d_identification_structure =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 8) => { (2..=16, 8) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -168,7 +168,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.raison_sociale_structure = .raison_sociale_structure =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 9) => { (2..=16, 9) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -176,7 +176,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.numero_d_identification_de_facturation_du_ps = .numero_d_identification_de_facturation_du_ps =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 10) => { (2..=16, 10) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -184,7 +184,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.cle_du_numero_d_identification_de_facturation_du_ps = .cle_du_numero_d_identification_de_facturation_du_ps =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 11) => { (2..=16, 11) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -192,7 +192,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.numero_d_identification_du_ps_remplaçant = .numero_d_identification_du_ps_remplaçant =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 12) => { (2..=16, 12) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -200,35 +200,35 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.cle_du_numero_d_identification_du_ps_remplaçant = .cle_du_numero_d_identification_du_ps_remplaçant =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 13) => { (2..=16, 13) => {
carte_ps.situations.last_mut().unwrap().code_conventionnel = carte_ps.situations.last_mut().unwrap().code_conventionnel =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 14) => { (2..=16, 14) => {
carte_ps.situations.last_mut().unwrap().code_specialite = carte_ps.situations.last_mut().unwrap().code_specialite =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 15) => { (2..=16, 15) => {
carte_ps.situations.last_mut().unwrap().code_zone_tarifaire = carte_ps.situations.last_mut().unwrap().code_zone_tarifaire =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 16) => { (2..=16, 16) => {
carte_ps.situations.last_mut().unwrap().code_zone_ik = carte_ps.situations.last_mut().unwrap().code_zone_ik =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 17) => { (2..=16, 17) => {
carte_ps.situations.last_mut().unwrap().code_agrement_1 = carte_ps.situations.last_mut().unwrap().code_agrement_1 =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 18) => { (2..=16, 18) => {
carte_ps.situations.last_mut().unwrap().code_agrement_2 = carte_ps.situations.last_mut().unwrap().code_agrement_2 =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 19) => { (2..=16, 19) => {
carte_ps.situations.last_mut().unwrap().code_agrement_3 = carte_ps.situations.last_mut().unwrap().code_agrement_3 =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 20) => { (2..=16, 20) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -236,7 +236,7 @@ fn decode_carte_ps(groups: Vec<Block>) -> Result<CartePS, String> {
.habilitation_à_signer_une_facture = .habilitation_à_signer_une_facture =
String::from_utf8_lossy(field.content).to_string(); String::from_utf8_lossy(field.content).to_string();
} }
(2, 21) => { (2..=16, 21) => {
carte_ps carte_ps
.situations .situations
.last_mut() .last_mut()
@ -348,6 +348,46 @@ mod test_decode_carte_ps {
assert_eq!(carte_ps.situations[0].habilitation_à_signer_un_lot, "1"); 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] #[test]
#[should_panic] #[should_panic]
fn test_missing_field() { fn test_missing_field() {