Ignore:
Timestamp:
Dec 4, 2009, 12:11:15 AM (14 years ago)
Author:
George Lilly
Message:

revised back to 6/30/08 version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • WorldVistAEHR/trunk/r/ORDER_ENTRY_RESULTS_REPORTING-OR-OCX--ORRC--ORRJ/ORCSEND1.m

    r613 r623  
    1 ORCSEND1        ;SLC/MKB-Release cont ;11/22/06
    2         ;;3.0;ORDER ENTRY/RESULTS REPORTING;**4,29,45,61,79,94,116,138,158,149,187,215,243**;Dec 17, 1997;Build 242
    3         ;
    4 PKGSTUFF(PKG)   ; Package code
    5         S PKG=$$GET1^DIQ(9.4,+PKG_",",1) Q:'$L(PKG)
    6         D:$L($T(@PKG)) @PKG
    7         Q
    8 LR      ; Spawn child orders if continuous schedule
    9         N ORSTRT,ORPARENT,OR0,ORNP,ORDIALOG,ORL,ORX,ORTIME,ORPITEM,ORPSAMP,ORPSPEC,ORPURG,ORPCOMM,ORPTYPE,ORPCOLL,ORS1,ORS2,P,ORCHLD,ORDG,ORLAST,ORDUZ,ORLOG,ORCOLLCT,STS
    10         S ORPARENT=+ORIFN,OR0=$G(^OR(100,ORIFN,0)),ORL=$P(OR0,U,10)
    11         D SCHEDULE(ORIFN,"LR",.ORSTRT) I ORSTRT'>1 D  Q
    12         . N START S START=$O(ORSTRT(0)) Q:START=$P($G(^OR(100,+ORIFN,0)),U,8)
    13         . D DATES^ORCSAVE2(+ORIFN,START) ;update start date from schedule
    14         S ORNP=+$P(OR0,U,4),ORDIALOG=+$P(OR0,U,5),ORDUZ=+$P(OR0,U,6),ORLOG=$P(OR0,U,7),ORDG=+$P(OR0,U,11)
    15         D GETDLG1^ORCD(ORDIALOG),GETORDER(ORIFN),GETIMES^ORCDLR1
    16         K ORDIALOG($$PTR^ORCD("OR GTX ADMIN SCHEDULE"),1),ORDIALOG($$PTR^ORCD("OR GTX DURATION"),1)
    17         S ORPITEM=$$PTR^ORCD("OR GTX ORDERABLE ITEM")
    18         S ORPSAMP=$$PTR^ORCD("OR GTX COLLECTION SAMPLE")
    19         S ORPSPEC=$$PTR^ORCD("OR GTX SPECIMEN")
    20         S ORPURG=$$PTR^ORCD("OR GTX LAB URGENCY")
    21         S ORPCOMM=$$PTR^ORCD("OR GTX WORD PROCESSING 1")
    22         S ORPTYPE=$$PTR^ORCD("OR GTX COLLECTION TYPE")
    23         S ORPCOLL=$$PTR^ORCD("OR GTX START DATE/TIME")
    24 LR1     S ORS1=0 F  S ORS1=$O(ORX(ORS1)) Q:ORS1'>0  D
    25         . F P=ORPITEM,ORPSAMP,ORPSPEC,ORPURG,ORPCOMM,ORPTYPE S ORDIALOG(P,1)=$G(ORX(ORS1,P)) ;set values to next instance
    26         . S ORCOLLCT=$G(ORDIALOG(ORPTYPE,1))
    27         . S ORS2=0 F  S ORS2=$O(ORSTRT(ORS2)) Q:ORS2'>0  D
    28         .. S ORDIALOG(ORPCOLL,1)=ORS2 ;,ORDUZ=DUZ,ORLOG=+$E($$NOW^XLFDT,1,12)
    29         .. I ORCOLLCT="LC" S ORDIALOG(ORPTYPE,1)=$S($$LABCOLL^ORCDLR1(ORS2):"LC",1:"WC")
    30         .. I ORCOLLCT="I" S ORDIALOG(ORPTYPE,1)=$S($$IMMCOLL^ORCDLR1(ORS2):"I",1:"WC")
    31         .. D CHILD^ORCSEND3()
    32         S:$G(ORCHLD) ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
    33         S ORIFN=ORPARENT,ORQUIT=1,STS=$P(^OR(100,ORIFN,3),U,3)
    34         I (STS=1)!(STS=13)!(STS=11) S ORERR="1^Unable to release orders"
    35         D RELEASE^ORCSAVE2(ORPARENT,1,ORNOW,DUZ,$G(NATURE))
    36         Q
    37 SCHEDULE(IFN,PKG,ORY,STRT)      ; Returns list of start time(s) from schedule
    38         N I,X,PSJSD,PSJFD,PSJW,PSJNE,PSJPP,PSJX,PSJAT,PSJM,PSJTS,PSJY,PSJAX,PSJSCH,PSJOSD,PSJOFD,PSJC,ORDUR
    39         S PSJSD=$S(+$G(STRT):STRT,1:$P($G(^OR(100,+IFN,0)),U,8)) I 'PSJSD S ORY=-1 Q
    40         S ORY=1,ORY(PSJSD)="" ;1st occurrance
    41         S I=$O(^OR(100,+IFN,4.5,"ID","SCHEDULE",0)) Q:'I  Q:'$L($G(PKG))
    42         S X=$G(^OR(100,+IFN,4.5,I,1)),PSJX=$S(X:$$GET1^DIQ(51.1,+X_",",.01),1:X)
    43         S PSJW=+$G(ORL),PSJNE="",PSJPP=PKG D ENSV^PSJEEU Q:'$L($G(PSJX))
    44         I $G(PSJTS)'="C",$G(PSJTS)'="D" Q  ;not continuous or day-of-week
    45         S PSJSCH=PSJX,I=$O(^OR(100,+IFN,4.5,"ID","DAYS",0)) Q:'I
    46         S ORDUR=$G(^OR(100,+IFN,4.5,+I,1))
    47         S:ORDUR PSJFD=$$FMADD^XLFDT(PSJSD,+ORDUR,,-1)
    48         I 'ORDUR S X=+$E(ORDUR,2,9) D
    49         . I PSJM S PSJFD=$$FMADD^XLFDT(PSJSD,,,(PSJM*X)-1) ;X_#times
    50         . E  D  ;no freq in minutes --> day of week
    51         .. N DAYS,LOCMX,SCHMX
    52         .. S LOCMX=$$GET^XPAR("ALL^LOC.`"_+ORL,"LR MAX DAYS CONTINUOUS",1,"Q")
    53         .. K ^TMP($J,"ORCSEND1 SCHEDULE")
    54         .. D ZERO^PSS51P1(PSJY,,,,"ORCSEND1 SCHEDULE")
    55         .. S SCHMX=+$G(^TMP($J,"ORCSEND1 SCHEDULE",PSJY,2.5))
    56         .. K ^TMP($J,"ORCSEND1 SCHEDULE")
    57         .. ;S SCHMX=$P(^PS(51.1,PSJY,0),U,7)
    58         .. S DAYS=$S('SCHMX:LOCMX,LOCMX<SCHMX:LOCMX,1:SCHMX)
    59         .. S PSJFD=$$FMADD^XLFDT(PSJSD,DAYS,,-1)
    60         D ENSPU^PSJEEU K ORY
    61         I ORDUR M ORY=PSJC Q
    62         S ORY=$S(PSJC<$E(ORDUR,2,9):PSJC,1:$E(ORDUR,2,9))
    63         N NXT
    64         S NXT=0 F I=1:1:ORY S NXT=$O(PSJC(NXT)) Q:'NXT  S ORY(NXT)=PSJC(NXT)
    65         Q
    66 GETORDER(IFN)   ; Set ORX(Inst,Ptr)=Value
    67         N I,X,Y,PTR,INST,TYPE
    68         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
    69         . S PTR=+$P(X,U,2),INST=+$P(X,U,3),TYPE=$P($G(^ORD(101.41,PTR,1)),U)
    70         . I TYPE'="W" S ORX(INST,PTR)=Y Q
    71         . S ORX(INST,PTR)="^OR(100,"_IFN_",4.5,"_I_",2)"
    72         Q
    73 PTR(X)  ; Returns ptr of prompt X in Order Dialog file
    74         Q +$O(^ORD(101.41,"AB",$E("OR GTX "_X,1,63),0))
    75 PS      ; spawn child orders if multiple doses
    76 PSJ     ; (Inpt only)
    77 PSS     ;
    78         N ORPARENT,OR0,ORNP,ORDIALOG,ORDUZ,ORLOG,ORL,ORDG,ORCAT,ORX,ORP,ORI,STS
    79         N ORDOSE,ORT,ORSCH,ORDUR,ORSTRT,ORFRST,ORCONJ,ORID,ORDD,ORSTR,ORDGNM
    80         N ORSTART,ORCHLD,ORLAST,ORSIG,OROI,ID,OR3,ORIG,CODE,ORPKG,ORENEW,I,ORADMIN
    81         S ORPARENT=+ORIFN,OR0=$G(^OR(100,ORPARENT,0)),OR3=$G(^(3))
    82         Q:$P(OR0,U,12)'="I"  S ORCAT="I",ORNP=+$P(OR0,U,4)
    83         S ORDIALOG=+$P(OR0,U,5),ORDUZ=+$P(OR0,U,6),ORLOG=$P(OR0,U,7)
    84         S ORL=$P(OR0,U,10),ORDG=+$P(OR0,U,11),ORPKG=+$P(OR0,U,14)
    85         D GETDLG1^ORCD(ORDIALOG),GETORDER(ORPARENT)
    86         S ORDOSE=$$PTR("INSTRUCTIONS"),ORT=$$PTR("ROUTE")
    87         S ORSCH=$$PTR("SCHEDULE"),ORDUR=$$PTR("DURATION")
    88         S ORCONJ=$$PTR("AND/THEN") D STRT S ORSTART=$G(ORSTRT("BEG"))
    89         S ORADMIN=$$PTR("ADMIN TIMES")
    90         D DATES^ORCSAVE2(ORPARENT,ORSTART) Q:$$DOSES(ORPARENT)'>1
    91         S ORFRST=$$PTR("NOW"),ORSIG=$$PTR("SIG")
    92         S ORID=$$PTR("DOSE"),ORDD=$$PTR("DISPENSE DRUG")
    93         S ORSTR=$$PTR("STRENGTH"),ORDGNM=$$PTR("DRUG NAME")
    94         I $P(OR3,U,11)=2,$O(^OR(100,+$P(OR3,U,5),2,0)) D
    95         . S ORENEW=+$P(OR3,U,5),I=0
    96         . I $$VALUE^ORX8(ORENEW,"NOW") S I=$O(^OR(100,ORENEW,2,0))
    97         . F  S I=$O(^OR(100,ORENEW,2,I)) Q:I<1  S ORENEW(I)=""
    98 PS1     F ORP="ORDERABLE ITEM","URGENCY","WORD PROCESSING 1" D
    99         . N PTR S PTR=$$PTR(ORP) Q:PTR'>0  Q:'$D(ORX(1,PTR))
    100         . S ORDIALOG(PTR,1)=ORX(1,PTR) S:$E(ORP)="O" OROI=ORX(1,PTR)
    101         S ORI=$$FRSTDOSE I $G(ORX(1,ORFRST)) D
    102         . F ORP=ORDOSE,ORT,ORID S:$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)=ORX(ORI,ORP)
    103         . S ID=$G(ORX(ORI,ORID)) S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
    104         . S ORDIALOG(ORSCH,1)="NOW",ORSTART=$$NOW^XLFDT
    105         . D SIG,CHILD^ORCSEND3(ORSTART)
    106         F  D  S ORI=$O(ORX(ORI)) Q:ORI'>0
    107         . F ORP=ORDOSE,ORT,ORSCH,ORDUR,ORID,ORADMIN S:$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)=ORX(ORI,ORP) K:'$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)
    108         . K ORDIALOG(ORDD,1) S ID=$G(ORX(ORI,ORID))
    109         . S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
    110         . S ORSTART=$G(ORSTRT(ORI))
    111         . D SIG,CHILD^ORCSEND3(ORSTART)
    112         S:$G(ORCHLD) ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
    113         S ORIFN=ORPARENT,ORQUIT=1,OR3=$G(^OR(100,ORIFN,3)),STS=$P(OR3,U,3)
    114         I (STS=1)!(STS=13)!(STS=11) S ORERR="1^Unable to release orders"
    115         D RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$G(NATURE)) K ^TMP("ORWORD",$J)
    116         S $P(^OR(100,ORIFN,3),U,8)=1 ;veil parent order - set stop date/time?
    117         Q:(STS=1)!(STS=13)!(STS=11)  ;unsuccessful
    118 PS2     ; ck if parent is unsigned or edit
    119         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
    120         Q:$P(OR3,U,11)'=1  S ORIG=$P(OR3,U,5) Q:ORIG'>0
    121         S CODE=$S($P($G(^OR(100,ORIG,3)),U,3)=5:"CA",1:"DC")
    122         D MSG^ORMBLD(ORIG,CODE) I "^1^13^"[(U_$P($G(^OR(100,ORIG,3)),U,3)_U) D
    123         . N NATR S NATR=+$O(^ORD(100.02,"C","C",0))
    124         . S $P(^OR(100,ORIG,3),U,3)=12,$P(^(3),U,7)=0,^(6)=NATR_U_DUZ_U_ORNOW
    125         . D CANCEL^ORCSEND(ORIG) ;ck for unrel actions
    126         Q
    127 DOSES(IFN)      ; count number of doses in order
    128         N I,CNT S CNT=0
    129         S I=0 F  S I=$O(^OR(100,+$G(IFN),4.5,"ID","INSTR",I)) Q:I'>0  I $L($G(^OR(100,+$G(IFN),4.5,I,1))) S CNT=CNT+1
    130         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
    131         Q CNT
    132 FRSTDOSE()      ; Return instance of first dose
    133         N I,Y S I=0,Y=1
    134         F  S I=$O(ORX(I)) Q:I'>0  I $D(ORX(I,ORDOSE)) S Y=I Q
    135         Q Y
    136 SIG     ; Build text of instructions
    137         N ORDRUG,ID,DOSE,ORI,ORX K ^TMP("ORWORD",$J,ORSIG,1)
    138         S ORDRUG=$G(ORDIALOG(ORDD,1)),ID=$G(ORDIALOG(ORID,1))
    139         S DOSE=$G(ORDIALOG(ORDOSE,1)),ORI=1
    140         S ORX=$$DOSE^ORCDPS2_$$RTE^ORCDPS2_$$SCH^ORCDPS2_$$DUR^ORCDPS2
    141         S ^TMP("ORWORD",$J,ORSIG,1,0)="^^1^1^"_DT_U,^(1,0)=ORX
    142         S ORDIALOG(ORSIG,1)=$NA(^TMP("ORWORD",$J,ORSIG,1))
    143         S ORDIALOG(ORDOSE,"FORMAT")="@"
    144         K ORDIALOG(ORSTR,1),ORDIALOG(ORDGNM,1)
    145         I ORDRUG,'ID D  ;set strength or drug name
    146         . N STR,ITM S STR=$P(ID,"&",7)_$P(ID,"&",8)
    147         . I STR'>0 S ORDIALOG(ORDGNM,1)=$$GET1^DIQ(50,+ORDRUG_",",.01) Q
    148         . S ITM=$P($G(^ORD(101.43,+$G(OROI),0)),U)
    149         . S:ITM'[STR ORDIALOG(ORSTR,1)=STR
    150         Q
    151 STRT    ; Build ORSTRT(inst)=date.time array of start times by dose
    152         N OI,PSOI,XD,XH,XM,XS,ORWD,ORI,SCH,ORSD,X,ORD K ORSTRT
    153         S OI=$G(ORX(1,$$PTR^ORCD("OR GTX ORDERABLE ITEM")))
    154         S PSOI=+$P($G(^ORD(101.43,+OI,0)),U,2),(XD,XH,XM,XS)=0
    155         S ORWD=+$G(^SC(+$G(ORL),42)) ;ward
    156         S ORI=0 F  S ORI=$O(ORX(ORI)) Q:ORI<1  D
    157         . S SCH=$G(ORX(ORI,ORSCH)),ORSD="" S:'$L(SCH) X=$$NOW^XLFDT
    158         . S:$L(SCH) ORSD=$$STARTSTP^PSJORPOE(+ORVP,SCH,PSOI,ORWD),X=$P(ORSD,U,4)
    159         . S ORSTRT(ORI)=$$FMADD^XLFDT(X,XD,XH,XM,XS) ;START+OFFSET
    160         . ; update OFFSET for next THEN dose
    161         . D DUR(ORI) I $G(ORX(ORI,ORCONJ))="T" D
    162         .. I $G(ORD("XD"))<1,$G(ORD("XH"))<1,$G(ORD("XM"))<1,$G(ORD("XS"))<1 S ORD("XD")=+$P(ORSD,U,3) ;default duration
    163         .. N I,Y F I="XD","XH","XM","XS" S Y=@I,@I=Y+$G(ORD(I))
    164         .. K ORD
    165         ; find beginning date.time for parent
    166         S ORI=0,X=9999999 F  S ORI=$O(ORSTRT(ORI)) Q:ORI<1  I ORSTRT(ORI)<X S X=ORSTRT(ORI)
    167         S ORSTRT("BEG")=X
    168         Q
    169 DUR(I)  ; Accumulate duration in ORD("Xt") for offsetting next THEN dose
    170         N X,Y S X=$$FMDUR^ORCDPS3($G(ORX(I,ORDUR)))
    171         I X["S",+X>$G(ORD("XS")) S ORD("XS")=+X
    172         I X["'",+X>$G(ORD("XM")) S ORD("XM")=+X
    173         I X["H",+X>$G(ORD("XH")) S ORD("XH")=+X
    174         S Y=$S(X["D":+X,X["W":+X*7,X["M":+X*30,1:0)
    175         I Y,Y>$G(ORD("XD")) S ORD("XD")=Y
    176         Q
    177 VBEC    ; Spawn VBECS children
    178         D:$L($T(EN^ORCSEND2)) EN^ORCSEND2
    179         Q
     1ORCSEND1 ;SLC/MKB-Release cont ;11/25/02  09:48
     2 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**4,29,45,61,79,94,116,138,158,149,187,215**;Dec 17, 1997
     3 ;
     4PKGSTUFF(PKG) ; Package code
     5 S PKG=$$GET1^DIQ(9.4,+PKG_",",1) Q:'$L(PKG)
     6 D:$L($T(@PKG)) @PKG
     7 Q
     8LR ; Spawn child orders if continuous schedule
     9 N ORSTRT,ORPARENT,OR0,ORNP,ORDIALOG,ORL,ORX,ORTIME,ORPITEM,ORPSAMP,ORPSPEC,ORPURG,ORPCOMM,ORPTYPE,ORPCOLL,ORS1,ORS2,P,ORCHLD,ORDG,ORLAST,ORDUZ,ORLOG,ORCOLLCT,STS
     10 S ORPARENT=+ORIFN,OR0=$G(^OR(100,ORIFN,0)),ORL=$P(OR0,U,10)
     11 D SCHEDULE(ORIFN,"LR",.ORSTRT) I ORSTRT'>1 D  Q
     12 . N START S START=$O(ORSTRT(0)) Q:START=$P($G(^OR(100,+ORIFN,0)),U,8)
     13 . D DATES^ORCSAVE2(+ORIFN,START) ;update start date from schedule
     14 S ORNP=+$P(OR0,U,4),ORDIALOG=+$P(OR0,U,5),ORDUZ=+$P(OR0,U,6),ORLOG=$P(OR0,U,7),ORDG=+$P(OR0,U,11)
     15 D GETDLG1^ORCD(ORDIALOG),GETORDER(ORIFN),GETIMES^ORCDLR1
     16 K ORDIALOG($$PTR^ORCD("OR GTX ADMIN SCHEDULE"),1),ORDIALOG($$PTR^ORCD("OR GTX DURATION"),1)
     17 S ORPITEM=$$PTR^ORCD("OR GTX ORDERABLE ITEM")
     18 S ORPSAMP=$$PTR^ORCD("OR GTX COLLECTION SAMPLE")
     19 S ORPSPEC=$$PTR^ORCD("OR GTX SPECIMEN")
     20 S ORPURG=$$PTR^ORCD("OR GTX LAB URGENCY")
     21 S ORPCOMM=$$PTR^ORCD("OR GTX WORD PROCESSING 1")
     22 S ORPTYPE=$$PTR^ORCD("OR GTX COLLECTION TYPE")
     23 S ORPCOLL=$$PTR^ORCD("OR GTX START DATE/TIME")
     24LR1 S ORS1=0 F  S ORS1=$O(ORX(ORS1)) Q:ORS1'>0  D
     25 . F P=ORPITEM,ORPSAMP,ORPSPEC,ORPURG,ORPCOMM,ORPTYPE S ORDIALOG(P,1)=$G(ORX(ORS1,P)) ;set values to next instance
     26 . S ORCOLLCT=$G(ORDIALOG(ORPTYPE,1))
     27 . S ORS2=0 F  S ORS2=$O(ORSTRT(ORS2)) Q:ORS2'>0  D
     28 .. S ORDIALOG(ORPCOLL,1)=ORS2 ;,ORDUZ=DUZ,ORLOG=+$E($$NOW^XLFDT,1,12)
     29 .. I ORCOLLCT="LC" S ORDIALOG(ORPTYPE,1)=$S($$LABCOLL^ORCDLR1(ORS2):"LC",1:"WC")
     30 .. I ORCOLLCT="I" S ORDIALOG(ORPTYPE,1)=$S($$IMMCOLL^ORCDLR1(ORS2):"I",1:"WC")
     31 .. D CHILD()
     32 S:$G(ORCHLD) ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
     33 S ORIFN=ORPARENT,ORQUIT=1,STS=$P(^OR(100,ORIFN,3),U,3)
     34 I (STS=1)!(STS=13)!(STS=11) S ORERR="1^Unable to release orders"
     35 D RELEASE^ORCSAVE2(ORPARENT,1,ORNOW,DUZ,$G(NATURE))
     36 Q
     37SCHEDULE(IFN,PKG,ORY,STRT) ; Returns list of start time(s) from schedule
     38 N I,X,PSJSD,PSJFD,PSJW,PSJNE,PSJPP,PSJX,PSJAT,PSJM,PSJTS,PSJY,PSJAX,PSJSCH,PSJOSD,PSJOFD,PSJC,ORDUR
     39 S PSJSD=$S(+$G(STRT):STRT,1:$P($G(^OR(100,+IFN,0)),U,8)) I 'PSJSD S ORY=-1 Q
     40 S ORY=1,ORY(PSJSD)="" ;1st occurrance
     41 S I=$O(^OR(100,+IFN,4.5,"ID","SCHEDULE",0)) Q:'I  Q:'$L($G(PKG))
     42 S X=$G(^OR(100,+IFN,4.5,I,1)),PSJX=$S(X:$$GET1^DIQ(51.1,+X_",",.01),1:X)
     43 S PSJW=+$G(ORL),PSJNE="",PSJPP=PKG D ENSV^PSJEEU Q:'$L($G(PSJX))
     44 I $G(PSJTS)'="C",$G(PSJTS)'="D" Q  ;not continuous or day-of-week
     45 S PSJSCH=PSJX,I=$O(^OR(100,+IFN,4.5,"ID","DAYS",0)) Q:'I
     46 S ORDUR=$G(^OR(100,+IFN,4.5,+I,1))
     47 S:ORDUR PSJFD=$$FMADD^XLFDT(PSJSD,+ORDUR,,-1)
     48 I 'ORDUR S X=+$E(ORDUR,2,9) D
     49 . I PSJM S PSJFD=$$FMADD^XLFDT(PSJSD,,,(PSJM*X)-1) ;X_#times
     50 . E  D  ;no freq in minutes --> day of week
     51 .. N DAYS,LOCMX,SCHMX
     52 .. S LOCMX=$$GET^XPAR("ALL^LOC.`"_+ORL,"LR MAX DAYS CONTINUOUS",1,"Q")
     53 .. S SCHMX=$P(^PS(51.1,PSJY,0),U,7)
     54 .. S DAYS=$S('SCHMX:LOCMX,LOCMX<SCHMX:LOCMX,1:SCHMX)
     55 .. S PSJFD=$$FMADD^XLFDT(PSJSD,DAYS,,-1)
     56 D ENSPU^PSJEEU K ORY
     57 I ORDUR M ORY=PSJC Q
     58 S ORY=$S(PSJC<$E(ORDUR,2,9):PSJC,1:$E(ORDUR,2,9))
     59 N NXT
     60 S NXT=0 F I=1:1:ORY S NXT=$O(PSJC(NXT)) Q:'NXT  S ORY(NXT)=PSJC(NXT)
     61 Q
     62GETORDER(IFN) ; Set ORX(Inst,Ptr)=Value
     63 N I,X,Y,PTR,INST,TYPE
     64 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
     65 . S PTR=+$P(X,U,2),INST=+$P(X,U,3),TYPE=$P($G(^ORD(101.41,PTR,1)),U)
     66 . I TYPE'="W" S ORX(INST,PTR)=Y Q
     67 . S ORX(INST,PTR)="^OR(100,"_IFN_",4.5,"_I_",2)"
     68 Q
     69PTR(X) ; Returns ptr of prompt X in Order Dialog file
     70 Q +$O(^ORD(101.41,"AB",$E("OR GTX "_X,1,63),0))
     71CHILD(STRT) ; Create child order, send to package
     72 N ORAPPT
     73 K ORIFN D EN^ORCSAVE Q:'$G(ORIFN)  D STARTDT^ORCSAVE2(ORIFN)
     74 I $G(STRT) D DATES^ORCSAVE2(ORIFN,STRT)
     75 S ORCHLD=+$G(ORCHLD)+1,^OR(100,ORPARENT,2,ORIFN,0)=ORIFN,ORLAST=ORIFN
     76 S ORAPPT=$P($G(^OR(100,ORPARENT,0)),U,18)
     77 S $P(^OR(100,ORIFN,0),U,18)=ORAPPT,$P(^(3),U,9)=ORPARENT
     78 I $G(PKG)="LR" S $P(^OR(100,ORIFN,8,1,0),U,4)=8 K ^OR(100,"AS",ORVP,9999999-ORLOG,ORIFN,1) ;signature tracked on parent order only, for Labs
     79 I $G(PKG)?1"PS".E D
     80 . N X0,OLD S X0=$G(^OR(100,ORPARENT,8,1,0))
     81 . I $P(X0,U,4)'=2 D SIGN^ORCSAVE2(ORIFN,+$P(X0,U,5),ORNOW,$P(X0,U,4),1)
     82 . I $D(^OR(100,ORPARENT,9)) M ^OR(100,ORIFN,9)=^OR(100,ORPARENT,9)
     83 . 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)
     84 D RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$G(NATURE)),NEW^ORMBLD(ORIFN)
     85 Q
     86PS ; spawn child orders if multiple doses
     87PSJ ; (Inpt only)
     88PSS ;
     89 N ORPARENT,OR0,ORNP,ORDIALOG,ORDUZ,ORLOG,ORL,ORDG,ORCAT,ORX,ORP,ORI,STS
     90 N ORDOSE,ORT,ORSCH,ORDUR,ORSTRT,ORFRST,ORCONJ,ORID,ORDD,ORSTR,ORDGNM
     91 N ORSTART,ORCHLD,ORLAST,ORSIG,OROI,ID,OR3,ORIG,CODE,ORPKG,ORENEW,I
     92 S ORPARENT=+ORIFN,OR0=$G(^OR(100,ORPARENT,0)),OR3=$G(^(3))
     93 Q:$P(OR0,U,12)'="I"  S ORCAT="I",ORNP=+$P(OR0,U,4)
     94 S ORDIALOG=+$P(OR0,U,5),ORDUZ=+$P(OR0,U,6),ORLOG=$P(OR0,U,7)
     95 S ORL=$P(OR0,U,10),ORDG=+$P(OR0,U,11),ORPKG=+$P(OR0,U,14)
     96 D GETDLG1^ORCD(ORDIALOG),GETORDER(ORPARENT)
     97 S ORDOSE=$$PTR("INSTRUCTIONS"),ORT=$$PTR("ROUTE")
     98 S ORSCH=$$PTR("SCHEDULE"),ORDUR=$$PTR("DURATION")
     99 S ORCONJ=$$PTR("AND/THEN") D STRT S ORSTART=$G(ORSTRT("BEG"))
     100 D DATES^ORCSAVE2(ORPARENT,ORSTART) Q:$$DOSES(ORPARENT)'>1
     101 S ORFRST=$$PTR("NOW"),ORSIG=$$PTR("SIG")
     102 S ORID=$$PTR("DOSE"),ORDD=$$PTR("DISPENSE DRUG")
     103 S ORSTR=$$PTR("STRENGTH"),ORDGNM=$$PTR("DRUG NAME")
     104 I $P(OR3,U,11)=2,$O(^OR(100,+$P(OR3,U,5),2,0)) D
     105 . S ORENEW=+$P(OR3,U,5),I=0
     106 . I $$VALUE^ORX8(ORENEW,"NOW") S I=$O(^OR(100,ORENEW,2,0))
     107 . F  S I=$O(^OR(100,ORENEW,2,I)) Q:I<1  S ORENEW(I)=""
     108PS1 F ORP="ORDERABLE ITEM","URGENCY","WORD PROCESSING 1" D
     109 . N PTR S PTR=$$PTR(ORP) Q:PTR'>0  Q:'$D(ORX(1,PTR))
     110 . S ORDIALOG(PTR,1)=ORX(1,PTR) S:$E(ORP)="O" OROI=ORX(1,PTR)
     111 S ORI=$$FRSTDOSE I $G(ORX(1,ORFRST)) D
     112 . F ORP=ORDOSE,ORT,ORID S:$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)=ORX(ORI,ORP)
     113 . S ID=$G(ORX(ORI,ORID)) S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
     114 . S ORDIALOG(ORSCH,1)="NOW",ORSTART=$$NOW^XLFDT
     115 . D SIG,CHILD(ORSTART)
     116 F  D  S ORI=$O(ORX(ORI)) Q:ORI'>0
     117 . F ORP=ORDOSE,ORT,ORSCH,ORDUR,ORID S:$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)=ORX(ORI,ORP) K:'$D(ORX(ORI,ORP)) ORDIALOG(ORP,1)
     118 . K ORDIALOG(ORDD,1) S ID=$G(ORX(ORI,ORID))
     119 . S:$P(ID,"&",6) ORDIALOG(ORDD,1)=$P(ID,"&",6)
     120 . S ORSTART=$G(ORSTRT(ORI))
     121 . D SIG,CHILD(ORSTART)
     122 S:$G(ORCHLD) ^OR(100,ORPARENT,2,0)="^100.002PA^"_ORLAST_U_ORCHLD
     123 S ORIFN=ORPARENT,ORQUIT=1,OR3=$G(^OR(100,ORIFN,3)),STS=$P(OR3,U,3)
     124 I (STS=1)!(STS=13)!(STS=11) S ORERR="1^Unable to release orders"
     125 D RELEASE^ORCSAVE2(ORIFN,1,ORNOW,DUZ,$G(NATURE)) K ^TMP("ORWORD",$J)
     126 S $P(^OR(100,ORIFN,3),U,8)=1 ;veil parent order - set stop date/time?
     127 Q:(STS=1)!(STS=13)!(STS=11)  ;unsuccessful
     128PS2 ; ck if parent is unsigned or edit
     129 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
     130 Q:$P(OR3,U,11)'=1  S ORIG=$P(OR3,U,5) Q:ORIG'>0
     131 S CODE=$S($P($G(^OR(100,ORIG,3)),U,3)=5:"CA",1:"DC")
     132 D MSG^ORMBLD(ORIG,CODE) I "^1^13^"[(U_$P($G(^OR(100,ORIG,3)),U,3)_U) D
     133 . N NATR S NATR=+$O(^ORD(100.02,"C","C",0))
     134 . S $P(^OR(100,ORIG,3),U,3)=12,$P(^(3),U,7)=0,^(6)=NATR_U_DUZ_U_ORNOW
     135 . D CANCEL^ORCSEND(ORIG) ;ck for unrel actions
     136 Q
     137DOSES(IFN) ; count number of doses in order
     138 N I,CNT S CNT=0
     139 S I=0 F  S I=$O(^OR(100,+$G(IFN),4.5,"ID","INSTR",I)) Q:I'>0  I $L($G(^OR(100,+$G(IFN),4.5,I,1))) S CNT=CNT+1
     140 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
     141 Q CNT
     142FRSTDOSE() ; Return instance of first dose
     143 N I,Y S I=0,Y=1
     144 F  S I=$O(ORX(I)) Q:I'>0  I $D(ORX(I,ORDOSE)) S Y=I Q
     145 Q Y
     146SIG ; Build text of instructions
     147 N ORDRUG,ID,DOSE,ORI,ORX K ^TMP("ORWORD",$J,ORSIG,1)
     148 S ORDRUG=$G(ORDIALOG(ORDD,1)),ID=$G(ORDIALOG(ORID,1))
     149 S DOSE=$G(ORDIALOG(ORDOSE,1)),ORI=1
     150 S ORX=$$DOSE^ORCDPS2_$$RTE^ORCDPS2_$$SCH^ORCDPS2_$$DUR^ORCDPS2
     151 S ^TMP("ORWORD",$J,ORSIG,1,0)="^^1^1^"_DT_U,^(1,0)=ORX
     152 S ORDIALOG(ORSIG,1)=$NA(^TMP("ORWORD",$J,ORSIG,1))
     153 S ORDIALOG(ORDOSE,"FORMAT")="@"
     154 K ORDIALOG(ORSTR,1),ORDIALOG(ORDGNM,1)
     155 I ORDRUG,'ID D  ;set strength or drug name
     156 . N STR,ITM S STR=$P(ID,"&",7)_$P(ID,"&",8)
     157 . I STR'>0 S ORDIALOG(ORDGNM,1)=$$GET1^DIQ(50,+ORDRUG_",",.01) Q
     158 . S ITM=$P($G(^ORD(101.43,+$G(OROI),0)),U)
     159 . S:ITM'[STR ORDIALOG(ORSTR,1)=STR
     160 Q
     161STRT ; Build ORSTRT(inst)=date.time array of start times by dose
     162 N OI,PSOI,XD,XH,XM,XS,ORWD,ORI,SCH,ORSD,X,ORD K ORSTRT
     163 S OI=$G(ORX(1,$$PTR^ORCD("OR GTX ORDERABLE ITEM")))
     164 S PSOI=+$P($G(^ORD(101.43,+OI,0)),U,2),(XD,XH,XM,XS)=0
     165 S ORWD=+$G(^SC(+$G(ORL),42)) ;ward
     166 S ORI=0 F  S ORI=$O(ORX(ORI)) Q:ORI<1  D
     167 . S SCH=$G(ORX(ORI,ORSCH)),ORSD="" S:'$L(SCH) X=$$NOW^XLFDT
     168 . S:$L(SCH) ORSD=$$STARTSTP^PSJORPOE(+ORVP,SCH,PSOI,ORWD),X=$P(ORSD,U,4)
     169 . S ORSTRT(ORI)=$$FMADD^XLFDT(X,XD,XH,XM,XS) ;START+OFFSET
     170 . ; update OFFSET for next THEN dose
     171 . D DUR(ORI) I $G(ORX(ORI,ORCONJ))="T" D
     172 .. I $G(ORD("XD"))<1,$G(ORD("XH"))<1,$G(ORD("XM"))<1,$G(ORD("XS"))<1 S ORD("XD")=+$P(ORSD,U,3) ;default duration
     173 .. N I,Y F I="XD","XH","XM","XS" S Y=@I,@I=Y+$G(ORD(I))
     174 .. K ORD
     175 ; find beginning date.time for parent
     176 S ORI=0,X=9999999 F  S ORI=$O(ORSTRT(ORI)) Q:ORI<1  I ORSTRT(ORI)<X S X=ORSTRT(ORI)
     177 S ORSTRT("BEG")=X
     178 Q
     179DUR(I) ; Accumulate duration in ORD("Xt") for offsetting next THEN dose
     180 N X,Y S X=$$FMDUR^ORCDPS3($G(ORX(I,ORDUR)))
     181 I X["S",+X>$G(ORD("XS")) S ORD("XS")=+X
     182 I X["'",+X>$G(ORD("XM")) S ORD("XM")=+X
     183 I X["H",+X>$G(ORD("XH")) S ORD("XH")=+X
     184 S Y=$S(X["D":+X,X["W":+X*7,X["M":+X*30,1:0)
     185 I Y,Y>$G(ORD("XD")) S ORD("XD")=Y
     186 Q
     187VBEC ; Spawn VBECS children
     188 D:$L($T(EN^ORCSEND2)) EN^ORCSEND2
     189 Q
Note: See TracChangeset for help on using the changeset viewer.