- ORCSEND3 ;SLC/MKB,AGP-Release cont ;Aug 19, 2020@11:27:06
- ;;3.0;ORDER ENTRY/RESULTS REPORTING;**243,282,280,409,405**;Dec 17, 1997;Build 211
- ;
- ;Per VHA Directive 2004-038, this routine should not be modified.
- ;
- ;Reference to PSJORPOE supported by IA #3167
- ;
- CHILD(STRT) ; Create child order, send to package
- N ORAPPT,ORPTS,A
- K ORIFN D EN^ORCSAVE Q:'$G(ORIFN) D STARTDT^ORCSAVE2(ORIFN)
- I $G(STRT) D DATES^ORCSAVE2(ORIFN,STRT)
- S ORCHLD=+$G(ORCHLD)+1,^OR(100,ORPARENT,2,ORIFN,0)=ORIFN,ORLAST=ORIFN
- S A=$G(^OR(100,ORPARENT,0)),ORAPPT=$P(A,U,18),ORPTS=$P(A,"^",13)
- S $P(^OR(100,ORIFN,0),U,18)=ORAPPT,$P(^(3),U,9)=ORPARENT
- I $P(^OR(100,ORIFN,0),U,13)="" S $P(^(0),"^",13)=ORPTS ; 409 - Preserve Treating Specialty
- N X0 S X0=$G(^OR(100,ORPARENT,8,1,0))
- I $P(X0,U,4)'=2 D SIGN^ORCSAVE2(ORIFN,+$P(X0,U,5),ORNOW,$P(X0,U,4),1)
- D COPY^OROCAPI1(ORPARENT,ORIFN)
- I $G(ORENEW) S OLD=$O(ORENEW(0)) I OLD S $P(^OR(100,OLD,3),U,6)=ORIFN,$P(^OR(100,ORIFN,3),U,5)=OLD,$P(^(3),U,11)=2 K ORENEW(OLD)
- D RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$G(NATURE)),NEW^ORMBLD(ORIFN)
- Q
- ;
- DOSES(IFN) ;
- N I,CNT S CNT=0
- S I=+$O(^OR(100,+$G(IFN),4.5,"ID","NOW",0)) I I,$G(^OR(100,+$G(IFN),4.5,I,1)) S CNT=CNT+1
- Q CNT
- ;
- GETORDER(IFN) ; Set ORX(Inst,Ptr)=Value
- N I,X,Y,PTR,INST,TYPE,SOLCNT,ADDCNT
- S (SOLCNT,ADDCNT)=0
- S I=0 F S I=$O(^OR(100,IFN,4.5,I)) Q:I'>0 S X=$G(^(I,0)),Y=$G(^(1)) D
- . S PTR=+$P(X,U,2),INST=+$P(X,U,3),TYPE=$P($G(^ORD(101.41,PTR,1)),U)
- . I TYPE'="W" S ORX(PTR,INST)=Y Q
- . ;S ORX(INST,PTR)="^OR(100,"_IFN_",4.5,"_I_",2)"
- . S ORX(PTR,INST)="^OR(100,"_IFN_",4.5,"_I_",2)"
- Q
- PSJI ;
- ;IV dialog
- N ORPARENT,OR0,ORNP,ORDIALOG,ORDUZ,ORLOG,ORL,ORDG,ORCAT,ORX,ORP,ORI,STS
- N ORDOSE,ORT,ORSCH,ORDUR,ORSTRT,ORFRST,ORCONJ,ORID,ORDD,ORSTR,ORDGNM
- N ORSTART,ORCHLD,ORLAST,ORSIG,OROI,ID,OR3,ORIG,CODE,PKG,ORENEW,I,ORADMIN
- N ORDUR
- N CNT
- S ORPARENT=+ORIFN,OR0=$G(^OR(100,ORPARENT,0)),OR3=$G(^OR(100,ORPARENT,3))
- S ORCAT="I",ORNP=+$P(OR0,U,4)
- ;Q:$P(OR0,U,12)'="I" S ORCAT="I",ORNP=+$P(OR0,U,4)
- S ORDIALOG=+$P(OR0,U,5),ORDUZ=+$P(OR0,U,6),ORLOG=$P(OR0,U,7)
- S ORL=$P(OR0,U,10),ORDG=+$P(OR0,U,11),PKG=$$GET1^DIQ(9.4,+$P(OR0,U,14)_",",1)
- ;Build ORDIALOG Array and ORX local array
- D GETDLG1^ORCD(ORDIALOG),GETORDER(ORPARENT)
- ;
- S ORSCH=$$PTR("SCHEDULE"),ORDUR=$$PTR("DURATION")
- D STRT S ORSTART=$G(ORSTRT("BEG"))
- S ORADMIN=$$PTR("ADMIN TIMES")
- D DATES^ORCSAVE2(ORPARENT,ORSTART) Q:$$DOSES(ORPARENT)<1
- S ORFRST=$$PTR("NOW"),ORSIG=$$PTR("SIG")
- ;
- I $P(OR3,U,11)=2,$O(^OR(100,+$P(OR3,U,5),2,0)) D
- . S ORENEW=+$P(OR3,U,5),I=0
- . I $$VALUE^ORX8(ORENEW,"NOW") S I=$O(^OR(100,ORENEW,2,0))
- . F S I=$O(^OR(100,ORENEW,2,I)) Q:I<1 S ORENEW(I)=""
- ;
- PSJI1 ;
- ;Build Order Dialog Prompts that can have Multiple Responses
- F ORP="ADDITIVE","ORDERABLE ITEM","STRENGTH PSIV","UNITS","VOLUME" D
- . N PTR S PTR=$$PTR(ORP) Q:PTR'>0 Q:'$D(ORX(PTR,1))
- . S CNT=0 F S CNT=$O(ORX(PTR,CNT)) Q:CNT'>0 S ORDIALOG(PTR,CNT)=ORX(PTR,CNT)
- ;
- ;Build Order Dialog Responses that should be in both Child Orders
- F ORP="INFUSION RATE","IV TYPE","ROUTE","URGENCY","WORD PROCESSING 1","INDICATION" D ;*405-IND
- . N PTR S PTR=$$PTR(ORP) Q:PTR'>0 Q:'$D(ORX(PTR,1))
- . S ORDIALOG(PTR,1)=ORX(PTR,1) S:$E(ORP)="O" OROI=ORX(PTR,1) Q
- ;
- ;If NOW order create NOW Child Order
- I $G(ORX(ORFRST,1)) D
- . S:$D(ORX(ORP,1)) ORDIALOG(ORP,1)=ORX(ORP,1)
- . ;S ID=$G(ORX(ORI,ORID)) S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
- . S ORDIALOG(ORSCH,1)="NOW",ORSTART=$$NOW^XLFDT
- . D CHILD(ORSTART)
- ;
- ;Build Order Fields for non-NOW Child Order
- F ORP=ORSCH,ORADMIN,ORDUR S:$D(ORX(ORP,1)) ORDIALOG(ORP,1)=ORX(ORP,1) K:'$D(ORX(ORP,1)) ORDIALOG(ORP,1)
- S ORSTART=$G(ORSTRT(1))
- D CHILD(ORSTART)
- ;
- S:$G(ORCHLD) ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
- S ORIFN=ORPARENT,ORQUIT=1,OR3=$G(^OR(100,ORIFN,3)),STS=$P(OR3,U,3)
- I (STS=1)!(STS=13)!(STS=11) S ORERR="1^Unable to release orders"
- D RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$G(NATURE)) K ^TMP("ORWORD",$J)
- S $P(^OR(100,ORIFN,3),U,8)=1 ;veil parent order - set stop date/time?
- Q:(STS=1)!(STS=13)!(STS=11) ;unsuccessful
- PSJI2 ; ck if parent is unsigned or edit
- I $P($G(^OR(100,ORIFN,8,1,0)),U,4)=2 S $P(^(0),U,4)="" K ^OR(100,"AS",ORVP,9999999-ORLOG,ORIFN,1) ;clear ES
- Q:$P(OR3,U,11)'=1 S ORIG=$P(OR3,U,5) Q:ORIG'>0
- S CODE=$S($P($G(^OR(100,ORIG,3)),U,3)=5:"CA",1:"DC")
- D MSG^ORMBLD(ORIG,CODE) I "^1^13^"[(U_$P($G(^OR(100,ORIG,3)),U,3)_U) D
- . N NATR S NATR=+$O(^ORD(100.02,"C","C",0))
- . S $P(^OR(100,ORIG,3),U,3)=12,$P(^(3),U,7)=0,^(6)=NATR_U_DUZ_U_ORNOW
- . D CANCEL^ORCSEND(ORIG) ;ck for unrel actions
- Q
- PTR(X) ; Returns ptr of prompt X in Order Dialog file
- Q +$O(^ORD(101.41,"AB",$E("OR GTX "_X,1,63),0))
- ;
- STRT ; Build ORSTRT(inst)=date.time array of start times by dose
- N OI,PSOI,XD,XH,XM,XS,ORWD,ORI,SCH,ORSD,X,ORD K ORSTRT
- S OI=$G(ORX($$PTR^ORCD("OR GTX ORDERABLE ITEM"),1))
- ;if OI is null assume Intermittent IV order this does not required a
- ;solution check for an additive only value
- I OI="" S OI=$G(ORX($$PTR^ORCD("OR GTX ADDITIVE"),1))
- S PSOI=+$P($G(^ORD(101.43,+OI,0)),U,2),(XD,XH,XM,XS)=0
- S ORWD=+$G(^SC(+$G(ORL),42)) ;ward
- ;S ORI=0 F S ORI=$O(ORX(ORI)) Q:ORI<1 D
- S SCH=$G(ORX(ORSCH,1)),ORSD="" S:'$L(SCH) X=$$NOW^XLFDT
- S:$L(SCH) ORSD=$$STARTSTP^PSJORPOE(+ORVP,SCH,PSOI,ORWD),X=$P(ORSD,U,4)
- S ORSTRT(1)=$$FMADD^XLFDT(X,XD,XH,XM,XS) ;START+OFFSET
- ; find beginning date.time for parent
- S ORI=0,X=9999999 F S ORI=$O(ORSTRT(ORI)) Q:ORI<1 I ORSTRT(ORI)<X S X=ORSTRT(ORI)
- S ORSTRT("BEG")=X
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORCSEND3 5565 printed Apr 23, 2025@18:43:39 Page 2
- ORCSEND3 ;SLC/MKB,AGP-Release cont ;Aug 19, 2020@11:27:06
- +1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**243,282,280,409,405**;Dec 17, 1997;Build 211
- +2 ;
- +3 ;Per VHA Directive 2004-038, this routine should not be modified.
- +4 ;
- +5 ;Reference to PSJORPOE supported by IA #3167
- +6 ;
- CHILD(STRT) ; Create child order, send to package
- +1 NEW ORAPPT,ORPTS,A
- +2 KILL ORIFN
- DO EN^ORCSAVE
- if '$GET(ORIFN)
- QUIT
- DO STARTDT^ORCSAVE2(ORIFN)
- +3 IF $GET(STRT)
- DO DATES^ORCSAVE2(ORIFN,STRT)
- +4 SET ORCHLD=+$GET(ORCHLD)+1
- SET ^OR(100,ORPARENT,2,ORIFN,0)=ORIFN
- SET ORLAST=ORIFN
- +5 SET A=$GET(^OR(100,ORPARENT,0))
- SET ORAPPT=$PIECE(A,U,18)
- SET ORPTS=$PIECE(A,"^",13)
- +6 SET $PIECE(^OR(100,ORIFN,0),U,18)=ORAPPT
- SET $PIECE(^(3),U,9)=ORPARENT
- +7 ; 409 - Preserve Treating Specialty
- IF $PIECE(^OR(100,ORIFN,0),U,13)=""
- SET $PIECE(^(0),"^",13)=ORPTS
- +8 NEW X0
- SET X0=$GET(^OR(100,ORPARENT,8,1,0))
- +9 IF $PIECE(X0,U,4)'=2
- DO SIGN^ORCSAVE2(ORIFN,+$PIECE(X0,U,5),ORNOW,$PIECE(X0,U,4),1)
- +10 DO COPY^OROCAPI1(ORPARENT,ORIFN)
- +11 IF $GET(ORENEW)
- SET OLD=$ORDER(ORENEW(0))
- IF OLD
- SET $PIECE(^OR(100,OLD,3),U,6)=ORIFN
- SET $PIECE(^OR(100,ORIFN,3),U,5)=OLD
- SET $PIECE(^(3),U,11)=2
- KILL ORENEW(OLD)
- +12 DO RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$GET(NATURE))
- DO NEW^ORMBLD(ORIFN)
- +13 QUIT
- +14 ;
- DOSES(IFN) ;
- +1 NEW I,CNT
- SET CNT=0
- +2 SET I=+$ORDER(^OR(100,+$GET(IFN),4.5,"ID","NOW",0))
- IF I
- IF $GET(^OR(100,+$GET(IFN),4.5,I,1))
- SET CNT=CNT+1
- +3 QUIT CNT
- +4 ;
- GETORDER(IFN) ; Set ORX(Inst,Ptr)=Value
- +1 NEW I,X,Y,PTR,INST,TYPE,SOLCNT,ADDCNT
- +2 SET (SOLCNT,ADDCNT)=0
- +3 SET I=0
- FOR
- SET I=$ORDER(^OR(100,IFN,4.5,I))
- if I'>0
- QUIT
- SET X=$GET(^(I,0))
- SET Y=$GET(^(1))
- Begin DoDot:1
- +4 SET PTR=+$PIECE(X,U,2)
- SET INST=+$PIECE(X,U,3)
- SET TYPE=$PIECE($GET(^ORD(101.41,PTR,1)),U)
- +5 IF TYPE'="W"
- SET ORX(PTR,INST)=Y
- QUIT
- +6 ;S ORX(INST,PTR)="^OR(100,"_IFN_",4.5,"_I_",2)"
- +7 SET ORX(PTR,INST)="^OR(100,"_IFN_",4.5,"_I_",2)"
- End DoDot:1
- +8 QUIT
- PSJI ;
- +1 ;IV dialog
- +2 NEW ORPARENT,OR0,ORNP,ORDIALOG,ORDUZ,ORLOG,ORL,ORDG,ORCAT,ORX,ORP,ORI,STS
- +3 NEW ORDOSE,ORT,ORSCH,ORDUR,ORSTRT,ORFRST,ORCONJ,ORID,ORDD,ORSTR,ORDGNM
- +4 NEW ORSTART,ORCHLD,ORLAST,ORSIG,OROI,ID,OR3,ORIG,CODE,PKG,ORENEW,I,ORADMIN
- +5 NEW ORDUR
- +6 NEW CNT
- +7 SET ORPARENT=+ORIFN
- SET OR0=$GET(^OR(100,ORPARENT,0))
- SET OR3=$GET(^OR(100,ORPARENT,3))
- +8 SET ORCAT="I"
- SET ORNP=+$PIECE(OR0,U,4)
- +9 ;Q:$P(OR0,U,12)'="I" S ORCAT="I",ORNP=+$P(OR0,U,4)
- +10 SET ORDIALOG=+$PIECE(OR0,U,5)
- SET ORDUZ=+$PIECE(OR0,U,6)
- SET ORLOG=$PIECE(OR0,U,7)
- +11 SET ORL=$PIECE(OR0,U,10)
- SET ORDG=+$PIECE(OR0,U,11)
- SET PKG=$$GET1^DIQ(9.4,+$PIECE(OR0,U,14)_",",1)
- +12 ;Build ORDIALOG Array and ORX local array
- +13 DO GETDLG1^ORCD(ORDIALOG)
- DO GETORDER(ORPARENT)
- +14 ;
- +15 SET ORSCH=$$PTR("SCHEDULE")
- SET ORDUR=$$PTR("DURATION")
- +16 DO STRT
- SET ORSTART=$GET(ORSTRT("BEG"))
- +17 SET ORADMIN=$$PTR("ADMIN TIMES")
- +18 DO DATES^ORCSAVE2(ORPARENT,ORSTART)
- if $$DOSES(ORPARENT)<1
- QUIT
- +19 SET ORFRST=$$PTR("NOW")
- SET ORSIG=$$PTR("SIG")
- +20 ;
- +21 IF $PIECE(OR3,U,11)=2
- IF $ORDER(^OR(100,+$PIECE(OR3,U,5),2,0))
- Begin DoDot:1
- +22 SET ORENEW=+$PIECE(OR3,U,5)
- SET I=0
- +23 IF $$VALUE^ORX8(ORENEW,"NOW")
- SET I=$ORDER(^OR(100,ORENEW,2,0))
- +24 FOR
- SET I=$ORDER(^OR(100,ORENEW,2,I))
- if I<1
- QUIT
- SET ORENEW(I)=""
- End DoDot:1
- +25 ;
- PSJI1 ;
- +1 ;Build Order Dialog Prompts that can have Multiple Responses
- +2 FOR ORP="ADDITIVE","ORDERABLE ITEM","STRENGTH PSIV","UNITS","VOLUME"
- Begin DoDot:1
- +3 NEW PTR
- SET PTR=$$PTR(ORP)
- if PTR'>0
- QUIT
- if '$DATA(ORX(PTR,1))
- QUIT
- +4 SET CNT=0
- FOR
- SET CNT=$ORDER(ORX(PTR,CNT))
- if CNT'>0
- QUIT
- SET ORDIALOG(PTR,CNT)=ORX(PTR,CNT)
- End DoDot:1
- +5 ;
- +6 ;Build Order Dialog Responses that should be in both Child Orders
- +7 ;*405-IND
- FOR ORP="INFUSION RATE","IV TYPE","ROUTE","URGENCY","WORD PROCESSING 1","INDICATION"
- Begin DoDot:1
- +8 NEW PTR
- SET PTR=$$PTR(ORP)
- if PTR'>0
- QUIT
- if '$DATA(ORX(PTR,1))
- QUIT
- +9 SET ORDIALOG(PTR,1)=ORX(PTR,1)
- if $EXTRACT(ORP)="O"
- SET OROI=ORX(PTR,1)
- QUIT
- End DoDot:1
- +10 ;
- +11 ;If NOW order create NOW Child Order
- +12 IF $GET(ORX(ORFRST,1))
- Begin DoDot:1
- +13 if $DATA(ORX(ORP,1))
- SET ORDIALOG(ORP,1)=ORX(ORP,1)
- +14 ;S ID=$G(ORX(ORI,ORID)) S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
- +15 SET ORDIALOG(ORSCH,1)="NOW"
- SET ORSTART=$$NOW^XLFDT
- +16 DO CHILD(ORSTART)
- End DoDot:1
- +17 ;
- +18 ;Build Order Fields for non-NOW Child Order
- +19 FOR ORP=ORSCH,ORADMIN,ORDUR
- if $DATA(ORX(ORP,1))
- SET ORDIALOG(ORP,1)=ORX(ORP,1)
- if '$DATA(ORX(ORP,1))
- KILL ORDIALOG(ORP,1)
- +20 SET ORSTART=$GET(ORSTRT(1))
- +21 DO CHILD(ORSTART)
- +22 ;
- +23 if $GET(ORCHLD)
- SET ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
- +24 SET ORIFN=ORPARENT
- SET ORQUIT=1
- SET OR3=$GET(^OR(100,ORIFN,3))
- SET STS=$PIECE(OR3,U,3)
- +25 IF (STS=1)!(STS=13)!(STS=11)
- SET ORERR="1^Unable to release orders"
- +26 DO RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$GET(NATURE))
- KILL ^TMP("ORWORD",$JOB)
- +27 ;veil parent order - set stop date/time?
- SET $PIECE(^OR(100,ORIFN,3),U,8)=1
- +28 ;unsuccessful
- if (STS=1)!(STS=13)!(STS=11)
- QUIT
- PSJI2 ; ck if parent is unsigned or edit
- +1 ;clear ES
- IF $PIECE($GET(^OR(100,ORIFN,8,1,0)),U,4)=2
- SET $PIECE(^(0),U,4)=""
- KILL ^OR(100,"AS",ORVP,9999999-ORLOG,ORIFN,1)
- +2 if $PIECE(OR3,U,11)'=1
- QUIT
- SET ORIG=$PIECE(OR3,U,5)
- if ORIG'>0
- QUIT
- +3 SET CODE=$SELECT($PIECE($GET(^OR(100,ORIG,3)),U,3)=5:"CA",1:"DC")
- +4 DO MSG^ORMBLD(ORIG,CODE)
- IF "^1^13^"[(U_$PIECE($GET(^OR(100,ORIG,3)),U,3)_U)
- Begin DoDot:1
- +5 NEW NATR
- SET NATR=+$ORDER(^ORD(100.02,"C","C",0))
- +6 SET $PIECE(^OR(100,ORIG,3),U,3)=12
- SET $PIECE(^(3),U,7)=0
- SET ^(6)=NATR_U_DUZ_U_ORNOW
- +7 ;ck for unrel actions
- DO CANCEL^ORCSEND(ORIG)
- End DoDot:1
- +8 QUIT
- PTR(X) ; Returns ptr of prompt X in Order Dialog file
- +1 QUIT +$ORDER(^ORD(101.41,"AB",$EXTRACT("OR GTX "_X,1,63),0))
- +2 ;
- STRT ; Build ORSTRT(inst)=date.time array of start times by dose
- +1 NEW OI,PSOI,XD,XH,XM,XS,ORWD,ORI,SCH,ORSD,X,ORD
- KILL ORSTRT
- +2 SET OI=$GET(ORX($$PTR^ORCD("OR GTX ORDERABLE ITEM"),1))
- +3 ;if OI is null assume Intermittent IV order this does not required a
- +4 ;solution check for an additive only value
- +5 IF OI=""
- SET OI=$GET(ORX($$PTR^ORCD("OR GTX ADDITIVE"),1))
- +6 SET PSOI=+$PIECE($GET(^ORD(101.43,+OI,0)),U,2)
- SET (XD,XH,XM,XS)=0
- +7 ;ward
- SET ORWD=+$GET(^SC(+$GET(ORL),42))
- +8 ;S ORI=0 F S ORI=$O(ORX(ORI)) Q:ORI<1 D
- +9 SET SCH=$GET(ORX(ORSCH,1))
- SET ORSD=""
- if '$LENGTH(SCH)
- SET X=$$NOW^XLFDT
- +10 if $LENGTH(SCH)
- SET ORSD=$$STARTSTP^PSJORPOE(+ORVP,SCH,PSOI,ORWD)
- SET X=$PIECE(ORSD,U,4)
- +11 ;START+OFFSET
- SET ORSTRT(1)=$$FMADD^XLFDT(X,XD,XH,XM,XS)
- +12 ; find beginning date.time for parent
- +13 SET ORI=0
- SET X=9999999
- FOR
- SET ORI=$ORDER(ORSTRT(ORI))
- if ORI<1
- QUIT
- IF ORSTRT(ORI)<X
- SET X=ORSTRT(ORI)
- +14 SET ORSTRT("BEG")=X
- +15 QUIT