PSJDOSE ;BIR/MV - POSSIBLE DOSES UTILITY ; 1/6/20 11:08am
;;5.0;INPATIENT MEDICATIONS ;**50,65,106,111,216,264,328,338,398**;16 DEC 97;Build 3
;
; Reference to ^PSSORPH is supported by DBIA #3234.
;
;PSJDSFLG: Set to 1 if Dose and DD are not compatible
;PSJDSSEL: The selected dose in format:
; Dosage Order^DD IEN^DUPD/BCMA DUPD^1(if BCMA DUPD exist
;PSJDSUPD: Set to 1 if need to prompt for the Units Per Dose
;
EDITDOSE ;Editing Dosage Ordered for active order
;*Need to set PSJDSFLG to null when call EDITDOSE.
NEW PSGOER1,PSJDD,PSJDSUPD,PSJDSSEL,PSJX,Y
;Offer the possible doses from the only one or 1st DD
S PSJX=$O(^PS(53.45,PSJSYSP,2,0)) S PSJDD=+$G(^(+PSJX,0))
D DOSE(PSJDD)
D DOSECHK
I +PSJDSFLG D
. W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
. D PAUSE^VALM1
S PSGOEE=2
Q
GETDOSE(PSJDD) ;Dosage Order
NEW PSJDSSEL,PSJDSUPD
D DOSE(PSJDD)
Q:'$D(PSJDSSEL)
D:+$G(PSJDSUPD) DUPD
D:'+$G(PSJDSUPD) SETDUPD($P(PSJDSSEL,U,3))
D DOSECHK
I +$G(PSJDSFLG) D
. W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
Q
;
SETVAR ;
S PSJDOSE("WARN")="WARNING: Dosage Ordered and Dispense Units do not match."
S PSJDOSE("WARN1")=" Please verify Dosage."
Q
;
DOSE(PSJDD) ;Prompt for Dosage Ordered
;PSJDD: Dispense drug IEN
;
NEW DA,DR,DIR,DTOUT,DUOUT,DIRUT,PSJDL,PSJX,PSJPIECE,PSJCONT
D SETVAR
D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U")
I '$D(PSJDOX) S PSJDOX(1)=-1
S PSJPIECE=$S($P(PSJDOX(1),U,11)]"":11,1:3)
I PSJPIECE=3 S:$S($P(PSJDOX(1),U,3)="":1,1:$P(PSJDOX(1),U)=-1) $P(PSJDOX(1),U)=-1
AGAIN ;Prompt for dosage order again
S PSJX=0
NEW DIR
W:($P(PSJDOX(1),U)'=-1) !!,"Available Dosage(s)"
F PSJDL=0:0 S PSJDL=$O(PSJDOX(PSJDL)) Q:$S('PSJDL:1,$G(DUOUT):1,1:+PSJDOX(PSJDL)=-1) D
. S PSJX=PSJX+1
. W !?4,$J(PSJX,3),". ",$P(PSJDOX(PSJDL),U,PSJPIECE)
. I '(PSJX#16) S DIR(0)="E" D ^DIR
W !
K DIR S DIR(0)="F^1:60" ;*216 - No null dosage
S DIR("A")=$S(+PSJX:"Select from list of Available Dosages or Enter Free Text Dose",1:"DOSAGE ORDERED")
S:$G(PSGDO)]"" DIR("B")=PSGDO
S DIR("?")="^D ENHLP^PSGOEM(53.1,109)" D ^DIR
S PSJY=$$UP^XLFSTR(Y)
;
I $S($D(DTOUT):1,$D(DUOUT):1,$D(DIRUT):1,1:0) S PSGOROE1=1 Q
;
;* If select for the presented list (possible and local doses)
I $D(PSJDOX(PSJY)) D G:PSJCONT=0 AGAIN S:PSJCONT="^" PSGOROE1=1 Q
. NEW X S X=$P(PSJDOX(PSJY),U,PSJPIECE)
. W " ",X
. S PSJCONT=$$CONT(X)
. I PSJCONT=0!(PSJCONT="^") Q
. D SELDOSE(PSJY,PSJDD)
;
;* Entered a numeric and choices are not local pos dose
I PSJY?.N!(PSJY?.N1".".N),(PSJPIECE'=3) D G:PSJCONT=0 AGAIN S:PSJCONT="^" PSGOROE1=1 Q
. S PSJCONT=0
. Q:$L(PSJY)>15
. D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U",,PSJY/+$P(PSJDOX(1),U,5))
. S PSJCONT=$$CONT($P(PSJDOX(1),U,11)) I PSJCONT="^" Q
. I 'PSJCONT D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U") Q
. D SELDOSE(1,PSJDD)
;
;* Can't accept just a numeric value
I PSJY?.N!(PSJY?.N1".".N) D ENHLP^PSGOEM(53.1,109) G AGAIN
;
;* Free text
I $E(PSJY)=" " G AGAIN
S PSJCONT=$$CONT(PSJY) I PSJCONT="^" S PSGOROE1=1 Q
I PSJCONT=0 G AGAIN
K PSJDSSEL
F X=0:0 S X=$O(PSJDOX(X)) Q:'X S PSJXDOSE=$P(PSJDOX(X),U,PSJPIECE) I PSJY=PSJXDOSE D SELDOSE(X,PSJDD) Q
I '$D(PSJDSSEL),($G(PSJY)]"") S PSJDSSEL=PSJY_U_+PSJDD_U_1,PSGDO=PSJY,PSJDSUPD=1
Q
;
SELDOSE(X,PSJDD) ;
S X=PSJDOX(X)
S PSGDO=$P(X,U,PSJPIECE)
S:$P(X,U)'=-1 PSJDOSE("DO")=$P(X,U,1,2)
S PSJDSSEL=$P(X,U,PSJPIECE)_U_PSJDD
I +$P(X,U,12) S $P(PSJDSSEL,U,3)=$P(X,U,12)_U_1 Q
S $P(PSJDSSEL,U,3)=$S(PSJPIECE=11:$P(X,U,3),1:1)
Q
CONT(X) ;Ask if user accepting the dose
NEW DIR,DIRUT,DIROUT,Y
W ! K DIR,DIRUT,DUOUT
S DIR(0)="Y",DIR("A")="You entered "_X_" is this correct",DIR("B")="Yes"
D ^DIR I $D(DIRUT)!$D(DIROUT) Q "^"
K DUOUT
Q +Y
;
DUPD ;
NEW PSJX,X
S PSGUD=1
W !,"UNITS PER DOSE: "_PSGUD_"// " R X:DTIME W " ",X I X="^"!'$T S PSGOROE1=1 Q
S:X="" X=1
I X="@",'PSGUD W $C(7)," ??" S X="?" D ENHLP^PSGOEM(53.11,.02) G DUPD
I X?1."?" D ENHLP^PSGOEM(53.11,.02) G DUPD
I X?1.2N1"/"1.2N S X=+$J(+X/$P(X,"/",2),0,2) W " ("_$E("0",X<1)_X_")"
I $S($L(X)>12:1,X'=+X:1,X>50:1,X<0:1,1:X?.N1"."5.N) W $C(7)," ??" S X="?" D ENHLP^PSGOEM(53.11,.02) G DUPD
S $P(PSJDSSEL,U,3)=X
D SETDUPD(X)
Q
SETDUPD(X) ;
S PSGUD=X,X=$S(PSJDSSEL]"":$P(PSJDSSEL,U,2),1:0)
S PSJX=$O(^PS(53.45,PSJSYSP,2,"B",X,0))
S PSGUD=+$FN(PSGUD,"",4) S:$E(PSGUD)="." PSGUD="0"_PSGUD
S $P(^PS(53.45,PSJSYSP,2,+PSJX,0),U,2)=PSGUD
Q
EDITDD ;Editing DDs
NEW DA,DR,DIE
S DIE="^PS(53.45,",DA=PSJSYSP,DR=2,DR(2,53.4502)=".02//1" D ^DIE
I '$O(^PS(53.45,PSJSYSP,2,0)) W $C(7),!!,"WARNING: This order must have at least one dispense drug before pharmacy can",!?9,"verify it!"
Q
DOSECHK ;
K PSJDSFLG S PSJDSFLG=0
Q:'$P(PSJSYSU,";",4)
Q:$G(PSGDO)=""
NEW PSJX,PSJXDD,PSJCNT S PSJCNT=0
;*216 Be sure PSJDT is set
I '$G(PSJDT) N X,% D NOW^%DTC S PSJDT=X
F PSJX=0:0 S PSJX=$O(^PS(53.45,PSJSYSP,2,PSJX)) Q:'PSJX D
. S PSJXDD=$G(^PS(53.45,PSJSYSP,2,PSJX,0)) Q:PSJXDD=""
. S:$P(PSJXDD,U,2)="" $P(^PS(53.45,PSJSYSP,2,PSJX,0),U,2)=1
. ;*216 Don't count inactive Disp. Drug
. I $P(PSJXDD,U,3)'="",$P(PSJXDD,U,3)'>PSJDT Q
. S PSJCNT=PSJCNT+1
D DOSECHK1
Q
DOSECHK1 ;
NEW PSJX,PSJXDD,PSJXUNIT,PSJUNIT,PSJXFLG,PSJTOT,PSJDRGDOSE,PSJUNITNM,PSJDRGUD,CNT
S CNT=0
;*216 Be sure PSJDT is set
I '$G(PSJDT) N X,% D NOW^%DTC S PSJDT=X
S PSJUNIT=$P(PSGDO,+PSGDO,2,$L(PSGDO,+PSGDO))
S (PSJDSFLG,PSJXFLG,PSJTOT)=0
S PSJX=0 F S PSJX=$O(^PS(53.45,PSJSYSP,2,PSJX)) Q:'PSJX!PSJDSFLG!PSJXFLG D
. S PSJXDD=$G(^PS(53.45,PSJSYSP,2,PSJX,0))
. S PSJXDUP=$S(+$P(PSJXDD,U,2):$P(PSJXDD,U,2),1:1)
. ;*216 Don't count inactive Disp. Drug
. I $P(PSJXDD,U,3)'="",$P(PSJXDD,U,3)'>PSJDT Q
. D DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U")
. I $S('$D(PSJXDOX):1,$P(PSJXDOX(1),U)="":1,1:+PSJXDOX(1)=-1) S PSJXFLG=1 Q
. S PSJXUNIT=""
. S:PSJUNIT["/" PSJXUNIT=PSJUNIT
. I PSJUNIT'["/" F X=1:1:$L(PSJUNIT) I $E(PSJUNIT,X)'?.N&($E(PSJUNIT,X)'?1" ") S PSJXUNIT=PSJXUNIT_$E(PSJUNIT,X)
. I PSJCNT=1 D ONEDD Q:'PSJDSFLG
. D BCMAUPD(PSJXDD),DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U",,PSJXDUP)
. I PSJCNT=1 D ONEDD Q
. S PSJTOT=+PSJXDOX(1)+$G(PSJTOT)
. ;*PSJ*5*264 - Data for POINTTOSURFACE calculation
. S CNT=CNT+1,PSJDRGDOSE(CNT)=+$P(PSJXDOX(1),U,5),PSJUNITNM(CNT)=$P(PSJXDOX(1),U,2),PSJDRGUD(CNT)=+$P(PSJXDOX(1),U,3)
I PSJCNT>1,(PSJTOT'=+PSGDO) D
. N UNITCNT,UNITERR
. S PSJDSFLG=1
. F UNITCNT=2:1:CNT I PSJUNITNM(UNITCNT)'=PSJUNITNM(1) S UNITERR=1 Q
. I '$G(UNITERR),$$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)'=-1,$$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)<($$SQRT^XLFMTH(CNT)/100) S PSJDSFLG=0
Q
ONEDD ;
NEW X S PSJDSFLG=1
F X=0:0 S X=$O(PSJXDOX(X)) Q:'X!'PSJDSFLG D
. I +PSJXDOX(X)'=+PSGDO,(PSJXUNIT=$P(PSJXDOX(X),U,2)),$S(+PSJXDUP=+$P(PSJXDOX(X),U,3):1,1:PSJXDUP=$P(PSJXDOX(X),U,12)) D Q:PSJDSFLG
..; REMOVED THE ROUNDING FUNCTION FOR 398 - PER SUMPM
..; N CHK,DGTS S CHK=+PSGDO/$P(PSJXDOX(X),U,5) S DGTS=$L($P(PSJXDUP,".",2)) S CHK=+$FN(CHK,"",DGTS) I +CHK=+PSJXDUP S PSJDSFLG=0
.. N CHK,DGTS S CHK=+PSGDO/$P(PSJXDOX(X),U,5) S DGTS=$L($P(PSJXDUP,".",2)) I +CHK=+PSJXDUP S PSJDSFLG=0
. I +PSJXDOX(X)=+PSGDO,$TR($P(PSJXDOX(X),U,11)," ")=$TR(PSGDO," "),$S(+PSJXDUP=+$P(PSJXDOX(X),U,3):1,1:PSJXDUP=$P(PSJXDOX(X),U,12)) S PSJDSFLG=0
Q
PTPLANE(P,X,C) ;Find the distance from a point to a line/plane
;P - array containing coordinates of point
;X - array representing normal vector defining the line/plane
;C - constant representing point defining the line/plane
;*PSJ*5*264 - PTPLANE added
;
N N,CNT,NUM,DEN
Q:'$D(P)!'$D(X)!'$D(C) -1
S N=0,CNT=0,NUM=0,DEN=0
F S CNT=$O(P(CNT)) Q:'CNT S N=N+1
F CNT=1:1:N S NUM=P(CNT)*X(CNT)+NUM
S NUM=$$ABS^XLFMTH(NUM-C)
F CNT=1:1:N S DEN=X(CNT)**2+DEN
S DEN=$$SQRT^XLFMTH(DEN)
Q $S(DEN=0:-1,1:NUM/DEN)
BCMAUPD(PSJDD) ;
NEW PSJCNT
K PSJBCMA
F X=0:0 S X=$O(PSJXDOX(X)) Q:'X D
. Q:'+$P(PSJXDOX(X),U,12)
. S PSJCNT=+$G(PSJCNT)+1
. S PSJBCMA(+PSJDD,$P(PSJXDOX(X),U,12),PSJCNT)=$P(PSJXDOX(X),U,1,2)
Q
DSPWARN ;
NEW PSJDOSE
D SETVAR
W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
D PAUSE^VALM1
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSJDOSE 8192 printed Dec 13, 2024@02:06:43 Page 2
PSJDOSE ;BIR/MV - POSSIBLE DOSES UTILITY ; 1/6/20 11:08am
+1 ;;5.0;INPATIENT MEDICATIONS ;**50,65,106,111,216,264,328,338,398**;16 DEC 97;Build 3
+2 ;
+3 ; Reference to ^PSSORPH is supported by DBIA #3234.
+4 ;
+5 ;PSJDSFLG: Set to 1 if Dose and DD are not compatible
+6 ;PSJDSSEL: The selected dose in format:
+7 ; Dosage Order^DD IEN^DUPD/BCMA DUPD^1(if BCMA DUPD exist
+8 ;PSJDSUPD: Set to 1 if need to prompt for the Units Per Dose
+9 ;
EDITDOSE ;Editing Dosage Ordered for active order
+1 ;*Need to set PSJDSFLG to null when call EDITDOSE.
+2 NEW PSGOER1,PSJDD,PSJDSUPD,PSJDSSEL,PSJX,Y
+3 ;Offer the possible doses from the only one or 1st DD
+4 SET PSJX=$ORDER(^PS(53.45,PSJSYSP,2,0))
SET PSJDD=+$GET(^(+PSJX,0))
+5 DO DOSE(PSJDD)
+6 DO DOSECHK
+7 IF +PSJDSFLG
Begin DoDot:1
+8 WRITE !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
+9 DO PAUSE^VALM1
End DoDot:1
+10 SET PSGOEE=2
+11 QUIT
GETDOSE(PSJDD) ;Dosage Order
+1 NEW PSJDSSEL,PSJDSUPD
+2 DO DOSE(PSJDD)
+3 if '$DATA(PSJDSSEL)
QUIT
+4 if +$GET(PSJDSUPD)
DO DUPD
+5 if '+$GET(PSJDSUPD)
DO SETDUPD($PIECE(PSJDSSEL,U,3))
+6 DO DOSECHK
+7 IF +$GET(PSJDSFLG)
Begin DoDot:1
+8 WRITE !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
End DoDot:1
+9 QUIT
+10 ;
SETVAR ;
+1 SET PSJDOSE("WARN")="WARNING: Dosage Ordered and Dispense Units do not match."
+2 SET PSJDOSE("WARN1")=" Please verify Dosage."
+3 QUIT
+4 ;
DOSE(PSJDD) ;Prompt for Dosage Ordered
+1 ;PSJDD: Dispense drug IEN
+2 ;
+3 NEW DA,DR,DIR,DTOUT,DUOUT,DIRUT,PSJDL,PSJX,PSJPIECE,PSJCONT
+4 DO SETVAR
+5 DO DOSE^PSSORPH(.PSJDOX,+PSJDD,"U")
+6 IF '$DATA(PSJDOX)
SET PSJDOX(1)=-1
+7 SET PSJPIECE=$SELECT($PIECE(PSJDOX(1),U,11)]"":11,1:3)
+8 IF PSJPIECE=3
if $SELECT($PIECE(PSJDOX(1),U,3)=""
SET $PIECE(PSJDOX(1),U)=-1
AGAIN ;Prompt for dosage order again
+1 SET PSJX=0
+2 NEW DIR
+3 if ($PIECE(PSJDOX(1),U)'=-1)
WRITE !!,"Available Dosage(s)"
+4 FOR PSJDL=0:0
SET PSJDL=$ORDER(PSJDOX(PSJDL))
if $SELECT('PSJDL
QUIT
Begin DoDot:1
+5 SET PSJX=PSJX+1
+6 WRITE !?4,$JUSTIFY(PSJX,3),". ",$PIECE(PSJDOX(PSJDL),U,PSJPIECE)
+7 IF '(PSJX#16)
SET DIR(0)="E"
DO ^DIR
End DoDot:1
+8 WRITE !
+9 ;*216 - No null dosage
KILL DIR
SET DIR(0)="F^1:60"
+10 SET DIR("A")=$SELECT(+PSJX:"Select from list of Available Dosages or Enter Free Text Dose",1:"DOSAGE ORDERED")
+11 if $GET(PSGDO)]""
SET DIR("B")=PSGDO
+12 SET DIR("?")="^D ENHLP^PSGOEM(53.1,109)"
DO ^DIR
+13 SET PSJY=$$UP^XLFSTR(Y)
+14 ;
+15 IF $SELECT($DATA(DTOUT):1,$DATA(DUOUT):1,$DATA(DIRUT):1,1:0)
SET PSGOROE1=1
QUIT
+16 ;
+17 ;* If select for the presented list (possible and local doses)
+18 IF $DATA(PSJDOX(PSJY))
Begin DoDot:1
+19 NEW X
SET X=$PIECE(PSJDOX(PSJY),U,PSJPIECE)
+20 WRITE " ",X
+21 SET PSJCONT=$$CONT(X)
+22 IF PSJCONT=0!(PSJCONT="^")
QUIT
+23 DO SELDOSE(PSJY,PSJDD)
End DoDot:1
if PSJCONT=0
GOTO AGAIN
if PSJCONT="^"
SET PSGOROE1=1
QUIT
+24 ;
+25 ;* Entered a numeric and choices are not local pos dose
+26 IF PSJY?.N!(PSJY?.N1".".N)
IF (PSJPIECE'=3)
Begin DoDot:1
+27 SET PSJCONT=0
+28 if $LENGTH(PSJY)>15
QUIT
+29 DO DOSE^PSSORPH(.PSJDOX,+PSJDD,"U",,PSJY/+$PIECE(PSJDOX(1),U,5))
+30 SET PSJCONT=$$CONT($PIECE(PSJDOX(1),U,11))
IF PSJCONT="^"
QUIT
+31 IF 'PSJCONT
DO DOSE^PSSORPH(.PSJDOX,+PSJDD,"U")
QUIT
+32 DO SELDOSE(1,PSJDD)
End DoDot:1
if PSJCONT=0
GOTO AGAIN
if PSJCONT="^"
SET PSGOROE1=1
QUIT
+33 ;
+34 ;* Can't accept just a numeric value
+35 IF PSJY?.N!(PSJY?.N1".".N)
DO ENHLP^PSGOEM(53.1,109)
GOTO AGAIN
+36 ;
+37 ;* Free text
+38 IF $EXTRACT(PSJY)=" "
GOTO AGAIN
+39 SET PSJCONT=$$CONT(PSJY)
IF PSJCONT="^"
SET PSGOROE1=1
QUIT
+40 IF PSJCONT=0
GOTO AGAIN
+41 KILL PSJDSSEL
+42 FOR X=0:0
SET X=$ORDER(PSJDOX(X))
if 'X
QUIT
SET PSJXDOSE=$PIECE(PSJDOX(X),U,PSJPIECE)
IF PSJY=PSJXDOSE
DO SELDOSE(X,PSJDD)
QUIT
+43 IF '$DATA(PSJDSSEL)
IF ($GET(PSJY)]"")
SET PSJDSSEL=PSJY_U_+PSJDD_U_1
SET PSGDO=PSJY
SET PSJDSUPD=1
+44 QUIT
+45 ;
SELDOSE(X,PSJDD) ;
+1 SET X=PSJDOX(X)
+2 SET PSGDO=$PIECE(X,U,PSJPIECE)
+3 if $PIECE(X,U)'=-1
SET PSJDOSE("DO")=$PIECE(X,U,1,2)
+4 SET PSJDSSEL=$PIECE(X,U,PSJPIECE)_U_PSJDD
+5 IF +$PIECE(X,U,12)
SET $PIECE(PSJDSSEL,U,3)=$PIECE(X,U,12)_U_1
QUIT
+6 SET $PIECE(PSJDSSEL,U,3)=$SELECT(PSJPIECE=11:$PIECE(X,U,3),1:1)
+7 QUIT
CONT(X) ;Ask if user accepting the dose
+1 NEW DIR,DIRUT,DIROUT,Y
+2 WRITE !
KILL DIR,DIRUT,DUOUT
+3 SET DIR(0)="Y"
SET DIR("A")="You entered "_X_" is this correct"
SET DIR("B")="Yes"
+4 DO ^DIR
IF $DATA(DIRUT)!$DATA(DIROUT)
QUIT "^"
+5 KILL DUOUT
+6 QUIT +Y
+7 ;
DUPD ;
+1 NEW PSJX,X
+2 SET PSGUD=1
+3 WRITE !,"UNITS PER DOSE: "_PSGUD_"// "
READ X:DTIME
WRITE " ",X
IF X="^"!'$TEST
SET PSGOROE1=1
QUIT
+4 if X=""
SET X=1
+5 IF X="@"
IF 'PSGUD
WRITE $CHAR(7)," ??"
SET X="?"
DO ENHLP^PSGOEM(53.11,.02)
GOTO DUPD
+6 IF X?1."?"
DO ENHLP^PSGOEM(53.11,.02)
GOTO DUPD
+7 IF X?1.2N1"/"1.2N
SET X=+$JUSTIFY(+X/$PIECE(X,"/",2),0,2)
WRITE " ("_$EXTRACT("0",X<1)_X_")"
+8 IF $SELECT($LENGTH(X)>12:1,X'=+X:1,X>50:1,X<0:1,1:X?.N1"."5.N)
WRITE $CHAR(7)," ??"
SET X="?"
DO ENHLP^PSGOEM(53.11,.02)
GOTO DUPD
+9 SET $PIECE(PSJDSSEL,U,3)=X
+10 DO SETDUPD(X)
+11 QUIT
SETDUPD(X) ;
+1 SET PSGUD=X
SET X=$SELECT(PSJDSSEL]"":$PIECE(PSJDSSEL,U,2),1:0)
+2 SET PSJX=$ORDER(^PS(53.45,PSJSYSP,2,"B",X,0))
+3 SET PSGUD=+$FNUMBER(PSGUD,"",4)
if $EXTRACT(PSGUD)="."
SET PSGUD="0"_PSGUD
+4 SET $PIECE(^PS(53.45,PSJSYSP,2,+PSJX,0),U,2)=PSGUD
+5 QUIT
EDITDD ;Editing DDs
+1 NEW DA,DR,DIE
+2 SET DIE="^PS(53.45,"
SET DA=PSJSYSP
SET DR=2
SET DR(2,53.4502)=".02//1"
DO ^DIE
+3 IF '$ORDER(^PS(53.45,PSJSYSP,2,0))
WRITE $CHAR(7),!!,"WARNING: This order must have at least one dispense drug before pharmacy can",!?9,"verify it!"
+4 QUIT
DOSECHK ;
+1 KILL PSJDSFLG
SET PSJDSFLG=0
+2 if '$PIECE(PSJSYSU,";",4)
QUIT
+3 if $GET(PSGDO)=""
QUIT
+4 NEW PSJX,PSJXDD,PSJCNT
SET PSJCNT=0
+5 ;*216 Be sure PSJDT is set
+6 IF '$GET(PSJDT)
NEW X,%
DO NOW^%DTC
SET PSJDT=X
+7 FOR PSJX=0:0
SET PSJX=$ORDER(^PS(53.45,PSJSYSP,2,PSJX))
if 'PSJX
QUIT
Begin DoDot:1
+8 SET PSJXDD=$GET(^PS(53.45,PSJSYSP,2,PSJX,0))
if PSJXDD=""
QUIT
+9 if $PIECE(PSJXDD,U,2)=""
SET $PIECE(^PS(53.45,PSJSYSP,2,PSJX,0),U,2)=1
+10 ;*216 Don't count inactive Disp. Drug
+11 IF $PIECE(PSJXDD,U,3)'=""
IF $PIECE(PSJXDD,U,3)'>PSJDT
QUIT
+12 SET PSJCNT=PSJCNT+1
End DoDot:1
+13 DO DOSECHK1
+14 QUIT
DOSECHK1 ;
+1 NEW PSJX,PSJXDD,PSJXUNIT,PSJUNIT,PSJXFLG,PSJTOT,PSJDRGDOSE,PSJUNITNM,PSJDRGUD,CNT
+2 SET CNT=0
+3 ;*216 Be sure PSJDT is set
+4 IF '$GET(PSJDT)
NEW X,%
DO NOW^%DTC
SET PSJDT=X
+5 SET PSJUNIT=$PIECE(PSGDO,+PSGDO,2,$LENGTH(PSGDO,+PSGDO))
+6 SET (PSJDSFLG,PSJXFLG,PSJTOT)=0
+7 SET PSJX=0
FOR
SET PSJX=$ORDER(^PS(53.45,PSJSYSP,2,PSJX))
if 'PSJX!PSJDSFLG!PSJXFLG
QUIT
Begin DoDot:1
+8 SET PSJXDD=$GET(^PS(53.45,PSJSYSP,2,PSJX,0))
+9 SET PSJXDUP=$SELECT(+$PIECE(PSJXDD,U,2):$PIECE(PSJXDD,U,2),1:1)
+10 ;*216 Don't count inactive Disp. Drug
+11 IF $PIECE(PSJXDD,U,3)'=""
IF $PIECE(PSJXDD,U,3)'>PSJDT
QUIT
+12 DO DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U")
+13 IF $SELECT('$DATA(PSJXDOX):1,$PIECE(PSJXDOX(1),U)="":1,1:+PSJXDOX(1)=-1)
SET PSJXFLG=1
QUIT
+14 SET PSJXUNIT=""
+15 if PSJUNIT["/"
SET PSJXUNIT=PSJUNIT
+16 IF PSJUNIT'["/"
FOR X=1:1:$LENGTH(PSJUNIT)
IF $EXTRACT(PSJUNIT,X)'?.N&($EXTRACT(PSJUNIT,X)'?1" ")
SET PSJXUNIT=PSJXUNIT_$EXTRACT(PSJUNIT,X)
+17 IF PSJCNT=1
DO ONEDD
if 'PSJDSFLG
QUIT
+18 DO BCMAUPD(PSJXDD)
DO DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U",,PSJXDUP)
+19 IF PSJCNT=1
DO ONEDD
QUIT
+20 SET PSJTOT=+PSJXDOX(1)+$GET(PSJTOT)
+21 ;*PSJ*5*264 - Data for POINTTOSURFACE calculation
+22 SET CNT=CNT+1
SET PSJDRGDOSE(CNT)=+$PIECE(PSJXDOX(1),U,5)
SET PSJUNITNM(CNT)=$PIECE(PSJXDOX(1),U,2)
SET PSJDRGUD(CNT)=+$PIECE(PSJXDOX(1),U,3)
End DoDot:1
+23 IF PSJCNT>1
IF (PSJTOT'=+PSGDO)
Begin DoDot:1
+24 NEW UNITCNT,UNITERR
+25 SET PSJDSFLG=1
+26 FOR UNITCNT=2:1:CNT
IF PSJUNITNM(UNITCNT)'=PSJUNITNM(1)
SET UNITERR=1
QUIT
+27 IF '$GET(UNITERR)
IF $$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)'=-1
IF $$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)<($$SQRT^XLFMTH(CNT)/100)
SET PSJDSFLG=0
End DoDot:1
+28 QUIT
ONEDD ;
+1 NEW X
SET PSJDSFLG=1
+2 FOR X=0:0
SET X=$ORDER(PSJXDOX(X))
if 'X!'PSJDSFLG
QUIT
Begin DoDot:1
+3 IF +PSJXDOX(X)'=+PSGDO
IF (PSJXUNIT=$PIECE(PSJXDOX(X),U,2))
IF $SELECT(+PSJXDUP=+$PIECE(PSJXDOX(X),U,3):1,1:PSJXDUP=$PIECE(PSJXDOX(X),U,12))
Begin DoDot:2
+4 ; REMOVED THE ROUNDING FUNCTION FOR 398 - PER SUMPM
+5 ; N CHK,DGTS S CHK=+PSGDO/$P(PSJXDOX(X),U,5) S DGTS=$L($P(PSJXDUP,".",2)) S CHK=+$FN(CHK,"",DGTS) I +CHK=+PSJXDUP S PSJDSFLG=0
+6 NEW CHK,DGTS
SET CHK=+PSGDO/$PIECE(PSJXDOX(X),U,5)
SET DGTS=$LENGTH($PIECE(PSJXDUP,".",2))
IF +CHK=+PSJXDUP
SET PSJDSFLG=0
End DoDot:2
if PSJDSFLG
QUIT
+7 IF +PSJXDOX(X)=+PSGDO
IF $TRANSLATE($PIECE(PSJXDOX(X),U,11)," ")=$TRANSLATE(PSGDO," ")
IF $SELECT(+PSJXDUP=+$PIECE(PSJXDOX(X),U,3):1,1:PSJXDUP=$PIECE(PSJXDOX(X),U,12))
SET PSJDSFLG=0
End DoDot:1
+8 QUIT
PTPLANE(P,X,C) ;Find the distance from a point to a line/plane
+1 ;P - array containing coordinates of point
+2 ;X - array representing normal vector defining the line/plane
+3 ;C - constant representing point defining the line/plane
+4 ;*PSJ*5*264 - PTPLANE added
+5 ;
+6 NEW N,CNT,NUM,DEN
+7 if '$DATA(P)!'$DATA(X)!'$DATA(C)
QUIT -1
+8 SET N=0
SET CNT=0
SET NUM=0
SET DEN=0
+9 FOR
SET CNT=$ORDER(P(CNT))
if 'CNT
QUIT
SET N=N+1
+10 FOR CNT=1:1:N
SET NUM=P(CNT)*X(CNT)+NUM
+11 SET NUM=$$ABS^XLFMTH(NUM-C)
+12 FOR CNT=1:1:N
SET DEN=X(CNT)**2+DEN
+13 SET DEN=$$SQRT^XLFMTH(DEN)
+14 QUIT $SELECT(DEN=0:-1,1:NUM/DEN)
BCMAUPD(PSJDD) ;
+1 NEW PSJCNT
+2 KILL PSJBCMA
+3 FOR X=0:0
SET X=$ORDER(PSJXDOX(X))
if 'X
QUIT
Begin DoDot:1
+4 if '+$PIECE(PSJXDOX(X),U,12)
QUIT
+5 SET PSJCNT=+$GET(PSJCNT)+1
+6 SET PSJBCMA(+PSJDD,$PIECE(PSJXDOX(X),U,12),PSJCNT)=$PIECE(PSJXDOX(X),U,1,2)
End DoDot:1
+7 QUIT
DSPWARN ;
+1 NEW PSJDOSE
+2 DO SETVAR
+3 WRITE !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
+4 DO PAUSE^VALM1
+5 QUIT