Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: PSJHLU

PSJHLU.m

Go to the documentation of this file.
  1. PSJHLU ;BIR/RLW - UTILITIES USED IN BUILDING HL7 SEGMENTS ;4/24/12 2:52pm
  1. ;;5.0;INPATIENT MEDICATIONS;**1,56,72,102,134,181,267,285,317,339,364,446**;16 DEC 97;Build 1
  1. ;
  1. ; Reference to ^PS(52.6 is supported by DBIA# 1231.
  1. ; Reference to ^PS(52.7 is supported by DBIA# 2173.
  1. ; Reference to ^VA(200 is supported by DBIA 10060.
  1. ; Reference to ^PS(55 is supported by DBIA# 2191.
  1. ;
  1. ;*267 Change NTE|21 so it can send over the Long Wp Special Inst/
  1. ; Other Prt Info fields if populated.
  1. ;*364 Add HAZ Handle & Haz Dispose flags to new ZZZ segment for BCBU
  1. ;*446 Fix infusion rate evaluation in ENI tag to determine when to add
  1. ; "ml/hr". Continuous orders with rate < 1 were adding extra "ml/hr".
  1. ;
  1. INIT ; set up HL7 application variables
  1. S PSJHLSDT="PS",PSJHINST=$P($$SITE^VASITE(),"^")
  1. S PSJCLEAR="K FIELD F J=0:1:LIMIT S FIELD(J)="""""
  1. Q
  1. ;
  1. SEGMENT(LIMIT) ;
  1. K SEGMENT
  1. N SUBSEG,SEGLENGT S SUBSEG=0,SEGMENT="" F J=0:1:LIMIT D
  1. .I SEGMENT']"" S SEGMENT=FIELD(J) Q
  1. .S SEGMENT=SEGMENT_"|"_FIELD(J)
  1. F S SEGLENGT=$L(SEGMENT) D Q:$L(SEGMENT)'>246
  1. .I SEGLENGT'>246 S SEGMENT(SUBSEG)=SEGMENT
  1. .I SEGLENGT>245 S SEGMENT(SUBSEG)=$E(SEGMENT,1,245),SUBSEG=SUBSEG+1 D
  1. ..S SEGMENT=$E(SEGMENT,246,SEGLENGT),SEGMENT(SUBSEG)=$E(SEGMENT,1,245)
  1. SET S PSJI=PSJI+1,^TMP("PSJHLS",$J,PSJHLSDT,PSJI)=SEGMENT(0)
  1. F J=1:1 Q:'$D(SEGMENT(J)) S ^TMP("PSJHLS",$J,PSJHLSDT,PSJI,J)=SEGMENT(J)
  1. Q
  1. ;
  1. SEGMENT2 ; Retrieve text fields
  1. K SEGMENT S JJ=0 F S JJ=$O(@(PSJORDER_"12,"_JJ_")")) Q:'JJ S SEGMENT(JJ-1)=$G(@(PSJORDER_"12,"_JJ_",0)"))
  1. I $D(SEGMENT(0)) S SEGMENT(0)="NTE|6|L|"_$S($G(PSJBCBU):SEGMENT(0),1:$$ESC^ORHLESC(SEGMENT(0))) D
  1. .D SET^PSJHLU K SEGMENT,JJ
  1. ;build NTE 21 with Special Inst/Other Prt Info Wp fields *267
  1. N QQ K ^TMP("PSJBCMA5",$J)
  1. D GETSIOPI^PSJBCMA5(PSJHLDFN,RXORDER,1)
  1. I RXORDER["V"!(RXORDER["U") I ($G(PSJORD)["P"),($P($G(^PS(53.1,+PSJORD,0)),"^",25)=RXORDER) D
  1. .D GETSIOPI^PSJBCMA5(PSJHLDFN,PSJORD,1)
  1. .N LINES,TEXT1 S LINES=($G(^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD))),TEXT1=$G(^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD,1))
  1. .I LINES<1!(LINES=1&(TEXT1["Instructions too long. See Order View or BCMA for full text")) Q
  1. .K ^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER) M ^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER)=^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD) K ^TMP("PSJBCMA5",$J,PSJHLDFN,PSJORD)
  1. F QQ=0:0 S QQ=$O(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ)) Q:'QQ D
  1. .I QQ=1 D Q
  1. ..S SEGMENT(0)="NTE|21|L|"_$$ESC^ORHLESC(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ))
  1. ..S:$G(PSJBCBU) SEGMENT(0)=SEGMENT(0)_"\.br\"
  1. .S SEGMENT(QQ-1)=$$ESC^ORHLESC(^TMP("PSJBCMA5",$J,PSJHLDFN,RXORDER,QQ))
  1. .S:$G(PSJBCBU) SEGMENT(QQ-1)=SEGMENT(QQ-1)_"\.br\"
  1. I $D(SEGMENT(0)) D SET^PSJHLU K SEGMENT,^TMP("PSJBCMA5",$J)
  1. ;*267 end
  1. Q
  1. ;
  1. CALL(HLEVN) ; call DHCP HL7 package -or- protocol, to pass Orders
  1. ; HLEVN = number of segments in message
  1. ;*317
  1. N PADE,PDTYP S PADE=0,PDTYP=""
  1. I PSJORDER["^PS(55," D
  1. . I $O(XQORMSG(0))&((PSOC="DR")!(PSOC="OD")) S PADE=1,PDTYP=PSOC Q
  1. . I '$O(XQORMSG(0)) D
  1. .. N PD0,PD1 S PD0=$G(@(PSJORDER_"0)"))
  1. .. S PD1=$S(RXORDER["V":$P(PD0,"^",17),1:$P(PD0,"^",9)) Q:PD1=""
  1. .. I ",A,D,H,"[(","_$E(PD1)_",") S PADE=1,PDTYP=PSOC
  1. K CLERK,DDIEN,DDNUM,DOSEFORM,DOSEOR,FIELD,IVTYPE,LIMIT,NAME,NDNODE,NODE1,NODE2,PRODNAME,PROVIDER,PSGS0Y,PSJHINST,PSJHLSDT,PSJI,PSOC,PSREASON,ROOMBED,SPDIEN,SEGMENT,% ;*364 move kill PSJORDER to later for PADE
  1. I $G(PSJBCBU)=1 M PSJNAME=^TMP("PSJHLS",$J,"PS") Q
  1. S PSJMSG="^TMP(""PSJHLS"",$J,""PS"")"
  1. I PADE N RXO,PDMSG S RXO=RXORDER_$S(+RXORDER=RXORDER:"U",1:"") M PDMSG=^TMP("PSJHLS",$J,"PS") ;*317
  1. D MSG^XQOR("PS EVSEND OR",.PSJMSG)
  1. I PADE D PDORD^PSJPDCLU ;*317
  1. I $G(RXORDER),$G(PSJHLDFN) N PSJSTOP S PSJSTOP=$S(RXORDER["U":$P(^PS(55,PSJHLDFN,5,+RXORDER,2),"^",4),RXORDER["V":$P(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",3),1:"") I PSJSTOP D
  1. .N PSJSTATU S PSJSTATU=$S(RXORDER["U":$P(^PS(55,PSJHLDFN,5,+RXORDER,0),"^",9),RXORDER["V":$P(^PS(55,PSJHLDFN,"IV",+RXORDER,0),"^",17),1:"")
  1. .I ",A,H,"[(","_PSJSTATU_",") D NOW^%DTC I PSJSTOP'>% N RXON S RXON=RXORDER D EXPIR^PSJHL6
  1. K PSJORDER ;*364 moved to here
  1. Q
  1. ;
  1. IVTYPE(PSJORDER) ; check whether a back-door order is Inpatient IV or IV fluid
  1. I RXORDER["V",$P($G(@(PSJORDER_"0)")),"^",4)'="A" Q "I"
  1. I RXORDER["P" I $P($G(@(PSJORDER_"0)")),"^",4)'="F" S IVTYPE="" Q IVTYPE
  1. N SUB,AD,SOL,IVTYPE,NODE1 S SUB=0,IVTYPE="F"
  1. ;naked reference on line below refers to the full indirect reference of PSJORDER_ which is from ^PS(55,DFN,"IV",PSJORD
  1. F TYPE="AD","SOL" S SUB=0 F S SUB=$O(@(PSJORDER_""""_TYPE_""""_","_SUB_")")) Q:(SUB="")!(IVTYPE="I") S NODE1=$G(^(SUB,0)) Q:NODE1="" D Q:IVTYPE="I"
  1. .I TYPE="AD" D
  1. ..I '$P($G(^PS(52.6,$P(NODE1,"^"),0)),"^",13) S IVTYPE="I"
  1. .D:TYPE="SOL"
  1. ..S:'$P($G(^PS(52.7,$P(NODE1,"^"),0)),"^",13) IVTYPE="I"
  1. Q IVTYPE
  1. ENI ;Calculate Frequency for IV orders
  1. N INFUSE
  1. I X?.E1L.E S INFUSE=$$ENLU^PSGMI(X) Q:(INFUSE="TITRATE")!(INFUSE="BOLUS")!($P(INFUSE," ")="INFUSE")!($P(INFUSE," ")="Infuse")
  1. Q:(X="TITRATE")!(X="BOLUS")!($P(X," ")="INFUSE")!($P(X," ")="Infuse")
  1. Q:$$INTRMT(X)
  1. K:$L(X)<1!($L(X)>30)!(X["""")!($A(X)=45) X I '$D(X) Q
  1. I X["=" D Q ; NOIS LOU-0501-42191
  1. .N X2,X1 S X1=$P(X,"="),X2=$P(X,"=",2)
  1. .I X1["ML/HR",(+X1=$P(X1,"ML/HR"))!(+X1=$P(X1," ML/HR")) D
  1. ..S X1=$TR(X1,"ML/HR","ml/hr")
  1. .I X2["ML/HR",(+X2=$P(X2,"ML/HR"))!(+X2=$P(X2," ML/HR")) D
  1. ..S X2=$TR(X2,"ML/HR","ml/hr")
  1. .I X1[" ml/hr",(+X1=$P(X1," ml/hr")) D
  1. ..S X1=$P(X1," ml/hr")_$P(X1," ml/hr",2,9999)
  1. .I X2[" ml/hr",(+X2=$P(X2," ml/hr")) D
  1. ..S X2=$P(X2," ml/hr")_$P(X2," ml/hr",2,9999)
  1. .I X1["ml/hr",(+X1=$P(X1,"ml/hr")) D
  1. ..S X1=$P(X1,"ml/hr")_$P(X1,"ml/hr",2,9999)
  1. .I X2["ml/hr",(+X2=$P(X2,"ml/hr")) D
  1. ..S X2=$P(X2,"ml/hr")_$P(X2,"ml/hr",2,9999)
  1. .I X2'=+X2 D
  1. ..I ($P(X2,"@",2,999)'=+$P(X2,"@",2,999)!(+$P(X2,"@",2,999)<0)) K X Q
  1. .I X1=+X1 S X1=X1_" ml/hr"
  1. .I X2=+X2 S X2=X2_" ml/hr"
  1. .S:$P(X2,"@")=+X2 $P(X2,"@")=$P(X2,"@")_" ml/hr"
  1. .S X=X1_"="_X2
  1. ;*285 - Allow for decimals with trailing zeroes
  1. I X'?.N.1".".N,($P($TR(X," ml/hr",""),"@",2,999)'=+$P($TR(X," ml/hr",""),"@",2,999)!(+$P(X,"@",2,999)<0)),($P(X," ml/hr")'?.N.1".".N!(+$P(X," ml/hr")<0)) Q:(X>0&($E(X)=0)) K X Q
  1. ; *446 - Fix infusion rate evaluation below
  1. ; I X=+X!(X>0&($E(X)=0)) S:$S(X'["ml/hr":0,X["@":0,1:1) X=X_" ml/hr" D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
  1. I (X=+X)!(X>0&($E(X)=0)) S X=$S(((X'["ml/hr")&(X'["@")):X_" ml/hr",1:X) D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
  1. ; *446 End
  1. I X[" ml/hr" D SPSOL S FREQ=$S('X:0,1:SPSOL\X*60+(SPSOL#X/X*60+.5)\1) K SPSOL Q
  1. S SPSOL=$P(X,"@",2) S:$P(X,"@")=+X $P(X,"@")=$P(X,"@")_" ml/hr" S FREQ=$S('SPSOL:0,1:1440/SPSOL\1) K SPSOL
  1. Q
  1. SPSOL S SPSOL=+TVOLUME Q
  1. INTRMT(X) ;
  1. Q:'$P(X," ") 0
  1. Q:$P(X," ",2)="Minutes" 1
  1. Q:$P(X," ",2)="Hours" 1
  1. Q 0
  1. IVCAT(DFN,PSJORD,PARRAY) ; This returns the IV CATEGORY based on the IV TYPE and CHEMO TYPE (not what is already in the IV CATEGORY field)
  1. ; Passed in: PSJORDER (file root of order)
  1. N NODE,TYP,CHEMTYP,INTSYR,ND2P5
  1. S (CHEMTYP,INTSYR)=""
  1. S TYP=$G(P(4)),INTSYR=$G(P(5)),CHEMTYP=$G(P(23))
  1. I TYP="",$G(PSJORD)["V" S NODE=$G(^PS(55,DFN,"IV",+PSJORD,0)) S TYP=$P(NODE,"^",4),INTSYR=$P(NODE,"^",5),CHEMTYP=$P(NODE,"^",23)
  1. I TYP="",$G(PSJORD)["P" S NODE=$G(^PS(53.1,+PSJORD,8)) S TYP=$P(NODE,"^"),INTSYR=$P(NODE,"^",4),CHEMTYP=$P(NODE,"^",2)
  1. I TYP="" S TYP=$G(PARRAY(4)),INTSYR=$G(PARRAY(5)),CHEMTYP=$G(PARRAY(23))
  1. Q:$G(TYP)="" ""
  1. S CAT=$S(",A,H,"[(","_TYP_","):"C",TYP="C"&(",A,H,S,"[(","_CHEMTYP_",")&'INTSYR):"C",TYP="C"&(CHEMTYP="P"):"I",TYP="S"&'INTSYR:"C",TYP="P":"I",$G(INTSYR):"I",1:"")
  1. Q CAT
  1. ZRX ; Perform outbound processing
  1. N NODE1
  1. S NODE1=$G(@(PSJORDER_"0)"))
  1. S LIMIT=6 X PSJCLEAR
  1. S FIELD(0)="ZRX"
  1. I '$G(PSJREN) N PREON,PSJREN I $G(PSJORD)["U"&($P(NODE1,"^",24)="R") S PSJREN=1
  1. I $G(PSJORD)["V"&($P(NODE2,"^",8)="R") S PSJREN=1
  1. S PREON=$S($G(PSJREN):$G(PSJORD),PSJORDER["IV":$P(NODE2,"^",5),1:$P(NODE1,"^",25))
  1. S FIELD(1)=$S(PREON["P":$P($G(^PS(53.1,+PREON,0)),"^",21),PREON["V":$P($G(^PS(55,PSJHLDFN,"IV",+PREON,0)),"^",21),1:$P($G(^PS(55,PSJHLDFN,5,+PREON,0)),"^",21))
  1. S FIELD(2)=$S(PSJORDER["IV":$G(P("NAT")),1:$G(PSJNOO))
  1. S FIELD(3)=$S($G(PSJREN):"R",PSJORDER["IV":$P(NODE2,"^",8),1:$P(NODE1,"^",24))
  1. I FIELD(3)="" I PSOC="SN" S FIELD(3)="N"
  1. I $D(P)>1 S FIELD(6)=$$IVCAT^PSJHLU(PSJHLDFN,RXORDER,.P)
  1. S NAME=$P($G(^VA(200,DUZ,0)),"^")
  1. S FIELD(5)=DUZ_"^"_$S($G(PSJBCBU):NAME,1:$$ESC^ORHLESC(NAME))_"^"_"99NP"
  1. D SEGMENT^PSJHLU(LIMIT),DISPLAY^PSJHL2
  1. Q
  1. ;
  1. ZZZ ; BCBU ZZZ Seg, Hazardous drug flags ZZZ.4 & ZZZ.5 *364
  1. N NODE1,HAZ
  1. S NODE1=$G(@(PSJORDER_"0)"))
  1. S LIMIT=5 X PSJCLEAR
  1. S FIELD(0)="ZZZ"
  1. ;Field(1-3) below, not used for BCBU reserved for PADE in PSJPDCLU
  1. S FIELD(1)=""
  1. S FIELD(2)=""
  1. S FIELD(3)=""
  1. S HAZ=$$HAZDRUG(PSJORDER) ;get Haz flag 1 or 0 value and convert flags to HL7 Y or N values
  1. S FIELD(4)=$S($P(HAZ,U):"Y",1:"N")
  1. S FIELD(5)=$S($P(HAZ,U,2):"Y",1:"N")
  1. ;set fields into segment temp global
  1. D SEGMENT^PSJHLU(LIMIT),DISPLAY^PSJHL2
  1. Q
  1. ;
  1. HAZDRUG(FILE) ;Get Hazardous to Handle and Hazardous to Dispose fields per this order (if any component is Haz then order is) *364
  1. ; FILE = file root + Order Num from inpatient variables during workflow; Example VAR contains: "^PS(55,DFN,5,ON," or "(PS(53.1,ON," or "^PS(55,DFN,"IV",ON,"
  1. ; (build ROOT to the multiple level to find all Disp Drugs or Additives or Solution and check for any HAZ components.)
  1. N QQ,ROOT,NXTROOT,NXT,IFN,GL,HAZH,HAZD,HZIFN
  1. S (HAZH,HAZD,HZIFN)=0
  1. ;check IF Unit Dose Disp Drug exists this order, then get IEN and Haz flags
  1. F QQ=0:0 S ROOT=FILE_"1,"_QQ_")" S QQ=$O(@ROOT) Q:'QQ D
  1. . S NXTROOT=FILE_"1,"_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
  1. . ;check IF IV additives exists this order, then get IEN and Haz flags
  1. F QQ=0:0 S ROOT=FILE_"""AD"","_QQ_")" S QQ=$O(@ROOT) Q:'QQ D
  1. . S NXTROOT=FILE_"""AD"","_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
  1. . S:IFN IFN=+$P($G(^PS(52.6,IFN,0)),U,2)
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
  1. F QQ=0:0 S ROOT=FILE_"""SOL"","_QQ_")" S QQ=$O(@ROOT) Q:'QQ D
  1. . S NXTROOT=FILE_"""SOL"","_QQ_")" S NXT=$O(@NXTROOT) S GL=$E(NXTROOT,1,$L(ROOT)-1),IFN=+@(GL_",0)")
  1. . S:IFN IFN=+$P($G(^PS(52.7,IFN,0)),U,2)
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,1) HAZH=1,HZIFN=IFN
  1. . S:$P($$HAZ^PSSUTIL(IFN),U,2) HAZD=1,HZIFN=IFN
  1. Q HAZH_U_HAZD_U_HZIFN