Aller au contenu

Serveur d'actes

serveur_actes

evenementsServeurActes / evenementServeurActe (actes CCAM) — un fichier par événement.

evenements (1 ligne = 1 fichier ; colonnes-chemins relatives à evenementServeurActe) obligatoires : evt_id, ipp, sexe, date_naissance facultatives : patient (ipp_recepteur, nom_usuel, nom_naissance, prenom), venue (nda, nda_recepteur, venue_date_entree, venue_heure_entree, venue_mode_entree, venue_uf_responsable, venue_date_sortie, venue_heure_sortie), intervention (intervention_id, intervention_date_debut, intervention_heure_debut, intervention_date_fin, intervention_heure_fin, intervention_uf, demande_date, demande_heure, demande_uf), identifiant_message, date_heure_production, commentaire

actes (1 ligne = 1 acteCCAM ; colonnes-chemins relatives à acteCCAM) obligatoires : evt_id, acte_id, code, activite, phase, date_execution, medecin facultatives : heure_execution, uf (UF exécutante), medecin_principal ("oui"), quantite, action ("creation"), facturable, valide, extension_pmsi, modificateurs (ex. "7J"), extension_documentaire, association_non_prevue

write_evenements_serveur_actes

write_evenements_serveur_actes(
    evenements: Table,
    actes: 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_acte: bool = False,
) -> list[Path]

Écrit des fichiers evenementsServeurActes (actes CCAM), un par événement.

Unité atomique du serveur d'actes : l'acte (acteCCAM), porteur de l'attribut action et d'un identifiant. par_acte=True écrit un message par acte.

Parameters:

Name Type Description Default
evenements Table

une ligne par événement : patient, venue, intervention.

required
actes Table

une ligne par acte CCAM.

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_acte bool

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

False

Returns:

Type Description
list[Path]

La liste des fichiers écrits.

Examples:

Script examples/exemple_serveur_actes.py :

# Régénère data/xml_tests/actes/00001.xml : une intervention et quatre actes CCAM.
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": "oui",
    "commentaire": "HPRIM-TEST",
    "date_heure_production": datetime(2024, 1, 1, 1, 1, 1),
}

# Une ligne par événement : patient, venue, intervention et demande
evenements = pl.DataFrame({
    "evt_id": ["00001_acte"],
    "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"],
    "venue/@prive": ["non"],
    "intervention_id": ["000000000001"],
    "intervention_date_debut": [date(2024, 1, 1)], "intervention_heure_debut": [time(8, 10)],
    "intervention_date_fin": [date(2024, 1, 1)], "intervention_heure_fin": [time(9, 0)],
    "intervention_uf": ["4321"],
    "demande_date": [date(2023, 12, 25)], "demande_heure": [time(2, 30)], "demande_uf": ["4321"],
})

# Une ligne par acte CCAM
actes = pl.DataFrame({
    "evt_id": ["00001_acte"] * 4,
    "acte_id": ["121212", "121213", "121214", "121215"],
    "code": ["EBLA003", "YYYY033", "EPLF002", "NFKA006"],
    "activite": [1] * 4, "phase": [0] * 4,
    "date_execution": [date(2024, 1, 1)] * 4, "heure_execution": [time(8, 10)] * 4,
    "medecin": ["01234567"] * 4, "uf": ["4321"] * 4,
    "quantite": ["1"] * 4,           # nombre5 : chaîne de chiffres dans le XSD
    "facturable": ["oui"] * 4, "valide": ["oui"] * 4,
})

fichiers = hx.write_evenements_serveur_actes(
    evenements, actes,
    entete=entete,
    out_dir="sortie/actes",          # -> sortie/actes/00001_acte.xml
    validate_xsd="warn",
)

read_evenements_serveur_actes

read_evenements_serveur_actes(
    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 evenementsServeurActes (actes CCAM) 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.

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", "actes"}.

iter_evenements_serveur_actes

iter_evenements_serveur_actes(
    evenements: Table,
    actes: Table,
    *,
    entete: dict | None = None,
    version: str | None = None,
    colmap: dict | None = None,
    par_acte: bool = False,
) -> Iterator[tuple[dict, dict]]

Itère sur (ligne evenement, arbre) : un arbre par événement, ou par acte avec par_acte=True (unité atomique du serveur d'actes).