IBTRH8 ;ALB/JWS - HCSR Worklist - view 278 message in X12 format ;24-AUG-2015
 ;;2.0;INTEGRATED BILLING;**517**;21-MAR-94;Build 240
 ;;Per VA Directive 6402, this routine should not be modified.
 ;;
 Q
EN ; display message in X12 format
 ; IBTRIEN = ien of file 356.22
 ; MSGTYPE = 217 or 215
 ; RR = 0 for request / inquiry, 1 for response
 N X,MSGTYPE,RR,TD,TT,HL1,HL2,ADDR1,ADDR2,ADDR3,REQDATA,SITEIEN
 N NODE0,OMSG,DFN,IEN312,INSNODE0,INSNODE3,IEN3553,IEN36,GNUM,PREL
 N NODE2,NODE4,NODE5,NODE6,NODE7,NODE8,NODE9,NODE10,NODE17,NODE18,NODE19
 N REQCAT,CERT,INPAT,EVNT,HL1,HL2,PAYID,PAYER,PNODE0,IDTYPE,RELINFO
 N REQIEN,RMSH10,HLECH,HLFS,HLQ
 K ^TMP($J,"IBTRH8")
 S SITEIEN=$P($$SITE^VASITE(),U) I SITEIEN'>0 D ERROR Q
 S NODE0=$G(^IBT(356.22,IBTRIEN,0)) I NODE0="" D ERROR Q
 I $P(NODE0,U,12)="" D ERROR Q
 S MSGTYPE=+$P(NODE0,"^",20),RR=0
 I MSGTYPE=2 D  I +OMSG=0 D ERROR Q
 . S RR=1
 . S OMSG=$P(NODE0,U,13)
 . I OMSG D
 .. S REQIEN=IBTRIEN,IBTRIEN=OMSG
 .. S NODE0=$G(^IBT(356.22,OMSG,0))
 .. S MSGTYPE=+$P(NODE0,U,20),RR=0,RMSH10=$P(NODE0,"^",12)
 . Q
 S DFN=+$P(NODE0,U,2)
 I DFN'>0 D ERROR Q
 S IEN312=+$P(NODE0,U,3)
 I IEN312'>0 D ERROR Q
 S INSNODE0=$G(^DPT(DFN,.312,IEN312,0)) ; 0-node in file 2.312
 S INSNODE3=$G(^DPT(DFN,.312,IEN312,3)) ; 3-node in file 2.312
 S IEN3553=+$P(INSNODE0,U,18) ; file 355.3 ien
 S IEN36=+$P(INSNODE0,U)
 I IEN36'>0 D ERROR Q
 S GNUM=$S(IEN3553>0:$$GET1^DIQ(355.3,IEN3553_",",.04),1:"") ; group number
 S PREL=$P($G(^DPT(DFN,.312,IEN312,4)),U,3) ; pat. relationship to insured
 S NODE2=$G(^IBT(356.22,IBTRIEN,2))
 S NODE4=$G(^IBT(356.22,IBTRIEN,4))
 S NODE5=$G(^IBT(356.22,IBTRIEN,5))
 S NODE6=$G(^IBT(356.22,IBTRIEN,6))
 S NODE7=$G(^IBT(356.22,IBTRIEN,7))
 S NODE8=$G(^IBT(356.22,IBTRIEN,8))
 S NODE9=$G(^IBT(356.22,IBTRIEN,9))
 S NODE10=$G(^IBT(356.22,IBTRIEN,10))
 S NODE17=$G(^IBT(356.22,IBTRIEN,17))
 S NODE18=$G(^IBT(356.22,IBTRIEN,18))
 S NODE19=$G(^IBT(356.22,IBTRIEN,19))
 S HLECH="^~\&",HLFS="|",HLQ=""""
 S X="ST*278*0001*005010X"_$S(MSGTYPE=0:217,1:215) D SAVE(X)
 S REQCAT=$$GET1^DIQ(356.001,+$P(NODE2,U)_",",.01) ; request category
 S CERT=$$GET1^DIQ(356.002,+$P(NODE2,U,2)_",",.01) ; certification type code
 S INPAT=$S($P(NODE0,U,4)="I":1,1:0) ; 1 if inpatient, 0 if outpatient
 ; determine event reason code
 I 'MSGTYPE D
 . I REQCAT'="IN" S EVNT="13" Q  ; request category = "HS" (Health Services), "AR" (Admission), or "SC" (Specialty Care) -> event code = 13 (Request)
 . I CERT=3 S EVNT="01" Q  ; request category = "IN" (Individual) and certification type = 3 (Cancel) -> event code = 01 (Cancel)
 . S EVNT=36 ; request category = "IN" (Individual) and certification type '= 3 (other than Cancel) -> event code = 36 (Authority To Deduct)
 . Q
 I MSGTYPE=1 S EVNT=28 ; 28 for 215 message
 I RR=1 S EVNT=11 ; 11 for response messages
 S X=$P(NODE0,U,15),(TD,TT)=""
 I X'="" D H^%DTC I %H D YX^%DTC S TD=$S($E(X)=3:20,1:19)_$E(X,2,7),Y=$P(NODE0,U,15) D DD^%DT S TT=$TR($P(Y,"@",2),":","")
 S X="BHT*0007*"_EVNT_"*"_$S(RR=1:$G(RMSH10),1:$P(NODE0,U,12))_"*"_TD_"*"_TT_$S(EVNT=36:"*RU",1:"") D SAVE(X)
 S HL1=$G(HL1)+1
 S X="HL*"_HL1_"**20*1" D SAVE(X)
 I RR=1 D AAA^IBTRH8A("2000A")
 S PAYID=""
 S PAYER=+$$GET1^DIQ(36,IEN36_",",3.1,"I") ; file 365.12 ien
 I PAYER'>0 D ERROR Q
 S PNODE0=$G(^IBE(365.12,PAYER,0)),IDTYPE="PI"
 S PAYID=$P(PNODE0,U,2) ; VA national id
 ; if no VA national id, try to get CMS national id
 I PAYID="" S PAYID=$P(PNODE0,U,3),IDTYPE="XV"
 ; if still no id, bail out
 I PAYID="" D ERROR Q
 S RELINFO=$P(NODE2,U,16)  ;UM09 Release of Information Code
 ; get HPID, relies on patch IB*2.0*519
 ; S $P(TMP,HLECH,3)=$$HPD^IBCNHUT1(IEN36)
 ; 
 S X="NM1*X3*2*"_$$GET1^DIQ(36,IEN36_",",.01)_"*****"_IDTYPE_"*"_PAYID D SAVE(X)
 I RR=1 D PERR,AAA^IBTRH8A("2010A")
 ; HL - Requester Level Loop 2000B
 S HL2=HL1,HL1=HL1+1
 S X="HL*"_HL1_"*"_HL2_"*21*1" D SAVE(X)
 S REQDATA=$$PRVDATA^IBTRHLO2(SITEIEN,4)
 I $TR(REQDATA,U)="" D ERROR Q
 S X="NM1*FA*2*"_$P(REQDATA,U)_"*****XX*"_$P(REQDATA,U,7) D SAVE(X)
 I RR=1 D AAA^IBTRH8A("2010B")
 S ADDR1=$P(REQDATA,U,2,3),ADDR2=$P(REQDATA,U,4,6)
 S ADDR3=$P($$HLADDR^HLFNC(ADDR1,ADDR2),U,1,5)
 I 'RR S X="N3*"_$P(ADDR3,"^") S:$P(ADDR3,"^",2)'="" X=X_"*"_$P(ADDR3,"^",2) D SAVE(X)
 I 'RR S X="N4*"_$P(ADDR3,"^",3)_"*"_$P(ADDR3,"^",4)_"*"_$P(ADDR3,"^",5) D SAVE(X)
 I 'RR D PER
 D PRV
 S HL2=HL1,HL1=HL1+1
 S X="HL*"_HL1_"*"_HL2_"*22*1" D SAVE(X)
 D NM1
 I PREL'="18" D
 .S HL2=HL1,HL1=HL1+1
 .S X="HL*"_HL1_"*"_HL2_"*23*1" D SAVE(X)
 .D NM12010D
 .Q
 S HL2=HL1,HL1=HL1+1
 S X="HL*"_HL1_"*"_HL2_"*EV*"_$S($O(^IBT(356.22,IBTRIEN,16,0)):1,1:0) D SAVE(X)  ; if line level procedure code sub HL seg, otherwise 0
 D EVENT
 D DISPLAY^IBTRH8A
 I $D(REQIEN) S IBTRIEN=REQIEN
 Q
 ;
PER ; create PER segment in loop 2010B
 N CTD,COMMSTR,IEN200,NAME,NODE19,QUAL,TMP,VALUE,Z
 S IEN200=+$P(NODE0,U,11) I IEN200'>0 Q
 S NAME=$$GET1^DIQ(200,IEN200_",",.01) I NAME="" Q
 S NODE19=$G(^IBT(356.22,IBTRIEN,19))
 S COMMSTR="" F Z="20^2^19.01","21^3^19.02","22^4^19.03" D
 . S QUAL=$P(NODE19,U,$P(Z,U,2)) I QUAL="" Q
 . S QUAL=$$EXTERNAL^DILFD(356.22,$P(Z,U,3),,QUAL)
 . S VALUE=$G(^IBT(356.22,IBTRIEN,$P(Z,U))) I VALUE="" Q
 . I "^FX^HP^TE^WP^"[(U_QUAL_U) S VALUE=$$NOPUNCT^IBCEF(VALUE,1) ; strip punctuation if phone #
 . S $P(TMP,U)=QUAL,$P(TMP,U,2)=VALUE
 . S COMMSTR=$S(COMMSTR="":TMP,1:COMMSTR_U_TMP)
 . Q
 S X="PER*IC*"_NAME_"*"_$P(COMMSTR,U)_"*"_$P(COMMSTR,U,2)
 I $P(COMMSTR,U,3)'="" S X=X_"*"_$P(COMMSTR,U,3)_"*"_$P(COMMSTR,U,4)
 I $P(COMMSTR,U,5)'="" S X=X_"*"_$P(COMMSTR,U,5)_"*"_$P(COMMSTR,U,6)
 D SAVE(X)
 Q
 ;
PRV ; create PRV segment (X12: PRV, 2010B)
 N PRD,TXNM
 S TXNM=$P($$TAXORG^XUSTAX(SITEIEN),U) I TXNM="" Q
 S X="PRV*PE*PXC*"_TXNM D SAVE(X)
 Q
 ;
NM1 ; create NM1 segment (X12: NM1, 2010C)
 N ADDR1,ADDR2,GT1,SID1,SIDSTR,NAME
 S SID1=$P(INSNODE0,U,2) I SID1=""  Q
 S NAME=$P(INSNODE0,U,17) I NAME="" Q
 ;;S SID2=GNUM ; secondary subscriber id is a group number
 S NAME=$$HLNAME^HLFNC(NAME)
 S X="NM1*IL*1*"_$P(NAME,"^")_"*"_$P(NAME,"^",2)_"*"_$P(NAME,"^",3)_"**"_$P(NAME,"^",4)_"*MI*"_SID1 D SAVE(X)
 I GNUM'="" S X="REF*6P*"_GNUM D SAVE(X)
 I 'MSGTYPE,$P(INSNODE3,U,6)'="",$P(INSNODE3,U,8)'="" D
 . S ADDR1=$P(INSNODE3,U,6,7),ADDR2=$P(INSNODE3,U,8,10)
 . S ADDR3=$$HLADDR^HLFNC(ADDR1,ADDR2) ; subscriber address
 . S X="N3*"_$P(ADDR3,"^") S:$P(ADDR3,"^",2)'="" X=X_"*"_$P(ADDR3,"^",2) D SAVE(X)
 . S X="N4*"_$P(ADDR3,"^",3)_"*"_$P(ADDR3,"^",4)_"*"_$P(ADDR3,"^",5) D SAVE(X)
 . Q
 I RR D AAA^IBTRH8A("2010C")
 S X="DMG*D8*"_$$HLDATE^HLFNC($P(INSNODE3,U)) ; subscriber dob
 I 'MSGTYPE S X=X_"*"_$P(INSNODE3,U,12) ; subscriber sex
 D SAVE(X)
 I MSGTYPE Q
 I PREL'="18" S PREL=$S(PREL="01":"01",PREL=19:19,1:"G8") ; relationship to insured
 S X="INS*Y*18" D SAVE(X)
 Q
 ;
NM12010D ; create NM1 segment, loop 2010D
 N IDSTR,PID,TMP,VAFSTR
 I GNUM="" Q
 S VAFSTR="7,8,11,"
 S PID=$$EN^VAFHLPID(DFN,VAFSTR)
 S TMP=$P(PID,"|",12)
 I $P(TMP,U,2)="""""" S $P(TMP,U,2)="",$P(PID,"|",12)=TMP
 S X="NM1*QC*1*"_$P($P(PID,"|",6),"^")_"*"_$P($P(PID,"|",6),"^",2) S:$P($P(PID,"|",6),"^",3)'="" X=X_"*"_$P($P(PID,"|",6),"^",3) D SAVE(X)
 S X="REF*EJ*"_GNUM D SAVE(X)
 I 'MSGTYPE!RR D
 . S X="N3*"_$P(TMP,"^") S:$P(TMP,"^",2)'="" X=X_"*"_$P(TMP,"^",2) D SAVE(X)
 . S X="N4*"_$P(TMP,"^",3)_"*"_$P(TMP,"^",4)_"*"_$P(TMP,"^",5) D SAVE(X)
 . Q
 I RR D AAA^IBTRH8A("2010D")
 S X="DMG*D8*"_$P(PID,"|",8) S:'MSGTYPE X=X_"*"_$P(PID,"|",9) D SAVE(X)
 I MSGTYPE Q
 S X="INS*N*"_PREL D SAVE(X)
 Q
 ;
EVENT ; 2000E loop
 ; create G2R.PRB segment (G2R segment group)
 N PRB,Z,TOT
 I RR D AAA^IBTRH8A("2000E")
 I CERT="" Q  ; missing certification type code
 S X="UM*"_REQCAT_"*"_CERT_"*"_$$GET1^DIQ(365.013,+$P(NODE2,U,3)_",",.01)
 I $P(NODE2,U,4)'="" S X=X_"*"_$S($P(NODE2,U,4)="A":($P(NODE2,U,6)_$P(NODE2,U,7)),1:$$GET1^DIQ(353.1,+$P(NODE2,U,5)_",",.01))_":"_$P(NODE2,U,4)
 E  D  I MSGTYPE Q
 . I MSGTYPE D SAVE(X) Q
 . S X=X_"*"
 S X=X_"*"_$P(NODE2,U,8)_":"_$P(NODE2,U,9)_":"_$P(NODE2,U,10)_":"_$$GET1^DIQ(5,+$P(NODE2,U,11)_",",1)
 S Z=$$GET1^DIQ(779.004,+$P(NODE2,U,12)_",",.01) I Z'="",Z'="USA" S X=X_":"_Z
 S X=X_"*"_$P(NODE2,U,13)_"*"_$$GET1^DIQ(356.003,+$P(NODE2,U,14)_",",.01)_"*"_$$GET1^DIQ(356.004,+$P(NODE2,U,15)_",",.01)_"*"_$P(NODE2,U,16)_"*"_$$GET1^DIQ(356.005,+$P(NODE2,U,17)_",",.01) D SAVE(X)
 I RR D HCR
 D REF
 D DTP
 D HI
 ; for 217 request only
 I 'MSGTYPE D 
 . D HSD,CRC
 . I $TR(NODE18,U)'="" D CR1
 . D CR2,CR5^IBTRH8A,CR6^IBTRH8A,PWK,MSG
 D NM1^IBTRH8A
 ;
 I '$O(^IBT(356.22,IBTRIEN,16,0)) Q
 S HL2=HL1,HL1=HL1+1
 S X="HL*"_HL1_"*"_HL2_"*SS*0" D SAVE(X)
 D DETAIL^IBTRH8A
 S TOT=$G(^TMP($J,"IBTRH8"))+1
 S X="SE*"_TOT_"*0001" D SAVE(X)
 Q
 ;
REF ; REF segment
 I $P(NODE17,U)'="" S X="REF*BB*"_$P(NODE17,U) D SAVE(X) Q
 I $P(NODE17,U,2)'="" S X="REF*NT*"_$P(NODE17,U,2) D SAVE(X) Q
 Q
 ;
DTP ; create DTP segments
 N DATA,Z,Z1
 S Z=$P(NODE0,U,7) I Z'="" D
 . S Z1="AAH" I INPAT,REQCAT="AR" S Z1="435"
 . S DATA(Z1)=$S(Z["-":$$HLDATE^HLFNC($P($P(Z,"-"),"."))_"-"_$$HLDATE^HLFNC($P($P(Z,"-",2),".")),1:$$HLDATE^HLFNC($P(Z,"."))) ; admission / appointment date
 . Q
 S Z=$P(NODE2,U,18) I Z'="" S DATA("439")=$$HLDATE^HLFNC($P(Z,".")) ; accident date
 I 'MSGTYPE D
 . S Z=$P(NODE2,U,19) I Z'="" S DATA("484")=$$HLDATE^HLFNC($P(Z,".")) ; last menstrual period date
 . S Z=$P(NODE2,U,20) I Z'="" S DATA("ABC")=$$HLDATE^HLFNC(Z) ; estimated DOB
 . S Z=$P(NODE2,U,21) I Z'="" S DATA("431")=$$HLDATE^HLFNC(Z) ; illness date
 . Q
 ; the following date is for "Admission Review" request category only
 I INPAT,REQCAT="AR" S Z=$P(NODE2,U,22) S:Z'="" DATA("096")=$$HLDATE^HLFNC($P(Z,".")) ; discharge date
 S Z="" F  S Z=$O(DATA(Z)) Q:Z=""  D
 . S X="DTP*"_Z_"*D8*"_DATA(Z) D SAVE(X)
 . Q
 Q 
 ;
HI ; create HI segments
 N DG1,DIAG,NODE0,SEQ,Z
 S (SEQ,Z)=0 F  S Z=$O(^IBT(356.22,IBTRIEN,3,Z)) Q:Z'=+Z  D
 . S NODE0=$G(^IBT(356.22,IBTRIEN,3,Z,0)) I NODE0="" Q  ; 0-node of sub-file 356.223
 . S SEQ=SEQ+1 I SEQ>12 Q  ; only allow up to 12 DG1 segments
 . I MSGTYPE,SEQ>1 Q  ; only allow 1 DG1 segment in 215 message
 . S DIAG=$TR($$EXTERNAL^DILFD(356.223,.02,,$P(NODE0,U,2)),".") I DIAG="" Q  ; invalid diagnosis code
 . S DG1(SEQ)="*"_$$GET1^DIQ(356.006,+$P(NODE0,U)_",",.01)_":"_DIAG I 'MSGTYPE,$P(NODE0,U,3)'="" S DG1(SEQ)=DG1(SEQ)_":D8:"_$$HLDATE^HLFNC($P(NODE0,U,3))
 . ;S DG1="DG1"_HLFS_SEQ_HLFS_HLFS_$$ENCHL7^IBCNEHLQ(DIAG)_HLFS_HLFS_$S('MSGTYPE:$$HLDATE^HLFNC($P(NODE0,U,3)),1:"")_HLFS_"W"
 . Q
 I '$O(DG1("")) Q
 S X="HI"
 S Z=0 F  S Z=$O(DG1(Z)) Q:Z=""  S X=X_DG1(Z)
 D SAVE(X)
 Q
 ;
HSD ; create HSD segment
 N QUAL,VALUE,HSD,I
 S QUAL=$$GET1^DIQ(365.016,+$P(NODE4,U)_",",.01)
 S VALUE=$P(NODE4,U,2)
 I QUAL'="",VALUE'="" S HSD(1)=QUAL,HSD(2)=VALUE  ;ZHS.2=4.01, ZHS.3=4.02 
 S QUAL=$P(NODE4,U,3)
 S VALUE=$P(NODE4,U,4)
 I QUAL'="",VALUE'="" S HSD(3)=QUAL  ;ZHS.4=4.03
 I VALUE'="" S HSD(4)=VALUE  ;ZHS.5=4.04
 S QUAL=$$GET1^DIQ(365.015,+$P(NODE4,U,5)_",",.01)
 S VALUE=$P(NODE4,U,6)
 I QUAL'="",VALUE'="" S HSD(5)=QUAL,HSD(6)=VALUE ;ZHS.6=4.05, ZHS.7=4.06
 I +$P(NODE4,U,7) S HSD(7)=$$GET1^DIQ(365.025,+$P(NODE4,U,7)_",",.01) ;ZHS.8=4.07
 I +$P(NODE4,U,8) S HSD(8)=$$GET1^DIQ(356.007,+$P(NODE4,U,8)_",",.01) ;ZHS.9=4.08
 I '$D(HSD) Q
 S X="HSD" F I=1:1:8 S X=X_"*"_$G(HSD(I))
 D SAVE(X)
 Q
 ;
CRC ; create CRC and CL1 segments in loop 2000E
 N PC,Z
 I +$P(NODE4,U,10) D  ; at least one ambulance cert. condition exists
 . S X="CRC*07*"_$P(NODE4,U,9)
 . F PC=10:1:14 S Z=+$P(NODE4,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE5,U,2) D  ; at least one chiropractic cert. condition exists
 . S X="CRC*08*"_$P(NODE5,U)
 . F PC=2:1:6 S Z=+$P(NODE5,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE5,U,8) D  ; at least one DME cert. condition exists
 . S X="CRC*09*"_$P(NODE5,U,7)
 . F PC=8:1:12 S Z=+$P(NODE5,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE5,U,14) D  ; at least one oxygen cert. condition exists
 . S X="CRC*11*"_$P(NODE5,U,13)
 . F PC=14:1:18 S Z=+$P(NODE5,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE6,U,2) D  ; at least one functional limit cert. condition exists
 . S X="CRC*75*"_$P(NODE6,U)
 . F PC=2:1:6 S Z=+$P(NODE6,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE6,U,8) D  ; at least one activities cert. condition exists
 . S X="CRC*76*"_$P(NODE6,U,7)
 . F PC=8:1:12 S Z=+$P(NODE6,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I +$P(NODE6,U,14) D  ; at least one mental status cert. condition exists
 . S X="CRC*77*"_$P(NODE6,U,13)
 . F PC=14:1:18 S Z=+$P(NODE6,U,PC) I Z S X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 . D SAVE(X)
 . Q
 I INPAT,$TR($P(NODE7,U,1,4),U)'="" D  ; inpatient, admission data exists
 . S X="CL1*"_$P(NODE7,U)
 . S Z=+$P(NODE7,U,2) I Z S $P(X,"*",3)=$$GET1^DIQ(356.009,Z_",",.01)
 . S Z=+$P(NODE7,U,3) I Z S $P(X,"*",4)=$$GET1^DIQ(356.01,Z_",",.01)
 . S Z=+$P(NODE7,U,4) I Z S $P(X,"*",5)=$$GET1^DIQ(356.011,Z_",",.01)
 . D SAVE(X)
 . Q
 Q
 ;
CR1 ; create CR1 segment
 N Z,Z1
 S X="CR1*"
 S $P(X,"*",5)=$P(NODE18,U,4)
 S $P(X,"*",10)=$P(NODE18,U,9)
 S $P(X,"*",11)=$P(NODE18,U,10)
 S Z=$P(NODE18,U,2) I Z'="" S $P(X,"*",2)=$P(NODE18,U),$P(X,"*",3)=Z
 S Z=$P(NODE18,U,6) I Z'="" S $P(X,"*",6)=$P(NODE18,U,5),$P(X,"*",7)=Z
 S $P(X,"*",4)=$P(NODE18,U,3)
 D SAVE(X)
 Q
 ;
CR2 ; create CR2 segment
 N TXNUM,TXCNT,Z
 S TXNUM=$P(NODE7,U,5) I TXNUM="" Q  ; missing treatment series number
 S TXCNT=$P(NODE7,U,6) I TXCNT="" Q  ; missing treatment count
 S TXNUM=+TXNUM,TXCNT=+TXCNT
 S X="CR2*"_TXNUM_"*"_TXCNT
 S Z=+$P(NODE7,U,7) I Z>0 S $P(X,"*",4)=$$GET1^DIQ(356.012,Z_",",.01)
 S Z=+$P(NODE7,U,8) I Z>0 S $P(X,"*",5)=$$GET1^DIQ(356.012,Z_",",.01)
 S $P(X,"*",9)=$P(NODE7,U,9)
 I $P(NODE7,U,10)'="" S $P(X,"*",10)=$P(NODE7,U,10)
 S $P(X,"*",13)=$P(NODE7,U,13)
 S $P(X,"*",11)=$P(NODE7,U,11)
 S $P(X,"*",12)=$P(NODE7,U,12)
 D SAVE(X)
 Q
 ;
PWK ; create the PWK segment loop 2000E
 N NODE0,SEQ,Z,Z1
 S SEQ=0,Z="" F  S Z=$O(^IBT(356.22,IBTRIEN,11,"B",Z)) Q:Z=""  D
 . S Z1=+$O(^IBT(356.22,IBTRIEN,11,"B",Z,"")) I 'Z1 Q
 . S NODE0=$G(^IBT(356.22,IBTRIEN,11,Z1,0)) I NODE0="" Q  ; 0-node of sub-file 356.2211
 . S SEQ=SEQ+1 I SEQ>10 Q
 . S X="PWK*"
 . S $P(X,"*",2)=$$GET1^DIQ(356.018,+$P(NODE0,U)_",",.01)
 . I $P(NODE0,U,3)'="" S $P(X,"*",7)=$P(NODE0,U,3),$P(X,"*",6)="AC"
 . S $P(X,"*",8)=$P(NODE0,U,4)
 . S $P(X,"*",3)=$P(NODE0,U,2)
 . D SAVE(X)
 . Q
 Q
 ;
MSG ; create the MSG segment loop 2000E
 N MSG,NTE
 S MSG=$$WP2STR^IBTRHLO2(356.22,12,IBTRIEN_",",264)
 I MSG="" Q
 S X="MSG*"_MSG
 D SAVE(X)
 Q
 ;
SAVE(X) ;
 N XCT
 S (^TMP($J,"IBTRH8"),XCT)=$G(^TMP($J,"IBTRH8"))+1
 S ^TMP($J,"IBTRH8",XCT)=X
 Q
 ;
ERROR ;
 D CLEAR^VALM1
 I $P(NODE0,"^",12)="" W !!,"Unable to display the 278 request. The request for this entry has not been sent.",!!
 I $P(NODE0,"^",12)'="" W !!,"INSUFFICIENT DATA TO DISPLAY X12 TRANSACTION.",!!
 D PAUSE^VALM1
 S VALMBCK="R"
 D RE^VALM4
 I $D(REQIEN) S IBTRIEN=REQIEN
 Q 
 ;
PERR ; PER segment for response loop 2010A
 N X
 S X="PER*IC"
 S $P(X,"*",3)=$P(NODE19,"^")
 S $P(X,"*",4)=$P(NODE19,"^",2)
 S $P(X,"*",5)=$$NOPUNCT^IBCEF($P($G(^IBT(356.22,IBTRIEN,20)),"^"),1)
 S $P(X,"*",6)=$P(NODE19,"^",3)
 S $P(X,"*",7)=$$NOPUNCT^IBCEF($P($G(^IBT(356.22,IBTRIEN,21)),"^"),1)
 S $P(X,"*",8)=$P(NODE19,"^",4)
 S $P(X,"*",9)=$$NOPUNCT^IBCEF($P($G(^IBT(356.22,IBTRIEN,22)),"^"),1)
 D SAVE(X)
 Q
 ;
HCR ; HCR segment for response loop 2000E
 N X,NODE103
 I '$D(^IBT(356.22,IBTRIEN,103)) Q
 S NODE103=$G(^IBT(356.22,IBTRIEN,103))
 S X="HCR*"
 S $P(X,"*",2)=$$GET1^DIQ(356.02,$P(NODE103,"^")_",",.01)
 S $P(X,"*",3)=$P(NODE103,"^",2)
 S $P(X,"*",4)=$$GET1^DIQ(356.021,$P(NODE103,"^",3)_",",.01)
 S $P(X,"*",5)=$P(NODE103,"^",4)
 D SAVE(X)
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBTRH8   15993     printed  Sep 23, 2025@20:04:42                                                                                                                                                                                                     Page 2
IBTRH8    ;ALB/JWS - HCSR Worklist - view 278 message in X12 format ;24-AUG-2015
 +1       ;;2.0;INTEGRATED BILLING;**517**;21-MAR-94;Build 240
 +2       ;;Per VA Directive 6402, this routine should not be modified.
 +3       ;;
 +4        QUIT 
EN        ; display message in X12 format
 +1       ; IBTRIEN = ien of file 356.22
 +2       ; MSGTYPE = 217 or 215
 +3       ; RR = 0 for request / inquiry, 1 for response
 +4        NEW X,MSGTYPE,RR,TD,TT,HL1,HL2,ADDR1,ADDR2,ADDR3,REQDATA,SITEIEN
 +5        NEW NODE0,OMSG,DFN,IEN312,INSNODE0,INSNODE3,IEN3553,IEN36,GNUM,PREL
 +6        NEW NODE2,NODE4,NODE5,NODE6,NODE7,NODE8,NODE9,NODE10,NODE17,NODE18,NODE19
 +7        NEW REQCAT,CERT,INPAT,EVNT,HL1,HL2,PAYID,PAYER,PNODE0,IDTYPE,RELINFO
 +8        NEW REQIEN,RMSH10,HLECH,HLFS,HLQ
 +9        KILL ^TMP($JOB,"IBTRH8")
 +10       SET SITEIEN=$PIECE($$SITE^VASITE(),U)
           IF SITEIEN'>0
               DO ERROR
               QUIT 
 +11       SET NODE0=$GET(^IBT(356.22,IBTRIEN,0))
           IF NODE0=""
               DO ERROR
               QUIT 
 +12       IF $PIECE(NODE0,U,12)=""
               DO ERROR
               QUIT 
 +13       SET MSGTYPE=+$PIECE(NODE0,"^",20)
           SET RR=0
 +14       IF MSGTYPE=2
               Begin DoDot:1
 +15               SET RR=1
 +16               SET OMSG=$PIECE(NODE0,U,13)
 +17               IF OMSG
                       Begin DoDot:2
 +18                       SET REQIEN=IBTRIEN
                           SET IBTRIEN=OMSG
 +19                       SET NODE0=$GET(^IBT(356.22,OMSG,0))
 +20                       SET MSGTYPE=+$PIECE(NODE0,U,20)
                           SET RR=0
                           SET RMSH10=$PIECE(NODE0,"^",12)
                       End DoDot:2
 +21               QUIT 
               End DoDot:1
               IF +OMSG=0
                   DO ERROR
                   QUIT 
 +22       SET DFN=+$PIECE(NODE0,U,2)
 +23       IF DFN'>0
               DO ERROR
               QUIT 
 +24       SET IEN312=+$PIECE(NODE0,U,3)
 +25       IF IEN312'>0
               DO ERROR
               QUIT 
 +26      ; 0-node in file 2.312
           SET INSNODE0=$GET(^DPT(DFN,.312,IEN312,0))
 +27      ; 3-node in file 2.312
           SET INSNODE3=$GET(^DPT(DFN,.312,IEN312,3))
 +28      ; file 355.3 ien
           SET IEN3553=+$PIECE(INSNODE0,U,18)
 +29       SET IEN36=+$PIECE(INSNODE0,U)
 +30       IF IEN36'>0
               DO ERROR
               QUIT 
 +31      ; group number
           SET GNUM=$SELECT(IEN3553>0:$$GET1^DIQ(355.3,IEN3553_",",.04),1:"")
 +32      ; pat. relationship to insured
           SET PREL=$PIECE($GET(^DPT(DFN,.312,IEN312,4)),U,3)
 +33       SET NODE2=$GET(^IBT(356.22,IBTRIEN,2))
 +34       SET NODE4=$GET(^IBT(356.22,IBTRIEN,4))
 +35       SET NODE5=$GET(^IBT(356.22,IBTRIEN,5))
 +36       SET NODE6=$GET(^IBT(356.22,IBTRIEN,6))
 +37       SET NODE7=$GET(^IBT(356.22,IBTRIEN,7))
 +38       SET NODE8=$GET(^IBT(356.22,IBTRIEN,8))
 +39       SET NODE9=$GET(^IBT(356.22,IBTRIEN,9))
 +40       SET NODE10=$GET(^IBT(356.22,IBTRIEN,10))
 +41       SET NODE17=$GET(^IBT(356.22,IBTRIEN,17))
 +42       SET NODE18=$GET(^IBT(356.22,IBTRIEN,18))
 +43       SET NODE19=$GET(^IBT(356.22,IBTRIEN,19))
 +44       SET HLECH="^~\&"
           SET HLFS="|"
           SET HLQ=""""
 +45       SET X="ST*278*0001*005010X"_$SELECT(MSGTYPE=0:217,1:215)
           DO SAVE(X)
 +46      ; request category
           SET REQCAT=$$GET1^DIQ(356.001,+$PIECE(NODE2,U)_",",.01)
 +47      ; certification type code
           SET CERT=$$GET1^DIQ(356.002,+$PIECE(NODE2,U,2)_",",.01)
 +48      ; 1 if inpatient, 0 if outpatient
           SET INPAT=$SELECT($PIECE(NODE0,U,4)="I":1,1:0)
 +49      ; determine event reason code
 +50       IF 'MSGTYPE
               Begin DoDot:1
 +51      ; request category = "HS" (Health Services), "AR" (Admission), or "SC" (Specialty Care) -> event code = 13 (Request)
                   IF REQCAT'="IN"
                       SET EVNT="13"
                       QUIT 
 +52      ; request category = "IN" (Individual) and certification type = 3 (Cancel) -> event code = 01 (Cancel)
                   IF CERT=3
                       SET EVNT="01"
                       QUIT 
 +53      ; request category = "IN" (Individual) and certification type '= 3 (other than Cancel) -> event code = 36 (Authority To Deduct)
                   SET EVNT=36
 +54               QUIT 
               End DoDot:1
 +55      ; 28 for 215 message
           IF MSGTYPE=1
               SET EVNT=28
 +56      ; 11 for response messages
           IF RR=1
               SET EVNT=11
 +57       SET X=$PIECE(NODE0,U,15)
           SET (TD,TT)=""
 +58       IF X'=""
               DO H^%DTC
               IF %H
                   DO YX^%DTC
                   SET TD=$SELECT($EXTRACT(X)=3:20,1:19)_$EXTRACT(X,2,7)
                   SET Y=$PIECE(NODE0,U,15)
                   DO DD^%DT
                   SET TT=$TRANSLATE($PIECE(Y,"@",2),":","")
 +59       SET X="BHT*0007*"_EVNT_"*"_$SELECT(RR=1:$GET(RMSH10),1:$PIECE(NODE0,U,12))_"*"_TD_"*"_TT_$SELECT(EVNT=36:"*RU",1:"")
           DO SAVE(X)
 +60       SET HL1=$GET(HL1)+1
 +61       SET X="HL*"_HL1_"**20*1"
           DO SAVE(X)
 +62       IF RR=1
               DO AAA^IBTRH8A("2000A")
 +63       SET PAYID=""
 +64      ; file 365.12 ien
           SET PAYER=+$$GET1^DIQ(36,IEN36_",",3.1,"I")
 +65       IF PAYER'>0
               DO ERROR
               QUIT 
 +66       SET PNODE0=$GET(^IBE(365.12,PAYER,0))
           SET IDTYPE="PI"
 +67      ; VA national id
           SET PAYID=$PIECE(PNODE0,U,2)
 +68      ; if no VA national id, try to get CMS national id
 +69       IF PAYID=""
               SET PAYID=$PIECE(PNODE0,U,3)
               SET IDTYPE="XV"
 +70      ; if still no id, bail out
 +71       IF PAYID=""
               DO ERROR
               QUIT 
 +72      ;UM09 Release of Information Code
           SET RELINFO=$PIECE(NODE2,U,16)
 +73      ; get HPID, relies on patch IB*2.0*519
 +74      ; S $P(TMP,HLECH,3)=$$HPD^IBCNHUT1(IEN36)
 +75      ; 
 +76       SET X="NM1*X3*2*"_$$GET1^DIQ(36,IEN36_",",.01)_"*****"_IDTYPE_"*"_PAYID
           DO SAVE(X)
 +77       IF RR=1
               DO PERR
               DO AAA^IBTRH8A("2010A")
 +78      ; HL - Requester Level Loop 2000B
 +79       SET HL2=HL1
           SET HL1=HL1+1
 +80       SET X="HL*"_HL1_"*"_HL2_"*21*1"
           DO SAVE(X)
 +81       SET REQDATA=$$PRVDATA^IBTRHLO2(SITEIEN,4)
 +82       IF $TRANSLATE(REQDATA,U)=""
               DO ERROR
               QUIT 
 +83       SET X="NM1*FA*2*"_$PIECE(REQDATA,U)_"*****XX*"_$PIECE(REQDATA,U,7)
           DO SAVE(X)
 +84       IF RR=1
               DO AAA^IBTRH8A("2010B")
 +85       SET ADDR1=$PIECE(REQDATA,U,2,3)
           SET ADDR2=$PIECE(REQDATA,U,4,6)
 +86       SET ADDR3=$PIECE($$HLADDR^HLFNC(ADDR1,ADDR2),U,1,5)
 +87       IF 'RR
               SET X="N3*"_$PIECE(ADDR3,"^")
               if $PIECE(ADDR3,"^",2)'=""
                   SET X=X_"*"_$PIECE(ADDR3,"^",2)
               DO SAVE(X)
 +88       IF 'RR
               SET X="N4*"_$PIECE(ADDR3,"^",3)_"*"_$PIECE(ADDR3,"^",4)_"*"_$PIECE(ADDR3,"^",5)
               DO SAVE(X)
 +89       IF 'RR
               DO PER
 +90       DO PRV
 +91       SET HL2=HL1
           SET HL1=HL1+1
 +92       SET X="HL*"_HL1_"*"_HL2_"*22*1"
           DO SAVE(X)
 +93       DO NM1
 +94       IF PREL'="18"
               Begin DoDot:1
 +95               SET HL2=HL1
                   SET HL1=HL1+1
 +96               SET X="HL*"_HL1_"*"_HL2_"*23*1"
                   DO SAVE(X)
 +97               DO NM12010D
 +98               QUIT 
               End DoDot:1
 +99       SET HL2=HL1
           SET HL1=HL1+1
 +100     ; if line level procedure code sub HL seg, otherwise 0
           SET X="HL*"_HL1_"*"_HL2_"*EV*"_$SELECT($ORDER(^IBT(356.22,IBTRIEN,16,0)):1,1:0)
           DO SAVE(X)
 +101      DO EVENT
 +102      DO DISPLAY^IBTRH8A
 +103      IF $DATA(REQIEN)
               SET IBTRIEN=REQIEN
 +104      QUIT 
 +105     ;
