hpk-parser by dedalus-erp-pas/foundation-skills
npx skills add https://github.com/dedalus-erp-pas/foundation-skills --skill hpk-parser此技能用于解析和解释 HPK(Healthcare Protocol Kernel)消息——一种在 Hexagone 系统中用于法国医疗环境的专有管道分隔医疗消息格式。该解析器支持跨多个领域(患者管理、供应链、库存、财务、组织管理)的 100 多种消息类型,能够识别消息类型、提取所有字段、验证结构,并根据官方 HPK 字典和规范提供人类可读的解释。
主要事实来源:
@erp-pas/hpk-dictionary) - 包含完整消息模式、字段定义和验证规则的 GitLab 仓库覆盖范围:
何时使用此技能:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
HPK 消息使用管道符 (|) 作为字段分隔符,结构如下:
Type|Message|Mode|Emetteur|Date|User|...additional fields...
核心字段(位置 0-5):
ID = 身份, MV = 移动, CV = 覆盖)M1, M2, M3, M6, M8, M9, MT, CE, B1 等)C = 创建, M = 修改, D = 删除)YYYYMMDDHHmmss)目的:患者人口统计信息(注册)
字段结构(共 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||||||||||||||||||||||||||||||
解释:
目的:分配或更新患者的主治医师 (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||
解释:
目的:记录患者对治疗/数据处理的同意
字段结构(共 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é
目的:医院入院 (admission hospitalière)
字段结构(共 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|||||||
解释:
目的:患者管理状态变更
字段结构:
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
目的:患者在不同单元或科室之间的转移
字段结构(共 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||||||
解释:
目的:从功能单元退出(非出院)
字段结构:
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
目的:患者从医院出院
字段结构(共 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||||
解释:
目的:急诊科诊室移动
字段结构:
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
目的:患者临时移动(检查、手术)
字段结构:
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)
目的:患者保险和覆盖信息
字段结构(共 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
解释:
当被要求解析 HPK 消息时:
按管道分隔符分割:fields = message.split('|')
识别消息类型:检查 fields[0]、fields[1] 和 fields[2]
在 HPK 字典中查找:使用消息键 {Type}|{Message} 从 @erp-pas/hpk-dictionary 获取字段定义
提取标准头部字段(始终存在于位置 0-5):
| 位置 | 字段 | 格式 | 描述 |
|---|---|---|---|
| 0 | Type | 2 个字符 | 消息类别 |
| 1 | Message | 2 个字符 | 特定消息类型 |
| 2 | Mode | 1 个字符 | 操作 (C/M/S/D) |
| 3 | Emetteur | 15 个字符 | 发送方系统 |
| 4 | Date | 16 个字符 | 时间戳 (YYYYMMDDHHMISSnn) |
| 5 | User | 50 个字符 | 用户标识符 |
根据消息类型,提取剩余字段:
ID|M1(身份 - 字段 6-37):
MV|M2(入院 - 字段 6-18):
MV|M6(转移 - 字段 6-17):
MV|M9(出院 - 字段 6-13):
CV|M1(覆盖 - 字段 6-19):
根据数据类型应用格式化:
日期字段 (YYYYMMDD):
20260122 → 22/01/2026日期时间字段 (YYYYMMDDHHMISSnn):
20260122140530 → 22/01/2026 14:05:30枚举值:
空字段:
||使用 HPK 字典定义:
字段计数验证:
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}")
类型验证:
长度验证:
if len(field_value) > field_def.length: warn(f"Field exceeds maximum length: {field_def.description}")
提供上下文和解释:
| 分隔(ASCII 124)|| 而非 | |来自 HPK 字典的 isMandatory 和 type 属性:
isMandatory: true 则不能为空length 属性comment 字段)来自 HPK 规范和业务规则:
日期合理性:
标识符格式:
代码有效性:
当验证失败时,报告:
**验证问题**:
❌ **错误**:位置 7 缺少必填字段(姓氏)
⚠️ **警告**:字段 9(出生日期)超过最大长度
⚠️ **警告**:字段计数不匹配 - 预期 38,实际 35
ℹ️ **信息**:可选字段 16(手机)未提供
严重级别:
解析消息时,提供:
### HPK 消息分析
**原始消息**:
[原始 HPK 消息]
**消息标识**:
- 类型:[ID/MV/CV]
- 代码:[M1/M2/M6/M9/等]
- 全称:[描述性名称]
- 操作:[创建/修改/删除]
**核心字段**:
- 发送方系统:[emetteur]
- 时间戳:[格式化日期/时间]
- 用户:[用户 ID]
**[类型]特定字段**:
[列出所有相关字段及其标签和值]
**业务上下文**:
[解释此消息代表什么及其目的]
**验证**:
- 字段计数:[实际](预期:[此类型的预期值])
- 必填字段:[✓ 或 ✗ 针对每个必填字段]
- 日期格式:[✓ 或 ✗]
- 枚举值:[✓ 或 ✗]
仓库:https://gitlab-erp-pas.dedalus.lan/erp-pas/hexagone/hpk-dictionary
包:@erp-pas/hpk-dictionary (NPM)
版本:1.0.5+
目的:所有 HPK 消息定义的权威来源
HPK 字典是一个 NPM 包,为 Hexagone 医疗系统提供全面的消息定义。每种消息类型包括:
{
description: String, // 人类可读的消息描述
fields: Array[{
position: Number, // 字段位置(从 1 开始)
description: String, // 字段描述
length: Number, // 最大字段长度
type: String, // 数据类型 (String, Number, Date 等)
isMandatory: Boolean, // 必填字段标志
comment: String // 附加注释/规则
}]
}
const hpk = require('@erp-pas/hpk-dictionary')
// 访问消息定义
const idM1 = hpk.segments['ID|M1']
console.log(idM1.description) // "Suppression Identité Patient"
// 遍历字段定义
idM1.fields.forEach(field => {
console.log(`${field.position}. ${field.description} (${field.type}, max: ${field.length})`)
if (field.isMandatory) console.log(' ⚠️ Required')
})
HPK 字典定义了跨以下领域的 100 多种消息类型:
解析 HPK 消息时,使用字典进行:
isMandatory 标志确保所有必填字段存在type 字段验证数据格式(日期、数字、字符串)length 字段确保值不超过最大值comment 字段进行附加验证逻辑来自 HPK 字典:
9999.99)主要事实来源:
内部文档:
相关标准(供参考):
| 作为字段分隔符|| 表示(无空格)HPK 消息通常映射到 HL7 v2.5 / IHE PAM 格式以实现互操作性。fixtures 目录包含这些映射的示例。
| 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 |
| HPK 消息 | HL7 消息 | IHE 事件 | 描述 |
|---|---|---|---|
| MV | M2 | C | ADT^A01 |
| MV | M3 | C | ADT^A06 |
| MV | M6 | C | ADT^A02 |
| MV | M8 | C | ADT^A02 |
| MV | M9 | C | ADT^A03 |
| MV | B1 | C | ADT^A02 |
| MV | MT | C | ADT^A09/A10 |
| HPK 消息 | HL7 段 | 描述 |
|---|---|---|
| CV | M1 | C |
| CV | M1 | M |
| HPK 字段(位置) | HPK 描述 | HL7 字段 | HL7 描述 |
|---|---|---|---|
| 6 | IPP | PID-3 | 患者标识符列表 |
| 7 | Nom | PID-5.1 | 患者姓名 - 姓氏 |
| 8 | Prénom | PID-5.2 | 患者姓名 - 名字 |
| 9 | Date de naissance | PID-7 | 出生日期/时间 |
| 10 | Sexe | PID-8 | 管理性别 |
| 11-14 | Adresse, CP, Ville, Pays | PID-11 | 患者地址 |
| 15-16 | Téléphone | PID-13 | 电话号码 - 家庭 |
| 28 | INS | PID-3 | 国家健康 ID (OID 1.2.250.1.213.1.4.8) |
| 30-31 | NIR + Clé | PID-3 | 社会保险号 (OID 1.2.250.1.213.1.4.10) |
| HPK 字段(位置) | HPK 描述 | HL7 字段 | HL7 描述 |
|---|---|---|---|
| 7 | Numéro de séjour | PV1-19 | 就诊号 |
| 8 | Date/heure entrée |
This skill parses and explains HPK (Healthcare Protocol Kernel) messages - a proprietary pipe-delimited healthcare message format used in the Hexagone system for French healthcare environments. The parser supports 100+ message types across multiple domains (patient administration, supply chain, inventory, financial, organizational), identifies message types, extracts all fields, validates structure, and provides human-readable explanations based on the official HPK dictionary and specifications.
Primary Sources of Truth :
@erp-pas/hpk-dictionary) - GitLab repository with complete message schemas, field definitions, and validation rulesCoverage :
When to use this skill:
HPK messages use pipe (|) as field delimiter with the following structure:
Type|Message|Mode|Emetteur|Date|User|...additional fields...
Core Fields (positions 0-5):
ID = Identity, MV = Movement, CV = Coverage)M1, M2, M3, M6, M8, M9, MT, CE, B1, etc.)Purpose : Patient demographic information (registration)
Field Structure (38 fields total):
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
Example :
ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||
Explanation :
Purpose : Assign or update patient's treating physician (médecin traitant)
Field Structure (13 fields total):
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
Example :
ID|MT|C|HEXAGONE|20260122120000|USER001|PAT12345|PR_MARTIN|MARTIN|SOPHIE|CARDIOLOGUE|20260122||
Explanation :
Purpose : Record patient consent for treatment/data processing
Field Structure (11 fields total):
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é
Purpose : Hospital admission (admission hospitalière)
Field Structure (19 fields total):
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
Example :
MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||
Explanation :
Purpose : Change in patient administrative status
Field Structure :
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
Purpose : Patient transfer between units or services
Field Structure (18 fields total):
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
Example :
MV|M6|C|HEXAGONE|20260123090000|USER002|PAT12345|VIS20260122001|UF_NEURO_01|LIT_102|NEURO|UF_CARDIO_01|LIT_001|CARDIO||||||
Explanation :
Purpose : Exit from functional unit (without discharge)
Field Structure :
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
Purpose : Patient discharge from hospital
Field Structure (14 fields total):
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
Example :
MV|M9|C|HEXAGONE|20260125180000|USER003|PAT12345|VIS20260122001|20260125180000|DOMICILE||AMELIORE||||
Explanation :
Purpose : Emergency department box movement
Field Structure :
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
Purpose : Temporary patient movement (exam, procedure)
Field Structure :
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)
Purpose : Patient insurance and coverage information
Field Structure (20 fields total):
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
Example :
CV|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|CPAM75|01|750|001|1234567890|12|00|20260101|20261231|CPAM|100|OUI|NON
Explanation :
When asked to parse an HPK message:
Split by pipe delimiter : fields = message.split('|')
Identify message type : Check fields[0], fields[1], and fields[2]
Look up in HPK Dictionary : Use message key {Type}|{Message} to get field definitions from @erp-pas/hpk-dictionary
Extract standard header fields (always present in positions 0-5):
| Position | Field | Format | Description |
|---|---|---|---|
| 0 | Type | 2 chars | Message category |
| 1 | Message | 2 chars | Specific message type |
| 2 | Mode | 1 char | Operation (C/M/S/D) |
| 3 | Emetteur | 15 chars | Sender system |
| 4 | Date | 16 chars | Timestamp (YYYYMMDDHHMISSnn) |
| 5 | User | 50 chars | User identifier |
Based on message type, extract remaining fields:
ID|M1 (Identity - fields 6-37):
MV|M2 (Admission - fields 6-18):
MV|M6 (Transfer - fields 6-17):
MV|M9 (Discharge - fields 6-13):
CV|M1 (Coverage - fields 6-19):
Apply formatting based on data types:
Date fields (YYYYMMDD):
20260122 → 22/01/2026DateTime fields (YYYYMMDDHHMISSnn):
20260122140530 → 22/01/2026 14:05:30Enumerated values :
Empty fields :
||Using HPK Dictionary definitions:
Field count validation :
expected_count = len(dictionary[message_key].fields) actual_count = len(fields) if actual_count != expected_count: warn("Field count mismatch")
Required field validation :
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}")
Type validation :
Length validation :
if len(field_value) > field_def.length: warn(f"Field exceeds maximum length: {field_def.description}")
Provide context and interpretation:
| (ASCII 124)|| not | |From HPK Dictionary isMandatory and type properties:
isMandatory: truelength property from dictionarycomment field)From HPK specifications and business rules:
Date reasonableness :
Identifier formats :
Code validity :
When validation fails, report:
**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
Severity levels:
When parsing a message, provide:
### HPK Message Analysis
**Raw Message**:
[original HPK message]
**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 ✗]
Repository : https://gitlab-erp-pas.dedalus.lan/erp-pas/hexagone/hpk-dictionary
Package : @erp-pas/hpk-dictionary (NPM)
Version : 1.0.5+
Purpose : Authoritative source of truth for all HPK message definitions
The HPK dictionary is an NPM package that provides comprehensive message definitions for the Hexagone healthcare system. Each message type includes:
{
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')
})
The HPK dictionary defines 100+ message types across these domains:
When parsing HPK messages, use the dictionary to:
isMandatory flag to ensure all required fields presenttype field to validate data format (Date, Number, String)length field to ensure values don't exceed maximumcomment field for additional validation logicFrom HPK dictionary:
9999.99)Primary Source of Truth :
Internal Documentation :
Related Standards (for context):
| as field delimiter|| (no spaces)HPK messages are often mapped to HL7 v2.5 / IHE PAM format for interoperability. The fixtures directory contains examples of these mappings.
| HPK Message | HL7 Message | IHE Event | Description |
|---|---|---|---|
| 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 |
| HPK Message | HL7 Message | IHE Event | Description |
|---|---|---|---|
| MV | M2 | C | ADT^A01 |
| MV | M3 | C | ADT^A06 |
| MV | M6 | C | ADT^A02 |
| MV | M8 | C | ADT^A02 |
| MV | M9 | C | ADT^A03 |
| MV | B1 | C | ADT^A02 |
| MV | MT | C | ADT^A09/A10 |
| HPK Message | HL7 Segments | Description |
|---|---|---|
| CV | M1 | C |
| CV | M1 | M |
| HPK Field (Position) | HPK Description | HL7 Field | HL7 Description |
|---|---|---|---|
| 6 | IPP | PID-3 | Patient Identifier List |
| 7 | Nom | PID-5.1 | Patient Name - Family Name |
| 8 | Prénom | PID-5.2 | Patient Name - Given Name |
| 9 | Date de naissance | PID-7 | Date/Time of Birth |
| 10 | Sexe | PID-8 | Administrative Sex |
| 11-14 | Adresse, CP, Ville, Pays | PID-11 | Patient Address |
| 15-16 | Téléphone | PID-13 | Phone Number - Home |
| HPK Field (Position) | HPK Description | HL7 Field | HL7 Description |
|---|---|---|---|
| 7 | Numéro de séjour | PV1-19 | Visit Number |
| 8 | Date/heure entrée | PV1-44 | Admit Date/Time |
| 9 | Mode d'entrée | PV1-4 | Admission Type |
| 10 | Établissement | PV1-3.1 | Assigned Patient Location - Facility |
| 11 | Service | PV1-3.2 | Assigned Patient Location - Building |
| 12 | Unité fonctionnelle | PV1-3.3 | Assigned Patient Location - Floor |
| 13 | Lit | PV1-3.4 | Assigned Patient Location - Bed |
| HPK Field (Position) | HPK Description | HL7 Field | HL7 Description |
|---|---|---|---|
| 8 | Date/heure sortie | PV1-45 | Discharge Date/Time |
| 9 | Mode de sortie | PV1-36 | Discharge Disposition |
| 11 | État à la sortie | PV1-52 | Patient Condition Code |
[Hexagone WEB] --HPK--> [Service Echange] --HPK/HL7--> [External System]
↓
[HPK Dictionary]
[Mapping Rules]
Flow :
[External System] --Request--> [Hexagone WEB API] --HPK Event--> [Database]
↓
[HPK Message]
↓
[Service Echange] --HPK--> [Other Systems]
Flow :
Typical HPK message sequences for common workflows:
New Patient Admission :
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
Patient Transfer :
1. MV|M8|C - Exit from current unit
2. MV|M6|C - Transfer to new unit
3. [If needed] MV|M3|C - Status change
Patient Discharge :
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
Important OIDs for HPK to HL7 mapping:
| Identifier Type | OID | Description |
|---|---|---|
| INS-C | 1.2.250.1.213.1.4.8 | Identifiant National de Santé Calculé |
| INS-A | 1.2.250.1.213.1.4.9 | Identifiant National de Santé Attesté |
| NIR | 1.2.250.1.213.1.4.10 | Numéro de Sécurité Sociale |
| IPP | 1.2.250.1.213.1.4.2 | Identifiant Permanent du Patient (local) |
| FINESS | 1.2.250.1.71.4.2.2 | Identifiant Établissement |
| RPPS | 1.2.250.1.71.4.2.1 | Répertoire Partagé des Professionnels de Santé |
Symptom : Message has fewer/more fields than expected
Expected 38 fields for ID|M1, got 35
Causes :
Solution :
Symptom : Invalid date format or parsing errors
Field 9 (Birth Date): "1975/03/15" - expected YYYYMMDD
Causes :
Solution :
Symptom : Message rejected by receiver
Field 3 (Emetteur): "Hexagone" - must be uppercase
Causes :
Solution :
Symptom : Required field appears empty
Field 7 (Last Name): "" - required field missing
Causes :
|| instead of value interpreted as emptySolution :
|| (consecutive pipes)| | is wrongSymptom : Special characters corrupted
"Hôpital" appears as "H?pital"
Causes :
Solution :
Input :
ID|M1|C|HEXAGONE|20260122120000|USER001|PAT12345|DUPONT|JEAN|19750315|M|15 RUE DE LA PAIX|75001|PARIS|FRA|0612345678||||||||||||||||||||||||||||||||||||||
Expected Output :
### 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
Input :
MV|M2|C|HEXAGONE|20260122140000|USER001|PAT12345|VIS20260122001|20260122140000|URGENCE|CHU_PARIS|CARDIO|UF_CARDIO_01|LIT_001|PR_MARTIN|||||||
Expected Output :
### 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
Input (Multiple Messages) :
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|...
Expected Output :
### 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
| HPK Message | Full Name | Purpose | HL7 Equivalent |
|---|---|---|---|
| ID | M1 | C/M/D | Patient Identity |
| ID | MT | C/M/D | Treating Physician |
| ID | CE | C/M/D | Informed Consent |
| MV | M2 | C/M/D | Admission |
| MV | M3 | C/M/D | Status Change |
| MV | M6 | C/M/D | Transfer |
| MV | M8 | C/M/D | Unit Exit |
| MV | M9 |
| HPK Message | Full Name | Purpose |
|---|---|---|
| UT | A1 | C/M/S |
| HPK Message | Full Name | Purpose |
|---|---|---|
| ST | EJ | C/M |
| ST | EG | C/M |
| ST | BA | C/M/S |
| ST | ET | C/M/S |
| ST | CH | C/M/S |
| HPK Message | Full Name | Purpose |
|---|---|---|
| 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 |
| HPK Message | Full Name | Purpose |
|---|---|---|
| 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 |
| HPK Message | Full Name | Purpose |
|---|---|---|
| FA | FE | C |
| FA | FL | C |
| RD | E1 | C |
| RD | L1 | C |
| HPK Message | Full Name | Purpose |
|---|---|---|
| SO | S1 | C |
| SO | I1 | C |
| SO | T1 | C |
| SO | L1 | C |
| IM | M1 | C |
| HPK Message | Full Name | Purpose |
|---|---|---|
| DD | M1 | C |
| DD | K1 | C |
| Mode | French | English | Description |
|---|---|---|---|
| C | Création | Creation | Create new record |
| M | Modification | Modification | Update existing record |
| S | Suppression | Deletion | Delete/remove record |
| D | Deletion | Deletion | Delete (alternate notation) |
Standard Header (all messages):
Type|Message|Mode|Emetteur|Date|User|...
Date Formats :
YYYYMMDD (e.g., 20260122)YYYYMMDDHHMISSnn (e.g., 20260122140530)Gender Codes :
M = Male (Masculin)F = Female (Féminin)U = Unknown (Inconnu)French Administrative Terms :
Weekly Installs
78
Repository
GitHub Stars
2
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex65
gemini-cli65
github-copilot65
opencode65
cursor64
claude-code59
免费AI数据抓取智能体:自动化收集、丰富与存储网站/API数据
1,100 周安装
C = Creation, M = Modification, D = Deletion)YYYYMMDDHHmmss)| 28 | INS | PID-3 | National Health ID (OID 1.2.250.1.213.1.4.8) |
| 30-31 | NIR + Clé | PID-3 | Social Security Number (OID 1.2.250.1.213.1.4.10) |
| 14 | Médecin responsable | PV1-7 | Attending Doctor |
| C/M/D |
| Discharge |
| MV | B1 | C/M/D | Box Movement |
| MV | MT | C/M/D | Temporary Movement |
| CV | M1 | C/M/D | Coverage |