HL7FHIRAI ; HL7 v2.x → FHIR Bundle Converter
 Quit  ; prevent accidental execution if called with Do ^HL7FHIRAI

 ; --- Test driver ---
Test
 New HL7MSG,OUTJSON
 ; Example HL7 message segments
 Set HL7MSG(1)="MSH|^~\&|LABSYS|LAB|EHR|HOSP|202501011200||ADT^A01|123456|P|2.3"
 Set HL7MSG(2)="PID|1||12345^^^HOSP^MR||Doe^Jane||19851105|F|||123 Main St^^Metropolis^NY^10001||555-1234"
 Set HL7MSG(3)="PV1|1|I|2000^2012^01||||1234^Smith^John|||||||||||98765"
 Set HL7MSG(4)="OBX|1|NM|GLUCOSE^GLU||120|mg/dL|70-110|H|||F"
 Do Convert(.HL7MSG,.OUTJSON)
 Write !,"--- FHIR Bundle JSON Output ---",!
 Write OUTJSON,!
 Quit

 ; --- Main converter ---
Convert(HL7MSG,OUTJSON)
 New FS,CS,RS,EC,SS,SEG,I,TYPE,ENTRY,IDX
 Set FS="|"
 Set CS=$Extract(HL7MSG(1),5)
 Set RS=$Extract(HL7MSG(1),6)
 Set EC=$Extract(HL7MSG(1),7)
 Set SS=$Extract(HL7MSG(1),8)
 Set OUTJSON="{""resourceType"":""Bundle"",""type"":""collection"",""entry"":["
 Set IDX=0
 For I=1:1 Quit:'$Data(HL7MSG(I))  Do
 . Set SEG=HL7MSG(I)
 . Set TYPE=$Piece(SEG,FS,1)
 . Set ENTRY=""
 . Do Dispatch(TYPE,SEG,.ENTRY,FS,RS,CS,SS)
 . If ENTRY'="" Do
 . . If IDX>0 Set OUTJSON=OUTJSON_","
 . . Set OUTJSON=OUTJSON_"{""resource"":"_ENTRY_"}"
 . . Set IDX=IDX+1
 Set OUTJSON=OUTJSON_"]}"
 Quit

 ; --- Dispatcher ---
Dispatch(TYPE,SEG,OUT,FS,RS,CS,SS)
 If TYPE="PID" Do PID(.OUT,SEG,FS,RS,CS,SSQuit
 If TYPE="PV1" Do PV1(.OUT,SEG,FS,RS,CS,SSQuit
 If TYPE="OBX" Do OBX(.OUT,SEG,FS,RS,CS,SSQuit
 Quit

 ; --- Patient (PID → Patient) ---
PID(OUT,SEG,FS,RS,CS,SS)
 New NAME,FAMILY,GIVEN,BIRTH,GENDER
 Set NAME=$$FldOne(5,SEG,FS,RS,CS,SS)
 Set FAMILY=$Piece(NAME,CS,1)
 Set GIVEN=$Piece(NAME,CS,2)
 Set BIRTH=$$FldOne(7,SEG,FS,RS,CS,SS)
 If $Length(BIRTH)=8 Set BIRTH=$Extract(BIRTH,1,4)_"-"_$Extract(BIRTH,5,6)_"-"_$Extract(BIRTH,7,8)
 Set GENDER=$$FldOne(8,SEG,FS,RS,CS,SS)
 If GENDER="M" Set GENDER="male"
 If GENDER="F" Set GENDER="female"
 If GENDER="O" Set GENDER="other"
 If GENDER="U" Set GENDER="unknown"
 Set OUT="{""resourceType"":""Patient"",""identifier"":[{""value"":"""_$$FldOne(3,SEG,FS,RS,CS,SS)_"""}],""name"":[{""family"":"""_FAMILY_""",""given"":["""_GIVEN_"""]}],""birthDate"":"""_BIRTH_""",""gender"":"""_GENDER_"""}"
 Quit

 ; --- Encounter (PV1 → Encounter) ---
PV1(OUT,SEG,FS,RS,CS,SS)
 New VISITNO,CLASSTYP
 Set CLASSTYP=$$FldOne(2,SEG,FS,RS,CS,SS)
 Set VISITNO=$$FldOne(19,SEG,FS,RS,CS,SS)
 Set OUT="{""resourceType"":""Encounter"",""identifier"":[{""value"":"""_VISITNO_"""}],""class"":{""code"":"""_CLASSTYP_"""}}"
 Quit

 ; --- Observation (OBX → Observation) ---
OBX(OUT,SEG,FS,RS,CS,SS)
 New ID,VAL,UNIT
 Set ID=$$FldOne(3,SEG,FS,RS,CS,SS)
 Set VAL=$$FldOne(5,SEG,FS,RS,CS,SS)
 Set UNIT=$$FldOne(6,SEG,FS,RS,CS,SS)
 Set OUT="{""resourceType"":""Observation"",""code"":{""text"":"""_ID_"""},"
 Set OUT=OUT_"""valueQuantity"":{""value"":"""_VAL_""",""unit"":"""_UNIT_"""}}"
 Quit

 ; --- Helpers ---
Fld(N,SEG,OUT,FS,RS,CS,SS)
 New FIELD,I
 Kill OUT
 Set FIELD=$Piece(SEG,FS,N+1)
 For I=1:1:$Length(FIELD,RSSet OUT(I)=$Piece(FIELD,RS,I)
 Quit

FldOne(N,SEG,FS,RS,CS,SS)
 Quit $Piece(SEG,FS,N+1)

en
 New request,linecnt
 Set request=$zcmdline Quit:request=""
 Set request=$$convert(request)
 For linecnt=1:1:$Length(request,$c(10)) Do
 . Set HL7MSG(linecnt)=$Translate($Piece(request,$c(10),linecnt),$c(13)_$c(10),"")
 . Kill:$Translate(HL7MSG(linecnt)," ","")="" HL7MSG(linecnt)
 Do Convert(.HL7MSG,.OUTJSON)
 Write !,"--- FHIR Bundle JSON Output ---",!
 Write OUTJSON,!
 Quit

convert(x)
 New y,z Set z=$Piece(x,"%",1)
 For y=2:1:$Length(x,"%"Do
 . Set %HD=$Extract($Piece(x,"%",y),1,2Do ^%HD
 . Set z=z_$C(%HD)_$Extract($Piece(x,"%",y),3,99)
 Quit z