@ cosyte/ ncpdp
在不购买标准的情况下,用一行读取销售商-quirky Telecom药店索赔或STRIPT ePrecific.
NCPDP 解析器、序列器和节点和类型Script的构建器: SCRIPT ePresent和Telecom 药房要求,宽大 剖析, 光谱清洁 弹出.
为什么会这样
NCPDP是一个品牌下两个结构上无关的标准: SCRIPT,一种XML ePrepression格式,
以及电讯标准,一种控制性质药店索赔格式。 这个
两份指南的执行指南都是购买的产品,因此节点小组通常的路线是:
手卷读者对向导,有人要买:元素走过
fast-xml-parser 斯德哥尔摩,a
String.split 页:1 这工作直到
真正的输入到达,然后一个卖家的怪异 是一个例外 扔在中间
离相抵消是一个错误的字段,一个货币金额用 parseFloat 支付错误
金额。 这个软件包是另一个选择:一个宽大化的阅读器,将怪事变成位置
警告而不是失败,一个只写光谱干净输出的保守的发射器,以及
数量和金钱按字符串处理,所以二进制浮动点永远不能损坏一个值.
状态
0.1线. 公共API是定居和稳定的,足以依赖. 输出函数 其论据的形状、它们返回的模型字段和稳定的警告代码的消费者 分支上的所有内容都包含在此发布后的语义版本中; 重命名一个警告代码 是一个突破性的变化,被作为一体对待.
两种公共表面仍在移动,两者都是添加式视图而不是剖析本身:
- 结构化的SIG视图 (单位:千美元)
medication.sig) (中文(简体) ). 明确损失并明确标注: 自由文本sigText永远是权威的 永远不会被覆盖 结构化的组件 只有在已公布的字段标签显示其元素名称时才解码。 这个被禁用的名字列表可以 当重新检查其定位时丢失一个名称, 这将移动组件从coded改为absent。 。 。 . - 线码标签表 (单位:千美元)
known在拒绝, DUR, 或理由代码。 标签船只在 所以大多数密码都作为光线密码known: false当发现一件文物时,会添加标签,而且永远不会猜到.
两种电线格式上的其他一切都解决了. 软件包做和不解码是 一次,在 合规说明。 。 。 .
安装
pnpm add @cosyte/ncpdp
22号或以后试验的节点js 22、24和26(engines.node 实值 >=22.0.0) (中文(简体) ). 软件包是
无害环境管理"type": "module"和船 共同JS建造 旁边,所以 import 财务报告和审定财务报表 require 都决心
通过相同的 exports 地图。 脚本类型解析 node16 遗产 node10。 。 。 .
依赖关系
电信方面是零依赖,只有节点标准库. STRIPT一方只拿一个
经审查的运行时间依赖,
fast-xml-parser,用于名称意识
XML 解析, 配置了 XXE 安全, 实体解析被禁用 。 不再依赖运行时间
添加时没有同样的审查.
使用量
下文的两个例子是完整的程序。 每一个都与这个包裹相撞 下方的块 这是它印刷的,逐字记录。 每一个病人、医生、成员和产品价值 是人工合成的.
发送和阅读电信账单索赔
import { buildTelecomRequest, serializeTelecom, parseTelecom, claim } from "@cosyte/ncpdp/telecom";
// Emit a spec-clean Telecom B1 billing claim. Every value below is synthetic.
const wire = serializeTelecom(
buildTelecomRequest({
header: { transactionCode: "B1", binNumber: "999999", dateOfService: "20260115" },
segments: [
{ segmentId: "04", fields: [{ id: "C2", value: "SYNTHCARD09" }] },
{
segmentId: "07",
fields: [
{ id: "D2", value: "RX0000001" },
{ id: "E1", value: "03" },
{ id: "D7", value: "99999999999" },
{ id: "E7", value: "30000" },
{ id: "D5", value: "30" },
],
},
],
}),
);
// Read it back. A vendor quirk becomes a positioned warning here, never a throw.
const t = parseTelecom(wire);
const c = claim(t);
console.log(t.kind, t.header.transactionCode, t.warnings.length);
console.log(c?.cardholderId, c?.prescriptionReferenceNumber);
console.log(c?.product?.id, c?.product?.qualifier);
console.log(c?.quantityDispensed?.source, c?.quantityDispensed?.impliedDecimal);
request B1 0
SYNTHCARD09 RX0000001
99999999999 03
30000 30.000
注意倒数行. 所发放的数量带有一个隐含的小数点后三分位数,逐字记录则含有 源保存在缩放值旁边,该值是按字符串而不是通过浮点生成的.
读取 STIPT NewRx
import { parseScript, newRx } from "@cosyte/ncpdp/script";
// A minimal SCRIPT NewRx. Every value below is synthetic.
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<Message xmlns="http://www.ncpdp.org/schema/SCRIPT" version="2017071">
<Header><MessageID>SYNTH-MSG-0001</MessageID></Header>
<Body><NewRx>
<Patient><HumanPatient>
<Name><LastName>Testpatient</LastName><FirstName>Avery</FirstName></Name>
<DateOfBirth><Date>1990-04-12</Date></DateOfBirth>
</HumanPatient></Patient>
<MedicationPrescribed>
<DrugDescription>Amoxicillin 500 MG Oral Capsule</DrugDescription>
<DrugCoded><ProductCode Qualifier="ND">99999999999</ProductCode></DrugCoded>
<Sig><SigText>Take 1 capsule by mouth three times daily for 10 days.</SigText></Sig>
</MedicationPrescribed>
</NewRx></Body>
</Message>`;
const msg = parseScript(xml);
const rx = newRx(msg); // the NewRx body, or undefined for another transaction
console.log(msg.header.messageId, msg.warnings.length);
console.log(rx?.patient?.name?.lastName, rx?.patient?.dateOfBirth);
console.log(rx?.medication?.description, rx?.medication?.coded?.productCode?.system);
console.log(rx?.medication?.sig?.sigText);
SYNTH-MSG-0001 0
Testpatient 1990-04-12
Amoxicillin 500 MG Oral Capsule NDC
Take 1 capsule by mouth three times daily for 10 days.
更多的任务,每一个都有自己的榜样,都包含在如何指导,从 读取 PBM 回复 财务报告和审定财务报表 构建和序列化信件。 。 。 .
API 密码
五个密码入口,加 @cosyte/ncpdp/package.json 用于读出清单的工具:
| 导入 | 它携带着什么 |
|---|---|
@cosyte/ncpdp | VERSION 和每一次导出 script, (中文(简体) ), telecom, (中文(简体) ), common,以及 profiles |
@cosyte/ncpdp/script | 师曰 parseScript, (中文(简体) ), newRx,反应脊椎status 编号 : error 编号 : verify),生命周期读取器(rxRenewalResponse 编号 : rxChangeResponse 编号 : cancelRxResponse, (中文(简体) ), approvalOf, (中文(简体) ), serializeScript, (中文(简体) ), buildNewRx, (中文(简体) ), buildScriptResponse |
@cosyte/ncpdp/telecom | 电讯: parseTelecom, (中文(简体) ), claim, (中文(简体) ), adjudication, (中文(简体) ), compound, (中文(简体) ), cobOtherPayments, (中文(简体) ), responseCob, (中文(简体) ), requestDur, (中文(简体) ), priorAuthorization, (中文(简体) ), serializeTelecom, (中文(简体) ), buildTelecomRequest |
@cosyte/ncpdp/common | 共享词汇 : ndcValue, (中文(简体) ), decimalValue,位置帮助器,警告和致命代码常数两个格式共享 |
@cosyte/ncpdp/profiles | defineProfile, (中文(简体) ), partitionWarnings,以及内置 profiles.surescripts 财务报告和审定财务报表 profiles.pbm |
签名、返回类型和每个字段的笔记都作为 JSDoc 公开输出,所以编辑器 显示其内含。 咬人的警示,没有签名可以显示,是:
- 拒绝总是获胜. 处理反应是交易中的一项总功能
反应状态和拒绝代码一起。 如有拒绝,则处分如下:
"rejected"即使已支付状态外地索偿, 矛盾的表面 反而 未解决。 消费者从未被告知一个被拒绝的索赔已经支付。 未识别状态为"unknown"从来没有支付. - 否认绝不是认可. 生命周期结果只从反应中读取
选择元素。 未确认或不存在的结果如下:
"unknown",且反应不正确 拥有一个以上的结果首先解决拒绝问题。 在一个approvedWithChanges读取medicationPrescribed:这是被改变的药物,这是可以分发的药物. - 一个
Error从来没有成功. 一个危机disposition仅取自反应机构 类型,如果一个错误的信息包含一个以上的响应机构,则最保守 一个赢。 代码和说明是浮出水面的;没有代号表船. - 金钱和数量从不浮出水面. 每笔金额都包含一个隐含的 二位小数和一个
可选小区小数点后超小数符号,数量表示小数点后三位数。 两者都是
应用字符串,将逐字记录源保留在结果旁边。 任何出乎意料的事都会发生
保留于
isValid: false并且没有解释价值 而不是猜测. - 没有什么是默默地放弃的. 未知的片段、未知的字段和错误的符号是 保持了逐字记录和警告。 每一个解码交易都与自己的索引相对应 区段、字节相抵和警告,以及后期交易成本的缺陷。 每个复合成分,每个效益协调 钱行,每个回报 DUR 提醒被浮出水面, 从未合并或截断; 已声明的数与 解码的计数会发出警告, 却一无所获。 报告申报的交易数,绝不 已执行.
- 事先授权是存在,而不是裁决. 它报告说,该部分已经提交 并呼应类型和数字。 它从未决定授权是否有效或是否得到尊重.
- 结构化SIG有添加剂和失活性.
sigText永远是真理的来源 与结构化观点相协调;如果两者意见相左,则两者都表面为正. 每个 组件被标记coded, (中文(简体) ),derived,或absent,一个缺席者 永远不会从自由 文本,而一个模糊的剂量读取absent而不是被猜测. - Emit是犬形,不是字节身份. 读取是失落的,所以放出复制的模型
内容 :
serialize(parse(serialize(x)))字节与serialize(x)财务报告和审定财务报表parse(serialize(x))结构上等于x。构建者拒绝无效的消息 以有打字错误的方式建造,而不排放畸形的东西 值在错误中永远不会重复。 将 SCRIPT 交易序列化, 软件包不建模 丢弃而不是写带有删除正文的文档:测试body.kind首先转发 原字节. - 只有结构性腐败才能产生. 空输入, 非 XML, 缺少信件根, 前 XML 遗留版本,没有设置字节,和不支持的版本印章都是输入致命错误. 其它的都是带有稳定代码和位置的警告.
日期和时间
每个有日期的字段 在一个解析模型上 是,并留下来 逐字记录字符串 到达时
电线。 在下面没有东西会改写一个 转换是 选入: 你找到他们的时候
想要一个日期作为部分,作为ISO-8601,或者作为一个瞬间,直到你这样做, header.dateOfService 财务报告和审定财务报表
claim.dateOfBirth 正是发送者发送的字符.
dateValue 将线条串解码为值; toObject, (中文(简体) ), toISO,以及 toDate 读取该值.
每个名字都一样 @cosyte/* par.
import { dateValue, toObject, toISO, toDate } from "@cosyte/ncpdp";
const dos = dateValue(t.header.dateOfService); // "20260629"
toObject(dos); // { year: 2026, month: 6, day: 29 }: month is 1 to 12, never 0 to 11
toISO(dos); // "2026-06-29": truncated to the precision stated, nothing appended
toDate(dos); // undefined: see the timezone rule below
toDate(dos, { assumeOffsetMinutes: 0 }); // 2026-06-29T00:00:00.000Z
toDate(dos, { assumeOffsetMinutes: -300 }); // 2026-06-29T05:00:00.000Z
一种电线形式被解码: CCYYMMDD。 。 。 . 这是本套件唯一公布的日期表
在交易页头和在出生日期(304-C4)的病人部分.
所有其他有日期或有时间的字段均按无说明形式逐字记录:
苏格兰 <SentTime>, (中文(简体) ), <DateOfBirth>,以及 <WrittenDate> 值,以及 Telecom 其他付款日期
(443-E8)和上个填充日期(530-FU)值. dateValue 答题 undefined 这些
而不是猜测一种表格,因为能解决问题的文件是购买的产品
此软件包不重新分配或引用,从猜测中解码的日期是一个错误的答案:
没什么好宣布的 田地本身未受破坏,仍可读取.
一天的日历没有被拒绝,从来没有翻转. dateValue("20240230") 实值
undefined,一个 DateValue 使用相同的组件构建或分散:
转换应用相同的 4/100/400 跳跃规则 解码器应用,所以两种路径都一样
同样的八位数。 这儿没什么 "2024-02-30",每个 ISO-8601 读取
回到3月1日,和 toDate 在接下来的一个月内永远不要返回.
toDate 永远猜不到一个区域. 这里没有解码的表格带有 UTC 偏移,所以区从不
自行决定:无 assumeOffsetMinutes 你会得到 undefined,以及 主机的
时区从不读取, UTC 也从不假设. 提供冲抵 0 意思是"条约"
这个天真值作为UTC))或得到一无所获. 这种拒绝是关键:一个出生日期已经确定
在每一负震荡区,它都默默地行动.
toObject 只返回所报值的组件,因此 Object.keys() 恢复它的精度.
删除 offsetMinutes 离开对象 Temporal.PlainDate.from 和豪华的
DateTime.fromObject 接受现在。 这里两个库都不是依赖; 此软件包将保留
除其 XML 解析器外,零运行时间依赖.
使用两个 @cosyte 在一个文件中解析
三个名字在套间上刻意相同 所以把两个解码器导入一个 模块表示别名或名称间隔:
import { toISO as ncpdpToISO, dateValue } from "@cosyte/ncpdp";
import { toISO as hl7ToISO, parseDtm } from "@cosyte/hl7";
ncpdpToISO(dateValue(c.dateOfBirth)); // c: the Telecom claim view
hl7ToISO(parseDtm(dtm)); // dtm: an HL7 v2 timestamp string
// or namespace them instead
import * as ncpdp from "@cosyte/ncpdp";
兼容性
标准版本. 每个标准的哪个版本被解码,该章在不识别的情况下被识别 已解码的公用栏目,每个栏目的通过日期,以及结束通过的日期 一次也只有一次,在 合规说明他们是 故意不在这里重述 因为第二本是一份过时的.
卖家怪异. 贸易伙伴和伴行指南的差异通过简介处理
系统 : defineProfile() 加内置 profiles.surescripts 科学、技术和科学研究所 profiles.pbm 页:1
电信,通过同一个公共API 并基于真正的容忍定律
比猜测。 附上一个
parseScript(xml, { profile }) 或者说 parseTelecom(raw, { profile })。简介为 说明数字 :
附带属性和电源警告分区,附带配置文件的输出是
字节- 和输出相同, 没有一个 。 剖面图不会改变剖面 .
以相隔为名,取而代之. 受管制物质的电子说明已失效 它需要缉毒署管制的签名核查和 不同的认证姿态。 解析和排放只是全信息,没有流线 模式。 STIPT 构建器释放它获得的SIG, 并且不从结构中生成 结构化的SIG解码不读取任意的自然语言方向. 大部分线码标签都是 不是船,因为没有公共文物可以建造它们。 没有第三方测试过这个包裹 对参照执行没有差别 合规说明 说什么代表两个 知识分子 是完整的非重叠信任列表.
文档
完整参考文献 docs.cosyte.com/ncpdp 页面存档备份,存于互联网档案馆,从此构建
存储器 docs-content/从这些页面开始:
- 快速启动:读取 SCRIPT NewRx 和 Telecom B1 要求结束, 并看看抛出什么,什么只是警告.
- 开个账单,读一下答案数字 : 建立Telecom债权并读取已付款和被拒绝答案的教程.
- 诊断代码每一个致命的,警告,和 以读者或建筑者的行为构建代码.
- 遵约声明:每条线格式解码, 在收养结束时,由通过收养的公共部门和经过检验的公共部门进行收养.
- 解决问题:当一个解剖投出时,怎么办, 字段读取未定义,或拒绝放出,以及已知的限制.
- 已知的限制:完整的"不逾越信任清单".
支助
虫子报告到 问题跟踪器由人工合成而成 仅限数据。 问题和想法 讨论情况, (中文(简体) ), 它覆盖每个科西特仓库。 该组织 支持页面 列出两者.
需要建立国家CPDP集成,还是为您主办和运行? 看我们的 融合服务。 。 。 .
警卫
通过这个存储库私下报告脆弱性 私人脆弱性报告 或通过电子邮件发送给 安全性@ cosyte.com作为 安全政策 描述。 从不报告 而不包含真正的病人数据.
PHI 与安全
药房交易带有PHI, 而这个图书馆是建立在你的假设.
伐木. 图书馆没有记录 没有 console 调用库代码, 以及它自己的
诊断可以完整记录: 警告或错误消息来自一个被冻结的登记册, 由
代码,而制造一个的工厂 采取一个位置 没有别的,所以没有
一个文档可以到达的插入站点。 一个警告 message 与登记册的字节相同
条目 code并且测试表明 位置是 SCRIPT 的 XPath 和一个字节
乘以 Telecom 的双字符字段代号,其部件仅取自此库的名称
认得,从来没有从一个发送者选择的名字.
续收. 没有任何保留。 剖析是交给它的字节的纯函数. 有一个 没有缓存, 没有模块级别状态, 也没有历史; 返回被冻结的模型是唯一的东西 超过呼叫.
写入磁盘 . 无所为而取取. 库打开没有文件也没有 任何时间的套接字, 代码列表它被捆绑的快照编入包中 而不是运行时间下载.
解析模型无法安全日志 . 域值、药品编码、说明和识别特征
你问的就是这个
为. 保证的是 图书馆自己的结构识别器 保持界限,所以
下游包件建筑诊断不能被传送出无约束的线条字节:
segment.segmentId 总是两个字符 或空的,但交易是, field.id
最多为2个,一个未建模的 SCRIPT 交易只从一个已关闭的词汇中命名.
昂贵的应用程序仍然拥有什么. 呼叫之外的一切:运输和
加密、认证、访问控制和审计、保留和处置、去除识别
分析前, 和它自己的伐木。 如果您登录了解析模型, 您已经登录了 PHI 。 斯德哥尔摩
装入器拒绝任何带有 <!DOCTYPE> 或者说 <!ENTITY> 声明和解决否
因此,没有外部实体或亿分百的载体,但是没有解析器可以使
未信任的文档可存储 .
捐款
外拉请求. 寄存器是公用和麻省理工学院许可的,它需要拉取请求 条件与任何其他变化相同。 该组织 贡献指南 财务报告和审定财务报表 行为守则 此处适用 本节补充了该寄存器的具体内容.
在合并之前,必须澄清什么是贡献. 一个拉动请求必须绿色满足要求
状态检查 main地方:
pnpm lint && pnpm typecheck && pnpm test && pnpm run check && pnpm run build
林特运行于 --max-warnings=0 每个目录的覆盖率为90%。 检查两道门
文本及代码: 任何履带文件或拉取请求标题、正文中无 em 或 en switch
或输入信件,在已公布的表面没有内部项目标识符。 改变
行为还需要一个变换器,一个重新命名稳定警告代码的变换器正在描述
一个突破性的变化.
许可证
MIT. 版权 (c) 2026 Cosyte LLC. 全文: 自由主义。 。 。 .
商标
@cosyte/ncpdp 是一个独立的开源项目。 Cosyte不附属于, 得到..,
或由本储存库或其文件所命名的任何公司担保。 标记显示为
内置配置的名称,因为配置无法记录交易伙伴公约
它可以容纳而不命名它们。 见 贸易。 。 。 .