@cosyte/x12 (英语)
从835、837或271的钞票上读出 桌上没有打开的TR3.
以开发者为主的 ASC X12 保健 EDI 解析器,序列器,以及Node.js和TypeScript的构建器:宽放解析, spec-clean on exmit.
为什么会这样
正确读取 X12 医疗保健交易通常意味着购买TR3 执行指南 对于它,然后手绘元素位置,编译器不会检查。 这个图书馆 移除该步骤 对于一个835的工程师, 一个271的回答, 或者一个837的发送, 和谁需要的金额 完全正确而不是大约正确。 离这里最近的 选项是通用的 EDI 翻译器,该翻译器正确框框但一无所知 关于CLP-04意味着什么, 和一个手卷分解 在片断终止器上, 它的工作直到 第一个交易合伙人派了一个重复分离器 你没有计划。 这都不是:a 零依赖性 TypeScript 库,可以解码保健交易设置为打入的模型, 保持每笔金额的精确小数算术 并报告每个销售商的偏差 一个稳定的代码,而不是失败或猜测.
状态
0.1行线,发布于 npm 从公共仓库.
在0.1线上,公共API是定居的,并且安全地依赖: 输出的阅读器,建设者, 类型和警告代码是我们保持稳定的表面,警告登记册只会增加 密码 在 1.0 下方,一个破碎的更改会撞出小版本,在更改日志中呼出 移民问题。 在更古老的 0.0 发行时, 刻出精确的版本而不是范围 .
每套交易都按打读和打出两艘飞船,包涵270、271、276,
277和277CA、278项请求和答复、820、834、835、837P、837I和837D、999和TA1,各一份
有两个读取器和一个匹配的域名构建器,两个索赔附件指导45 CFR 162. 2002
通过2028年5月26日及之后的时期:277项提供补充资料的请求
(单位:千美元)006020X313和回答它的275(006020X314) (中文(简体) ). 那两个人的基地是X12 006020
对结构进行打字,不检查执行指南的用法,因此使用限定词或分块
指南要求按发送方式携带,从未验证; KNOWN-LIMITATIONS.md 列出其他内容
他们不开放. X12_TR3_CONFORMANCE 是机器可读的答案,用于执行
引导每个源,并且是比此页面更好的源.
未覆盖,而且故意如此:一般不保证字节准确的往返旅行(见 兼容性(c) 运输,例如: AS2和SFTP, 前005010修订, 006020 指南,但两个附件指南除外,以及 解码附件所携带的东西都超出了范围.
安装
pnpm add @cosyte/x12
npm install @cosyte/x12 财务报告和审定财务报表 yarn add @cosyte/x12 一样的工作方式.
22号或以后的节点js,测试于22,24和26:发动机地板为: >=22.0.0,则没有
运行时间依赖。 一揽子船舶具有无害环境管理和共同司法体系的双重性质,包括两种类型的申报
条件,所以 import 财务报告和审定财务报表 require 每个人的意志都是为了他们 可选
@cosyte/x12/arbitraries 进入点,快速检查发电机
属性测试自己的代码, (中文(简体) ),
需求 fast-check 安装在旁边;主入口从不加载.
使用量
分析835笔汇款建议,并读取钱款:付款总额、索赔 收费/付款/病人-责任分开,差额背后的调整原因。 这个 下面的交换是合成的,有一个编造的付款人、提供者、病人和金额.
import { parseX12, get835 } from "@cosyte/x12";
const raw = `ISA*00* *00* *ZZ*MEDICARE *ZZ*SUBMITTER *260601*1200*^*00501*000000001*0*P*:~
GS*HP*MEDICARE*SUBMITTER*20260601*1200*1*X*005010X221A1~
ST*835*0001~
BPR*I*450.00*C*ACH*CCP*01*123456789*DA*987654321*1512345678**01*111111111*DA*222222222*20260601~
TRN*1*0012345*1512345678~
DTM*405*20260601~
N1*PR*MEDICARE PART A~
N3*123 PAYER WAY~
N4*BALTIMORE*MD*21244~
PER*BL*JANE COORDINATOR*TE*5551234567~
N1*PE*SAMPLE CLINIC INC~
N3*456 PROVIDER LN~
N4*CLEVELAND*OH*44113~
REF*TJ*123456789~
LX*1~
CLP*PT-ACCT-001*1*500.00*450.00*50.00*MC*PAYER-CLAIM-001*11*1~
NM1*QC*1*PATIENT*TEST*A***MI*MEMBER001~
NM1*82*2*RENDERING PROVIDER INC*****XX*1234567890~
DTM*232*20260501~
DTM*233*20260501~
SVC*HC:99213*500.00*450.00**1~
DTM*472*20260501~
CAS*PR*1*50.00~
REF*6R*LINE-CTRL-001~
SE*23*0001~
GE*1*1~
IEA*1*000000001~`;
const ix = parseX12(raw);
const tx = ix.groups[0]?.transactions.find((t) => t.st.elements[1] === "835");
if (tx === undefined) throw new Error("no 835 in this interchange");
const remit = get835(ix.delimiters, tx);
if (remit === undefined) throw new Error("not an 835");
// The payment, the claim's split, and who owes the difference and why.
const claim = remit.claims[0];
const adjustment = claim?.serviceLines[0]?.adjustments[0];
console.log("paid", remit.payment.totalActualPayment?.toString(), "by", remit.payment.method);
console.log("claim", claim?.patientControlNumber, "charged", claim?.totalChargeAmount?.toString());
console.log("patient owes", claim?.patientResponsibilityAmount?.toString());
console.log("reason", adjustment?.groupCode, adjustment?.reasonCode, adjustment?.reasonDescription);
console.log("warnings", ix.warnings.length);
// The values printed above, which the test suite asserts on every run:
remit.payment.totalActualPayment?.toString(); // => "450.00"
claim?.totalChargeAmount?.toString(); // => "500.00"
claim?.patientResponsibilityAmount?.toString(); // => "50.00"
adjustment?.groupCode; // => "PR"
adjustment?.reasonCode; // => "1"
adjustment?.reasonDescription; // => "Deductible Amount"
ix.warnings; // => []
它印着:
paid 450.00 by ACH
claim PT-ACCT-001 charged 500.00
patient owes 50.00
reason PR 1 Deductible Amount
warnings 0
这个 groupCode 你告诉我,谁欠这笔钱PR 病人的责任, CO 合同
义务,等等)。 读取;从不推断.
API 密码
所有船只都从一个入境点出发,没有次道进口.
- 读取.
parseX12将交换码解码为模型,每个交易读取器转换为 交易设置为已键入的get835, (中文(简体) ),get837Claims, (中文(简体) ),get270Inquiry, (中文(简体) ),get271Eligibility, (中文(简体) ),get276StatusInquiry, (中文(简体) ),parse999, (中文(简体) ),parseTA1,和其余部分). - 释出.
serializeX12财务报告和审定财务报表buildInterchange是一般路径, 每套交易 拥有阅读器的还有域名构建器(build835, (中文(简体) ),build837P, (中文(简体) ),build271,和其余部分). - 错误和警告. 解析很宽大,而且 4个 结构故障是致命的
(单位:千美元)
X12_NO_ISA_HEADER, (中文(简体) ),X12_ISA_TOO_SHORT, (中文(简体) ),X12_INVALID_DELIMITERS, (中文(简体) ),X12_EMPTY_INPUT) (中文(简体) ). 其他东西都来了ix.warnings作为稳定代码 位置上下文, 所以容忍 偏差是可见的,而不是沉默的. - 钱. 每个货币、百分比和数量字段解码为
X12Decimal,这是 以 BigInt 算术支持字符串, 这个库从不parseFloat编号 a 电子数据交换数额。 A 类 将发件人空出的位置读取undefined而不是零,所以“已声明为零”和“已声明为零” 没什么" 读数不同. - 相会相会.
X12_TR3_CONFORMANCE说明每个交易集的执行指南 以及该识别特征如何与联邦的参照法相矛盾. - CORE代码组合.
checkCoreCodeCombination回答835调整组, cORE 定义业务情景的 CORE 代码组合表 你叫谁? 您提供表并命名其版本, 没有CORE表船与这个包 a 一个unevaluated答案是绝不允许张贴.
面向任务的指南包含 docs-content/,以及
知识分子 是一份诚实的不逾越信任清单.
日期和时间
每个输入的读取器都会逐字显示日期, 因为发送者使用的修饰符加上它的字节
载. toObject, (中文(简体) ), toISO,以及 toDate 是三种读取方法之一,而每一个 @cosyte/*
parser 输出形状和时区规则相同的三个名称.
import { toObject, toISO, toDate } from "@cosyte/x12";
// A DTP or DTM date off any typed reader: claim.dates[0], eligibility.dates[0], and so on.
const day = { formatQualifier: "D8", value: "20260601" };
toObject(day); // { year: 2026, month: 6, day: 1 }
toISO(day); // "2026-06-01"
// A calendar day is not an instant. Without a stated offset there is no answer.
toDate(day); // undefined
toDate(day, { assumeOffsetMinutes: 0 })?.toISOString(); // "2026-06-01T00:00:00.000Z"
toDate(day, { assumeOffsetMinutes: -300 })?.toISOString(); // "2026-06-01T05:00:00.000Z"
// A range converts to nothing, because an interval is not a point in time.
const span = { formatQualifier: "RD8", value: "20260601-20260605" };
toISO(span); // undefined
解码格式限定语集为 D8 财务报告和审定财务报表 RD8没有别的. 这是两个DTP-02
值 此库已解析并构建 : D8 是一个单 CCYYMMDD 白天,和 RD8 是一个
CCYYMMDD-CCYYMMDD 范围。 此对外的修饰符, 一个缺失的, 一个数值的位数不
匹配其修饰符声明的形状,日历上没有的一天全部转换为
undefined三个人从不扔, 所以宽大 剖析保持宽大
值您读取.
RD8 转换为 undefined 从所有三个,故意. 间隔不是时间点,
因此,在服务期间或资格期,没有一天可以交还。 递回来
第一端点将是一个静悄悄的错误答案,其外形很正. 自己分割范围
并改变你的意思.
toDate 返回一个瞬间,只当您声明区域. 没有 X12 日期元素此库
解码带 UTC 偏移,所以 assumeOffsetMinutes (在协调世界时以东签署)是唯一的办法
一个到达结果。 没有它,答案是 undefined: 主机的时区从不
读取 和 UTC 永远不会被假定, 因为同一个午夜是两个不同的瞬间
边界和在错误区域读取的出生日期是一天.
toObject 只返回所报值的组件,其中 month 第1至12类比
比 Java 脚本 Date 0对11,所以 Object.keys() 的精度。 删除
offsetMinutes 所剩的被接受 Temporal.PlainDateTime.from 和豪华的
DateTime.fromObject 没有重命名。 这里两个库都不是依赖; 此软件包仍然有
零的这些.
日期意识代码列表查询, checkCarcValidity 财务报告和审定财务报表 checkRarcValidity,保持他们自己的
合同和仍然THROW a X12CodeListError 在一个文件日期,他们拒绝。 这种分歧是
故意地:他们回答一个打电话者,他询问一个合法性问题,而不能说明当天的情况
这三人读了一张已经很宽大了的文件.
使用一个文件中的两个 @ cosyte 解析器
三个名字都一样 @cosyte/* parser,所以导入其中两个意味着别名:
import { toISO as x12ToISO } from "@cosyte/x12";
import { toISO as hl7ToISO } from "@cosyte/hl7";
x12ToISO({ formatQualifier: "D8", value: "20260601" });
hl7ToISO(someParsedHl7Timestamp);
命名空间导入工作也 : import * as x12 from "@cosyte/x12",则 x12.toISO(day)。 。 。 .
兼容性
- 005010 HIPAA交易集用钩子对行业进行修正 交换。 850起、856起、810起、204起、EDIFACT起、AS2起、SFTP起等非卫生保健装置 运输以及前005010年的修订已超出范围.
- 供应商的偏离成为警告,而不是例外. 内建配置文件记录
它们所容纳的伴向导偏差; 选择一个绝对不会改变一个相反的偏差
解析和配置文件通过同一公众编写
defineProfile()API你已经. - 轮回旅行一般不是字节准确的.
serializeX12复制模型上的片段 逐字记录,包括元素粘贴、复合材料和?- 释放逃跑,但是serialize(parse(s)) === s通常没有保障间换行符 常见的大小写: 区段之间的任何 CR 或 LF 运行都是在剖析时被吸收的, 所以一个相当打印的文件 发射紧凑。 大部分打破来回的构造是沉默的,所以"我的文档没有行 间歇也不够. 知识分子 是犬科动物 列表中选择一个选项.
文档
完整的文献资料生活在 docs.cosyte.com/x12 (英语),从此构建
存储器 docs-content/开始
这些页:
- 快速启动:读作835 并抽出付款, 每件索赔的钱, 和调整的理由.
- 80/20套交易数字 : 每个交易都设置了这个包封面,有它的阅读器和构建器.
- 十进制货币数字 :
为什么每个金额都是
X12Decimal并且从来没有JavaScript号码. - 构建和序列化 X12数字 :
发射方,从
serializeX12到域名构建者. - 寄出835笔汇款数字 : ,第一个向导,一个任务,用于交接的交易.
- 解决问题页:1 出错模型,常见症状,以及此套件的分界线都是故意的.
支助
问题和想法 讨论情况,哪个 覆盖每个 Cosyte 仓库 。 臭虫报告 交易伙伴怪怪到 问题跟踪器与合成复制 从来没有 真正的交换。 该组织 支助指南 还有其他的.
需要建立X12集成系统,还是为您托管和运行? 看我们的 融合服务。 。 。 .
警卫
私下报告脆弱性,如: 安全政策 描述,从来没有在 公共问题.
PHI 与安全
X12保健交易携带受保护的保健信息,所以处理你手上的每一个交换 这个图书馆是PHI.
和你的文件有什么关系. 它在记忆中解码 而不是其他的。 没有打开套接字, 没有写入磁盘, 没有在运行时获取到任何内容: 已捆绑的代码列表已版本 数据快照,所以更新一个是发布而不是网络呼叫. 承认者 是纯函数,从不自动发送.
无法诊断的. 一个警告 message 而是对被冻结的登记册进行检索
而不是从你的文档中建起的东西, 并且这个库里的任何警告工厂 都没有价值
参数,所以你的任何元素 都无法达到诊断。 密码和 position 说什么和
在哪里;字节留在模型上. ALL_WARNING_MESSAGES 被导出,所以您可以断言 .
一个故意的例外. X12ParseError.snippet 四个结构致命的 是一个界限
输入开始的复制件,因此在真实流量上,它可以携带PHI,并且没有被编辑. 日志
err.code 财务报告和审定财务报表 err.position 而不是在你的电话网站进行编辑.
一个附件拒绝打印 . 将275个载体的每个BDS数据读入
X12AttachmentData谁的弦,JSON,和 util.inspect 表格中显示其八分数和无
其他; readOctets() 是通往八角星的一条路.
建造者拒绝是一种较弱的地表,是故意的. A 类 build* 拒绝名称控件
数字、数或代码,你通过, 这样你就可以看到什么被拒绝。 碎片是
以出出常数为界,但以出出常数为界,而非去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去去 两个附件
建构者是例外, 名称完全没有价值 。 日志 err.code没有 err.message从 a
建会者.
你仍然拥有的东西. 运输、储存、保留、出入控制、审计记录和每个记录 键入您自己的代码。 这个图书馆没有代表你提出HIPAA遵守要求.
捐款
错误报告和交易伙伴的怪胎属于 GitHub 问题,如上文支助所说.
欢迎拉动请求。 该组织
贡献指南 财务报告和审定财务报表
行为守则 在此应用。 A 类
捐款必须明确 pnpm typecheck, (中文(简体) ), pnpm lint,以及 pnpm test,按每本目录
覆盖层,通过PHI交火门pnpm phi-scan和传教门
(单位:千美元)pnpm check:no-emdash, (中文(简体) ), pnpm check:no-internal-refs),并携带一个变换器. 每一个固定
合成:永远不要打开一个带真实病人数据的拉出请求.
商标
活性与蓝十字蓝盾是各自所有者的商标. 软体不是 * 附属于、得到或得到其中任何一方的认可。 贸易伙伴的名字 他们的伴行偏离了内置的轮廓。 见 贸易。 。 。 .
许可证
MIT,版权 (c) 2026 Cosyte LLC. 见 自由主义。 。 。 .
由 调和。 。 。 .