diff --git a/crates/services-sesam-vitale-sys/src/bindings.rs b/crates/services-sesam-vitale-sys/src/bindings.rs new file mode 100644 index 0000000..c01f0ea --- /dev/null +++ b/crates/services-sesam-vitale-sys/src/bindings.rs @@ -0,0 +1,285 @@ +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] + +extern "C" { + // Fonctions de gestion des données + + pub fn SSV_LireCartePS( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_LireDroitsVitale( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + DateConsultation: *const ::std::os::raw::c_char, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_FormaterFactures( + cFactureACreer: ::std::os::raw::c_char, + cModeSecur: ::std::os::raw::c_char, + cTypeFlux: ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + TailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_ChiffrerFacture( + pZDataIn: *mut ::std::os::raw::c_void, + TailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_SignerFactureVitale( + pcNomRessourceVitale: *const ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_CalculerHashFactureAssure( + pcNumSerie: *const ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_AjouterSignatureAssureDansFacture( + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_SignerFactureCPS( + pcNomRessourcePS: *const ::std::os::raw::c_char, + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcCodePorteurPS: *const ::std::os::raw::c_char, + cNologSituation: ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_FormaterLot( + NBZDataIn: ::std::os::raw::c_short, + TZDataIn: *mut *mut ::std::os::raw::c_void, + TTailleZoneIn: *mut usize, + pNbZDataOut: *mut ::std::os::raw::c_short, + TZDataOut: *mut *mut ::std::os::raw::c_void, + TTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_SignerLotCPS( + pcNomRessourcePS: *const ::std::os::raw::c_char, + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcCodePorteurPS: *const ::std::os::raw::c_char, + cNologSituation: ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_FormaterFichier( + pZDataIn: *mut ::std::os::raw::c_void, + TailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_TraduireARL( + NbZDonneesEntree: ::std::os::raw::c_short, + TZDataIn: *mut *mut ::std::os::raw::c_void, + TTailleZoneIn: *mut usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_LireNumSerieCarteVitale( + pcNomRessource: *mut ::std::os::raw::c_char, + numeroSerie: *mut ::std::os::raw::c_uchar, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_CalculerHashFacturePS( + pcNumSerieCPS: *const ::std::os::raw::c_char, + pZDataIn: *mut ::std::os::raw::c_void, + usTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pusTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_AjouterSignaturePSFacture( + pZDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_DechargerFacturesPdT( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + pcNumFact: *const ::std::os::raw::c_char, + sNbZDataIn: ::std::os::raw::c_short, + pvTZDataIn: *mut *mut ::std::os::raw::c_void, + psTTailleDataIn: *mut usize, + pNbZDataOut: *mut ::std::os::raw::c_short, + TZDataOut: *mut *mut ::std::os::raw::c_void, + TTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_TraduireFSE( + pZDataIn: *mut ::std::os::raw::c_void, + TailleDataIn: usize, + pZDataOut: *mut *mut ::std::os::raw::c_void, + pTailleZone: *mut usize, + ) -> ::std::os::raw::c_ushort; + + // Fonctions TLA + // TLA (Terminal Lecteur Applicatif) -> lecteur autre que PC-SC, on ne prend pas en compte cela + + pub fn SSV_IdentifierTLA( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + NumVersionCDC: *const ::std::os::raw::c_char, + pZDataOut: *mut *mut ::std::os::raw::c_void, + tailleDataOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_ChargerDonneesTLA( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + sNbZDataIn: ::std::os::raw::c_short, + pvTZDataIn: *mut *mut ::std::os::raw::c_void, + psTTailleDataIn: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_ChargerFacturesPdT( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcNumFacturation: *const ::std::os::raw::c_char, + sNbZDataIn: ::std::os::raw::c_short, + pvTZDataIn: *mut *mut ::std::os::raw::c_void, + psTTailleDataIn: *mut usize, + pNbZDataOut: *mut ::std::os::raw::c_short, + TZDataOut: *mut *mut ::std::os::raw::c_void, + TTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_DechargerFSETLA( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + pcNumFact: *const ::std::os::raw::c_char, + pNbZDataOut: *mut ::std::os::raw::c_short, + TZDataOut: *mut *mut ::std::os::raw::c_void, + TTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_DechargerFSETLANC( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + pcNumFact: *const ::std::os::raw::c_char, + pNbZDataOut: *mut ::std::os::raw::c_short, + TZDataOut: *mut *mut ::std::os::raw::c_void, + TTailleZoneOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_DechargerBeneficiaires( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + cNumFacturation: *const ::std::os::raw::c_char, + sNbZDataOut: *mut ::std::os::raw::c_short, + pTZDataOut: *mut *mut ::std::os::raw::c_void, + sTTailleDataOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_EffacerTLA( + NomRessourcePS: *const ::std::os::raw::c_char, + NomRessourceLecteur: *const ::std::os::raw::c_char, + CodePorteurPS: *const ::std::os::raw::c_char, + cNumFacturation: *const ::std::os::raw::c_char, + cTypeDonnee: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_ushort; + pub fn SSV_SecuriserFacture( + pcNomRessourcePS: *const ::std::os::raw::c_char, + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcCodePorteurPS: *const ::std::os::raw::c_char, + cNologSituation: ::std::os::raw::c_char, + pcNumFact: *const ::std::os::raw::c_char, + pvDataIn: *mut ::std::os::raw::c_void, + szTailleDataIn: usize, + pvDataOut: *mut *mut ::std::os::raw::c_void, + pszTailleDataOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + + // Fonctions de gestion de configuration (GALSS) + + pub fn SSV_LireConfig( + pZDataOut: *mut *mut ::std::os::raw::c_void, + psTailleDataOut: *mut usize, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_LireDateLecteur( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcDateHeure: *mut ::std::os::raw::c_char, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_MajDateLecteur( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + pcDateHeure: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_ushort; + + pub fn SSV_ChargerAppli( + pcNomRessourceLecteur: *const ::std::os::raw::c_char, + sNbZDataIn: ::std::os::raw::c_short, + pvTZDataIn: *mut *mut ::std::os::raw::c_void, + psTTailleDataIn: *mut usize, + ) -> ::std::os::raw::c_ushort; + + // Fonctions techniques + + // La fonction Initialiser Librairie a pour objet de charger et d’initialiser dans la mémoire du système : + // - dans le cas où le GALSS est installé sur le poste : + // - la bibliothèque du Gestionnaire d’Accès au Lecteur Santé Social (GALSS), + // - qui charge la bibliothèque du Protocole Santé Social (PSS), + // - la configuration du poste de travail à l’aide du fichier galssinf, + // - les variables globales communes aux différents Services SESAM-Vitale, + // - les fichiers de tables et scripts des répertoires par défaut. + // Cette fonction accède au référentiel électronique en utilisant le chemin complet indiqué dans le fichier sesam.ini. + pub fn SSV_InitLIB2(pcFichierSesam: *const ::std::os::raw::c_char) -> ::std::os::raw::c_ushort; + + // La fonction Terminer a pour objet de décharger de la mémoire du système les éléments + // chargés par la fonction Initialiser Librairie, qui ne sont plus utiles. + pub fn SSV_TermLIB() -> ::std::os::raw::c_ushort; + + /// Fonctions de Tracage + //La fonction Allouer Zone Mémoire a un rôle purement technique : elle permet d’allouer, autrement dit de réserver une zone ou partie de la mémoire du poste de travail pour y écrire les données à passer en entrée d’un Service SESAM-Vitale. + // Cette fonction doit être utilisée pour allouer toutes les zones de mémoire requises en entrée des Services SESAM-Vitale de manière à permettre un diagnostic fiable par le « mode trace » en cas de dysfonctionnement. En effet, son mode d’exécution est susceptible de fournir des informations utiles au « mode trace » lorsqu’il est activé. + pub fn SSV_AllouerZoneMem( + pZDataIn: *mut *mut ::std::os::raw::c_void, + taille: usize, + ) -> ::std::os::raw::c_ushort; + + // La fonction Libérer Zone Mémoire a un rôle purement technique : elle permet de libérer une zone de mémoire du poste de travail précédemment allouée après exploitation des données qu’elle contient. + // Cette fonction doit être utilisée pour libérer toutes les zones de mémoire : + // - celles qui ont été allouées par le progiciel de santé pour fournir les données nécessaires à l’entrée des Services SESAM-Vitale, avant leur appel, celles qui ont été allouées par les Services SESAM-Vitale pour fournir en sortie les données utiles au progiciel de santé qui a fait appel à ces services, + // - de façon à permettre un diagnostic fiable par le mode trace en cas de dysfonctionnement + //En effet, son exécution est susceptible de fournir des informations utiles au « mode trace » lorsqu’il est activé. + pub fn SSV_LibererZoneMem(pZone: *mut ::std::os::raw::c_void); + + // La fonction Initialiser Trace a pour objet de permettre l’activation du « mode trace ». + // Ce mode de fonctionnement est prévu pour permettre à l’assistance technique du GIE + // SESAM-Vitale d’analyser les problèmes de mise en œuvre des Services SESAM-Vitale, + // notamment lorsque une fonction retourne un code d’erreur de valeur hexadécimale supérieure à FF00. + pub fn SSV_InitTrace( + pathConf: *mut ::std::os::raw::c_char, + ModeOuvertureFicherLog: *mut ::std::os::raw::c_char, + ModuleLog: ::std::os::raw::c_ushort, + NiveauLog: ::std::os::raw::c_uchar, + ) -> ::std::os::raw::c_ushort; + +} diff --git a/crates/services-sesam-vitale-sys/src/types/common.rs b/crates/services-sesam-vitale-sys/src/types/common.rs new file mode 100644 index 0000000..08ce7eb --- /dev/null +++ b/crates/services-sesam-vitale-sys/src/types/common.rs @@ -0,0 +1,264 @@ +pub struct Identification { + value: T, + // Key to check the validity of the value + // TODO: implement checking algorithm + key: u8, +} + +pub type Byte = u8; + +pub(crate) enum IdentificationNationale { + NumeroAdeli(String), + NumeroEmployeeDansStructure(IdentificationStructure, String), + NumeroDRASS(String), + NumeroRPPS(String), + /// N° Etudiant Médecin type ADELI sur 9 caractères (information transmise par l’ANS) + NumeroEtudiantMedecin(String), +} + +pub(crate) enum TypeCarteProfessionnelSante { + /// Carte de Professionnel de Santé (CPS) + CarteDeProfessionnelSante, + /// Carte de Professionnel de Santé en Formation (CPF) + CarteDeProfessionnelSanteEnFormation, + /// Carte de Personnel d'Établissement de Santé (CDE/CPE) + CarteDePersonnelEtablissementSante, + /// Carte de Personnel Autorisé (CDA/CPA) + CarteDePersonnelAutorise, + /// Carte de Personne Morale + CarteDePersonneMorale, +} + +pub(crate) enum CategorieCarteProfessionnelSante { + Reelle, + Test, + Demonstration, +} + +pub(crate) enum CodeCivilite { + Adjudant, + Amiral, + Aspirant, + Aumônier, + Capitaine, + Cardinal, + Chanoine, + Colonel, + Commandant, + Commissaire, + Conseiller, + Directeur, + Docteur, + Douanier, + Epouxse, // Epoux(se) + Evêque, + Général, + Gouverneur, + Ingénieur, + Inspecteur, + Lieutenant, + Madame, + Mademoiselle, + Maître, + Maréchal, + Médecin, + Mesdames, + Mesdemoiselles, + Messieurs, + Monseigneur, + Monsieur, + NotreDame, + Pasteur, + Préfet, + Président, + Professeur, + Recteur, + Sergent, + SousPréfet, + Technicien, + Veuve, +} + +pub(crate) enum IdentificationStructure { + NumeroAdeliCabinet(String), + NumeroFINESS(String), + NumeroSIREN(String), + NumeroSIRET(String), + NumeroRPPSCabinet(String), +} + +pub(crate) enum ModeExercice { + LiberalExploitantCommercant, // Libéral, exploitant, commerçant + Salarie, + Remplacant, + Benevole, +} + +pub(crate) enum StatutExercice { + // TAB-Statuts géré par l’ANS il faut trouver la donnee + PLACEHOLDER(u8), +} + +pub(crate) enum SecteurActivite { + EtablissementPublicDeSanté, + HopitauxMilitaires, + EtablissementPrivePSPH, // Participant au Service Public Hospitalier + EtablissementPriveNonPSPH, + DispensaireDeSoins, + AutresStructuresDeSoinsRelevantDuServiceDeSanteDesArmees, + CabinetIndividuel, + CabinetDeGroupe, + ExerciceEnSociete, + SecteurPrivePHTempsPlein, + TransportSanitaire, + EntrepriseDInterim, + EtablissementDeSoinsEtPrevention, + PreventionEtSoinsEnEntreprise, + SanteScolaireEtUniversitaire, + RecrutementEtGestionRH, + PMIPlanificationFamiliale, + EtablissementPourHandicapes, + ComMarketingConsultingMedia, + EtablissementPersonnesAgees, + EtablissementAideaLaFamille, + EtablissementDEnseignement, + EtablissementsDeProtectionDeLEnfance, + EtablissementsDHebergementEtDeReadaptation, + Recherche, + AssurancePrivee, + OrganismeDeSecuriteSociale, + MinistèreEtServicesDeconcentres, + CollectivitesTerritoriales, + AssociationsEtOrganitationsHumanitaire, + LaboratoireDeBiologieMedicale, + AutreEtablissementSanitaire, + ProductionCommercialisationGrosBienMedicaux, + CommerceDétailDeBiensMédicaux, + PharmacieDOfficine, + CentreDeDialyse, + ParaPharmacie, + AutreSecteurDActivité, + SecteurNonDefini, + CentreAntiCancer, + CentreDeTransfusionSanguine, + RépartitionDistribributionFabricationExploitationImportationMedicamentsEtDispositifsMédicaux, + IncendiesEtSecours, + EntreprisesIndustriellesEtTertiairesHorsIndustriesPharmaceutiques, + EntiteDUnTOM, + FabricationExploitationImportationMedicamentsEtDispositifsMedicaux, +} + +pub(crate) type IdentificationFacturation = u32; +pub(crate) enum CodeConventionnel { + NonConventionne, + Conventionne, + ConventionneAvecDepassement, + ConventionneAvecHonorairesLibres, +} + +/// Code spécialité ou Code spécialité de l'exécutant +pub(crate) enum CodeSpecialite { + MedecineGenerale, + AnesthesieReanimation, + Cardiologie, + ChirurgieGenerale, + DermatologieEtVenerologie, + Radiologie, + GynecologieObstetrique, + GastroEnterologieEtHepatologie, + MedecineInterne, + NeuroChirurgie, + OtoRhinoLaryngologie, + Pediatrie, + Pneumologie, + Rhumatologie, + Ophtalmologie, + ChirurgieUrologique, + NeuroPsychiatrie, + Stomatologie, + ChirurgienDentiste, + ReanimationMedicale, + SageFemme, + SpecialisteEnMedecineGeneraleAvecDiplome, + SpecialisteEnMedecineGeneraleReconnuParLOrdre, + Infirmier, + Psychologue, + MasseurKinesitherapeute, + PedicurePodologue, + Orthophoniste, + Orthoptiste, + LaboratoireDAnalysesMedicales, + ReeducationReadaptationFonctionnelle, + Neurologie, + Psychiatrie, + Geriatrie, + Nephrologie, + ChirurgieDentaireSpecialiteODF, + AnatomoCytoPathologie, + MedecinBiologiste, + LaboratoirePolyvalent, + LaboratoireDAnatomoCytoPathologique, + ChirurgieOrthopediqueEtTraumatologie, + EndocrinologieEtMetabolisme, + ChirurgieInfantile, + ChirurgieMaxilloFaciale, + ChirurgieMaxilloFacialeEtStomatologie, + ChirurgiePlastiqueReconstructriceEtEsthetique, + ChirurgieThoraciqueEtCardioVasculaire, + ChirurgieVasculaire, + ChirurgieVisceraleEtDigestive, + PharmacieDOfficine, + PharmacieMutualiste, + ChirurgienDentisteSpecialiteCO, + ChirurgienDentisteSpecialiteMBD, + PrestataireDeTypeSociete, + PrestataireArtisan, + PrestataireDeTypeAssociation, + Orthesiste, + Opticien, + Audioprothesiste, + ÉpithesisteOculariste, + PodoOrthesiste, + Orthoprothesiste, + ChirurgieOrale, + GynecologieMedicale, + Hematologie, + MedecineNucleaire, + OncologieMedicale, + OncologieRadiotherapique, + PsychiatrieDeLEnfantEtDeLAdolescent, + Radiotherapie, + Obstetrique, + GenetiqueMedicale, + ObstetriqueEtGynecologieMedicale, + SantePubliqueEtMedecineSociale, + MedecineDesMaladiesInfectieusesEtTropicales, + MedecineLegaleEtExpertisesMedicales, + MedecineDUrgence, + MedecineVasculaire, + Allergologie, + InfirmierExercantEnPratiquesAvancees, // IPA +} + +/// Page 54 dictionnaires des donnees +/// donnees inutilises pour les pharmacies +pub(crate) enum CodeZoneTarifaire {} + +pub(crate) enum CodeZoneIK { + PasIndemniteKilometrique, + IndemnitesKilometriquesPlaine, + IndemnitesKilometriquesMontagne, +} + +pub(crate) enum CodeAgrement { + PasDAgrementRadio, + /// Agrément D ou agrément DDASS + AgrementDDASS, + /// Agrément A, B, C, E et F + AgrementABCEF, + /// Agrément G, H et J + AgrementGHJ, + AgrementK, + AgrementL, + AgrementM, +} diff --git a/crates/services-sesam-vitale-sys/src/types/mod.rs b/crates/services-sesam-vitale-sys/src/types/mod.rs new file mode 100644 index 0000000..6e75369 --- /dev/null +++ b/crates/services-sesam-vitale-sys/src/types/mod.rs @@ -0,0 +1,3 @@ +pub(crate) mod types; +pub mod common; +pub mod serialization_types; diff --git a/crates/services-sesam-vitale-sys/src/types/serialization_types.rs b/crates/services-sesam-vitale-sys/src/types/serialization_types.rs new file mode 100644 index 0000000..9b9de2d --- /dev/null +++ b/crates/services-sesam-vitale-sys/src/types/serialization_types.rs @@ -0,0 +1,81 @@ +use std::cmp::Ordering; + +use binrw::{BinRead, BinResult}; +use bitreader::{BitReader, BitReaderError}; + +fn parse_memory_zone_size_bitreader(bytes: &[u8; 5]) -> Result { + let mut reader = BitReader::new(bytes); + + let zone_size_bit_count = match reader.read_bool()? { + true => 7, + false => reader.read_u8(7)? * 8, + }; + Ok(reader.read_u32(zone_size_bit_count)?) +} + +#[binrw::parser(reader)] +fn parse_memory_zone_size() -> BinResult { + let mut value: u8 = 0; + + + reader.read_exact(std::slice::from_mut(&mut value)); + + // first bit s 0 <=> value < 128 + match value.cmp(&128) { + Ordering::Less => { + Ok(value.into()) + } + Ordering::Equal | Ordering::Greater => { + let zone_size_encoding_byte_count = value - 128; + let mut buf: Vec = vec![0; zone_size_encoding_byte_count.into()]; + reader.read_exact(&mut buf); + + let mut result = 0u32; + + for (i, &byte) in buf.iter().enumerate() { + result += (byte as u32) << (8 * i); + } + + Ok(result) + } + } +} + +#[derive(BinRead)] +struct MemoryZone { + #[br(parse_with = parse_memory_zone_size)] + memory_size: u32, +} + +enum TypeIdentificationStructure { + NumeroAdeliCabinet, + NumeroFINESS, + NumeroSIREN, + NumeroSIRET, + NumeroRPPSCabinet, +} + +pub enum TypeDIdentificationNationale { + NumeroAdeli, + NumeroAdeliCabinetNumeroEmploye, + NumeroDRASS, + NumeroFINESSNumeroEmploye, + NumeroSIRENNumeroEmploye, + NumeroSIRETNumeroEmploye, + NumeroRPPSCabinetNumeroEmploye, + NumeroRPPS, + /// N° Etudiant Médecin type ADELI sur 9 caractères (information transmise par l’ANS) + NumeroEtudiantMedecin, +} +pub(crate) enum TypeCartePS { + /// Carte de Professionnel de Santé (CPS) + CarteDeProfessionnelSante, + /// Carte de Professionnel de Santé en Formation (CPF) + CarteDeProfessionnelSanteEnFormation, + /// Carte de Personnel d'Établissement de Santé (CDE/CPE) + CarteDePersonnelEtablissementSante, + /// Carte de Personnel Autorisé (CDA/CPA) + CarteDePersonnelAutorise, + /// Carte de Personne Morale + CarteDePersonneMorale, +} diff --git a/crates/services-sesam-vitale-sys/src/types/types.rs b/crates/services-sesam-vitale-sys/src/types/types.rs new file mode 100644 index 0000000..7d26301 --- /dev/null +++ b/crates/services-sesam-vitale-sys/src/types/types.rs @@ -0,0 +1,45 @@ +pub(crate) use crate::types::common::IdentificationNationale; + +use super::common::{ + Byte, CategorieCarteProfessionnelSante, CodeAgrement, CodeCivilite, CodeConventionnel, + CodeSpecialite, CodeZoneIK, CodeZoneTarifaire, Identification, IdentificationFacturation, + IdentificationStructure, ModeExercice, SecteurActivite, StatutExercice, + TypeCarteProfessionnelSante, +}; + +pub(crate) struct CarteProfessionnelSante { + type_carte: TypeCarteProfessionnelSante, + categorie_carte: CategorieCarteProfessionnelSante, + professionnel_sante: ProfessionnelDeSante, +} + +struct ProfessionnelDeSante { + prenom: String, + nom: String, + code_civilite: CodeCivilite, + identification_nationale: Identification, + situations_execice: Vec, +} +struct StructureMedicale { + /// Nom Entreprise + raison_sociale: String, + identification: Identification, +} + +struct SituationDExercice { + /// Numéro identifiant la situation du PS parmi ses autres situations inscrites sur sa CPS + identifiant_situation: Byte, + mode_exercice: Option, + statut_exercice: Option, + secteur_activite: Option, + structure_d_exercice: Option, + identification_facturation: Identification, + identification_remplacant: Option>, + code_conventionnel: CodeConventionnel, + code_specialite: CodeSpecialite, + code_zone_tarifaire: CodeZoneTarifaire, + code_zone_ik: CodeZoneIK, + code_agrement: CodeAgrement, + habilite_signature_facture: bool, + habilite_signature_lot: bool, +}