- SRCHL7A ;BIR/SJA - RECEIVE HL-7 CONSULTS MESSAGE, PARSE INTO COMPONENTS AND CALL PFSS GET ACCOUNT API ;12/17/04 05:10 PM
- ;;3.0; Surgery ;**144**;24 Jun 93
- ;
- ; Reference to $$GETACCT^IBBAPI() is supported by DBIA #4664
- ; Reference to ^GMR(123.5 is supported by DBIA #3861
- ; Reference to ^DIC(40.7 is supported by DBIA #557
- ; Reference to ^DG(40.8 is supported by DBIA #2817
- Q
- ORC(SRCORC) ;Get fields from ORC segment.
- ;SRCTRLC=ORC control code
- ;SRCORNP=provider
- I $E(SRCMSG,1,6)'="ORC|NW" S SRCQT=1 Q
- S SRCTRLC=$P(SRCORC,"|",2)
- S SRCORNP=$P(SRCORC,"|",13)
- S SRCODT=$P(SRCORC,"|",16)
- Q
- OBR(SRCOBR) ;Get fields from OBR segment.
- ;SRCSS=type of consult, field 9, 1-4 if NO, then not surgery
- ;Must have 99CON in SRC99C.
- ;SRCODT=observation date/time
- S SRC99C=$P($P(SRCOBR,"|",5),"^",6)
- I SRC99C'="99CON" S SRCSS="NO",SRCQT=1 Q
- S SRCSST=$P($P(SRCOBR,"|",5),"^",4)
- S SRCSS=$$GET1^DIQ(123.5,SRCSST,.01) D
- .I SRCSS["SURGERY REQUEST" S SRCSS=1 Q
- .;then not surgery
- .S SRCSS="NO"
- I SRCSS="NO" S SRCQT=1 Q
- S SRCODT=$P(SRCOBR,"|",7)
- I SRCODT]"" S SRCODT=$$FMDATE^SRCHL7U(SRCODT)
- S SRCATN=$P(SRCOBR,"|",20)
- S SRCSTDT=$P(SRCOBR,"|",23)
- I SRCSTDT]"" S SRCSTDT=$$FMDATE^SRCHL7U(SRCSTDT)
- S SRCINTR=$P(SRCOBR,"|",33)
- Q
- ZSV(SRCZSV) ;Get service from ZSV segment
- S SRCZSS=$P($P(SRCZSV,"|",2),"^",4)
- ;Set the service if ZSV provided
- I $L($P(SRCZSV,"|",3)) S SRCOTXT=$P(SRCZSV,"|",3) ;consult type
- Q
- OBX(SRCOBX) ;Get fields from OBX segment and set into SRC variables
- ;SRCOID=observation id identifying value in seg. 5
- ;free text or code^free text^I9C
- S SRCMSG=MSG(SRCOBX)
- S SRCOID=$P($P(SRCMSG,"|",4),"^",2)
- I SRCOID="REASON FOR REQUEST" D
- .S LN=0 F S LN=$O(MSG(SRCOBX,LN)) Q:LN="" S SRCRF(LN+1)=$G(MSG(SRCOBX,LN)),SRCRFL=SRCRF(LN+1),SRCRF=$$UP^XLFSTR($G(SRCRF(LN+1))) D
- ..I SRCRF["DATE OF OPERATION:" S (SRDOP,X)=$P(SRCRFL,": ",2),%DT="XT" D ^%DT S:Y>0 SRCPV2(8)=Y I Y'>0 D NOW^%DTC S SRCPV2(8)=X Q
- ..I $P(SRCRF,":")="SURGEON" S SRCPV1(17)=$$FN($P(SRCRFL,": ",2)) Q
- ..I SRCRF["ATTENDING SURGEON:" S SRCPV1(7)=$$FN($P(SRCRFL,": ",2)) Q
- ..I SRCRF["SURGICAL SPECIALTY:" S SRX=$O(^SRO(137.45,"B1",$P(SRCRFL,": ",2),0)) Q
- ..I SRCRF["PRINCIPAL PREOPERATIVE DIAGNOSIS:" D
- ...S II=LN F S II=$O(MSG(SRCOBX,II)) Q:MSG(SRCOBX,II)=""!($L(SRCRF)>70) S SRCRFL=SRCRFL_" "_$G(MSG(SRCOBX,II))
- ...S SRCDG1(1,4)=$E($P(SRCRFL,": ",2),1,40) Q
- ..I SRCRF["PRINCIPAL OPERATIVE PROCEDURE:" D
- ...S II=LN F S II=$O(MSG(SRCOBX,II)) Q:MSG(SRCOBX,II)=""!($L(SRCRF)>90) S SRCRFL=SRCRFL_" "_$G(MSG(SRCOBX,II))
- ...S SRCPR1(4)=$E($P(SRCRFL,": ",2),1,60) Q
- S SRCPV1(18)=$O(^DIC(40.7,"C",429,0)) I SRX S SRCSURG(2)=$P($G(^SRO(137.45,SRX,0)),"^",2),SRCPV1(3)=$P($G(^SRO(137.45,SRX,0)),"^",5)
- S SRCPV1(2)="O"
- Q
- EN(MSG) ;Entry point from protocol SR RECEIVE
- Q:'+$$SWSTAT^IBBAPI()
- ;MSG = local array which contains the HL7 segments
- N LN,SRC99C,SRCARFN,SRCATN,SRCDG1,SRCDIV,SRCINTR,SRCMSG,SRCNOD
- N SRCOBR,SRCOBX,SRCODT,SRCOID,SRCORNP,SRCOTXT,SRCPNM,SRCPR1,SRCPV2,SRCQT
- N SRCRATSN,SRCRB,SRCRF,SRCRFL,SRCSEND,SRCSS,SRCSST,SRCSTDT,SRCSURG,SRX
- N SRCTRLC,SRCZSS,SRDFN,SRDOP,Y
- S SRCMSG="",SRCNOD=0,SRCPV2(8)=0,(SRCPV1(7),SRCPV1(17),SRCSURG(2),SRCDG1(1,4),SRCPR1(4))=""
- F S SRCNOD=$O(MSG(SRCNOD)) Q:SRCNOD="" S SRCMSG=$G(MSG(SRCNOD)) I $E(SRCMSG,1,3)="MSH" D Q
- .S SRCSEND=$P(SRCMSG,"|",3),SRCDIV=$O(^DG(40.8,"AD",$P(SRCMSG,"|",4),0))
- ;SRCQT, stop flag in loop
- S SRCMSG="",SRCNOD=0,SRCQT=0
- F S SRCNOD=$O(MSG(SRCNOD)) Q:SRCNOD="" Q:SRCQT=1 S SRCMSG=$G(MSG(SRCNOD)) D
- .I $E(SRCMSG,1,3)="PID" D PID^SRCHL7U(SRCMSG) Q
- .;look at ORC|NW for new order
- .I $E(SRCMSG,1,3)="ORC" D ORC(SRCMSG) Q
- .I SRCQT=1 Q
- .I $E(SRCMSG,1,3)="OBR" D OBR(SRCMSG) I SRCSS="NO" S SRCQT=1 Q
- .I SRCQT=1 Q
- .;look at ZSV for surgery (4)
- .I $E(SRCMSG,1,3)="ZSV" D ZSV(SRCMSG) Q
- .I $E(SRCMSG,1,3)="OBX" D OBX(SRCNOD) Q
- I SRCSS="NO" Q ;not surgery request
- I SRCPV2(8)'>0!(SRCSURG(2)="")!(SRCDG1(1,4)="")!(SRCPR1(4)="") D REJECT^SRCHL7U Q
- ;check for new order, NW, and a surgery consult in SRCSS
- I '$D(SRCTRLC)!(SRCTRLC'="NW")!('$D(SRCSS))!(SRCSS="NO") D EXIT^SRCHL7U Q
- ACCT S SRCARFN=+$$GETACCT^IBBAPI(SRDFN,"","A05","ACCT;SRCHL7A",.SRCPV1,.SRCPV2,.SRCPR1,.SRCDG1,"",SRCDIV,"",.SRCSURG)
- I '$G(SRCARFN) D REJECT^SRCHL7U Q
- D EXIT^SRCHL7U
- Q
- FN(X) ;Return New Person Code give Name from HL-7 segment
- I X["(" Q +$P(X,"(",2)
- K DIC S DIC="^VA(200,",DIC(0)="XM" D ^DIC K DIC
- Q $S(Y'=-1:+Y,1:"")
- SRCHL7A ;BIR/SJA - RECEIVE HL-7 CONSULTS MESSAGE, PARSE INTO COMPONENTS AND CALL PFSS GET ACCOUNT API ;12/17/04 05:10 PM
- +1 ;;3.0; Surgery ;**144**;24 Jun 93
- +2 ;
- +3 ; Reference to $$GETACCT^IBBAPI() is supported by DBIA #4664
- +4 ; Reference to ^GMR(123.5 is supported by DBIA #3861
- +5 ; Reference to ^DIC(40.7 is supported by DBIA #557
- +6 ; Reference to ^DG(40.8 is supported by DBIA #2817
- +7 QUIT
- ORC(SRCORC) ;Get fields from ORC segment.
- +1 ;SRCTRLC=ORC control code
- +2 ;SRCORNP=provider
- +3 IF $EXTRACT(SRCMSG,1,6)'="ORC|NW"
- SET SRCQT=1
- QUIT
- +4 SET SRCTRLC=$PIECE(SRCORC,"|",2)
- +5 SET SRCORNP=$PIECE(SRCORC,"|",13)
- +6 SET SRCODT=$PIECE(SRCORC,"|",16)
- +7 QUIT
- OBR(SRCOBR) ;Get fields from OBR segment.
- +1 ;SRCSS=type of consult, field 9, 1-4 if NO, then not surgery
- +2 ;Must have 99CON in SRC99C.
- +3 ;SRCODT=observation date/time
- +4 SET SRC99C=$PIECE($PIECE(SRCOBR,"|",5),"^",6)
- +5 IF SRC99C'="99CON"
- SET SRCSS="NO"
- SET SRCQT=1
- QUIT
- +6 SET SRCSST=$PIECE($PIECE(SRCOBR,"|",5),"^",4)
- +7 SET SRCSS=$$GET1^DIQ(123.5,SRCSST,.01)
- Begin DoDot:1
- +8 IF SRCSS["SURGERY REQUEST"
- SET SRCSS=1
- QUIT
- +9 ;then not surgery
- +10 SET SRCSS="NO"
- End DoDot:1
- +11 IF SRCSS="NO"
- SET SRCQT=1
- QUIT
- +12 SET SRCODT=$PIECE(SRCOBR,"|",7)
- +13 IF SRCODT]""
- SET SRCODT=$$FMDATE^SRCHL7U(SRCODT)
- +14 SET SRCATN=$PIECE(SRCOBR,"|",20)
- +15 SET SRCSTDT=$PIECE(SRCOBR,"|",23)
- +16 IF SRCSTDT]""
- SET SRCSTDT=$$FMDATE^SRCHL7U(SRCSTDT)
- +17 SET SRCINTR=$PIECE(SRCOBR,"|",33)
- +18 QUIT
- ZSV(SRCZSV) ;Get service from ZSV segment
- +1 SET SRCZSS=$PIECE($PIECE(SRCZSV,"|",2),"^",4)
- +2 ;Set the service if ZSV provided
- +3 ;consult type
- IF $LENGTH($PIECE(SRCZSV,"|",3))
- SET SRCOTXT=$PIECE(SRCZSV,"|",3)
- +4 QUIT
- OBX(SRCOBX) ;Get fields from OBX segment and set into SRC variables
- +1 ;SRCOID=observation id identifying value in seg. 5
- +2 ;free text or code^free text^I9C
- +3 SET SRCMSG=MSG(SRCOBX)
- +4 SET SRCOID=$PIECE($PIECE(SRCMSG,"|",4),"^",2)
- +5 IF SRCOID="REASON FOR REQUEST"
- Begin DoDot:1
- +6 SET LN=0
- FOR
- SET LN=$ORDER(MSG(SRCOBX,LN))
- IF LN=""
- QUIT
- SET SRCRF(LN+1)=$GET(MSG(SRCOBX,LN))
- SET SRCRFL=SRCRF(LN+1)
- SET SRCRF=$$UP^XLFSTR($GET(SRCRF(LN+1)))
- Begin DoDot:2
- +7 IF SRCRF["DATE OF OPERATION:"
- SET (SRDOP,X)=$PIECE(SRCRFL,": ",2)
- SET %DT="XT"
- DO ^%DT
- IF Y>0
- SET SRCPV2(8)=Y
- IF Y'>0
- DO NOW^%DTC
- SET SRCPV2(8)=X
- QUIT
- +8 IF $PIECE(SRCRF,":")="SURGEON"
- SET SRCPV1(17)=$$FN($PIECE(SRCRFL,": ",2))
- QUIT
- +9 IF SRCRF["ATTENDING SURGEON:"
- SET SRCPV1(7)=$$FN($PIECE(SRCRFL,": ",2))
- QUIT
- +10 IF SRCRF["SURGICAL SPECIALTY:"
- SET SRX=$ORDER(^SRO(137.45,"B1",$PIECE(SRCRFL,": ",2),0))
- QUIT
- +11 IF SRCRF["PRINCIPAL PREOPERATIVE DIAGNOSIS:"
- Begin DoDot:3
- +12 SET II=LN
- FOR
- SET II=$ORDER(MSG(SRCOBX,II))
- IF MSG(SRCOBX,II)=""!($LENGTH(SRCRF)>70)
- QUIT
- SET SRCRFL=SRCRFL_" "_$GET(MSG(SRCOBX,II))
- +13 SET SRCDG1(1,4)=$EXTRACT($PIECE(SRCRFL,": ",2),1,40)
- QUIT
- End DoDot:3
- +14 IF SRCRF["PRINCIPAL OPERATIVE PROCEDURE:"
- Begin DoDot:3
- +15 SET II=LN
- FOR
- SET II=$ORDER(MSG(SRCOBX,II))
- IF MSG(SRCOBX,II)=""!($LENGTH(SRCRF)>90)
- QUIT
- SET SRCRFL=SRCRFL_" "_$GET(MSG(SRCOBX,II))
- +16 SET SRCPR1(4)=$EXTRACT($PIECE(SRCRFL,": ",2),1,60)
- QUIT
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +17 SET SRCPV1(18)=$ORDER(^DIC(40.7,"C",429,0))
- IF SRX
- SET SRCSURG(2)=$PIECE($GET(^SRO(137.45,SRX,0)),"^",2)
- SET SRCPV1(3)=$PIECE($GET(^SRO(137.45,SRX,0)),"^",5)
- +18 SET SRCPV1(2)="O"
- +19 QUIT
- EN(MSG) ;Entry point from protocol SR RECEIVE
- +1 IF '+$$SWSTAT^IBBAPI()
- QUIT
- +2 ;MSG = local array which contains the HL7 segments
- +3 NEW LN,SRC99C,SRCARFN,SRCATN,SRCDG1,SRCDIV,SRCINTR,SRCMSG,SRCNOD
- +4 NEW SRCOBR,SRCOBX,SRCODT,SRCOID,SRCORNP,SRCOTXT,SRCPNM,SRCPR1,SRCPV2,SRCQT
- +5 NEW SRCRATSN,SRCRB,SRCRF,SRCRFL,SRCSEND,SRCSS,SRCSST,SRCSTDT,SRCSURG,SRX
- +6 NEW SRCTRLC,SRCZSS,SRDFN,SRDOP,Y
- +7 SET SRCMSG=""
- SET SRCNOD=0
- SET SRCPV2(8)=0
- SET (SRCPV1(7),SRCPV1(17),SRCSURG(2),SRCDG1(1,4),SRCPR1(4))=""
- +8 FOR
- SET SRCNOD=$ORDER(MSG(SRCNOD))
- IF SRCNOD=""
- QUIT
- SET SRCMSG=$GET(MSG(SRCNOD))
- IF $EXTRACT(SRCMSG,1,3)="MSH"
- Begin DoDot:1
- +9 SET SRCSEND=$PIECE(SRCMSG,"|",3)
- SET SRCDIV=$ORDER(^DG(40.8,"AD",$PIECE(SRCMSG,"|",4),0))
- End DoDot:1
- QUIT
- +10 ;SRCQT, stop flag in loop
- +11 SET SRCMSG=""
- SET SRCNOD=0
- SET SRCQT=0
- +12 FOR
- SET SRCNOD=$ORDER(MSG(SRCNOD))
- IF SRCNOD=""
- QUIT
- IF SRCQT=1
- QUIT
- SET SRCMSG=$GET(MSG(SRCNOD))
- Begin DoDot:1
- +13 IF $EXTRACT(SRCMSG,1,3)="PID"
- DO PID^SRCHL7U(SRCMSG)
- QUIT
- +14 ;look at ORC|NW for new order
- +15 IF $EXTRACT(SRCMSG,1,3)="ORC"
- DO ORC(SRCMSG)
- QUIT
- +16 IF SRCQT=1
- QUIT
- +17 IF $EXTRACT(SRCMSG,1,3)="OBR"
- DO OBR(SRCMSG)
- IF SRCSS="NO"
- SET SRCQT=1
- QUIT
- +18 IF SRCQT=1
- QUIT
- +19 ;look at ZSV for surgery (4)
- +20 IF $EXTRACT(SRCMSG,1,3)="ZSV"
- DO ZSV(SRCMSG)
- QUIT
- +21 IF $EXTRACT(SRCMSG,1,3)="OBX"
- DO OBX(SRCNOD)
- QUIT
- End DoDot:1
- +22 ;not surgery request
- IF SRCSS="NO"
- QUIT
- +23 IF SRCPV2(8)'>0!(SRCSURG(2)="")!(SRCDG1(1,4)="")!(SRCPR1(4)="")
- DO REJECT^SRCHL7U
- QUIT
- +24 ;check for new order, NW, and a surgery consult in SRCSS
- +25 IF '$DATA(SRCTRLC)!(SRCTRLC'="NW")!('$DATA(SRCSS))!(SRCSS="NO")
- DO EXIT^SRCHL7U
- QUIT
- ACCT SET SRCARFN=+$$GETACCT^IBBAPI(SRDFN,"","A05","ACCT;SRCHL7A",.SRCPV1,.SRCPV2,.SRCPR1,.SRCDG1,"",SRCDIV,"",.SRCSURG)
- +1 IF '$GET(SRCARFN)
- DO REJECT^SRCHL7U
- QUIT
- +2 DO EXIT^SRCHL7U
- +3 QUIT
- FN(X) ;Return New Person Code give Name from HL-7 segment
- +1 IF X["("
- QUIT +$PIECE(X,"(",2)
- +2 KILL DIC
- SET DIC="^VA(200,"
- SET DIC(0)="XM"
- DO ^DIC
- KILL DIC
- +3 QUIT $SELECT(Y'=-1:+Y,1:"")