PER       ; create PER segment in loop 2010B
 +1        NEW CTD,COMMSTR,IEN200,NAME,NODE19,QUAL,TMP,VALUE,Z
 +2        SET IEN200=+$PIECE(NODE0,U,11)
           IF IEN200'>0
               QUIT 
 +3        SET NAME=$$GET1^DIQ(200,IEN200_",",.01)
           IF NAME=""
               QUIT 
 +4        SET NODE19=$GET(^IBT(356.22,IBTRIEN,19))
 +5        SET COMMSTR=""
           FOR Z="20^2^19.01","21^3^19.02","22^4^19.03"
               Begin DoDot:1
 +6                SET QUAL=$PIECE(NODE19,U,$PIECE(Z,U,2))
                   IF QUAL=""
                       QUIT 
 +7                SET QUAL=$$EXTERNAL^DILFD(356.22,$PIECE(Z,U,3),,QUAL)
 +8                SET VALUE=$GET(^IBT(356.22,IBTRIEN,$PIECE(Z,U)))
                   IF VALUE=""
                       QUIT 
 +9       ; strip punctuation if phone #
                   IF "^FX^HP^TE^WP^"[(U_QUAL_U)
                       SET VALUE=$$NOPUNCT^IBCEF(VALUE,1)
 +10               SET $PIECE(TMP,U)=QUAL
                   SET $PIECE(TMP,U,2)=VALUE
 +11               SET COMMSTR=$SELECT(COMMSTR="":TMP,1:COMMSTR_U_TMP)
 +12               QUIT 
               End DoDot:1
 +13       SET X="PER*IC*"_NAME_"*"_$PIECE(COMMSTR,U)_"*"_$PIECE(COMMSTR,U,2)
 +14       IF $PIECE(COMMSTR,U,3)'=""
               SET X=X_"*"_$PIECE(COMMSTR,U,3)_"*"_$PIECE(COMMSTR,U,4)
 +15       IF $PIECE(COMMSTR,U,5)'=""
               SET X=X_"*"_$PIECE(COMMSTR,U,5)_"*"_$PIECE(COMMSTR,U,6)
 +16       DO SAVE(X)
 +17       QUIT 
 +18      ;
PRV       ; create PRV segment (X12: PRV, 2010B)
 +1        NEW PRD,TXNM
 +2        SET TXNM=$PIECE($$TAXORG^XUSTAX(SITEIEN),U)
           IF TXNM=""
               QUIT 
 +3        SET X="PRV*PE*PXC*"_TXNM
           DO SAVE(X)
 +4        QUIT 
 +5       ;
NM1       ; create NM1 segment (X12: NM1, 2010C)
 +1        NEW ADDR1,ADDR2,GT1,SID1,SIDSTR,NAME
 +2        SET SID1=$PIECE(INSNODE0,U,2)
           IF SID1=""
               QUIT 
 +3        SET NAME=$PIECE(INSNODE0,U,17)
           IF NAME=""
               QUIT 
 +4       ;;S SID2=GNUM ; secondary subscriber id is a group number
 +5        SET NAME=$$HLNAME^HLFNC(NAME)
 +6        SET X="NM1*IL*1*"_$PIECE(NAME,"^")_"*"_$PIECE(NAME,"^",2)_"*"_$PIECE(NAME,"^",3)_"**"_$PIECE(NAME,"^",4)_"*MI*"_SID1
           DO SAVE(X)
 +7        IF GNUM'=""
               SET X="REF*6P*"_GNUM
               DO SAVE(X)
 +8        IF 'MSGTYPE
               IF $PIECE(INSNODE3,U,6)'=""
                   IF $PIECE(INSNODE3,U,8)'=""
                       Begin DoDot:1
 +9                        SET ADDR1=$PIECE(INSNODE3,U,6,7)
                           SET ADDR2=$PIECE(INSNODE3,U,8,10)
 +10      ; subscriber address
                           SET ADDR3=$$HLADDR^HLFNC(ADDR1,ADDR2)
 +11                       SET X="N3*"_$PIECE(ADDR3,"^")
                           if $PIECE(ADDR3,"^",2)'=""
                               SET X=X_"*"_$PIECE(ADDR3,"^",2)
                           DO SAVE(X)
 +12                       SET X="N4*"_$PIECE(ADDR3,"^",3)_"*"_$PIECE(ADDR3,"^",4)_"*"_$PIECE(ADDR3,"^",5)
                           DO SAVE(X)
 +13                       QUIT 
                       End DoDot:1
 +14       IF RR
               DO AAA^IBTRH8A("2010C")
 +15      ; subscriber dob
           SET X="DMG*D8*"_$$HLDATE^HLFNC($PIECE(INSNODE3,U))
 +16      ; subscriber sex
           IF 'MSGTYPE
               SET X=X_"*"_$PIECE(INSNODE3,U,12)
 +17       DO SAVE(X)
 +18       IF MSGTYPE
               QUIT 
 +19      ; relationship to insured
           IF PREL'="18"
               SET PREL=$SELECT(PREL="01":"01",PREL=19:19,1:"G8")
 +20       SET X="INS*Y*18"
           DO SAVE(X)
 +21       QUIT 
 +22      ;
NM12010D  ; create NM1 segment, loop 2010D
 +1        NEW IDSTR,PID,TMP,VAFSTR
 +2        IF GNUM=""
               QUIT 
 +3        SET VAFSTR="7,8,11,"
 +4        SET PID=$$EN^VAFHLPID(DFN,VAFSTR)
 +5        SET TMP=$PIECE(PID,"|",12)
 +6        IF $PIECE(TMP,U,2)=""""""
               SET $PIECE(TMP,U,2)=""
               SET $PIECE(PID,"|",12)=TMP
 +7        SET X="NM1*QC*1*"_$PIECE($PIECE(PID,"|",6),"^")_"*"_$PIECE($PIECE(PID,"|",6),"^",2)
           if $PIECE($PIECE(PID,"|",6),"^",3)'=""
               SET X=X_"*"_$PIECE($PIECE(PID,"|",6),"^",3)
           DO SAVE(X)
 +8        SET X="REF*EJ*"_GNUM
           DO SAVE(X)
 +9        IF 'MSGTYPE!RR
               Begin DoDot:1
 +10               SET X="N3*"_$PIECE(TMP,"^")
                   if $PIECE(TMP,"^",2)'=""
                       SET X=X_"*"_$PIECE(TMP,"^",2)
                   DO SAVE(X)
 +11               SET X="N4*"_$PIECE(TMP,"^",3)_"*"_$PIECE(TMP,"^",4)_"*"_$PIECE(TMP,"^",5)
                   DO SAVE(X)
 +12               QUIT 
               End DoDot:1
 +13       IF RR
               DO AAA^IBTRH8A("2010D")
 +14       SET X="DMG*D8*"_$PIECE(PID,"|",8)
           if 'MSGTYPE
               SET X=X_"*"_$PIECE(PID,"|",9)
           DO SAVE(X)
 +15       IF MSGTYPE
               QUIT 
 +16       SET X="INS*N*"_PREL
           DO SAVE(X)
 +17       QUIT 
 +18      ;
EVENT     ; 2000E loop
 +1       ; create G2R.PRB segment (G2R segment group)
 +2        NEW PRB,Z,TOT
 +3        IF RR
               DO AAA^IBTRH8A("2000E")
 +4       ; missing certification type code
           IF CERT=""
               QUIT 
 +5        SET X="UM*"_REQCAT_"*"_CERT_"*"_$$GET1^DIQ(365.013,+$PIECE(NODE2,U,3)_",",.01)
 +6        IF $PIECE(NODE2,U,4)'=""
               SET X=X_"*"_$SELECT($PIECE(NODE2,U,4)="A":($PIECE(NODE2,U,6)_$PIECE(NODE2,U,7)),1:$$GET1^DIQ(353.1,+$PIECE(NODE2,U,5)_",",.01))_":"_$PIECE(NODE2,U,4)
 +7       IF '$TEST
               Begin DoDot:1
 +8                IF MSGTYPE
                       DO SAVE(X)
                       QUIT 
 +9                SET X=X_"*"
               End DoDot:1
               IF MSGTYPE
                   QUIT 
 +10       SET X=X_"*"_$PIECE(NODE2,U,8)_":"_$PIECE(NODE2,U,9)_":"_$PIECE(NODE2,U,10)_":"_$$GET1^DIQ(5,+$PIECE(NODE2,U,11)_",",1)
 +11       SET Z=$$GET1^DIQ(779.004,+$PIECE(NODE2,U,12)_",",.01)
           IF Z'=""
               IF Z'="USA"
                   SET X=X_":"_Z
 +12       SET X=X_"*"_$PIECE(NODE2,U,13)_"*"_$$GET1^DIQ(356.003,+$PIECE(NODE2,U,14)_",",.01)_"*"_$$GET1^DIQ(356.004,+$PIECE(NODE2,U,15)_",",.01)_"*"_$PIECE(NODE2,U,16)_"*"_$$GET1^DIQ(356.005,+$PIECE(NODE2,U,17)_",",.01)
           DO SAVE(X)
 +13       IF RR
               DO HCR
 +14       DO REF
 +15       DO DTP
 +16       DO HI
 +17      ; for 217 request only
 +18       IF 'MSGTYPE
               Begin DoDot:1
 +19               DO HSD
                   DO CRC
 +20               IF $TRANSLATE(NODE18,U)'=""
                       DO CR1
 +21               DO CR2
                   DO CR5^IBTRH8A
                   DO CR6^IBTRH8A
                   DO PWK
                   DO MSG
               End DoDot:1
 +22       DO NM1^IBTRH8A
 +23      ;
 +24       IF '$ORDER(^IBT(356.22,IBTRIEN,16,0))
               QUIT 
 +25       SET HL2=HL1
           SET HL1=HL1+1
 +26       SET X="HL*"_HL1_"*"_HL2_"*SS*0"
           DO SAVE(X)
 +27       DO DETAIL^IBTRH8A
 +28       SET TOT=$GET(^TMP($JOB,"IBTRH8"))+1
 +29       SET X="SE*"_TOT_"*0001"
           DO SAVE(X)
 +30       QUIT 
 +31      ;
REF       ; REF segment
 +1        IF $PIECE(NODE17,U)'=""
               SET X="REF*BB*"_$PIECE(NODE17,U)
               DO SAVE(X)
               QUIT 
 +2        IF $PIECE(NODE17,U,2)'=""
               SET X="REF*NT*"_$PIECE(NODE17,U,2)
               DO SAVE(X)
               QUIT 
 +3        QUIT 
 +4       ;
DTP       ; create DTP segments
 +1        NEW DATA,Z,Z1
 +2        SET Z=$PIECE(NODE0,U,7)
           IF Z'=""
               Begin DoDot:1
 +3                SET Z1="AAH"
                   IF INPAT
                       IF REQCAT="AR"
                           SET Z1="435"
 +4       ; admission / appointment date
                   SET DATA(Z1)=$SELECT(Z["-":$$HLDATE^HLFNC($PIECE($PIECE(Z,"-"),"."))_"-"_$$HLDATE^HLFNC($PIECE($PIECE(Z,"-",2),".")),1:$$HLDATE^HLFNC($PIECE(Z,".")))
 +5                QUIT 
               End DoDot:1
 +6       ; accident date
           SET Z=$PIECE(NODE2,U,18)
           IF Z'=""
               SET DATA("439")=$$HLDATE^HLFNC($PIECE(Z,"."))
 +7        IF 'MSGTYPE
               Begin DoDot:1
 +8       ; last menstrual period date
                   SET Z=$PIECE(NODE2,U,19)
                   IF Z'=""
                       SET DATA("484")=$$HLDATE^HLFNC($PIECE(Z,"."))
 +9       ; estimated DOB
                   SET Z=$PIECE(NODE2,U,20)
                   IF Z'=""
                       SET DATA("ABC")=$$HLDATE^HLFNC(Z)
 +10      ; illness date
                   SET Z=$PIECE(NODE2,U,21)
                   IF Z'=""
                       SET DATA("431")=$$HLDATE^HLFNC(Z)
 +11               QUIT 
               End DoDot:1
 +12      ; the following date is for "Admission Review" request category only
 +13      ; discharge date
           IF INPAT
               IF REQCAT="AR"
                   SET Z=$PIECE(NODE2,U,22)
                   if Z'=""
                       SET DATA("096")=$$HLDATE^HLFNC($PIECE(Z,"."))
 +14       SET Z=""
           FOR 
               SET Z=$ORDER(DATA(Z))
               if Z=""
                   QUIT 
               Begin DoDot:1
 +15               SET X="DTP*"_Z_"*D8*"_DATA(Z)
                   DO SAVE(X)
 +16               QUIT 
               End DoDot:1
 +17       QUIT 
 +18      ;
HI        ; create HI segments
 +1        NEW DG1,DIAG,NODE0,SEQ,Z
 +2        SET (SEQ,Z)=0
           FOR 
               SET Z=$ORDER(^IBT(356.22,IBTRIEN,3,Z))
               if Z'=+Z
                   QUIT 
               Begin DoDot:1
 +3       ; 0-node of sub-file 356.223
                   SET NODE0=$GET(^IBT(356.22,IBTRIEN,3,Z,0))
                   IF NODE0=""
                       QUIT 
 +4       ; only allow up to 12 DG1 segments
                   SET SEQ=SEQ+1
                   IF SEQ>12
                       QUIT 
 +5       ; only allow 1 DG1 segment in 215 message
                   IF MSGTYPE
                       IF SEQ>1
                           QUIT 
 +6       ; invalid diagnosis code
                   SET DIAG=$TRANSLATE($$EXTERNAL^DILFD(356.223,.02,,$PIECE(NODE0,U,2)),".")
                   IF DIAG=""
                       QUIT 
 +7                SET DG1(SEQ)="*"_$$GET1^DIQ(356.006,+$PIECE(NODE0,U)_",",.01)_":"_DIAG
                   IF 'MSGTYPE
                       IF $PIECE(NODE0,U,3)'=""
                           SET DG1(SEQ)=DG1(SEQ)_":D8:"_$$HLDATE^HLFNC($PIECE(NODE0,U,3))
 +8       ;S DG1="DG1"_HLFS_SEQ_HLFS_HLFS_$$ENCHL7^IBCNEHLQ(DIAG)_HLFS_HLFS_$S('MSGTYPE:$$HLDATE^HLFNC($P(NODE0,U,3)),1:"")_HLFS_"W"
 +9                QUIT 
               End DoDot:1
 +10       IF '$ORDER(DG1(""))
               QUIT 
 +11       SET X="HI"
 +12       SET Z=0
           FOR 
               SET Z=$ORDER(DG1(Z))
               if Z=""
                   QUIT 
               SET X=X_DG1(Z)
 +13       DO SAVE(X)
 +14       QUIT 
 +15      ;
HSD       ; create HSD segment
 +1        NEW QUAL,VALUE,HSD,I
 +2        SET QUAL=$$GET1^DIQ(365.016,+$PIECE(NODE4,U)_",",.01)
 +3        SET VALUE=$PIECE(NODE4,U,2)
 +4       ;ZHS.2=4.01, ZHS.3=4.02 
           IF QUAL'=""
               IF VALUE'=""
                   SET HSD(1)=QUAL
                   SET HSD(2)=VALUE
 +5        SET QUAL=$PIECE(NODE4,U,3)
 +6        SET VALUE=$PIECE(NODE4,U,4)
 +7       ;ZHS.4=4.03
           IF QUAL'=""
               IF VALUE'=""
                   SET HSD(3)=QUAL
 +8       ;ZHS.5=4.04
           IF VALUE'=""
               SET HSD(4)=VALUE
 +9        SET QUAL=$$GET1^DIQ(365.015,+$PIECE(NODE4,U,5)_",",.01)
 +10       SET VALUE=$PIECE(NODE4,U,6)
 +11      ;ZHS.6=4.05, ZHS.7=4.06
           IF QUAL'=""
               IF VALUE'=""
                   SET HSD(5)=QUAL
                   SET HSD(6)=VALUE
 +12      ;ZHS.8=4.07
           IF +$PIECE(NODE4,U,7)
               SET HSD(7)=$$GET1^DIQ(365.025,+$PIECE(NODE4,U,7)_",",.01)
 +13      ;ZHS.9=4.08
           IF +$PIECE(NODE4,U,8)
               SET HSD(8)=$$GET1^DIQ(356.007,+$PIECE(NODE4,U,8)_",",.01)
 +14       IF '$DATA(HSD)
               QUIT 
 +15       SET X="HSD"
           FOR I=1:1:8
               SET X=X_"*"_$GET(HSD(I))
 +16       DO SAVE(X)
 +17       QUIT 
 +18      ;
CRC       ; create CRC and CL1 segments in loop 2000E
 +1        NEW PC,Z
 +2       ; at least one ambulance cert. condition exists
           IF +$PIECE(NODE4,U,10)
               Begin DoDot:1
 +3                SET X="CRC*07*"_$PIECE(NODE4,U,9)
 +4                FOR PC=10:1:14
                       SET Z=+$PIECE(NODE4,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +5                DO SAVE(X)
 +6                QUIT 
               End DoDot:1
 +7       ; at least one chiropractic cert. condition exists
           IF +$PIECE(NODE5,U,2)
               Begin DoDot:1
 +8                SET X="CRC*08*"_$PIECE(NODE5,U)
 +9                FOR PC=2:1:6
                       SET Z=+$PIECE(NODE5,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +10               DO SAVE(X)
 +11               QUIT 
               End DoDot:1
 +12      ; at least one DME cert. condition exists
           IF +$PIECE(NODE5,U,8)
               Begin DoDot:1
 +13               SET X="CRC*09*"_$PIECE(NODE5,U,7)
 +14               FOR PC=8:1:12
                       SET Z=+$PIECE(NODE5,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +15               DO SAVE(X)
 +16               QUIT 
               End DoDot:1
 +17      ; at least one oxygen cert. condition exists
           IF +$PIECE(NODE5,U,14)
               Begin DoDot:1
 +18               SET X="CRC*11*"_$PIECE(NODE5,U,13)
 +19               FOR PC=14:1:18
                       SET Z=+$PIECE(NODE5,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +20               DO SAVE(X)
 +21               QUIT 
               End DoDot:1
 +22      ; at least one functional limit cert. condition exists
           IF +$PIECE(NODE6,U,2)
               Begin DoDot:1
 +23               SET X="CRC*75*"_$PIECE(NODE6,U)
 +24               FOR PC=2:1:6
                       SET Z=+$PIECE(NODE6,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +25               DO SAVE(X)
 +26               QUIT 
               End DoDot:1
 +27      ; at least one activities cert. condition exists
           IF +$PIECE(NODE6,U,8)
               Begin DoDot:1
 +28               SET X="CRC*76*"_$PIECE(NODE6,U,7)
 +29               FOR PC=8:1:12
                       SET Z=+$PIECE(NODE6,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +30               DO SAVE(X)
 +31               QUIT 
               End DoDot:1
 +32      ; at least one mental status cert. condition exists
           IF +$PIECE(NODE6,U,14)
               Begin DoDot:1
 +33               SET X="CRC*77*"_$PIECE(NODE6,U,13)
 +34               FOR PC=14:1:18
                       SET Z=+$PIECE(NODE6,U,PC)
                       IF Z
                           SET X=X_"*"_$$GET1^DIQ(356.008,Z_",",.01)
 +35               DO SAVE(X)
 +36               QUIT 
               End DoDot:1
 +37      ; inpatient, admission data exists
           IF INPAT
               IF $TRANSLATE($PIECE(NODE7,U,1,4),U)'=""
                   Begin DoDot:1
 +38                   SET X="CL1*"_$PIECE(NODE7,U)
 +39                   SET Z=+$PIECE(NODE7,U,2)
                       IF Z
                           SET $PIECE(X,"*",3)=$$GET1^DIQ(356.009,Z_",",.01)
 +40                   SET Z=+$PIECE(NODE7,U,3)
                       IF Z
                           SET $PIECE(X,"*",4)=$$GET1^DIQ(356.01,Z_",",.01)
 +41                   SET Z=+$PIECE(NODE7,U,4)
                       IF Z
                           SET $PIECE(X,"*",5)=$$GET1^DIQ(356.011,Z_",",.01)
 +42                   DO SAVE(X)
 +43                   QUIT 
                   End DoDot:1
 +44       QUIT 
 +45      ;
CR1       ; create CR1 segment
 +1        NEW Z,Z1
 +2        SET X="CR1*"
 +3        SET $PIECE(X,"*",5)=$PIECE(NODE18,U,4)
 +4        SET $PIECE(X,"*",10)=$PIECE(NODE18,U,9)
 +5        SET $PIECE(X,"*",11)=$PIECE(NODE18,U,10)
 +6        SET Z=$PIECE(NODE18,U,2)
           IF Z'=""
               SET $PIECE(X,"*",2)=$PIECE(NODE18,U)
               SET $PIECE(X,"*",3)=Z
 +7        SET Z=$PIECE(NODE18,U,6)
           IF Z'=""
               SET $PIECE(X,"*",6)=$PIECE(NODE18,U,5)
               SET $PIECE(X,"*",7)=Z
 +8        SET $PIECE(X,"*",4)=$PIECE(NODE18,U,3)
 +9        DO SAVE(X)
 +10       QUIT 
 +11      ;
CR2       ; create CR2 segment
 +1        NEW TXNUM,TXCNT,Z
 +2       ; missing treatment series number
           SET TXNUM=$PIECE(NODE7,U,5)
           IF TXNUM=""
               QUIT 
 +3       ; missing treatment count
           SET TXCNT=$PIECE(NODE7,U,6)
           IF TXCNT=""
               QUIT 
 +4        SET TXNUM=+TXNUM
           SET TXCNT=+TXCNT
 +5        SET X="CR2*"_TXNUM_"*"_TXCNT
 +6        SET Z=+$PIECE(NODE7,U,7)
           IF Z>0
               SET $PIECE(X,"*",4)=$$GET1^DIQ(356.012,Z_",",.01)
 +7        SET Z=+$PIECE(NODE7,U,8)
           IF Z>0
               SET $PIECE(X,"*",5)=$$GET1^DIQ(356.012,Z_",",.01)
 +8        SET $PIECE(X,"*",9)=$PIECE(NODE7,U,9)
 +9        IF $PIECE(NODE7,U,10)'=""
               SET $PIECE(X,"*",10)=$PIECE(NODE7,U,10)
 +10       SET $PIECE(X,"*",13)=$PIECE(NODE7,U,13)
 +11       SET $PIECE(X,"*",11)=$PIECE(NODE7,U,11)
 +12       SET $PIECE(X,"*",12)=$PIECE(NODE7,U,12)
 +13       DO SAVE(X)
 +14       QUIT 
 +15      ;
PWK       ; create the PWK segment loop 2000E
 +1        NEW NODE0,SEQ,Z,Z1
 +2        SET SEQ=0
           SET Z=""
           FOR 
               SET Z=$ORDER(^IBT(356.22,IBTRIEN,11,"B",Z))
               if Z=""
                   QUIT 
               Begin DoDot:1
 +3                SET Z1=+$ORDER(^IBT(356.22,IBTRIEN,11,"B",Z,""))
                   IF 'Z1
                       QUIT 
 +4       ; 0-node of sub-file 356.2211
                   SET NODE0=$GET(^IBT(356.22,IBTRIEN,11,Z1,0))
                   IF NODE0=""
                       QUIT 
 +5                SET SEQ=SEQ+1
                   IF SEQ>10
                       QUIT 
 +6                SET X="PWK*"
 +7                SET $PIECE(X,"*",2)=$$GET1^DIQ(356.018,+$PIECE(NODE0,U)_",",.01)
 +8                IF $PIECE(NODE0,U,3)'=""
                       SET $PIECE(X,"*",7)=$PIECE(NODE0,U,3)
                       SET $PIECE(X,"*",6)="AC"
 +9                SET $PIECE(X,"*",8)=$PIECE(NODE0,U,4)
 +10               SET $PIECE(X,"*",3)=$PIECE(NODE0,U,2)
 +11               DO SAVE(X)
 +12               QUIT 
               End DoDot:1
 +13       QUIT 
 +14      ;
MSG       ; create the MSG segment loop 2000E
 +1        NEW MSG,NTE
 +2        SET MSG=$$WP2STR^IBTRHLO2(356.22,12,IBTRIEN_",",264)
 +3        IF MSG=""
               QUIT 
 +4        SET X="MSG*"_MSG
 +5        DO SAVE(X)
 +6        QUIT 
 +7       ;
SAVE(X)   ;
 +1        NEW XCT
 +2        SET (^TMP($JOB,"IBTRH8"),XCT)=$GET(^TMP($JOB,"IBTRH8"))+1
 +3        SET ^TMP($JOB,"IBTRH8",XCT)=X
 +4        QUIT 
 +5       ;
ERROR     ;
 +1        DO CLEAR^VALM1
 +2        IF $PIECE(NODE0,"^",12)=""
               WRITE !!,"Unable to display the 278 request. The request for this entry has not been sent.",!!
 +3        IF $PIECE(NODE0,"^",12)'=""
               WRITE !!,"INSUFFICIENT DATA TO DISPLAY X12 TRANSACTION.",!!
 +4        DO PAUSE^VALM1
 +5        SET VALMBCK="R"
 +6        DO RE^VALM4
 +7        IF $DATA(REQIEN)
               SET IBTRIEN=REQIEN
 +8        QUIT 
 +9       ;
PERR      ; PER segment for response loop 2010A
 +1        NEW X
 +2        SET X="PER*IC"
 +3        SET $PIECE(X,"*",3)=$PIECE(NODE19,"^")
 +4        SET $PIECE(X,"*",4)=$PIECE(NODE19,"^",2)
 +5        SET $PIECE(X,"*",5)=$$NOPUNCT^IBCEF($PIECE($GET(^IBT(356.22,IBTRIEN,20)),"^"),1)
 +6        SET $PIECE(X,"*",6)=$PIECE(NODE19,"^",3)
 +7        SET $PIECE(X,"*",7)=$$NOPUNCT^IBCEF($PIECE($GET(^IBT(356.22,IBTRIEN,21)),"^"),1)
 +8        SET $PIECE(X,"*",8)=$PIECE(NODE19,"^",4)
 +9        SET $PIECE(X,"*",9)=$$NOPUNCT^IBCEF($PIECE($GET(^IBT(356.22,IBTRIEN,22)),"^"),1)
 +10       DO SAVE(X)
 +11       QUIT 
 +12      ;
HCR       ; HCR segment for response loop 2000E
 +1        NEW X,NODE103
 +2        IF '$DATA(^IBT(356.22,IBTRIEN,103))
               QUIT 
 +3        SET NODE103=$GET(^IBT(356.22,IBTRIEN,103))
 +4        SET X="HCR*"
 +5        SET $PIECE(X,"*",2)=$$GET1^DIQ(356.02,$PIECE(NODE103,"^")_",",.01)
 +6        SET $PIECE(X,"*",3)=$PIECE(NODE103,"^",2)
 +7        SET $PIECE(X,"*",4)=$$GET1^DIQ(356.021,$PIECE(NODE103,"^",3)_",",.01)
 +8        SET $PIECE(X,"*",5)=$PIECE(NODE103,"^",4)
 +9        DO SAVE(X)
 +10       QUIT