Aller au contenu

États patient

etat_patient

evenementsServeurEtatsPatient (diagnostics, IGS2…) — un fichier par événement.

evenements (1 ligne = 1 fichier ; colonnes-chemins relatives à la racine du message) obligatoires : evt_id, ipp, sexe, date_naissance facultatives : patient, venue et intervention comme pour le serveur d'actes, date_observation, heure_observation (élément dateObservation), recueil_id, recueil_date, recueil_heure, recueil_uf (élément recueil : date et UF où les états ont été observés), identifiant_message, date_heure_production, commentaire

Le XSD impose un repère, au choix : intervention (colonnes intervention_*),
dateObservation (date_observation) ou recueil (colonnes recueil_*). Le recueil est le
plus précis : il porte l'UF d'observation, qui permet au récepteur de retrouver le RUM.
Le contenu est un choix exclusif : Diagnostics (table ``diagnostics``), ou igs2,
dependances… (colonnes-chemins, par exemple ``igs2/@age``).

diagnostics (1 ligne = 1 diagnostic ; colonnes-chemins relatives à diagnostic) obligatoires : evt_id, type, code facultatives : date_action, action ("creation") type suit l'énumération du XSD : dp, dr, da, ds, dd, fpc, mm, ae (mis en minuscules ; DP et dp sont équivalents).

write_evenements_etat_patient

write_evenements_etat_patient(
    evenements: Table,
    diagnostics: Table,
    *,
    entete: dict | None = None,
    out_dir: str | Path,
    filename: str | Callable[[dict], str] = "{evt_id}.xml",
    version: str | None = None,
    xmlns: str | None = HPRIM_NS,
    encoding: str = "UTF-8",
    validate_xsd: str | bool = "error",
    colmap: dict | None = None,
    identifiant_egal_nom_fichier: bool = True,
    fichier_ok: bool = False,
    par_diagnostic: bool = False,
) -> list[Path]

Écrit des fichiers evenementsServeurEtatsPatient (diagnostics), un par événement.

Unité atomique des états patient (pour les diagnostics) : le diagnostic, porteur de l'attribut action et d'un identifiant. par_diagnostic=True écrit un message par diagnostic. L'IGS2, unique par message, est atomique par construction.

Parameters:

Name Type Description Default
evenements Table

une ligne par événement : patient, venue, intervention. Les colonnes-chemins sont relatives à la racine du message.

required
diagnostics Table

une ligne par diagnostic (type : dp, dr, da, ds, dd, fpc, mm, ae).

required
entete dict | None

voir write_evenements_pmsi.

None
out_dir str | Path

dossier de sortie.

required
filename str | Callable[[dict], str]

gabarit ou fonction.

'{evt_id}.xml'
version str | None

version du schéma.

None
xmlns str | None

voir write_evenements_pmsi.

HPRIM_NS
encoding str

encodage des fichiers.

'UTF-8'
validate_xsd str | bool

"error" (défaut), "warn" ou False.

'error'
colmap dict | None

renommage de colonnes.

None
identifiant_egal_nom_fichier bool

si vrai (défaut), l'identifiantMessage de chaque message est exactement le nom de son fichier sans extension (evt_id, ou {evt_id}_{rum_id} avec par_rum, ou ce que donne filename). Une colonne identifiant_message différente lève une erreur. False : identifiant et nom de fichier indépendants (utile pour réécrire des fichiers d'autres producteurs).

True
fichier_ok bool

dépose un fichier .ok vide, de même nom, une fois chaque .xml écrit intégralement (marqueur de dépôt complet pour le destinataire). Le .xml est toujours écrit de façon atomique (nom temporaire puis renommage).

False
par_diagnostic bool

un message par diagnostic (unité atomique) au lieu d'un par événement. Le contexte (patient, venue, repère) est répété ; evt_id vaut {evt_id}_{rang}, et le gabarit filename dispose aussi de {evt_origine} et {rang}.

False

Returns:

Type Description
list[Path]

La liste des fichiers écrits.

Examples:

Script examples/exemple_etat_patient.py :

# Régénère data/xml_tests/etat_patient/00001.xml : diagnostics DP et DR.
from datetime import date, datetime, time

import polars as pl

import pyhprimxml as hx

entete = {
    "version": "2.00",                   # version HPRIM XML des messages
    "emetteur": "TEST",
    "destinataire": None,
    "acquittement_attendu": "non",
    "commentaire": "HPRIM-TEST",
    "date_heure_production": datetime(2024, 1, 1, 1, 1, 1),
}

# Une ligne par événement : patient, venue, intervention
# (ici, les colonnes-chemins sont relatives à la racine du message)
evenements = pl.DataFrame({
    "evt_id": ["00001_esep"],
    "ipp": ["123456789"], "ipp_recepteur": ["123456789"],
    "sexe": ["M"], "nom_usuel": ["SANDWICK"], "prenom": ["JOHN"],
    "date_naissance": [date(1970, 1, 1)],
    "nda": ["987654321"], "nda_recepteur": ["987654321"],
    "venue_date_entree": [date(2024, 1, 1)], "venue_heure_entree": [time(8, 0)],
    "venue_uf_responsable": ["4321"],
    "intervention_id": ["000000000001"], "intervention_uf": ["4321"],
    "patient/@confidentiel": ["non"], "venue/@prive": ["non"],
    "patient/identifiant/emetteur/@etat": ["permanent"],
    "patient/identifiant/emetteur/@portee": ["local"],
    "patient/identifiant/emetteur/@referent": ["non"],
    "patient/identifiant/recepteur/@etat": ["permanent"],
    "patient/identifiant/recepteur/@portee": ["local"],
    "patient/identifiant/recepteur/@referent": ["non"],
})

# Une ligne par diagnostic ; type dans dp, dr, da, ds, dd, fpc, mm, ae
diagnostics = pl.DataFrame({
    "evt_id": ["00001_esep", "00001_esep"],
    "type": ["dp", "dr"],
    "code": ["Z511", "C10"],
    "date_action": [datetime(2024, 1, 1, 8, 10)] * 2,
})

fichiers = hx.write_evenements_etat_patient(
    evenements, diagnostics,
    entete=entete,
    out_dir="sortie/etat_patient",   # -> sortie/etat_patient/00001_esep.xml
    validate_xsd="warn",
)

read_evenements_etat_patient

read_evenements_etat_patient(
    sources: Sources,
    *,
    extra: dict[str, list[str]] | None = None,
    version: str | None = None,
    backend: str = "polars",
    exiger_ok: bool = False,
) -> dict[str, Table]

Lit des fichiers evenementsServeurEtatsPatient vers des tables.

Parameters:

Name Type Description Default
sources Sources

fichier, dossier, motif glob, bytes ou liste.

required
extra dict[str, list[str]] | None

colonnes-chemins supplémentaires, par table (evenements : relatives à la racine du message).

None
version str | None

forcer une version de schéma.

None
backend str

"polars" ou "pandas".

'polars'
exiger_ok bool

ne lit que les .xml accompagnés de leur .ok (dépôt terminé) ; les autres sont ignorés, avec un avertissement.

False

Returns:

Type Description
dict[str, Table]

{"evenements", "diagnostics"}.

iter_evenements_etat_patient

iter_evenements_etat_patient(
    evenements: Table,
    diagnostics: Table,
    *,
    entete: dict | None = None,
    version: str | None = None,
    colmap: dict | None = None,
    par_diagnostic: bool = False,
) -> Iterator[tuple[dict, dict]]

Itère sur (ligne evenement, arbre) : un arbre par événement, ou par diagnostic avec par_diagnostic=True (unité atomique des états patient pour les diagnostics).