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

PSJDOSE.m

Go to the documentation of this file.
  1. 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
  1. ;
  1. ; Reference to ^PSSORPH is supported by DBIA #3234.
  1. ;
  1. ;PSJDSFLG: Set to 1 if Dose and DD are not compatible
  1. ;PSJDSSEL: The selected dose in format:
  1. ; Dosage Order^DD IEN^DUPD/BCMA DUPD^1(if BCMA DUPD exist
  1. ;PSJDSUPD: Set to 1 if need to prompt for the Units Per Dose
  1. ;
  1. EDITDOSE ;Editing Dosage Ordered for active order
  1. ;*Need to set PSJDSFLG to null when call EDITDOSE.
  1. NEW PSGOER1,PSJDD,PSJDSUPD,PSJDSSEL,PSJX,Y
  1. ;Offer the possible doses from the only one or 1st DD
  1. S PSJX=$O(^PS(53.45,PSJSYSP,2,0)) S PSJDD=+$G(^(+PSJX,0))
  1. D DOSE(PSJDD)
  1. D DOSECHK
  1. I +PSJDSFLG D
  1. . W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
  1. . D PAUSE^VALM1
  1. S PSGOEE=2
  1. Q
  1. GETDOSE(PSJDD) ;Dosage Order
  1. NEW PSJDSSEL,PSJDSUPD
  1. D DOSE(PSJDD)
  1. Q:'$D(PSJDSSEL)
  1. D:+$G(PSJDSUPD) DUPD
  1. D:'+$G(PSJDSUPD) SETDUPD($P(PSJDSSEL,U,3))
  1. D DOSECHK
  1. I +$G(PSJDSFLG) D
  1. . W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
  1. Q
  1. ;
  1. SETVAR ;
  1. S PSJDOSE("WARN")="WARNING: Dosage Ordered and Dispense Units do not match."
  1. S PSJDOSE("WARN1")=" Please verify Dosage."
  1. Q
  1. ;
  1. DOSE(PSJDD) ;Prompt for Dosage Ordered
  1. ;PSJDD: Dispense drug IEN
  1. ;
  1. NEW DA,DR,DIR,DTOUT,DUOUT,DIRUT,PSJDL,PSJX,PSJPIECE,PSJCONT
  1. D SETVAR
  1. D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U")
  1. I '$D(PSJDOX) S PSJDOX(1)=-1
  1. S PSJPIECE=$S($P(PSJDOX(1),U,11)]"":11,1:3)
  1. I PSJPIECE=3 S:$S($P(PSJDOX(1),U,3)="":1,1:$P(PSJDOX(1),U)=-1) $P(PSJDOX(1),U)=-1
  1. AGAIN ;Prompt for dosage order again
  1. S PSJX=0
  1. NEW DIR
  1. W:($P(PSJDOX(1),U)'=-1) !!,"Available Dosage(s)"
  1. F PSJDL=0:0 S PSJDL=$O(PSJDOX(PSJDL)) Q:$S('PSJDL:1,$G(DUOUT):1,1:+PSJDOX(PSJDL)=-1) D
  1. . S PSJX=PSJX+1
  1. . W !?4,$J(PSJX,3),". ",$P(PSJDOX(PSJDL),U,PSJPIECE)
  1. . I '(PSJX#16) S DIR(0)="E" D ^DIR
  1. W !
  1. K DIR S DIR(0)="F^1:60" ;*216 - No null dosage
  1. S DIR("A")=$S(+PSJX:"Select from list of Available Dosages or Enter Free Text Dose",1:"DOSAGE ORDERED")
  1. S:$G(PSGDO)]"" DIR("B")=PSGDO
  1. S DIR("?")="^D ENHLP^PSGOEM(53.1,109)" D ^DIR
  1. S PSJY=$$UP^XLFSTR(Y)
  1. ;
  1. I $S($D(DTOUT):1,$D(DUOUT):1,$D(DIRUT):1,1:0) S PSGOROE1=1 Q
  1. ;
  1. ;* If select for the presented list (possible and local doses)
  1. I $D(PSJDOX(PSJY)) D G:PSJCONT=0 AGAIN S:PSJCONT="^" PSGOROE1=1 Q
  1. . NEW X S X=$P(PSJDOX(PSJY),U,PSJPIECE)
  1. . W " ",X
  1. . S PSJCONT=$$CONT(X)
  1. . I PSJCONT=0!(PSJCONT="^") Q
  1. . D SELDOSE(PSJY,PSJDD)
  1. ;
  1. ;* Entered a numeric and choices are not local pos dose
  1. I PSJY?.N!(PSJY?.N1".".N),(PSJPIECE'=3) D G:PSJCONT=0 AGAIN S:PSJCONT="^" PSGOROE1=1 Q
  1. . S PSJCONT=0
  1. . Q:$L(PSJY)>15
  1. . D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U",,PSJY/+$P(PSJDOX(1),U,5))
  1. . S PSJCONT=$$CONT($P(PSJDOX(1),U,11)) I PSJCONT="^" Q
  1. . I 'PSJCONT D DOSE^PSSORPH(.PSJDOX,+PSJDD,"U") Q
  1. . D SELDOSE(1,PSJDD)
  1. ;
  1. ;* Can't accept just a numeric value
  1. I PSJY?.N!(PSJY?.N1".".N) D ENHLP^PSGOEM(53.1,109) G AGAIN
  1. ;
  1. ;* Free text
  1. I $E(PSJY)=" " G AGAIN
  1. S PSJCONT=$$CONT(PSJY) I PSJCONT="^" S PSGOROE1=1 Q
  1. I PSJCONT=0 G AGAIN
  1. K PSJDSSEL
  1. 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
  1. I '$D(PSJDSSEL),($G(PSJY)]"") S PSJDSSEL=PSJY_U_+PSJDD_U_1,PSGDO=PSJY,PSJDSUPD=1
  1. Q
  1. ;
  1. SELDOSE(X,PSJDD) ;
  1. S X=PSJDOX(X)
  1. S PSGDO=$P(X,U,PSJPIECE)
  1. S:$P(X,U)'=-1 PSJDOSE("DO")=$P(X,U,1,2)
  1. S PSJDSSEL=$P(X,U,PSJPIECE)_U_PSJDD
  1. I +$P(X,U,12) S $P(PSJDSSEL,U,3)=$P(X,U,12)_U_1 Q
  1. S $P(PSJDSSEL,U,3)=$S(PSJPIECE=11:$P(X,U,3),1:1)
  1. Q
  1. CONT(X) ;Ask if user accepting the dose
  1. NEW DIR,DIRUT,DIROUT,Y
  1. W ! K DIR,DIRUT,DUOUT
  1. S DIR(0)="Y",DIR("A")="You entered "_X_" is this correct",DIR("B")="Yes"
  1. D ^DIR I $D(DIRUT)!$D(DIROUT) Q "^"
  1. K DUOUT
  1. Q +Y
  1. ;
  1. DUPD ;
  1. NEW PSJX,X
  1. S PSGUD=1
  1. W !,"UNITS PER DOSE: "_PSGUD_"// " R X:DTIME W " ",X I X="^"!'$T S PSGOROE1=1 Q
  1. S:X="" X=1
  1. I X="@",'PSGUD W $C(7)," ??" S X="?" D ENHLP^PSGOEM(53.11,.02) G DUPD
  1. I X?1."?" D ENHLP^PSGOEM(53.11,.02) G DUPD
  1. I X?1.2N1"/"1.2N S X=+$J(+X/$P(X,"/",2),0,2) W " ("_$E("0",X<1)_X_")"
  1. 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
  1. S $P(PSJDSSEL,U,3)=X
  1. D SETDUPD(X)
  1. Q
  1. SETDUPD(X) ;
  1. S PSGUD=X,X=$S(PSJDSSEL]"":$P(PSJDSSEL,U,2),1:0)
  1. S PSJX=$O(^PS(53.45,PSJSYSP,2,"B",X,0))
  1. S PSGUD=+$FN(PSGUD,"",4) S:$E(PSGUD)="." PSGUD="0"_PSGUD
  1. S $P(^PS(53.45,PSJSYSP,2,+PSJX,0),U,2)=PSGUD
  1. Q
  1. EDITDD ;Editing DDs
  1. NEW DA,DR,DIE
  1. S DIE="^PS(53.45,",DA=PSJSYSP,DR=2,DR(2,53.4502)=".02//1" D ^DIE
  1. 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!"
  1. Q
  1. DOSECHK ;
  1. K PSJDSFLG S PSJDSFLG=0
  1. Q:'$P(PSJSYSU,";",4)
  1. Q:$G(PSGDO)=""
  1. NEW PSJX,PSJXDD,PSJCNT S PSJCNT=0
  1. ;*216 Be sure PSJDT is set
  1. I '$G(PSJDT) N X,% D NOW^%DTC S PSJDT=X
  1. F PSJX=0:0 S PSJX=$O(^PS(53.45,PSJSYSP,2,PSJX)) Q:'PSJX D
  1. . S PSJXDD=$G(^PS(53.45,PSJSYSP,2,PSJX,0)) Q:PSJXDD=""
  1. . S:$P(PSJXDD,U,2)="" $P(^PS(53.45,PSJSYSP,2,PSJX,0),U,2)=1
  1. . ;*216 Don't count inactive Disp. Drug
  1. . I $P(PSJXDD,U,3)'="",$P(PSJXDD,U,3)'>PSJDT Q
  1. . S PSJCNT=PSJCNT+1
  1. D DOSECHK1
  1. Q
  1. DOSECHK1 ;
  1. NEW PSJX,PSJXDD,PSJXUNIT,PSJUNIT,PSJXFLG,PSJTOT,PSJDRGDOSE,PSJUNITNM,PSJDRGUD,CNT
  1. S CNT=0
  1. ;*216 Be sure PSJDT is set
  1. I '$G(PSJDT) N X,% D NOW^%DTC S PSJDT=X
  1. S PSJUNIT=$P(PSGDO,+PSGDO,2,$L(PSGDO,+PSGDO))
  1. S (PSJDSFLG,PSJXFLG,PSJTOT)=0
  1. S PSJX=0 F S PSJX=$O(^PS(53.45,PSJSYSP,2,PSJX)) Q:'PSJX!PSJDSFLG!PSJXFLG D
  1. . S PSJXDD=$G(^PS(53.45,PSJSYSP,2,PSJX,0))
  1. . S PSJXDUP=$S(+$P(PSJXDD,U,2):$P(PSJXDD,U,2),1:1)
  1. . ;*216 Don't count inactive Disp. Drug
  1. . I $P(PSJXDD,U,3)'="",$P(PSJXDD,U,3)'>PSJDT Q
  1. . D DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U")
  1. . I $S('$D(PSJXDOX):1,$P(PSJXDOX(1),U)="":1,1:+PSJXDOX(1)=-1) S PSJXFLG=1 Q
  1. . S PSJXUNIT=""
  1. . S:PSJUNIT["/" PSJXUNIT=PSJUNIT
  1. . I PSJUNIT'["/" F X=1:1:$L(PSJUNIT) I $E(PSJUNIT,X)'?.N&($E(PSJUNIT,X)'?1" ") S PSJXUNIT=PSJXUNIT_$E(PSJUNIT,X)
  1. . I PSJCNT=1 D ONEDD Q:'PSJDSFLG
  1. . D BCMAUPD(PSJXDD),DOSE^PSSORPH(.PSJXDOX,+PSJXDD,"U",,PSJXDUP)
  1. . I PSJCNT=1 D ONEDD Q
  1. . S PSJTOT=+PSJXDOX(1)+$G(PSJTOT)
  1. . ;*PSJ*5*264 - Data for POINTTOSURFACE calculation
  1. . 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)
  1. I PSJCNT>1,(PSJTOT'=+PSGDO) D
  1. . N UNITCNT,UNITERR
  1. . S PSJDSFLG=1
  1. . F UNITCNT=2:1:CNT I PSJUNITNM(UNITCNT)'=PSJUNITNM(1) S UNITERR=1 Q
  1. . I '$G(UNITERR),$$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)'=-1,$$PTPLANE(.PSJDRGUD,.PSJDRGDOSE,+PSGDO)<($$SQRT^XLFMTH(CNT)/100) S PSJDSFLG=0
  1. Q
  1. ONEDD ;
  1. NEW X S PSJDSFLG=1
  1. F X=0:0 S X=$O(PSJXDOX(X)) Q:'X!'PSJDSFLG D
  1. . 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
  1. ..; REMOVED THE ROUNDING FUNCTION FOR 398 - PER SUMPM
  1. ..; 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
  1. .. N CHK,DGTS S CHK=+PSGDO/$P(PSJXDOX(X),U,5) S DGTS=$L($P(PSJXDUP,".",2)) I +CHK=+PSJXDUP S PSJDSFLG=0
  1. . 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
  1. Q
  1. PTPLANE(P,X,C) ;Find the distance from a point to a line/plane
  1. ;P - array containing coordinates of point
  1. ;X - array representing normal vector defining the line/plane
  1. ;C - constant representing point defining the line/plane
  1. ;*PSJ*5*264 - PTPLANE added
  1. ;
  1. N N,CNT,NUM,DEN
  1. Q:'$D(P)!'$D(X)!'$D(C) -1
  1. S N=0,CNT=0,NUM=0,DEN=0
  1. F S CNT=$O(P(CNT)) Q:'CNT S N=N+1
  1. F CNT=1:1:N S NUM=P(CNT)*X(CNT)+NUM
  1. S NUM=$$ABS^XLFMTH(NUM-C)
  1. F CNT=1:1:N S DEN=X(CNT)**2+DEN
  1. S DEN=$$SQRT^XLFMTH(DEN)
  1. Q $S(DEN=0:-1,1:NUM/DEN)
  1. BCMAUPD(PSJDD) ;
  1. NEW PSJCNT
  1. K PSJBCMA
  1. F X=0:0 S X=$O(PSJXDOX(X)) Q:'X D
  1. . Q:'+$P(PSJXDOX(X),U,12)
  1. . S PSJCNT=+$G(PSJCNT)+1
  1. . S PSJBCMA(+PSJDD,$P(PSJXDOX(X),U,12),PSJCNT)=$P(PSJXDOX(X),U,1,2)
  1. Q
  1. DSPWARN ;
  1. NEW PSJDOSE
  1. D SETVAR
  1. W !!,PSJDOSE("WARN"),!,PSJDOSE("WARN1"),!
  1. D PAUSE^VALM1
  1. Q