- IBECECQ1 ;BSL/DVA-BILLING - SEND/RECEIVE QRY & DSR HL7 messages FOR PATIENT ACCUMULATOR INTERFACE ; 01 Jun 2022 7:17 AM
- ;;2.0;INTEGRATED BILLING;**704**;21-MAR-94;Build 49
- ;Per VA Directive 6402, this routine should not be modified.
- ;
- ; Reference to $$STARTMSG^HLOPRS,$$NEXTSEG^HLOPRS,$$GET^HLOPRS,$$MSGID^HLOPRS in ICR #4718
- ; Reference to $$ADDSEG^HLOAPI,$$NEWMSG^HLOAPI,SET^HLOAPI in ICR #4722
- ; Reference to $$SENDONE^HLOAPI1 in ICR #4717
- ;
- ; -4200Build and send seeding of Vista data to DAS SPOE IBECEAC-QRY DSR^Q03
- ; Receive seeding query of Vista data from DAS SPOE IBECEAC-QRY DSR^Q03
- ;
- ; Sample message
- ;MSH|^~\&||695^HL7.IVMVEE.FO-ALBANY.DOMAIN.EXT:5127^DNS|IBECECQ-QRYRESP|200DAS^:^DNS|20211001094308-0500||QRY^RO2^QRY_RO2|695 1469|T^|2.3|||AL|NE|USA
- ;QRD|20211008123254-0500|1|1||||1|DRI^DODMORE MESSAGE|1008713999V404928
- ;QRF|IBECEAC-QRY|20161106|20161107
- ;
- Q ;No direct routine calls
- ;
- ADM ;Called from IB MEANS TEST BILLING protocol
- Q:$P($G(DGPMA),"^",2)'=1
- D EN(DFN)
- Q
- ;
- EDTCLCK(DFN,IBADMIT) ;Called from Billing CLock Maintenance option
- N IBTRYTIL,IBECDT,IBECLDT,IBECIEN,IBECSTDT,IBECENDT,IBNOW
- Q:'$$ICN^IBARXMU(DFN) ;Do not run query of patient does not have an ICN
- D MTEQRY(DFN,IBADMIT) ;Run Query
- W !,"Running Billing Clock Query, please wait."
- S IBFLAG1=0 S IBTRYTIL=$$FMADD^XLFDT($$NOW^XLFDT,,,1),IBNOW=$$NOW^XLFDT F Q:$$NOW^XLFDT>IBTRYTIL Q:IBFLAG1 D
- .H 2 W "." S IBECDT1=-(IBADMIT_.9999) F S IBECDT1=$O(^IBE(351,"AIVDT",DFN,IBECDT1)) Q:'IBECDT1 S IBECIEN=$O(^IBE(351,"AIVDT",DFN,IBECDT1,";"),-1) Q:'IBECIEN D
- ..S IBECLDT=$$GET1^DIQ(351,IBECIEN_",",.04,"I") Q:IBECLDT=3 D
- ...S IBECSTDT=$$GET1^DIQ(351,IBECIEN_",",.03,"I"),IBECENDT=$$GET1^DIQ(351,IBECIEN_",",.1,"I"),IBECENDT=$S(IBECENDT:IBECENDT,IBECLDT=2:($$CLSDT^IBECECX1(IBECSTDT)),1:DT) D
- ....I (IBECENDT>=IBADMIT),$$GET1^DIQ(351,IBECIEN_",",14,"I")>IBNOW,$P(^IBE(351,IBECIEN,1),U,5) S IBFLAG1=1,IBECDA=IBECIEN Q
- Q
- ;
- MTEQRY(DFN,IBADMIT) ;Query for Billing CLock Maintenance option
- N IBICN,IBDISCH
- S IBICN=$$ICN^IBARXMU(DFN)
- I +IBICN<1 S SERROR="NO PATIENT ICN FOUND",SERR=1 Q ;quit if unable to find ICN
- S IBDISCH=$$CLSDT^IBECECX1(IBADMIT)
- I IBDISCH S IBDISCH=$$FMTHL7^XLFDT($P(IBDISCH,"."))
- S IBADMIT=$$FMTHL7^XLFDT($P(IBADMIT,"."))
- S IBOADMIT=IBADMIT
- I IBDISCH S IBODISCH=IBDISCH
- S:$G(SERR)="" SERR=0
- D MSH,QRD,QRF,SENDQRY
- Q
- ;
- CCBILL(DFN,IBADMIT) ;OUTGOING QRY Called from CC Inpatient Bill
- ;
- N X,PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO,IBACBCLK,IBADM,IBDISC,IBDISCH,IBIEN,IBICN,IBQIEN,IBC0,IBODISCH,IBOADMIN
- ;
- ;S IBC0=^IBE(351,IBCLDA,0)
- ;HL7 to FM - $$HL7TFM^XLFDT(DT)
- ;FM TO HL7 - $$FMTHL7^XLFDT(DT)
- ; Retrieve Admission and Discharge dates from the PTF file
- ;
- D CCINPT^IBECECX1(DFN,.IBADMIT) ;Get admit/discharge data
- S IBICN=$$ICN^IBARXMU(DFN)
- I +IBICN<1 S SERROR="NO PATIENT ICN FOUND",SERR=1 Q ;quit if unable to find ICN
- S:$G(SERR)="" SERR=0
- D MSH,QRD,QRF,SENDQRY
- Q
- ;-------------------------------------------------OUTGOING QRY ----------------------------------------
- EN(DFN) ;OUTGOING QRY ENTRY POINT
- ; IBQIEN - Query Request Message IEN (#778) that initiated this response CALLED FROM CLADD^IBAUTL3
- N X,PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO,IBACBCLK,IBADM,IBDISC,IBADMIT,IBDISCH,IBIEN,IBICN,IBQIEN,IBC0,IBODISCH,IBOADMIN
- ;
- ;S IBC0=^IBE(351,IBCLDA,0)
- ;HL7 to FM - $$HL7TFM^XLFDT(DT)
- ;FM TO HL7 - $$FMTHL7^XLFDT(DT)
- ; Retrieve Admission and Discharge dates from the PTF file
- ;
- D INPT^IBECECX1(DFN) ;Get admit/discharge data
- S IBICN=$$ICN^IBARXMU(DFN)
- I +IBICN<1 S SERROR="NO PATIENT ICN FOUND",SERR=1 Q ;quit if unable to find ICN
- S:$G(SERR)="" SERR=0
- D MSH,QRD,QRF,SENDQRY
- Q
- ;
- MSH ; Build MSH Segment
- N PARMS K ^TMP("DSR")
- S PARMS("COUNTRY")="USA"
- S PARMS("MESSAGE TYPE")="QRY"
- S PARMS("EVENT")="R02"
- S PARMS("VERSION")="2.3"
- S PARMS("MESSAGE STRUCTURE")="QRY_R02"
- S MSG="^TMP("_"QRY"
- S X=$$NEWMSG^HLOAPI(.PARMS,.MSG,.ERROR)
- MSA ;Build MSA Segment (OPTIONAL)
- S VALUE="MSA",FIELD=0 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S VALUE="AL",FIELD=1 D SET^HLOAPI(.SEG,VALUE,FIELD)
- ;S VALUE=QRYNUM,FIELD=2 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- Q
- ;
- QRD ;Build QRD segment
- S VALUE="QRD",FIELD=0 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S %P1=$$NOW^XLFDT() S %P1=$$FMTHL7^XLFDT(%P1)
- S VALUE=%P1,FIELD=1 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S VALUE=1,FIELD=2 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S VALUE=1,FIELD=3 D SET^HLOAPI(.SEG,VALUE,FIELD)
- ;S VALUE=QRYNUM,FIELD=4 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S VALUE=1,FIELD=7 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S NAME=$$GET1^DIQ(2,DFN_",",.01)
- S VALUE=$P($G(NAME),",",1),FIELD=8 D SET^HLOAPI(.SEG,VALUE,FIELD,1)
- S VALUE=$P($G(NAME),",",2),FIELD=8 D SET^HLOAPI(.SEG,VALUE,FIELD,2)
- S VALUE=IBICN,FIELD=9 D SET^HLOAPI(.SEG,VALUE,FIELD)
- S FIELD=11 I $G(IBOADMIT) S VALUE=IBOADMIT D SET^HLOAPI(.SEG,VALUE,FIELD) ; ADMIT DATE
- S FIELD=12 I $G(IBODISCH) S VALUE=IBODISCH D SET^HLOAPI(.SEG,VALUE,FIELD) ; Discharge date
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- Q
- ;
- QRF ;Build QRF segment
- S FIELD=0,VALUE="QRF" D SET^HLOAPI(.SEG,VALUE,FIELD)
- S FIELD=1,VALUE="IBECEAC-QRY" D SET^HLOAPI(.SEG,VALUE,FIELD)
- S FIELD=2 I $G(IBADMIT) S VALUE=IBADMIT D SET^HLOAPI(.SEG,VALUE,FIELD) ; ADMIT DATE
- S FIELD=3 I $G(IBDISCH) S VALUE=IBDISCH D SET^HLOAPI(.SEG,VALUE,FIELD) ; Discharge date
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- Q
- SENDQRY ;
- S PARMS("SENDING APPLICATION")="IBECEAC-QRY"
- S WHOTO("RECEIVING APPLICATION")="IBECEAC-RECV"
- S WHOTO("STATION NUMBER")="200DAS"
- S WHOTO("MIDDLEWARE LINK NAME")="IBECEC-QRY" ;File #870 entry
- S XXX=$$SENDONE^HLOAPI1(.MSG,.PARMS,.WHOTO,.ERROR)
- Q
- ;
- ;--------------------------------------------------INCOMING QRY --------------------------
- QRYIN ; receives incoming HL7 QRY^R02 and returns a DSR
- N ICN,IBECADM,IBSADMIT,IBSDISCH
- S ERR=0,IBSTAT=$$STARTMSG^HLOPRS(.IBMSG,HLMSGIEN,.IBHDR)
- S IBIEN=HLMSGIEN
- I 'IBSTAT S HLERR="Unable to start parse of message" Q
- I "QRY"'[IBHDR("MESSAGE TYPE") Q
- ;
- ; extract some incoming message data from Cerner message IBARXC-QRY - QRY^R02
- F Q:'$$NEXTSEG^HLOPRS(.IBMSG,.SEG) S IBSEGT=$G(SEG("SEGMENT TYPE")) Q:IBSEGT="" D
- . I IBSEGT="QRD" D QRDQI
- . I IBSEGT="QRF" D QRFQI
- Q:'ICN
- D DSROUT(ICN,IBIEN,IBECADM)
- K IBCLNDT
- Q
- ;
- QRDQI ; INCOMING QRD SEGMENT
- S ICN=$$GET^HLOPRS(.SEG,9,1,1,1)
- S IBSADMIT=$$GET^HLOPRS(.SEG,11,1,1,1)
- S IBSDISCH=$$GET^HLOPRS(.SEG,12,1,1,1)
- Q
- ;
- QRFQI ; INCOMING QRF SEGMENT
- S IBECADM=$$GET^HLOPRS(.SEG,2,1,1,1)
- S IBECADM=$$HL7TFM^XLFDT(IBECADM)
- Q
- ;
- ;--------------------------------------------------INCOMING DSR --------------------------
- DSRIN ;MAIN ENTRY POINT - incoming DSR message
- ;
- N IBMSG,HDR,SEG,XXX,DFN,IBAGG
- S IBERR=0,IBAGG=1
- S XXX=$$STARTMSG^HLOPRS(.IBMSG,HLMSGIEN,.HDR)
- F Q:'$$NEXTSEG^HLOPRS(.IBMSG,.SEG) S IBSEGT=$G(SEG("SEGMENT TYPE")) Q:IBSEGT="" D
- . I IBSEGT="MSA" D MSA1
- . I IBSEGT="QRD" D QRDDI
- . I IBSEGT="DSP" D DSPDI
- . I IBSEGT="ERR" D ERR1($$GET^HLOPRS(.SEG,6,1))
- Q
- ;
- MSA1 ;PULL 351 REFERENCE NUMBER
- S IBCLDA=IBMSG("HDR","MESSAGE CONTROL ID")
- S IB778=$P($$GET^HLOPRS(.SEG,2,1,1)," ",2)
- Q
- ;
- QRDDI ;INCOMING QRD SEGMENT
- ;N IBQRYDT
- S IBQRYDT=$$GET^HLOPRS(.SEG,1,1,1) ;QUERY DATE/TIME
- S IBICN=$$GET^HLOPRS(.SEG,9,1,1,1) ;Pt ICN
- S DFN=$$DFN^IBARXMU(IBICN)
- S IBADMIT=$$GET^HLOPRS(.SEG,11,1,1,1)
- S IBDISCH=$$GET^HLOPRS(.SEG,12,1,1,1)
- Q
- DSPDI ;INCOMING DSP SEGMENT
- N IBSETID,IBCLDT,IB901,IB902,IB903,IB904,IBICLDAY,IBICLDT,IBSETID1,IBCLDT1,IB9011,IB9021,IB9031,IB9041,IBCLDAY1,IBICKDT,IBACTC,IBCKNUM,IBICNUM
- N IBCNT,IBDA,IBCNDT,IBQRYS,IBCBDT,IBDA1,IBICLNDT,IBERRMSG,IBODISCH,IBOADMIN,IBQRY,IBCRTST
- S IBERRMSG=$$GET^HLOPRS(.SEG,5,1) ;Result Messages/Errors
- I IBERRMSG'="" D ERR1(IBERRMSG) Q
- S IBCNT=$$GET^HLOPRS(.SEG,1,1)
- S IBISETID=$$GET^HLOPRS(.SEG,3,1) ;FT1 Response - bjr
- S IBICLDT=$$GET^HLOPRS(.SEG,3,2) ;Billing Clock start date - bjr
- S IBICLDT=$$HL7TFM^XLFDT(IBICLDT) ;convert HL7 date TO FM - bjr
- S IBI901=$$GET^HLOPRS(.SEG,3,3) ;1st QRT charges - bjr
- S IBI902=$$GET^HLOPRS(.SEG,3,4) ;2nd QRT charges - bjr
- S IBI903=$$GET^HLOPRS(.SEG,3,5) ;3rd QRT charges - bjr
- S IBI904=$$GET^HLOPRS(.SEG,3,6) ;4th QRT charges - bjr
- S IBICLDAY=$$GET^HLOPRS(.SEG,3,7) ;Inpatient days - bjr
- S IBICLNDT=$$GET^HLOPRS(.SEG,3,8) ;Billing clock end date - bjr
- S IBICLNDT=$$HL7TFM^XLFDT(IBICLNDT) ;HL7 TO FM - bjr
- S IBICKDT=IBICLNDT
- ;RRA currently nothing passed in the 4th field - leaving for integration with Cerner
- S IBSETID1=$$GET^HLOPRS(.SEG,4,1) ;FT2 set id (IF PRESENT)
- S IBCLDT1=$$GET^HLOPRS(.SEG,4,2) ;Billing Clock start date
- S IBCLDT1=$$HL7TFM^XLFDT(IBCLDT1) ;convert HL7 date TO FM
- S IB9011=$$GET^HLOPRS(.SEG,4,3) ;1st QRT charges
- S IB9021=$$GET^HLOPRS(.SEG,4,4) ;2nd QRT charges
- S IB9031=$$GET^HLOPRS(.SEG,4,5) ;3rd QRT charges
- S IB9041=$$GET^HLOPRS(.SEG,4,6) ;4th QRT charges
- S IBCLDAY1=$$GET^HLOPRS(.SEG,4,7) ;Inpatient days
- ;S IBICKDT=$$GET^HLOPRS(.SEG,4,8) ;Billing clock end date
- ;S IBICKDT=$$HL7TFM^XLFDT(IBICKDT) ;convert HL7 date TO FM
- S IBISTAT=$$GET^HLOPRS(.SEG,6,1) ;Clock Status
- S IBCKNUM=$$GET^HLOPRS(.SEG,7,1) ;Number of billing clocks sent (FT1)
- S IBICNUM=$$GET^HLOPRS(.SEG,8,1) ;Number of admit encounters sent (FT2) - bjr
- S IBISITE=$$GET^HLOPRS(.SEG,9,1) ;Site - bjr
- I 'IBISTAT D UDCL Q ;Quit if no status sent which indicates no clocks from other sites
- S IBDA=";" F S IBDA=$O(^IBE(351,"AIVDT",DFN,-IBICLDT,IBDA),-1) Q:'IBDA Q:$G(IBCBDT) D
- .S IBCBDT=$$GET1^DIQ(351,IBDA_",",.03,"I")
- .S IBQRYS=$$GET1^DIQ(351,IBDA_",",16,"I")
- .S IBCRTST=$$GET1^DIQ(351,IBDA_",",.04,"I")
- .S IBDA1=IBDA
- I $G(IBQRYS),IBCRTST'=3 Q
- Q:(IBICLDT<1)
- I $G(IBCBDT)=IBICLDT,IBCNT=1 D UPDATE^IBECECU1(IBDA1) Q ;Update record if current Billing Clock Start Date matches incoming Billing Clock Start Date
- I IBCNT=1 D NEWREC^IBECECU1 ;IBCNT=1 MEANS THE DSR SEGMENT IS AGGREGATED DATA AND SHOULD BE STORED IN 351
- I IBCNT>1 D EN^IBECECU2(IBICLDT,DFN) ;IBCNT>1 MEANS IT IS INDIVIDUAL SITE DATA USED FOR AGGREGATION AND NEEDS TO BE STORED IN 351.3
- S IBADMIT=$$FMADD^XLFDT(IBICLNDT,1)
- I ($$FMTHL7^XLFDT(IBICLNDT))<IBDISCH,IBCNT=1 D ;
- .S IBQRY=$O(^IBE(351,"AIVDT",DFN,-IBADMIT,";"),-1) I IBQRY,$P(^IBE(351,IBQRY,1),U,5) Q
- .S IBADMIT=$$FMADD^XLFDT(IBICLNDT,1),IBDISCH=$$FMADD^XLFDT(IBADMIT,365),IBADMIT=$$FMTHL7^XLFDT(IBADMIT),IBOADMIT=IBADMIT
- .S IBDISCH=$S(IBDISCH<DT:IBDISCH,1:"") I IBDISCH S IBDISCH=$$FMTHL7^XLFDT(IBDISCH),IBODISCH=IBDISCH
- .K SEG,ERROR
- .D MSH,QRD,QRF,SENDQRY
- Q
- ;
- ;-------------------------------------------------- OUTGOING DSR --- ---------------------------
- DSROUT(ICN,IBIEN,IBADMIT) ;MAIN ENTRY POINT - Outgoing DSR message
- ; IBIEN - Query Request Message IEN (#778) that initiated this response
- ; ------ Sample message ----
- ;MSH|^~\&|IBECEAC-SEND|695^HL7.IVMVEE.FO-ALBANY.DOMAIN.EXT:5127^DNS|IBECEAC-RECV|200DAS^:^DNS"|20211029135630-0500||DSR^Q03^DSR_Q03|695 1480|T^|2.3|||AL|NE|USA|3211029.135631^20211029145631.228^
- ;MSA|AL|0"
- ;QRD|20211102091619|1|1|0|||1|DRI^DODMORE MESSAGE|1008713999V404928"
- ;DSP|1||FT1^20201101^345^0^0^0^15^-1|||1|1|1"
- N PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO
- N IBSETID,IBCLDT,IB901,IB902,IB903,IB904,IBCLDAY,IBSETID1,IBCLDT1,IB9011,IB9021,IB9031,IB9041,IBCLDAY1,IBCLNDT1,IBACTC,IBCKNUM,IBICNUM
- S DFN=$$DFN^IBARXMU(ICN)
- I +DFN<1 S SERROR="NO PATIENT FOUND WITH SUBMITTED ICN",SERR=1
- S QRYNUM=$$MSGID^HLOPRS(IBIEN) ; Message Control ID of initiating Query
- S:$G(SERR)="" SERR=0
- D EN^IBECECX1(DFN),INPT^IBECECX1(DFN)
- MSHO ; Outgoing MSH
- N PARMS K ^TMP("DSR")
- S PARMS("COUNTRY")="USA"
- S PARMS("MESSAGE TYPE")="DSR"
- S PARMS("EVENT")="Q03"
- S PARMS("SENDING APPLICATION")="IBECEAC-QRYRESP"
- S PARMS("VERSION")="2.3"
- S PARMS("MESSAGE STRUCTURE")="DSR_Q03"
- S MSG="^TMP("_"DSR"
- S X=$$NEWMSG^HLOAPI(.PARMS,.MSG,.ERROR)
- MSAO ;Outgoing MSA
- D SET^HLOAPI(.SEG,"MSA",0)
- D SET^HLOAPI(.SEG,"AL",1)
- D SET^HLOAPI(.SEG,QRYNUM,2)
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- QRDO ;Outgoing QRD
- D SET^HLOAPI(.SEG,"QRD",0)
- S %P1=$$NOW^XLFDT() S %P1=$$FMTHL7^XLFDT(%P1)
- D SET^HLOAPI(.SEG,+%P1,1)
- D SET^HLOAPI(.SEG,1,2)
- D SET^HLOAPI(.SEG,1,3)
- D SET^HLOAPI(.SEG,+QRYNUM,4)
- D SET^HLOAPI(.SEG,1,7)
- S NAME=$$GET1^DIQ(2,DFN_",",.01)
- D SET^HLOAPI(.SEG,$P($G(NAME),",",1),8,1)
- D SET^HLOAPI(.SEG,$P($G(NAME),",",2),8,2)
- D SET^HLOAPI(.SEG,ICN,9)
- I $G(IBSADMIT) D SET^HLOAPI(.SEG,IBSADMIT,11)
- I $G(IBSDISCH) D SET^HLOAPI(.SEG,IBSDISCH,12)
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- ;
- DSPO ;Outgoing DSP
- D SET^HLOAPI(.SEG,"DSP",0)
- D SET^HLOAPI(.SEG,1,1)
- D SET^HLOAPI(.SEG,"FT1",3,1) ;FT1 Response
- S IBCLDT=$$FMTHL7^XLFDT(+IBCLDT) D SET^HLOAPI(.SEG,$S(IBCLDT>0:IBCLDT,1:$$FMTHL7^XLFDT(DT)),3,2) ;Billing Clock start date (HL7 format)
- D SET^HLOAPI(.SEG,+IB901,3,3) ;1st QRT charges
- D SET^HLOAPI(.SEG,+IB902,3,4) ;2nd QRT charges
- D SET^HLOAPI(.SEG,+IB903,3,5) ;3rd QRT charges
- D SET^HLOAPI(.SEG,+IB904,3,6) ;4th QRT charges
- D SET^HLOAPI(.SEG,+IBCLDAY,3,7) ;Inpatient days
- I $G(IBCLNDT) S IBCLNDT=$$FMTHL7^XLFDT(IBCLNDT) D SET^HLOAPI(.SEG,+IBCLNDT,3,8) ;Billing Clock end date (HL7 format)
- ;D SET^HLOAPI(.SEG,+IBSETID1,4) ;FT2 set id (IF PRESENT)
- ;D SET^HLOAPI(.SEG,2,4) ;FT2 set id (IF PRESENT)
- ;D SET^HLOAPI(.SEG,+IBADMIT,4,1) ;Admit Date (Already HL7 format)
- ;D SET^HLOAPI(.SEG,+IBDISCH,4,2) ;Discharge Date (Already HL7 format)
- ;D SET^HLOAPI(.SEG,+IBCLDAY,4,3) ;Inpatient Days
- ;
- D SET^HLOAPI(.SEG,+IBSTAT,6) ;Active clock sent
- D SET^HLOAPI(.SEG,+IBCKNUM,7) ;Number of billing clocks sent (FT1)
- D SET^HLOAPI(.SEG,+IBICNUM,8) ;Number of admit encounters sent (FT2)
- S X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- ;
- SENDDSR ;
- S PARMS("SENDING APPLICATION")="IBECEAC-QRYRESP"
- S WHOTO("RECEIVING APPLICATION")="IBECEAC-RCV"
- S WHOTO("STATION NUMBER")="200DAS"
- S WHOTO("MIDDLEWARE LINK NAME")="IBECEC-DSR" ;File #870 entry
- S XXX=$$SENDONE^HLOAPI1(.MSG,.PARMS,.WHOTO,.ERROR)
- Q
- ;
- ERR1(IBERRMSG) ;HANDLE ERROR RESPONSES
- ;
- ;XMY,XMSUB,IBL
- I IBERRMSG["MVI returned no treating facilities for this patient" D UDCL ;no error message necessary - just update the query sent field
- ;MAIL MESSAGE GENERATION CODE ON HOLD FOR FUTURE REQUIREMENTS
- ;K ^TMP($J,"IBCPYAC")
- ;S XMSUB="COPAY PATIENT ACCUMULATOR ISSUE"
- ;S XMY("G.IB PATIENT ACCUMULATOR")=""
- ;S IBL=0
- ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)="ERROR RECEIVED BY DAS DURING QUERY ATTEMPT:"
- ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)=""
- ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)=IBERRMSG
- ;S XMDUZ=DUZ,XMTEXT="^TMP($J,""IBCPYAC"","
- ;D ^XMD
- Q
- UDCL ;Update original billing clock so nightly querys are not sent for patients without TFL's
- N IBSTAT,IBCLK,IBDA,IBMSG,IBHDR,SEG,IBSEGT,IBDFN,IBECDAT
- S IBSTAT=$$STARTMSG^HLOPRS(.IBMSG,IB778,.IBHDR)
- F Q:'$$NEXTSEG^HLOPRS(.IBMSG,.SEG) S IBSEGT=$G(SEG("SEGMENT TYPE")) Q:IBSEGT="" D
- . I IBSEGT="QRD" D QRDQI ;pull the ICN out of the initiating QRY message so we can update the Billing Clock
- Q:'ICN
- S IBDFN=$$DFN^IBARXMU(ICN)
- S IBDA=";" S IBDA=$O(^IBE(351,"ACT",IBDFN,IBDA),-1) ;locate the most recent active Billing Clock for update
- I 'IBDA S IBECDAT=$O(^IBE(351,"AIVDT",IBDFN,-9999999)) Q:'IBECDAT S IBDA=$O(^IBE(351,"AIVDT",IBDFN,IBECDAT,";"),-1) Q:$$GET1^DIQ(351,IBDA,.04) ;Use newest date entry when no status set
- Q:'IBDA
- S $P(^IBE(351,IBDA,1),"^",5)=1 ;Update QUERY SENT
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBECECQ1 15991 printed Mar 13, 2025@21:26:35 Page 2
- IBECECQ1 ;BSL/DVA-BILLING - SEND/RECEIVE QRY & DSR HL7 messages FOR PATIENT ACCUMULATOR INTERFACE ; 01 Jun 2022 7:17 AM
- +1 ;;2.0;INTEGRATED BILLING;**704**;21-MAR-94;Build 49
- +2 ;Per VA Directive 6402, this routine should not be modified.
- +3 ;
- +4 ; Reference to $$STARTMSG^HLOPRS,$$NEXTSEG^HLOPRS,$$GET^HLOPRS,$$MSGID^HLOPRS in ICR #4718
- +5 ; Reference to $$ADDSEG^HLOAPI,$$NEWMSG^HLOAPI,SET^HLOAPI in ICR #4722
- +6 ; Reference to $$SENDONE^HLOAPI1 in ICR #4717
- +7 ;
- +8 ; -4200Build and send seeding of Vista data to DAS SPOE IBECEAC-QRY DSR^Q03
- +9 ; Receive seeding query of Vista data from DAS SPOE IBECEAC-QRY DSR^Q03
- +10 ;
- +11 ; Sample message
- +12 ;MSH|^~\&||695^HL7.IVMVEE.FO-ALBANY.DOMAIN.EXT:5127^DNS|IBECECQ-QRYRESP|200DAS^:^DNS|20211001094308-0500||QRY^RO2^QRY_RO2|695 1469|T^|2.3|||AL|NE|USA
- +13 ;QRD|20211008123254-0500|1|1||||1|DRI^DODMORE MESSAGE|1008713999V404928
- +14 ;QRF|IBECEAC-QRY|20161106|20161107
- +15 ;
- +16 ;No direct routine calls
- QUIT
- +17 ;
- ADM ;Called from IB MEANS TEST BILLING protocol
- +1 if $PIECE($GET(DGPMA),"^",2)'=1
- QUIT
- +2 DO EN(DFN)
- +3 QUIT
- +4 ;
- EDTCLCK(DFN,IBADMIT) ;Called from Billing CLock Maintenance option
- +1 NEW IBTRYTIL,IBECDT,IBECLDT,IBECIEN,IBECSTDT,IBECENDT,IBNOW
- +2 ;Do not run query of patient does not have an ICN
- if '$$ICN^IBARXMU(DFN)
- QUIT
- +3 ;Run Query
- DO MTEQRY(DFN,IBADMIT)
- +4 WRITE !,"Running Billing Clock Query, please wait."
- +5 SET IBFLAG1=0
- SET IBTRYTIL=$$FMADD^XLFDT($$NOW^XLFDT,,,1)
- SET IBNOW=$$NOW^XLFDT
- FOR
- if $$NOW^XLFDT>IBTRYTIL
- QUIT
- if IBFLAG1
- QUIT
- Begin DoDot:1
- +6 HANG 2
- WRITE "."
- SET IBECDT1=-(IBADMIT_.9999)
- FOR
- SET IBECDT1=$ORDER(^IBE(351,"AIVDT",DFN,IBECDT1))
- if 'IBECDT1
- QUIT
- SET IBECIEN=$ORDER(^IBE(351,"AIVDT",DFN,IBECDT1,";"),-1)
- if 'IBECIEN
- QUIT
- Begin DoDot:2
- +7 SET IBECLDT=$$GET1^DIQ(351,IBECIEN_",",.04,"I")
- if IBECLDT=3
- QUIT
- Begin DoDot:3
- +8 SET IBECSTDT=$$GET1^DIQ(351,IBECIEN_",",.03,"I")
- SET IBECENDT=$$GET1^DIQ(351,IBECIEN_",",.1,"I")
- SET IBECENDT=$SELECT(IBECENDT:IBECENDT,IBECLDT=2:($$CLSDT^IBECECX1(IBECSTDT)),1:DT)
- Begin DoDot:4
- +9 IF (IBECENDT>=IBADMIT)
- IF $$GET1^DIQ(351,IBECIEN_",",14,"I")>IBNOW
- IF $PIECE(^IBE(351,IBECIEN,1),U,5)
- SET IBFLAG1=1
- SET IBECDA=IBECIEN
- QUIT
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +10 QUIT
- +11 ;
- MTEQRY(DFN,IBADMIT) ;Query for Billing CLock Maintenance option
- +1 NEW IBICN,IBDISCH
- +2 SET IBICN=$$ICN^IBARXMU(DFN)
- +3 ;quit if unable to find ICN
- IF +IBICN<1
- SET SERROR="NO PATIENT ICN FOUND"
- SET SERR=1
- QUIT
- +4 SET IBDISCH=$$CLSDT^IBECECX1(IBADMIT)
- +5 IF IBDISCH
- SET IBDISCH=$$FMTHL7^XLFDT($PIECE(IBDISCH,"."))
- +6 SET IBADMIT=$$FMTHL7^XLFDT($PIECE(IBADMIT,"."))
- +7 SET IBOADMIT=IBADMIT
- +8 IF IBDISCH
- SET IBODISCH=IBDISCH
- +9 if $GET(SERR)=""
- SET SERR=0
- +10 DO MSH
- DO QRD
- DO QRF
- DO SENDQRY
- +11 QUIT
- +12 ;
- CCBILL(DFN,IBADMIT) ;OUTGOING QRY Called from CC Inpatient Bill
- +1 ;
- +2 NEW X,PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO,IBACBCLK,IBADM,IBDISC,IBDISCH,IBIEN,IBICN,IBQIEN,IBC0,IBODISCH,IBOADMIN
- +3 ;
- +4 ;S IBC0=^IBE(351,IBCLDA,0)
- +5 ;HL7 to FM - $$HL7TFM^XLFDT(DT)
- +6 ;FM TO HL7 - $$FMTHL7^XLFDT(DT)
- +7 ; Retrieve Admission and Discharge dates from the PTF file
- +8 ;
- +9 ;Get admit/discharge data
- DO CCINPT^IBECECX1(DFN,.IBADMIT)
- +10 SET IBICN=$$ICN^IBARXMU(DFN)
- +11 ;quit if unable to find ICN
- IF +IBICN<1
- SET SERROR="NO PATIENT ICN FOUND"
- SET SERR=1
- QUIT
- +12 if $GET(SERR)=""
- SET SERR=0
- +13 DO MSH
- DO QRD
- DO QRF
- DO SENDQRY
- +14 QUIT
- +15 ;-------------------------------------------------OUTGOING QRY ----------------------------------------
- EN(DFN) ;OUTGOING QRY ENTRY POINT
- +1 ; IBQIEN - Query Request Message IEN (#778) that initiated this response CALLED FROM CLADD^IBAUTL3
- +2 NEW X,PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO,IBACBCLK,IBADM,IBDISC,IBADMIT,IBDISCH,IBIEN,IBICN,IBQIEN,IBC0,IBODISCH,IBOADMIN
- +3 ;
- +4 ;S IBC0=^IBE(351,IBCLDA,0)
- +5 ;HL7 to FM - $$HL7TFM^XLFDT(DT)
- +6 ;FM TO HL7 - $$FMTHL7^XLFDT(DT)
- +7 ; Retrieve Admission and Discharge dates from the PTF file
- +8 ;
- +9 ;Get admit/discharge data
- DO INPT^IBECECX1(DFN)
- +10 SET IBICN=$$ICN^IBARXMU(DFN)
- +11 ;quit if unable to find ICN
- IF +IBICN<1
- SET SERROR="NO PATIENT ICN FOUND"
- SET SERR=1
- QUIT
- +12 if $GET(SERR)=""
- SET SERR=0
- +13 DO MSH
- DO QRD
- DO QRF
- DO SENDQRY
- +14 QUIT
- +15 ;
- MSH ; Build MSH Segment
- +1 NEW PARMS
- KILL ^TMP("DSR")
- +2 SET PARMS("COUNTRY")="USA"
- +3 SET PARMS("MESSAGE TYPE")="QRY"
- +4 SET PARMS("EVENT")="R02"
- +5 SET PARMS("VERSION")="2.3"
- +6 SET PARMS("MESSAGE STRUCTURE")="QRY_R02"
- +7 SET MSG="^TMP("_"QRY"
- +8 SET X=$$NEWMSG^HLOAPI(.PARMS,.MSG,.ERROR)
- MSA ;Build MSA Segment (OPTIONAL)
- +1 SET VALUE="MSA"
- SET FIELD=0
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +2 SET VALUE="AL"
- SET FIELD=1
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +3 ;S VALUE=QRYNUM,FIELD=2 D SET^HLOAPI(.SEG,VALUE,FIELD)
- +4 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- +5 QUIT
- +6 ;
- QRD ;Build QRD segment
- +1 SET VALUE="QRD"
- SET FIELD=0
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +2 SET %P1=$$NOW^XLFDT()
- SET %P1=$$FMTHL7^XLFDT(%P1)
- +3 SET VALUE=%P1
- SET FIELD=1
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +4 SET VALUE=1
- SET FIELD=2
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +5 SET VALUE=1
- SET FIELD=3
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +6 ;S VALUE=QRYNUM,FIELD=4 D SET^HLOAPI(.SEG,VALUE,FIELD)
- +7 SET VALUE=1
- SET FIELD=7
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +8 SET NAME=$$GET1^DIQ(2,DFN_",",.01)
- +9 SET VALUE=$PIECE($GET(NAME),",",1)
- SET FIELD=8
- DO SET^HLOAPI(.SEG,VALUE,FIELD,1)
- +10 SET VALUE=$PIECE($GET(NAME),",",2)
- SET FIELD=8
- DO SET^HLOAPI(.SEG,VALUE,FIELD,2)
- +11 SET VALUE=IBICN
- SET FIELD=9
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +12 ; ADMIT DATE
- SET FIELD=11
- IF $GET(IBOADMIT)
- SET VALUE=IBOADMIT
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +13 ; Discharge date
- SET FIELD=12
- IF $GET(IBODISCH)
- SET VALUE=IBODISCH
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +14 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- +15 QUIT
- +16 ;
- QRF ;Build QRF segment
- +1 SET FIELD=0
- SET VALUE="QRF"
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +2 SET FIELD=1
- SET VALUE="IBECEAC-QRY"
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +3 ; ADMIT DATE
- SET FIELD=2
- IF $GET(IBADMIT)
- SET VALUE=IBADMIT
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +4 ; Discharge date
- SET FIELD=3
- IF $GET(IBDISCH)
- SET VALUE=IBDISCH
- DO SET^HLOAPI(.SEG,VALUE,FIELD)
- +5 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- +6 QUIT
- SENDQRY ;
- +1 SET PARMS("SENDING APPLICATION")="IBECEAC-QRY"
- +2 SET WHOTO("RECEIVING APPLICATION")="IBECEAC-RECV"
- +3 SET WHOTO("STATION NUMBER")="200DAS"
- +4 ;File #870 entry
- SET WHOTO("MIDDLEWARE LINK NAME")="IBECEC-QRY"
- +5 SET XXX=$$SENDONE^HLOAPI1(.MSG,.PARMS,.WHOTO,.ERROR)
- +6 QUIT
- +7 ;
- +8 ;--------------------------------------------------INCOMING QRY --------------------------
- QRYIN ; receives incoming HL7 QRY^R02 and returns a DSR
- +1 NEW ICN,IBECADM,IBSADMIT,IBSDISCH
- +2 SET ERR=0
- SET IBSTAT=$$STARTMSG^HLOPRS(.IBMSG,HLMSGIEN,.IBHDR)
- +3 SET IBIEN=HLMSGIEN
- +4 IF 'IBSTAT
- SET HLERR="Unable to start parse of message"
- QUIT
- +5 IF "QRY"'[IBHDR("MESSAGE TYPE")
- QUIT
- +6 ;
- +7 ; extract some incoming message data from Cerner message IBARXC-QRY - QRY^R02
- +8 FOR
- if '$$NEXTSEG^HLOPRS(.IBMSG,.SEG)
- QUIT
- SET IBSEGT=$GET(SEG("SEGMENT TYPE"))
- if IBSEGT=""
- QUIT
- Begin DoDot:1
- +9 IF IBSEGT="QRD"
- DO QRDQI
- +10 IF IBSEGT="QRF"
- DO QRFQI
- End DoDot:1
- +11 if 'ICN
- QUIT
- +12 DO DSROUT(ICN,IBIEN,IBECADM)
- +13 KILL IBCLNDT
- +14 QUIT
- +15 ;
- QRDQI ; INCOMING QRD SEGMENT
- +1 SET ICN=$$GET^HLOPRS(.SEG,9,1,1,1)
- +2 SET IBSADMIT=$$GET^HLOPRS(.SEG,11,1,1,1)
- +3 SET IBSDISCH=$$GET^HLOPRS(.SEG,12,1,1,1)
- +4 QUIT
- +5 ;
- QRFQI ; INCOMING QRF SEGMENT
- +1 SET IBECADM=$$GET^HLOPRS(.SEG,2,1,1,1)
- +2 SET IBECADM=$$HL7TFM^XLFDT(IBECADM)
- +3 QUIT
- +4 ;
- +5 ;--------------------------------------------------INCOMING DSR --------------------------
- DSRIN ;MAIN ENTRY POINT - incoming DSR message
- +1 ;
- +2 NEW IBMSG,HDR,SEG,XXX,DFN,IBAGG
- +3 SET IBERR=0
- SET IBAGG=1
- +4 SET XXX=$$STARTMSG^HLOPRS(.IBMSG,HLMSGIEN,.HDR)
- +5 FOR
- if '$$NEXTSEG^HLOPRS(.IBMSG,.SEG)
- QUIT
- SET IBSEGT=$GET(SEG("SEGMENT TYPE"))
- if IBSEGT=""
- QUIT
- Begin DoDot:1
- +6 IF IBSEGT="MSA"
- DO MSA1
- +7 IF IBSEGT="QRD"
- DO QRDDI
- +8 IF IBSEGT="DSP"
- DO DSPDI
- +9 IF IBSEGT="ERR"
- DO ERR1($$GET^HLOPRS(.SEG,6,1))
- End DoDot:1
- +10 QUIT
- +11 ;
- MSA1 ;PULL 351 REFERENCE NUMBER
- +1 SET IBCLDA=IBMSG("HDR","MESSAGE CONTROL ID")
- +2 SET IB778=$PIECE($$GET^HLOPRS(.SEG,2,1,1)," ",2)
- +3 QUIT
- +4 ;
- QRDDI ;INCOMING QRD SEGMENT
- +1 ;N IBQRYDT
- +2 ;QUERY DATE/TIME
- SET IBQRYDT=$$GET^HLOPRS(.SEG,1,1,1)
- +3 ;Pt ICN
- SET IBICN=$$GET^HLOPRS(.SEG,9,1,1,1)
- +4 SET DFN=$$DFN^IBARXMU(IBICN)
- +5 SET IBADMIT=$$GET^HLOPRS(.SEG,11,1,1,1)
- +6 SET IBDISCH=$$GET^HLOPRS(.SEG,12,1,1,1)
- +7 QUIT
- DSPDI ;INCOMING DSP SEGMENT
- +1 NEW IBSETID,IBCLDT,IB901,IB902,IB903,IB904,IBICLDAY,IBICLDT,IBSETID1,IBCLDT1,IB9011,IB9021,IB9031,IB9041,IBCLDAY1,IBICKDT,IBACTC,IBCKNUM,IBICNUM
- +2 NEW IBCNT,IBDA,IBCNDT,IBQRYS,IBCBDT,IBDA1,IBICLNDT,IBERRMSG,IBODISCH,IBOADMIN,IBQRY,IBCRTST
- +3 ;Result Messages/Errors
- SET IBERRMSG=$$GET^HLOPRS(.SEG,5,1)
- +4 IF IBERRMSG'=""
- DO ERR1(IBERRMSG)
- QUIT
- +5 SET IBCNT=$$GET^HLOPRS(.SEG,1,1)
- +6 ;FT1 Response - bjr
- SET IBISETID=$$GET^HLOPRS(.SEG,3,1)
- +7 ;Billing Clock start date - bjr
- SET IBICLDT=$$GET^HLOPRS(.SEG,3,2)
- +8 ;convert HL7 date TO FM - bjr
- SET IBICLDT=$$HL7TFM^XLFDT(IBICLDT)
- +9 ;1st QRT charges - bjr
- SET IBI901=$$GET^HLOPRS(.SEG,3,3)
- +10 ;2nd QRT charges - bjr
- SET IBI902=$$GET^HLOPRS(.SEG,3,4)
- +11 ;3rd QRT charges - bjr
- SET IBI903=$$GET^HLOPRS(.SEG,3,5)
- +12 ;4th QRT charges - bjr
- SET IBI904=$$GET^HLOPRS(.SEG,3,6)
- +13 ;Inpatient days - bjr
- SET IBICLDAY=$$GET^HLOPRS(.SEG,3,7)
- +14 ;Billing clock end date - bjr
- SET IBICLNDT=$$GET^HLOPRS(.SEG,3,8)
- +15 ;HL7 TO FM - bjr
- SET IBICLNDT=$$HL7TFM^XLFDT(IBICLNDT)
- +16 SET IBICKDT=IBICLNDT
- +17 ;RRA currently nothing passed in the 4th field - leaving for integration with Cerner
- +18 ;FT2 set id (IF PRESENT)
- SET IBSETID1=$$GET^HLOPRS(.SEG,4,1)
- +19 ;Billing Clock start date
- SET IBCLDT1=$$GET^HLOPRS(.SEG,4,2)
- +20 ;convert HL7 date TO FM
- SET IBCLDT1=$$HL7TFM^XLFDT(IBCLDT1)
- +21 ;1st QRT charges
- SET IB9011=$$GET^HLOPRS(.SEG,4,3)
- +22 ;2nd QRT charges
- SET IB9021=$$GET^HLOPRS(.SEG,4,4)
- +23 ;3rd QRT charges
- SET IB9031=$$GET^HLOPRS(.SEG,4,5)
- +24 ;4th QRT charges
- SET IB9041=$$GET^HLOPRS(.SEG,4,6)
- +25 ;Inpatient days
- SET IBCLDAY1=$$GET^HLOPRS(.SEG,4,7)
- +26 ;S IBICKDT=$$GET^HLOPRS(.SEG,4,8) ;Billing clock end date
- +27 ;S IBICKDT=$$HL7TFM^XLFDT(IBICKDT) ;convert HL7 date TO FM
- +28 ;Clock Status
- SET IBISTAT=$$GET^HLOPRS(.SEG,6,1)
- +29 ;Number of billing clocks sent (FT1)
- SET IBCKNUM=$$GET^HLOPRS(.SEG,7,1)
- +30 ;Number of admit encounters sent (FT2) - bjr
- SET IBICNUM=$$GET^HLOPRS(.SEG,8,1)
- +31 ;Site - bjr
- SET IBISITE=$$GET^HLOPRS(.SEG,9,1)
- +32 ;Quit if no status sent which indicates no clocks from other sites
- IF 'IBISTAT
- DO UDCL
- QUIT
- +33 SET IBDA=";"
- FOR
- SET IBDA=$ORDER(^IBE(351,"AIVDT",DFN,-IBICLDT,IBDA),-1)
- if 'IBDA
- QUIT
- if $GET(IBCBDT)
- QUIT
- Begin DoDot:1
- +34 SET IBCBDT=$$GET1^DIQ(351,IBDA_",",.03,"I")
- +35 SET IBQRYS=$$GET1^DIQ(351,IBDA_",",16,"I")
- +36 SET IBCRTST=$$GET1^DIQ(351,IBDA_",",.04,"I")
- +37 SET IBDA1=IBDA
- End DoDot:1
- +38 IF $GET(IBQRYS)
- IF IBCRTST'=3
- QUIT
- +39 if (IBICLDT<1)
- QUIT
- +40 ;Update record if current Billing Clock Start Date matches incoming Billing Clock Start Date
- IF $GET(IBCBDT)=IBICLDT
- IF IBCNT=1
- DO UPDATE^IBECECU1(IBDA1)
- QUIT
- +41 ;IBCNT=1 MEANS THE DSR SEGMENT IS AGGREGATED DATA AND SHOULD BE STORED IN 351
- IF IBCNT=1
- DO NEWREC^IBECECU1
- +42 ;IBCNT>1 MEANS IT IS INDIVIDUAL SITE DATA USED FOR AGGREGATION AND NEEDS TO BE STORED IN 351.3
- IF IBCNT>1
- DO EN^IBECECU2(IBICLDT,DFN)
- +43 SET IBADMIT=$$FMADD^XLFDT(IBICLNDT,1)
- +44 ;
- IF ($$FMTHL7^XLFDT(IBICLNDT))<IBDISCH
- IF IBCNT=1
- Begin DoDot:1
- +45 SET IBQRY=$ORDER(^IBE(351,"AIVDT",DFN,-IBADMIT,";"),-1)
- IF IBQRY
- IF $PIECE(^IBE(351,IBQRY,1),U,5)
- QUIT
- +46 SET IBADMIT=$$FMADD^XLFDT(IBICLNDT,1)
- SET IBDISCH=$$FMADD^XLFDT(IBADMIT,365)
- SET IBADMIT=$$FMTHL7^XLFDT(IBADMIT)
- SET IBOADMIT=IBADMIT
- +47 SET IBDISCH=$SELECT(IBDISCH<DT:IBDISCH,1:"")
- IF IBDISCH
- SET IBDISCH=$$FMTHL7^XLFDT(IBDISCH)
- SET IBODISCH=IBDISCH
- +48 KILL SEG,ERROR
- +49 DO MSH
- DO QRD
- DO QRF
- DO SENDQRY
- End DoDot:1
- +50 QUIT
- +51 ;
- +52 ;-------------------------------------------------- OUTGOING DSR --- ---------------------------
- DSROUT(ICN,IBIEN,IBADMIT) ;MAIN ENTRY POINT - Outgoing DSR message
- +1 ; IBIEN - Query Request Message IEN (#778) that initiated this response
- +2 ; ------ Sample message ----
- +3 ;MSH|^~\&|IBECEAC-SEND|695^HL7.IVMVEE.FO-ALBANY.DOMAIN.EXT:5127^DNS|IBECEAC-RECV|200DAS^:^DNS"|20211029135630-0500||DSR^Q03^DSR_Q03|695 1480|T^|2.3|||AL|NE|USA|3211029.135631^20211029145631.228^
- +4 ;MSA|AL|0"
- +5 ;QRD|20211102091619|1|1|0|||1|DRI^DODMORE MESSAGE|1008713999V404928"
- +6 ;DSP|1||FT1^20201101^345^0^0^0^15^-1|||1|1|1"
- +7 NEW PARMS,SEG,MSG,VALUE,FIELD,QRYNUM,SERROR,SERR,NAME,ERROR,XXX,WHOTO
- +8 NEW IBSETID,IBCLDT,IB901,IB902,IB903,IB904,IBCLDAY,IBSETID1,IBCLDT1,IB9011,IB9021,IB9031,IB9041,IBCLDAY1,IBCLNDT1,IBACTC,IBCKNUM,IBICNUM
- +9 SET DFN=$$DFN^IBARXMU(ICN)
- +10 IF +DFN<1
- SET SERROR="NO PATIENT FOUND WITH SUBMITTED ICN"
- SET SERR=1
- +11 ; Message Control ID of initiating Query
- SET QRYNUM=$$MSGID^HLOPRS(IBIEN)
- +12 if $GET(SERR)=""
- SET SERR=0
- +13 DO EN^IBECECX1(DFN)
- DO INPT^IBECECX1(DFN)
- MSHO ; Outgoing MSH
- +1 NEW PARMS
- KILL ^TMP("DSR")
- +2 SET PARMS("COUNTRY")="USA"
- +3 SET PARMS("MESSAGE TYPE")="DSR"
- +4 SET PARMS("EVENT")="Q03"
- +5 SET PARMS("SENDING APPLICATION")="IBECEAC-QRYRESP"
- +6 SET PARMS("VERSION")="2.3"
- +7 SET PARMS("MESSAGE STRUCTURE")="DSR_Q03"
- +8 SET MSG="^TMP("_"DSR"
- +9 SET X=$$NEWMSG^HLOAPI(.PARMS,.MSG,.ERROR)
- MSAO ;Outgoing MSA
- +1 DO SET^HLOAPI(.SEG,"MSA",0)
- +2 DO SET^HLOAPI(.SEG,"AL",1)
- +3 DO SET^HLOAPI(.SEG,QRYNUM,2)
- +4 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- QRDO ;Outgoing QRD
- +1 DO SET^HLOAPI(.SEG,"QRD",0)
- +2 SET %P1=$$NOW^XLFDT()
- SET %P1=$$FMTHL7^XLFDT(%P1)
- +3 DO SET^HLOAPI(.SEG,+%P1,1)
- +4 DO SET^HLOAPI(.SEG,1,2)
- +5 DO SET^HLOAPI(.SEG,1,3)
- +6 DO SET^HLOAPI(.SEG,+QRYNUM,4)
- +7 DO SET^HLOAPI(.SEG,1,7)
- +8 SET NAME=$$GET1^DIQ(2,DFN_",",.01)
- +9 DO SET^HLOAPI(.SEG,$PIECE($GET(NAME),",",1),8,1)
- +10 DO SET^HLOAPI(.SEG,$PIECE($GET(NAME),",",2),8,2)
- +11 DO SET^HLOAPI(.SEG,ICN,9)
- +12 IF $GET(IBSADMIT)
- DO SET^HLOAPI(.SEG,IBSADMIT,11)
- +13 IF $GET(IBSDISCH)
- DO SET^HLOAPI(.SEG,IBSDISCH,12)
- +14 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- +15 ;
- DSPO ;Outgoing DSP
- +1 DO SET^HLOAPI(.SEG,"DSP",0)
- +2 DO SET^HLOAPI(.SEG,1,1)
- +3 ;FT1 Response
- DO SET^HLOAPI(.SEG,"FT1",3,1)
- +4 ;Billing Clock start date (HL7 format)
- SET IBCLDT=$$FMTHL7^XLFDT(+IBCLDT)
- DO SET^HLOAPI(.SEG,$SELECT(IBCLDT>0:IBCLDT,1:$$FMTHL7^XLFDT(DT)),3,2)
- +5 ;1st QRT charges
- DO SET^HLOAPI(.SEG,+IB901,3,3)
- +6 ;2nd QRT charges
- DO SET^HLOAPI(.SEG,+IB902,3,4)
- +7 ;3rd QRT charges
- DO SET^HLOAPI(.SEG,+IB903,3,5)
- +8 ;4th QRT charges
- DO SET^HLOAPI(.SEG,+IB904,3,6)
- +9 ;Inpatient days
- DO SET^HLOAPI(.SEG,+IBCLDAY,3,7)
- +10 ;Billing Clock end date (HL7 format)
- IF $GET(IBCLNDT)
- SET IBCLNDT=$$FMTHL7^XLFDT(IBCLNDT)
- DO SET^HLOAPI(.SEG,+IBCLNDT,3,8)
- +11 ;D SET^HLOAPI(.SEG,+IBSETID1,4) ;FT2 set id (IF PRESENT)
- +12 ;D SET^HLOAPI(.SEG,2,4) ;FT2 set id (IF PRESENT)
- +13 ;D SET^HLOAPI(.SEG,+IBADMIT,4,1) ;Admit Date (Already HL7 format)
- +14 ;D SET^HLOAPI(.SEG,+IBDISCH,4,2) ;Discharge Date (Already HL7 format)
- +15 ;D SET^HLOAPI(.SEG,+IBCLDAY,4,3) ;Inpatient Days
- +16 ;
- +17 ;Active clock sent
- DO SET^HLOAPI(.SEG,+IBSTAT,6)
- +18 ;Number of billing clocks sent (FT1)
- DO SET^HLOAPI(.SEG,+IBCKNUM,7)
- +19 ;Number of admit encounters sent (FT2)
- DO SET^HLOAPI(.SEG,+IBICNUM,8)
- +20 SET X=$$ADDSEG^HLOAPI(.MSG,.SEG,.ERROR)
- +21 ;
- SENDDSR ;
- +1 SET PARMS("SENDING APPLICATION")="IBECEAC-QRYRESP"
- +2 SET WHOTO("RECEIVING APPLICATION")="IBECEAC-RCV"
- +3 SET WHOTO("STATION NUMBER")="200DAS"
- +4 ;File #870 entry
- SET WHOTO("MIDDLEWARE LINK NAME")="IBECEC-DSR"
- +5 SET XXX=$$SENDONE^HLOAPI1(.MSG,.PARMS,.WHOTO,.ERROR)
- +6 QUIT
- +7 ;
- ERR1(IBERRMSG) ;HANDLE ERROR RESPONSES
- +1 ;
- +2 ;XMY,XMSUB,IBL
- +3 ;no error message necessary - just update the query sent field
- IF IBERRMSG["MVI returned no treating facilities for this patient"
- DO UDCL
- +4 ;MAIL MESSAGE GENERATION CODE ON HOLD FOR FUTURE REQUIREMENTS
- +5 ;K ^TMP($J,"IBCPYAC")
- +6 ;S XMSUB="COPAY PATIENT ACCUMULATOR ISSUE"
- +7 ;S XMY("G.IB PATIENT ACCUMULATOR")=""
- +8 ;S IBL=0
- +9 ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)="ERROR RECEIVED BY DAS DURING QUERY ATTEMPT:"
- +10 ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)=""
- +11 ;S IBL=IBL+1,^TMP($J,"IBCPYAC",IBL)=IBERRMSG
- +12 ;S XMDUZ=DUZ,XMTEXT="^TMP($J,""IBCPYAC"","
- +13 ;D ^XMD
- +14 QUIT
- UDCL ;Update original billing clock so nightly querys are not sent for patients without TFL's
- +1 NEW IBSTAT,IBCLK,IBDA,IBMSG,IBHDR,SEG,IBSEGT,IBDFN,IBECDAT
- +2 SET IBSTAT=$$STARTMSG^HLOPRS(.IBMSG,IB778,.IBHDR)
- +3 FOR
- if '$$NEXTSEG^HLOPRS(.IBMSG,.SEG)
- QUIT
- SET IBSEGT=$GET(SEG("SEGMENT TYPE"))
- if IBSEGT=""
- QUIT
- Begin DoDot:1
- +4 ;pull the ICN out of the initiating QRY message so we can update the Billing Clock
- IF IBSEGT="QRD"
- DO QRDQI
- End DoDot:1
- +5 if 'ICN
- QUIT
- +6 SET IBDFN=$$DFN^IBARXMU(ICN)
- +7 ;locate the most recent active Billing Clock for update
- SET IBDA=";"
- SET IBDA=$ORDER(^IBE(351,"ACT",IBDFN,IBDA),-1)
- +8 ;Use newest date entry when no status set
- IF 'IBDA
- SET IBECDAT=$ORDER(^IBE(351,"AIVDT",IBDFN,-9999999))
- if 'IBECDAT
- QUIT
- SET IBDA=$ORDER(^IBE(351,"AIVDT",IBDFN,IBECDAT,";"),-1)
- if $$GET1^DIQ(351,IBDA,.04)
- QUIT
- +9 if 'IBDA
- QUIT
- +10 ;Update QUERY SENT
- SET $PIECE(^IBE(351,IBDA,1),"^",5)=1
- +11 QUIT