hpk-parser について
hpk-parser は、フランスの医療現場における Hexagone システムの HPK 医療メッセージを解析・説明するスキルです。メッセージ種別の識別、フィールド抽出とラベル付け、構造検証を行い、HPK 仕様に基づいて内容を解説します。
主な機能
- 01パイプ区切り HPK メッセージの解析
- 02100 種類以上のメッセージに対応
- 03フィールドの抽出とラベル付け
- 04構造、フィールド数、データ型の検証
- 05読みやすいメッセージ解説
- 06HL7 v2.5 または IHE PAM へのマッピング
活用シーン
- 01形式不正な HPK メッセージのデバッグ
- 02HPK 定義に沿ったメッセージフィールドの確認
- 03連携作業向け HPK 例の文書化
- 04HPK メッセージの HL7 または IHE PAM へのマッピング
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dedalus-erp-pas/ foundation-skills --skill hpk-parserインストール後、Claude Code で/hpk-parserを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
fixtures/identity/id_m1_create.jsonfixtures/movements/mv_m2_admission.jsonmv_m6_transfer.jsonmv_m9_discharge.jsonreference/README.md詳細
HPK メッセージの解析と解説
概要
このスキルは、フランスの医療環境で Hexagone システムが使用する独自のパイプ区切り医療メッセージ形式である HPK(Healthcare Protocol Kernel)メッセージを解析し、解説します。パーサーは複数のドメイン(患者管理、サプライチェーン、在庫、財務、組織)にまたがる 100 種類以上のメッセージタイプに対応し、メッセージタイプの特定、すべてのフィールドの抽出、構造の検証を行い、公式 HPK 辞書と仕様に基づいて人が読みやすい解説を提供します。
主な信頼できる情報源:
- HPK Dictionary(
@erp-pas/hpk-dictionary)- 完全なメッセージスキーマ、フィールド定義、検証ルールを含む GitLab リポジトリ - HPK ADT Message Specification - 患者管理メッセージの包括的なフィールド定義
- HPK GEF Specification - ワークフロー統合および経済・財務管理メッセージ
対応範囲:
- 患者管理:ID(ID)、移動(MV)、適用範囲(CV)- 12 種類以上のメッセージタイプ
- サプライチェーン:製品(PR)、サプライヤー(FO)、市場(MA)、注文(CO)、納品(LI)、受領(RO)- 20 種類以上のメッセージタイプ
- 財務:請求書(FA)、その他の入金(RD)- 4 種類以上のメッセージタイプ
- 在庫:在庫移動(SO)、資産在庫(IM)- 5 種類以上のメッセージタイプ
- 組織:組織構造(ST)、ユーザー(UT)- 6 種類以上のメッセージタイプ
- 依頼:作成依頼(DD)- 2 種類以上のメッセージタイプ
このスキルの使用場面:
- 任意の HPK メッセージを解析して解説する(あらゆるシステムドメインからの生テキスト入力)
- HPK メッセージタイプとモードを特定する(ID|M1|C、MV|M2|C、PR|M0|C など)
- 仕様に従ってすべての HPK フィールドを抽出し、ラベル付けする
- HPK メッセージの構造、フィールド数、データ型を検証する
- HPK のビジネスルールとフィールドマッピングを把握する
- HPK メッセージの問題やデータ品質上の問題をデバッグする
- 解説付きで HPK メッセージの例を文書化する
- HPK 辞書への準拠とフィールド定義を確認する
- HPK メッセージを HL7 v2.5 または IHE PAM の同等形式にマッピングする
- Hexagone WEB の統合シナリオにおける HPK メッセージフローを分析する
- HPK メッセージの生成ツールやパーサーの開発を支援する
- Hexagone WEB と外部システム間のインターフェースの問題を解決する
HPK メッセージ形式
HPK メッセージではフィールド区切り文字としてパイプ(|)を使用し、次の構造を取ります:
Type|Message|Mode|Emetteur|Date|User|...additional fields...
コアフィールド(位置 0~5):
- フィールド 0:メッセージタイプ(
ID= 本人情報、MV= 移動、CV= 適用範囲) - フィールド 1:メッセージコード(
M1、M2、M3、M6、M8、M9、MT、CE、B1など) - フィールド 2:モード(
C= 作成、M= 変更、D= 削除) - フィールド 3:送信元(送信者/ソースシステム)
- フィールド 4:日時(形式:
YYYYMMDDHHmmss) - フィールド 5:ユーザー ID
メッセージタイプ
本人情報メッセージ(ID|*)
ID|M1 - 患者の本人情報(作成/変更)
目的:患者の人口統計情報(登録)
フィールド構造(全 38 フィールド):
0: Type (ID)
1: Message (M1)
2: Mode (C/M/D)
3: Emetteur (Sender)
4: Date (YYYYMMDDHHmmss)
5: User
6: IPP (Patient ID)
7: Nom (Last Name)
8: Prénom (First Name)
9: Date de naissance (YYYYMMDD)
10: Sexe (M/F/U)
11: Adresse
12: Code postal
13: Ville
14: Pays
15: Téléphone
16: Téléphone portable
17: Email
18: Nom de naissance
19: Prénom usuel
20: Situation familiale
21: Nombre d'enfants
22: Profession
23: Médecin traitant
24: Établissement de naissance
25: Ville de naissance
26: Pays de naissance
27: Nationalité
28: INS (Identifiant National de Santé)
29: INS-C (Calcul)
30: NIR (Numéro de Sécurité Sociale)
31: Clé NIR
32: OID NIR
33: Matricule d'identité
34: Pays identité
35: Date décès (YYYYMMDD)
36: Indicateur de décès
37: Commentaire
例:
ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||
解説:
- タイプ:本人情報メッセージ
- コード:M1(患者の人口統計情報)
- モード:C(作成 - 新規患者の登録)
- 患者:DUPONT JEAN、生年月日 15/03/1975、男性
- 連絡先:06 12 34 56 78、15 RUE DE LA PAIX、75001 PARIS、フランス
- システム:HEXAGONE システムからのメッセージ、ユーザー USER001、タイムスタンプ 22/01/2026 12:00:00
ID|MT - 主治医
目的:患者の主治医(médecin traitant)を割り当てる、または更新する
フィールド構造(全 13 フィールド):
0: Type (ID)
1: Message (MT)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Code médecin traitant
8: Nom médecin traitant
9: Prénom médecin traitant
10: Spécialité
11: Date début
12: Date fin
例:
ID|MT|C|HEXAGONE|20260122120000|USER001|PAT12345|PR_MARTIN|MARTIN|SOPHIE|CARDIOLOGUE|20260122||
解説:
- タイプ:本人情報メッセージ
- コード:MT(Médecin Traitant - 主治医)
- モード:C(作成 - 新しい主治医を割り当て)
- 患者:PAT12345
- 医師:Dr. MARTIN SOPHIE、循環器専門医、コード PR_MARTIN
- 有効期間:22/01/2026 から(終了日なし)
ID|CE - インフォームド・コンセント
目的:治療/データ処理に関する患者の同意を記録する
フィールド構造(全 11 フィールド):
0: Type (ID)
1: Message (CE)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Type consentement
8: Statut (OUI/NON)
9: Date début validité
10: Date fin validité
移動メッセージ(MV|*)
MV|M2 - 入院
目的:病院への入院(入院)
フィールド構成(全19フィールド):
0: Type (MV)
1: Message (M2)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Numéro de séjour (Visit ID)
8: Date/heure entrée (YYYYMMDDHHmmss)
9: Mode d'entrée (URGENCE/MUTATION/DOMICILE)
10: Établissement
11: Service
12: Unité fonctionnelle (UF)
13: Lit
14: Médecin responsable
15: Provenance
16: Type hospitalisation
17: Mode de traitement
18: Motif d'admission
例:
MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||
説明:
- 種別:移動メッセージ
- コード:M2(病院への入院)
- モード:C(作成 - 新規入院)
- 患者:PAT12345
- 来院:VIS20260122001(一意の来院識別子)
- 入院:22/01/2026 14:00:00、救急部門経由
- 場所:CHU_PARIS、循環器科、UF_CARDIO_01、病床 LIT_001
- ケアチーム:担当医 PR_MARTIN
MV|M3 - ステータス変更
目的:患者の事務上のステータス変更
フィールド構成:
0-5: Common fields (Type, Message, Mode, Emetteur, Date, User)
6: IPP
7: Numéro de séjour
8: Ancien statut
9: Nouveau statut
10: Date changement statut
11: Motif changement
MV|M6 - 病棟入室/転棟
目的:患者の病棟または診療科間の移動
フィールド構成(全18フィールド):
0: Type (MV)
1: Message (M6)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Numéro de séjour
8: Nouvelle UF
9: Nouveau lit
10: Nouveau service
11: Ancienne UF
12: Ancien lit
13: Ancien service
14: Date/heure mouvement
15: Mode de transfert
16: Nouveau médecin responsable
17: Motif de transfert
例:
MV|M6|C|HEXAGONE|20260123090000|USER002|PAT12345|VIS20260122001|UF_NEURO_01|LIT_102|NEURO|UF_CARDIO_01|LIT_001|CARDIO||||||
説明:
- 種別:移動メッセージ
- コード:M6(病棟間の移動)
- モード:C(作成 - 新規移動イベント)
- 患者:来院 VIS20260122001 の PAT12345
- 移動元:循環器科 UF_CARDIO_01、病床 LIT_001
- 移動先:神経内科 UF_NEURO_01、病床 LIT_102
- 日時:23/01/2026 09:00:00
MV|M8 - 病棟退室
目的:機能病棟からの退室(退院を伴わない)
フィールド構成:
0-5: Common fields
6: IPP
7: Numéro de séjour
8: UF de sortie
9: Date/heure sortie UF
10: Destination
11: Mode de sortie
MV|M9 - 退院
目的:患者の病院からの退院
フィールド構成(全14フィールド):
0: Type (MV)
1: Message (M9)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Numéro de séjour
8: Date/heure sortie (YYYYMMDDHHmmss)
9: Mode de sortie (DOMICILE/MUTATION/DECES)
10: Destination
11: État à la sortie (AMELIORE/STATIONNAIRE/AGGRAVE)
12: Médecin ayant autorisé la sortie
13: Motif de sortie
例:
MV|M9|C|HEXAGONE|20260125180000|USER003|PAT12345|VIS20260122001|20260125180000|DOMICILE||AMELIORE||||
説明:
- 種別:移動メッセージ
- コード:M9(退院)
- モード:C(作成 - 新規退院イベント)
- 患者:PAT12345、来院 VIS20260122001
- 退院:25/01/2026 18:00:00
- 退院先:DOMICILE(自宅)
- 状態:AMELIORE(状態改善)
MV|B1 - 救急/処置室移動
目的:救急部門内の処置室移動
フィールド構成:
0-5: Common fields
6: IPP
7: Numéro de passage aux urgences
8: Box de départ
9: Box d'arrivée
10: Date/heure mouvement
11: Motif
MV|MT - 一時移動
目的:患者の一時的な移動(検査、処置)
フィールド構成:
0-5: Common fields
6: IPP
7: Numéro de séjour
8: Lieu de départ
9: Lieu d'arrivée
10: Date/heure départ
11: Date/heure retour prévue
12: Motif (EXAMEN/BLOC/RADIOLOGIE)
保険適用メッセージ(CV|*)
CV|M1 - 保険適用
目的:患者の保険および適用範囲の情報
フィールド構成(全20フィールド):
0: Type (CV)
1: Message (M1)
2: Mode (C/M/D)
3: Emetteur
4: Date
5: User
6: IPP
7: Organisme payeur
8: Code régime
9: Caisse
10: Centre
11: Numéro adhérent
12: Clé adhérent
13: Rang bénéficiaire
14: Date début droits
15: Date fin droits
16: Type couverture (CPAM/MUTUELLE/AME)
17: Taux de remboursement
18: ALD (Affection Longue Durée)
19: CMU/CMUC
例:
CV|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|CPAM75|01|750|001|1234567890|12|00|20260101|20261231|CPAM|100|OUI|NON
説明:
- 種別:保険適用メッセージ
- コード:M1(保険情報)
- 患者:PAT12345
- 保険者:CPAM 75(パリ社会保障)、コード 01/750/001
- 被保険者:#1234567890、キー 12、順位 00(主たる被保険者)
- 有効期間:01/01/2026 から 31/12/2026
- 適用範囲:CPAM(国民健康保険)、100%償還
- 特記事項:ALD(長期疾患)= はい、CMU = いいえ
解析ロジック
HPK メッセージの解析を求められた場合:
ステップ 1:分割と識別
-
パイプ区切りで分割:
fields = message.split('|') -
メッセージ種別を識別:fields[0]、fields[1]、fields[2] を確認します
- 種別:fields[0](ID、MV、CV、PR、FO、MA、CO、LI、RO、FA、SO、RD、IM、DD、UT、ST)
- メッセージコード:fields[1](M1、M2、M3、M6、M8、M9、MT、CE、B1 など)
- モード:fields[2](C=作成、M=変更、S/D=取消/削除)
-
HPK ディクショナリを検索:メッセージキー
{Type}|{Message}を使って、@erp-pas/hpk-dictionaryからフィールド定義を取得します
ステップ 2:基本フィールドの抽出
標準ヘッダーフィールドを抽出します(位置 0~5 に常に存在します)。
| 位置 | フィールド | 形式 | 説明 |
|---|---|---|---|
| 0 | 種別 | 2文字 | メッセージカテゴリ |
| 1 | メッセージ | 2文字 | 特定のメッセージ種別 |
| 2 | モード | 1文字 | 操作(C/M/S/D) |
| 3 | 送信元 | 15文字 | 送信元システム |
| 4 | 日付 | 16文字 | タイムスタンプ(YYYYMMDDHHMISSnn) |
| 5 | ユーザー | 50文字 | ユーザー識別子 |
ステップ 3:種類固有のフィールドを抽出する
メッセージの種類に基づいて、残りのフィールドを抽出します。
ID|M1(本人確認情報 - フィールド 6~37):
- 6:IPP(患者 ID)
- 7:姓(Last Name)
- 8:名(First Name)
- 9:生年月日(YYYYMMDD)
- 10:性別(M/F/U)
- 11~37:その他の人口統計情報
MV|M2(入院 - フィールド 6~18):
- 6:IPP
- 7:入院番号(Visit ID)
- 8:入院日時
- 9:入院方法
- 10~18:場所とケアチームの詳細
MV|M6(転棟 - フィールド 6~17):
- 6:IPP
- 7:入院番号
- 8~10:新しい場所(UF、ベッド、診療科)
- 11~13:以前の場所
- 14~17:転棟の詳細
MV|M9(退院 - フィールド 6~13):
- 6:IPP
- 7:入院番号
- 8:退院日時
- 9:退院方法
- 10~13:退院の詳細
CV|M1(保険適用 - フィールド 6~19):
- 6:IPP
- 7~19:保険および適用範囲の詳細
ステップ 4:データをフォーマットする
データ型に基づいてフォーマットを適用します。
-
日付フィールド(YYYYMMDD):
- 解析:
20260122→22/01/2026 - 検証:有効な日付か確認します
- 解析:
-
日時フィールド(YYYYMMDDHHMISSnn):
- 解析:
20260122140530→22/01/2026 14:05:30 - nn = センチ秒(通常、表示では無視します)
- 解析:
-
列挙値:
- 性別:M(男性)、F(女性)、U(不明)
- モード:C(作成)、M(変更)、S/D(削除)
- 入院方法:URGENCE、MUTATION、DOMICILE など
-
空のフィールド:
- 空文字列または連続するパイプ
|| - 「未提供」と表示するか、空欄のままにします
- 空文字列または連続するパイプ
ステップ 5:メッセージを検証する
HPK Dictionary の定義を使用して、次を検証します。
-
フィールド数の検証:
expected_count = len(dictionary[message_key].fields) actual_count = len(fields) if actual_count != expected_count: warn("Field count mismatch") -
必須フィールドの検証:
for field_def in dictionary[message_key].fields: if field_def.isMandatory and not fields[field_def.position]: error(f"Missing required field: {field_def.description}") -
型の検証:
- 日付:形式が YYYYMMDD で、有効な日付か確認します
- 数値:数値であり、範囲内か確認します
- 文字列:長さが最大値以下か確認します
-
長さの検証:
if len(field_value) > field_def.length: warn(f"Field exceeds maximum length: {field_def.description}")
ステップ 6:説明を生成する
背景と解釈を示します。
- メッセージの目的:このメッセージが何を行うか説明します
- 操作の種類:C/M/S/D モードを説明します
- 主要なデータポイント:重要な臨床/管理データを強調します
- 業務上の背景:ワークフローへの影響を説明します
- 関連メッセージ:一般的なメッセージのシーケンスに触れます
検証ルール
構造の検証
- メッセージ形式:有効な Type|Message|Mode パターンで始まる必要があります
- ヘッダーの大文字表記:最初の 6 フィールドは大文字である必要があります
- パイプ区切り文字:フィールドは
|(ASCII 124)で区切ります - スペースなし:空のフィールドは
| |ではなく||で表します - 末尾のパイプ:オプションのフィールドには、末尾にパイプが付く場合があります
フィールドレベルの検証
HPK Dictionary の isMandatory および type プロパティに基づきます。
- 必須フィールド:
isMandatory: trueの場合、空にしてはいけません - 日付形式:YYYYMMDD または YYYYMMDDHHMISSnn に一致する必要があります
- 数値フィールド:数字のみ(該当する場合は小数点を含む)である必要があります
- 長さ制限:Dictionary の
lengthプロパティを超えてはいけません - 列挙値:許可された値と一致する必要があります(
commentフィールドを確認します)
業務ロジックの検証
HPK の仕様および業務ルールに基づきます。
- IPP の一貫性:一連の関連メッセージでは、同じ IPP を使用する必要があります
- 入院番号:同じエピソードに関する MV メッセージでは、入院番号を共通にする必要があります
- 日付の順序:
- 入院日 ≤ 転棟日 ≤ 退院日
- 保険適用期間の開始日 ≤ 終了日
- 場所の参照:診療科/部門/ベッドが組織構造に存在する必要があります
- 医療従事者の参照:医師コードがシステム内で有効である必要があります
データ品質の確認
-
日付の妥当性:
- 生年月日が未来の日付ではないこと
- 入院日が妥当な範囲内であること
- (特別なケースを除き)年齢が 120 歳を超えていないこと
-
識別子の形式:
- IPP:形式とチェックサム(該当する場合)を確認します
- NIR:15 桁(13 桁 + 2 桁のキー)で、Luhn 検証に合格すること
- FINESS:施設の 9 桁のコード
-
コードの有効性:
- 性別コード:M、F、U のみ
- 国コード:ISO 3166-1 alpha-3(FRA など)
- 保険制度コード:référentiel と照合します
エラー報告
検証に失敗した場合は、次のように報告します。
**Validation Issues**:
❌ **Error**: Missing required field at position 7 (Last Name)
⚠️ **Warning**: Field 9 (Birth Date) exceeds maximum length
⚠️ **Warning**: Field count mismatch - expected 38, got 35
ℹ️ **Info**: Optional field 16 (Mobile phone) not provided
重大度レベル:
- エラー(❌):メッセージを処理できません
- 警告(⚠️):メッセージに問題がある可能性がありますが、処理は可能です
- 情報(ℹ️):任意のフィールドまたは軽微な問題です
出力形式の例
メッセージを解析する際は、次のように提示します。
### HPK Message Analysis
**Raw Message**:
[元の HPK メッセージ]
**Message Identification**:
- Type: [ID/MV/CV]
- Code: [M1/M2/M6/M9/etc.]
- Full Name: [descriptive name]
- Operation: [Creation/Modification/Deletion]
**Core Fields**:
- Sender System: [emetteur]
- Timestamp: [formatted date/time]
- User: [user ID]
**[Type]-Specific Fields**:
[List all relevant fields with labels and values]
**Business Context**:
[Explain what this message represents and its purpose]
**Validation**:
- Field count: [actual] (expected: [expected for this type])
- Required fields: [✓ or ✗ for each required field]
- Date formats: [✓ or ✗]
- Enumerated values: [✓ or ✗]
HPK 辞書との連携
GitLab リポジトリ
リポジトリ:https://gitlab-erp-pas.dedalus.lan/erp-pas/hexagone/hpk-dictionary
パッケージ:@erp-pas/hpk-dictionary(NPM)
バージョン:1.0.5+
目的:すべての HPK メッセージ定義の正式な信頼できる情報源
辞書の構造
HPK 辞書は、Hexagone 医療システム向けの包括的なメッセージ定義を提供する NPM パッケージです。各メッセージタイプには、次の情報が含まれます。
{
description: String, // Human-readable message description
fields: Array[{
position: Number, // Field position (1-based)
description: String, // Field description
length: Number, // Maximum field length
type: String, // Data type (String, Number, Date, etc.)
isMandatory: Boolean, // Required field flag
comment: String // Additional notes/rules
}]
}
辞書へのアクセス例
const hpk = require('@erp-pas/hpk-dictionary')
// Access message definition
const idM1 = hpk.segments['ID|M1']
console.log(idM1.description) // "Suppression Identité Patient"
// Iterate through field definitions
idM1.fields.forEach(field => {
console.log(`${field.position}. ${field.description} (${field.type}, max: ${field.length})`)
if (field.isMandatory) console.log(' ⚠️ Required')
})
辞書内のメッセージカテゴリ
HPK 辞書では、次の領域にわたる 100 種類以上のメッセージタイプが定義されています。
ID とユーザー管理(ID、UT)
- ID|M1:患者 ID の作成/変更
- ID|MT:担当医の割り当て
- ID|CE:インフォームドコンセント
- UT|A1:ユーザーアカウント管理
患者の移動(MV)
- MV|M2:入院
- MV|M3:管理ステータスの変更
- MV|M6:病棟/サービス間の転送
- MV|M8:機能単位からの退出
- MV|M9:退院
- MV|B1:救急ボックスの移動
- MV|MT:一時的な移動(検査、処置)
保険適用範囲と財務(CV、FA)
- CV|M1:保険適用情報
- FA|FE:請求書ヘッダー
- FA|FL:請求書明細
組織構造(ST)
- ST|EJ:法的施設(Établissement Juridique)
- ST|EG:地理的施設(Établissement Géographique)
- ST|BA:建物(Bâtiment)
- ST|ET:階(Étage)
- ST|CH:病室(Chambre)
サプライチェーン管理(PR、FO、MA、CO、LI、RO)
- PR|M0-M5:製品管理
- FO|M1-M3:サプライヤー管理
- MA|M1-M3:契約/市場管理
- CO|M1-M2:注文
- LI|M1-M2:外部納品
- RO|M1-M2:受領
在庫とストック(SO、IM)
- SO|S1:ストック出庫
- SO|I1:棚卸し
- SO|T1:ストック移動
- SO|L1:事前定義リスト
- IM|M1:資産棚卸し
その他(RD、DD)
- RD|E1/L1:その他の領収
- DD|M1/K1:依頼メッセージ
検証での辞書の使用
HPK メッセージを解析する際は、辞書を使用して次の項目を確認します。
- フィールド数の検証:実際のフィールド数と、辞書に定義された想定フィールド数を確認します
- 必須フィールドの確認:
isMandatoryフラグを使用して、すべての必須フィールドが存在することを確認します - 型の検証:
typeフィールドを使用して、データ形式(Date、Number、String)を検証します - 長さの検証:
lengthフィールドを使用して、値が最大長を超えていないことを確認します - ビジネスルール:追加の検証ロジックについては、
commentフィールドを使用します
フィールド型の参照
HPK 辞書より:
- String:テキストフィールド(英数字)
- Number:数値フィールド(
9999.99のような小数精度を含む場合があります) - Date:日付フィールド(YYYYMMDD または YYYYMMDDHHMISSnn 形式)
- Boolean:真/偽の値(フランス語では T/F または O/N(Oui/Non)で表されます)
参考ドキュメント
主な信頼できる情報源:
- HPK 辞書リポジトリ - フィールドスキーマ、検証ルール、データ型を含む完全なメッセージ定義
内部ドキュメント:
- HPK ADT メッセージ仕様 - ADT メッセージの完全なフィールド定義とビジネスルール
- HPK GEF 仕様 - 経済・財務管理のワークフローと連携の詳細
関連標準(参考):
- IHE PAM 2.10 仕様:https://github.com/Interop-Sante/ihe.iti.pam.fr
- HL7 v2.5 標準:http://www.hl7.eu/HL7v2x/v25/std25/ch02.html
重要な注意事項
メッセージ形式の標準
- 最初の6つのフィールドは大文字でなければなりません(Type、Message、Mode、Emetteur、Date、User)
- パイプ区切り文字:フィールド区切り文字として
|を使用します - 空のフィールド:連続するパイプ
||で表します(スペースなし) - 最大長:辞書に指定されています。超過しないでください
- 日付形式:YYYYMMDDHHMISSnn(nn = 1/100秒)
HPK から HL7 へのマッピング
標準メッセージのマッピング
相互運用性を確保するため、HPK メッセージは HL7 v2.5 / IHE PAM 形式にマッピングされることがよくあります。fixtures ディレクトリには、これらのマッピング例が含まれています。
ID メッセージ → HL7 ADT メッセージ
| HPK メッセージ | HL7 メッセージ | IHE イベント | 説明 |
|---|---|---|---|
| ID|M1|C | ADT^A28 | 患者登録 | 新しい患者を登録 |
| ID|M1|M | ADT^A31 | 患者更新 | 患者の属性情報を更新 |
| ID|M1|D | ADT^A29 | 患者削除 | 患者レコードを削除 |
| ID|MT|C | ADT^A28 | - | 担当医師を追加/更新 |
| ID|CE|C | ADT^A28 | - | インフォームドコンセントを記録 |
MV メッセージ → HL7 ADT メッセージ
| HPK メッセージ | HL7 メッセージ | IHE イベント | 説明 |
|---|---|---|---|
| MV|M2|C | ADT^A01 | 患者入院 [ITI-31] | 入院 |
| MV|M3|C | ADT^A06 | - | ステータス変更(外来へ) |
| MV|M6|C | ADT^A02 | 患者転棟 [ITI-32] | 病棟/診療科間の転棟 |
| MV|M8|C | ADT^A02 | - | 病棟退出(院内転棟) |
| MV|M9|C | ADT^A03 | 患者退院 [ITI-33] | 退院 |
| MV|B1|C | ADT^A02 | - | 救急ボックスの移動 |
| MV|MT|C | ADT^A09/A10 | - | 一時外出/帰院 |
CV メッセージ → HL7 セグメント
| HPK メッセージ | HL7 セグメント | 説明 |
|---|---|---|
| CV|M1|C | IN1 + IN2 | 主保険 |
| CV|M1|M | IN1 + IN2 | 保険情報の更新 |
主なフィールドのマッピング
HPK ID|M1 → HL7 ADT PID セグメント
| HPK フィールド(位置) | HPK の説明 | HL7 フィールド | HL7 の説明 |
|---|---|---|---|
| 6 | IPP | PID-3 | 患者識別子リスト |
| 7 | 姓 | PID-5.1 | 患者氏名 - 姓 |
| 8 | 名 | PID-5.2 | 患者氏名 - 名 |
| 9 | 生年月日 | PID-7 | 生年月日/時刻 |
| 10 | 性別 | PID-8 | 行政上の性別 |
| 11-14 | 住所、郵便番号、市区町村、国 | PID-11 | 患者住所 |
| 15-16 | 電話番号 | PID-13 | 電話番号 - 自宅 |
| 28 | INS | PID-3 | 国民健康保険ID(OID 1.2.250.1.213.1.4.8) |
| 30-31 | NIR + キー | PID-3 | 社会保障番号(OID 1.2.250.1.213.1.4.10) |
HPK MV|M2 → HL7 ADT PV1 セグメント
| HPK フィールド(位置) | HPK の説明 | HL7 フィールド | HL7 の説明 |
|---|---|---|---|
| 7 | 入院番号 | PV1-19 | 来院番号 |
| 8 | 入院日時 | PV1-44 | 入院日時 |
| 9 | 入院区分 | PV1-4 | 入院種別 |
| 10 | 医療機関 | PV1-3.1 | 割り当て患者ロケーション - 医療機関 |
| 11 | 診療科 | PV1-3.2 | 割り当て患者ロケーション - 建物 |
| 12 | 機能単位 | PV1-3.3 | 割り当て患者ロケーション - 階 |
| 13 | 病床 | PV1-3.4 | 割り当て患者ロケーション - 病床 |
| 14 | 担当医師 | PV1-7 | 主治医 |
HPK MV|M9 → HL7 ADT PV1 セグメント
| HPK フィールド(位置) | HPK の説明 | HL7 フィールド | HL7 の説明 |
|---|---|---|---|
| 8 | 退院日時 | PV1-45 | 退院日時 |
| 9 | 退院区分 | PV1-36 | 退院先 |
| 11 | 退院時の状態 | PV1-52 | 患者状態コード |
統合パターン
パターン 1:Hexagone WEB → Service Echange → 外部システム
[Hexagone WEB] --HPK--> [Service Echange] --HPK/HL7--> [External System]
↓
[HPK Dictionary]
[Mapping Rules]
フロー:
- Hexagone WEB でイベントが発生します(入院、転棟、退院)
- 辞書定義を使用して HPK メッセージが生成されます
- メッセージが Oracle データベースのキューに保存されます
- Service Echange/Hexaflux がメッセージを処理します
- 必要に応じて、マッピングルールを使用してメッセージが HL7 に変換されます
- 設定済みのコネクターを介して、メッセージが外部システムに送信されます
- 確認応答を受信し、記録します
パターン 2:外部システム → Hexagone WEB(同期)
[External System] --Request--> [Hexagone WEB API] --HPK Event--> [Database]
↓
[HPK Message]
↓
[Service Echange] --HPK--> [Other Systems]
フロー:
- 外部システムが Hexagone WEB に同期リクエストを送信します
- Hexagone WEB がリクエストを処理し、データベースを更新します
- データベースのトリガーが HPK メッセージを生成します
- メッセージに優先度が設定されます(同期リクエストは高優先度)
- Service Echange がメッセージを他のシステムに配信します
- 元のリクエスト元に応答が返されます
パターン 3:メッセージの順序
一般的なワークフローでの HPK メッセージの標準的な順序:
新規患者の入院:
1. ID|M1|C - Register patient identity
2. CV|M1|C - Add insurance coverage
3. MV|M2|C - Admit patient to hospital
4. [Optional] ID|MT|C - Assign treating physician
患者の転棟:
1. MV|M8|C - Exit from current unit
2. MV|M6|C - Transfer to new unit
3. [If needed] MV|M3|C - Status change
患者の退院:
1. MV|M9|C - Discharge from hospital
2. [Optional] ID|M1|M - Update address if changed
3. [Optional] CV|M1|M - Update coverage end date
OID 参照(フランスの医療)
HPK から HL7 へのマッピングで重要な OID:
| 識別子の種類 | OID | 説明 |
|---|---|---|
| INS-C | 1.2.250.1.213.1.4.8 | 計算済み国民健康識別子 |
| INS-A | 1.2.250.1.213.1.4.9 | 証明済み国民健康識別子 |
| NIR | 1.2.250.1.213.1.4.10 | 社会保障番号 |
| IPP | 1.2.250.1.213.1.4.2 | 患者恒久識別子(ローカル) |
| FINESS | 1.2.250.1.71.4.2.2 | 医療機関識別子 |
| RPPS | 1.2.250.1.71.4.2.1 | 医療従事者共有ディレクトリ |
よくある問題のトラブルシューティング
問題 1:フィールド数の不一致
症状:メッセージのフィールド数が想定より少ない、または多い
Expected 38 fields for ID|M1, got 35
原因:
- 任意フィールドの末尾のパイプが不足している
- テキストデータ(住所、氏名)に余分なパイプが含まれている
- 送信中にメッセージが切り詰められている
解決策:
- HPK 辞書で想定されるフィールド数を確認します
- 必須フィールドがすべて存在することを確認します
- データ内にエスケープされていないパイプがないか確認します
- 任意フィールドの末尾に不足しているパイプを追加します
問題 2:日付形式のエラー
症状:日付形式が無効、または解析エラーが発生する
Field 9 (Birth Date): "1975/03/15" - expected YYYYMMDD
原因:
- 日付形式が正しくない(数値ではなくスラッシュを使用している)
- 無効な日付値(例:20260231)
- 先頭のゼロが不足している
解決策:
- 形式が正確に YYYYMMDD(8 桁)であることを確認します
- DateTime の場合:YYYYMMDDHHMISSnn(16 桁)
- 実在する日付であることを確認します(2 月 31 日などは無効)
- 必要に応じてゼロで埋めます(例:「2026315」→「20260315」)
問題 3:大文字の要件
症状:メッセージが受信側で拒否される
Field 3 (Emetteur): "Hexagone" - must be uppercase
原因:
- ヘッダーフィールド(位置 0~5)の大文字と小文字が混在している
- 受信システムの検証で大文字と小文字が区別されている
解決策:
- 最初の 6 フィールドを大文字に変換します
- 患者名は適切な大文字・小文字表記のままにします(ID|M1 のフィールド 7~8)
- フィールドごとの大文字・小文字の要件を仕様で確認します
問題 4:空のフィールドと欠落したフィールド
症状:必須フィールドが空に見える
Field 7 (Last Name): "" - required field missing
原因:
- 値の代わりに連続したパイプ
||が使われている - 空白文字
が空として解釈されている - Null と空文字列の処理の違い
解決策:
- 必須フィールドには空でない値を含める必要があります
- 任意フィールドには
||(連続したパイプ)を使用します - 空を表すために空白を使用しないでください。
| |は誤りです - フィールド値から空白を削除します
問題 5:文字エンコーディング
症状:特殊文字が文字化けする
"Hôpital" appears as "H?pital"
原因:
- UTF-8 と ISO-8859-1 のエンコーディングが一致していない
- アクセント付き文字が正しくエンコードされていない
解決策:
- エンコーディングの仕様を確認します(通常は UTF-8 または ISO-8859-1)
- パイプライン全体で一貫したエンコーディングを使用します
- アクセント付き文字(é、è、à、ô、ç)でテストします
- 比較時にアクセントを取り除く正規化を検討します
実用例
例 1:識別メッセージの解析
入力:
ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||||||||||
想定される出力:
### HPK Message Analysis
**Message Type**: ID|M1|C - Patient Identity Creation
**Core Information**:
- System: HEXAGONE
- Timestamp: 22/01/2026 12:00:00
- User: USER001
- Operation: Creation (new patient registration)
**Patient Demographics**:
- IPP: PAT12345
- Name: DUPONT JEAN
- Birth Date: 15/03/1975 (50 years old)
- Gender: Male
- Address: 15 RUE DE LA PAIX, 75001 PARIS, France
- Phone: 06 12 34 56 78
**Business Context**:
This message registers a new patient in the system. The IPP (PAT12345) will be used to identify this patient in all subsequent messages (admissions, transfers, etc.). The message was generated by USER001 on 22/01/2026 at 12:00.
**Validation**: ✓ All required fields present, correct format
例 2:入院メッセージの解析
入力:
MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||
想定される出力:
### HPK Message Analysis
**Message Type**: MV|M2|C - Patient Admission
**Core Information**:
- System: HEXAGONE
- Timestamp: 22/01/2026 14:00:00
- User: USER001
- Operation: Creation (new admission)
**Patient & Visit**:
- IPP: PAT12345
- Visit Number: VIS20260122001
- Admission Date/Time: 22/01/2026 14:00:00
**Admission Details**:
- Entry Mode: URGENCE (Emergency admission)
- Facility: CHU_PARIS
- Service: CARDIO (Cardiology)
- Functional Unit: UF_CARDIO_01
- Bed: LIT_001
- Attending Physician: PR_MARTIN
**Business Context**:
Patient PAT12345 admitted to CHU Paris Cardiology department via emergency room on 22/01/2026 at 14:00. The visit is assigned number VIS20260122001 which will track all movements during this hospital stay. Patient assigned to bed LIT_001 in functional unit UF_CARDIO_01 under care of Dr. PR_MARTIN.
**HL7 Mapping**: Maps to ADT^A01 (Admit Patient) - IHE PAM [ITI-31]
**Validation**: ✓ All required fields present
例 3:メッセージシーケンスの解析
入力(複数のメッセージ):
1. ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|...
2. CV|M1|C|HEXAGONE|20260122120100|USER001|PAT12345|CPAM75|01|750|...
3. MV|M2|C|HEXAGONE|20260122140000|USER002|PAT12345|VIS001|20260122140000|URGENCE|...
4. MV|M6|C|HEXAGONE|20260123090000|USER003|PAT12345|VIS001|UF_NEURO|...
5. MV|M9|C|HEXAGONE|20260125180000|USER002|PAT12345|VIS001|20260125180000|DOMICILE|...
期待される出力:
### HPK Message Sequence Analysis
**Workflow**: Complete Patient Episode
**Timeline**:
**22/01/2026 12:00** - Patient Registration (ID|M1|C)
- Patient DUPONT JEAN (IPP: PAT12345) registered by USER001
**22/01/2026 12:01** - Insurance Added (CV|M1|C) [+1 min]
- CPAM Paris coverage added by USER001
**22/01/2026 14:00** - Emergency Admission (MV|M2|C) [+2h]
- Admitted via emergency, Visit: VIS001 by USER002
**23/01/2026 09:00** - Transfer (MV|M6|C) [+19h]
- Transferred to Neurology by USER003
**25/01/2026 18:00** - Discharge (MV|M9|C) [+2d 9h]
- Discharged home by USER002
**Summary**:
- Episode duration: 3 days 6 hours
- Visit VIS001 completed
- 3 users involved
- ✓ Logical sequence maintained
- ✓ Chronological order correct
**HL7 Equivalent**: ADT^A28 → ADT^A28 → ADT^A01 → ADT^A02 → ADT^A03
クイックリファレンス
コアメッセージタイプ
患者管理(ID、MV、CV)
| HPK メッセージ | 正式名称 | 用途 | HL7 相当 |
|---|---|---|---|
| ID|M1|C/M/D | 患者識別情報 | 患者の属性情報と登録 | ADT^A28/A31/A29 |
| ID|MT|C/M/D | 担当医 | 主治医の割り当て/更新 | ADT^A28 |
| ID|CE|C/M/D | インフォームド・コンセント | 患者の同意を記録 | ADT^A28 |
| MV|M2|C/M/D | 入院 | 入院手続き | ADT^A01 |
| MV|M3|C/M/D | ステータス変更 | 管理上のステータス変更 | ADT^A06 |
| MV|M6|C/M/D | 転棟 | 病棟/診療科間の移動 | ADT^A02 |
| MV|M8|C/M/D | 病棟退出 | 機能別ユニットからの退出 | ADT^A02 |
| MV|M9|C/M/D | 退院 | 退院手続き | ADT^A03 |
| MV|B1|C/M/D | ボックス移動 | 救急部門内のボックス移動 | ADT^A02 |
| MV|MT|C/M/D | 一時移動 | 一時的な移動(検査、処置) | ADT^A09/A10 |
| CV|M1|C/M/D | 保険適用範囲 | 保険および適用範囲の情報 | IN1/IN2 |
ユーザー管理(UT)
| HPK メッセージ | 正式名称 | 用途 |
|---|---|---|
| UT|A1|C/M/S | ユーザーアカウント | ユーザーアカウントの作成/変更/削除 |
組織構造(ST)
| HPK メッセージ | 正式名称 | 用途 |
|---|---|---|
| ST|EJ|C/M | 法的施設 | 法的施設(法人) |
| ST|EG|C/M | 地理的施設 | 地理的施設(物理的な拠点) |
| ST|BA|C/M/S | 建物 | 建物構造 |
| ST|ET|C/M/S | フロア | 階層 |
| ST|CH|C/M/S | 部屋 | 部屋/空間 |
サプライチェーン — 製品とサプライヤー(PR、FO)
| HPK メッセージ | 正式名称 | 用途 |
|---|---|---|
| PR|M0|C/M/S | 製品 — 一般データ | 製品の一般情報 |
| PR|M1|C/M/S | 製品 — 薬局情報 | 薬局固有の製品データ |
| PR|M2|C/M/S | 製品 — 治療薬集 | 治療薬集の情報 |
| PR|M3|C/M/S | 製品 — 会計情報 | 会計および財務データ |
| PR|M4|C/M/S | 製品 — 経済情報 | 経済管理情報 |
| PR|M5|C/M/S | 製品 — 店舗情報 | 店舗/倉庫の情報 |
| FO|M1|C/M/S | サプライヤー — 一般情報 | サプライヤーの一般情報 |
| FO|M2|C/M/S | サプライヤー — 銀行情報 | 銀行取引先情報 |
| FO|M3|C/M/S | サプライヤー — 発注窓口 | 発注に関する連絡窓口 |
サプライチェーン — 注文と納品(MA、CO、LI、RO)
| HPK メッセージ | 正式名称 | 用途 |
|---|---|---|
| MA|M1|C/M/S | 市場 — ヘッダー | 契約/市場のヘッダー |
| MA|M2|C/M/S | 市場 — 明細 | 契約/市場の明細項目 |
| MA|M3|C/M/S | 市場 — サプライヤー | 市場別サプライヤー |
| CO|M1|C/M/S | 注文 — ヘッダー | 発注書のヘッダー |
| CO|M2|C/M/S | 注文 — 明細 | 発注書の明細項目 |
| LI|M1|C/M | 納品 — 明細 | 外部納品の明細 |
| LI|M2|C/M | 納品 — ロット明細 | ロット管理を伴う納品明細 |
| RO|M1|C/M/S | 受領 — 明細 | 受領明細 |
| RO|M2|C/M | 受領 — ロット明細 | ロット管理を伴う受領明細 |
財務(FA、RD)
| HPK メッセージ | 正式名称 | 用途 |
|---|---|---|
| FA|FE|C | 請求書 — ヘッダー | 請求書のヘッダー |
| FA|FL|C | 請求書 — 明細 | 請求書の明細項目 |
| RD|E1|C | 雑収入 — ヘッダー | 雑収入のヘッダー |
| RD|L1|C | 雑収入 — 明細 | 雑収入の明細項目 |
在庫とストック(SO、IM)
| HPK メッセージ | 正式名称 | 目的 |
|---|---|---|
| SO|S1|C | ストック出庫 | 出庫(ストックの払い出し) |
| SO|I1|C | 棚卸 | 棚卸(ストックの数量確認) |
| SO|T1|C | ストック移動 | 移動(内部移動) |
| SO|L1|C | 事前定義リスト | 事前定義リスト |
| IM|M1|C | 資産棚卸 | 備品棚卸(資産管理) |
リクエスト(DD)
| HPK メッセージ | 正式名称 | 目的 |
|---|---|---|
| DD|M1|C | ID リクエスト | ID 作成リクエスト |
| DD|K1|C | 行為リクエスト | 行為作成リクエスト |
操作モード
| モード | フランス語 | 英語 | 説明 |
|---|---|---|---|
| C | 作成 | 作成 | 新しいレコードを作成します |
| M | 変更 | 変更 | 既存のレコードを更新します |
| S | 削除 | 削除 | レコードを削除します |
| D | 削除 | 削除 | 削除(別表記) |
共通フィールドパターン
標準ヘッダー(すべてのメッセージ):
Type|Message|Mode|Emetteur|Date|User|...
日付形式:
- 短い日付:
YYYYMMDD(例:20260122) - 完全なタイムスタンプ:
YYYYMMDDHHMISSnn(例:20260122140530) - nn = センチ秒(1/100 秒)
性別コード:
M= 男性(男性)F= 女性(女性)U= 不明(不明)
フランスの行政用語:
- IPP = Identifiant Permanent du Patient(患者の恒久 ID)
- INS = Identifiant National de Santé(国民医療 ID)
- NIR = Numéro d'Inscription au Répertoire(社会保障番号)
- UF = Unité Fonctionnelle(機能単位)
- FINESS = Fichier National des Établissements Sanitaires et Sociaux
- CPAM = Caisse Primaire d'Assurance Maladie(医療保険基金)
- ALD = Affection Longue Durée(長期疾患)
- CMU = Couverture Maladie Universelle(国民皆医療保障)