| 1 | ORCHART ;SLC/MKB/REV-OE/RR ; 11 March 2003 14:02 | 
|---|
| 2 | ;;3.0;ORDER ENTRY/RESULTS REPORTING;**7,27,48,70,72,92,141,181**;Dec 17, 1997 | 
|---|
| 3 | EN ; -- main entry point | 
|---|
| 4 | K ^TMP("OR",$J) ;ensure fresh start | 
|---|
| 5 | D EN^ORQPT Q:+$G(ORVP)'>0 | 
|---|
| 6 | D EN^VALM("OR CHART") G:'$G(OREXIT) EN | 
|---|
| 7 | K OREXIT | 
|---|
| 8 | Q | 
|---|
| 9 | ; | 
|---|
| 10 | INIT ; -- init variables and list array | 
|---|
| 11 | S:'$D(ORTAB) ORTAB=$$UP^XLFSTR($$GET^XPAR("ALL","ORCH INITIAL TAB",1,"E")) | 
|---|
| 12 | S:ORTAB="DCSUMM" ORTAB="SUMMRIES" S:'$L(ORTAB) ORTAB="COVER" | 
|---|
| 13 | S ORACTION=0 D TAB(ORTAB) | 
|---|
| 14 | Q | 
|---|
| 15 | ; | 
|---|
| 16 | PHDR ; -- protocol header code | 
|---|
| 17 | N ORM,ORI,ORS,ORSYN K ORNMBR,OREBUILD | 
|---|
| 18 | S:$G(ORTAB)'="LABS" VALMSG=$$MSG D SHOW^VALM | 
|---|
| 19 | S:XQORM("B")="Quit" XQORM("B")=$S('$G(DGPMT):"Chart Contents",1:"Close Patient Chart") | 
|---|
| 20 | S:$G(^TMP("OR",$J,"CURRENT","#")) XQORM("#")=^("#") | 
|---|
| 21 | S ORM=$S(ORTAB="CONSULTS":+$O(^ORD(101,"B","ORC CONSULT SERVICE MENU",0)),1:+$G(XQORM("#"))),ORI=0 ;set XQORM("KEY",<synonym>) | 
|---|
| 22 | F  S ORI=$O(^ORD(101,ORM,10,"B",ORI)) Q:ORI'>0  I $D(^ORD(101,+ORI,2)) D | 
|---|
| 23 | . S ORS=0 F  S ORS=$O(^ORD(101,+ORI,2,ORS)) Q:ORS'>0  S ORSYN=$G(^(ORS,0)) S:$L(ORSYN) XQORM("KEY",ORSYN)=+ORI_"^1" | 
|---|
| 24 | S XQORM("KEY","EX")=$O(^ORD(101,"B","ORC EXIT",0))_"^1" | 
|---|
| 25 | S XQORM("KEY","NEXT")=$O(^ORD(101,"B","ORC NEXT SCREEN",0))_"^1" | 
|---|
| 26 | S XQORM("KEY","PL")=$O(^ORD(101,"B","ORC PRINT LIST",0))_"^1" | 
|---|
| 27 | Q | 
|---|
| 28 | ; | 
|---|
| 29 | HDR ; -- header code | 
|---|
| 30 | ;    Expects ORPNM, ORSSN, ORL, ORDOB, ORAGE [, ORPD] | 
|---|
| 31 | ;    N DFN S DFN=+ORVP D SLCT1^ORQPT if any are missing ?? | 
|---|
| 32 | N ORX,ORX1,ORX2,ORX3,ORCWAD,L,SP K VALMHDR | 
|---|
| 33 | S ORX1=$P($G(^DPT(+ORVP,0)),U,3),ORX3=$$FMTE^XLFDT(ORX1,2)_"("_ORAGE_")" | 
|---|
| 34 | S ORX2="" I +$G(ORL) D  S:$L($G(ORL(1))) ORX2=ORX2_"/"_ORL(1) | 
|---|
| 35 | . S L=$G(^SC(+ORL,0)),ORX2=$P(L,U,2) | 
|---|
| 36 | . S:'$L(ORX2) ORX2=$E($P(L,U),1,4) | 
|---|
| 37 | S L=80-$L(ORPNM)-$L(ORSSN)-$L(ORX2)-$L(ORX3),SP=$$REPEAT^XLFSTR(" ",L\3) | 
|---|
| 38 | S ORX1=ORPNM_SP_ORSSN_SP_ORX2,VALMHDR(1)=ORX1_$J(ORX3,80-$L(ORX1)) | 
|---|
| 39 | S ORX1=$S(ORATTEND:"Attend: "_$$LNAMEF^ORCHTAB(ORATTEND),1:"") | 
|---|
| 40 | S ORX2="PrimCare: "_$$LNAMEF^ORCHTAB(+$$OUTPTPR^SDUTL3(+ORVP)) | 
|---|
| 41 | S ORX3="PCTeam: "_$P($$OUTPTTM^SDUTL3(+ORVP),U,2) | 
|---|
| 42 | S ORX=$S($L(ORX1):$$LJ^XLFSTR(ORX1,20),1:"")_ORX2,VALMHDR(2)=$$LJ^XLFSTR(ORX,42)_ORX3 | 
|---|
| 43 | S ORCWAD=$$CWAD^ORQPT2(+ORVP) S:ORCWAD]"" ORCWAD="<"_ORCWAD_">" | 
|---|
| 44 | S ORX=$S($G(ORTAB)="COVER":"",$G(ORTAB)="REPORTS":"",1:$$VIEW),VALMHDR(3)=ORX_$J(ORCWAD,80-$L(ORX)) | 
|---|
| 45 | Q | 
|---|
| 46 | ; | 
|---|
| 47 | MSG() ; -- LMgr message bar | 
|---|
| 48 | Q "Enter the numbers of the items you wish to act on." | 
|---|
| 49 | ; | 
|---|
| 50 | HELP ; -- help code | 
|---|
| 51 | N X,DX,DY D FULL^VALM1 | 
|---|
| 52 | W !!,"Enter the display numbers of the items you wish to change or act on; a menu of",!,"available actions will then be presented for selection." | 
|---|
| 53 | W !!,"To see a different 'page' of the chart, enter CC; if you'd like another view of",!,"the current page, by date range for example, enter CV.  You may add new orders" | 
|---|
| 54 | W !,"for this patient from any page in the chart by entering AD and review them",!,"using RV.  Enter ?? to see a list of actions available for navigating the list." | 
|---|
| 55 | W:ORTAB="PROBLEMS" !!,"* = Acute problem",!,"$ = Unverified problem",!,"# = Problem references inactive code" | 
|---|
| 56 | W:(ORTAB="SUMMRIES")!(ORTAB="NOTES") !!,"+ = Addenda attached" | 
|---|
| 57 | W:(ORTAB="ORDERS")!(ORTAB="MEDS") !!,"* = Order has been updated by service" | 
|---|
| 58 | W:ORTAB="ORDERS" !,"+ = Sub-orders exist" | 
|---|
| 59 | W !!,"Press <return> to continue ..." R X:DTIME | 
|---|
| 60 | S VALMBCK="R" S:$G(ORTAB)'="LABS" VALMSG=$$MSG | 
|---|
| 61 | S (DX,DY)=0 X ^%ZOSF("XY") | 
|---|
| 62 | Q | 
|---|
| 63 | ; | 
|---|
| 64 | ITEMHELP ; -- help code for action menus | 
|---|
| 65 | N X | 
|---|
| 66 | W !!,"Enter the action you wish to take on the items selected and highlighted",!,"above; each item will be processed in order, one at a time." | 
|---|
| 67 | W !!,"Press <return> to continue ..." R X:DTIME | 
|---|
| 68 | S X="?" D DISP^XQORM1 W ! | 
|---|
| 69 | Q | 
|---|
| 70 | ; | 
|---|
| 71 | EXIT ; -- exit code | 
|---|
| 72 | I $G(ORVP),$$MORE^ORCMENU2 D  ;unsig orders | 
|---|
| 73 | . ;I '$D(^TMP("ORNEW",$J)),'$D(^XUSEC("ORES",DUZ)) Q  ;msg like 2.5?? | 
|---|
| 74 | . W !!,"You have new or unsigned orders for this patient!" H 1 | 
|---|
| 75 | . S ORRV=1 D EN1^ORCMENU2,NOTIF^ORCMENU2 ;sign, notif if not all signed | 
|---|
| 76 | D UNLOCK^ORX2(+ORVP) K ^TMP("OR",$J),^TMP("ORNEW",$J),^TMP("LRRR",$J) | 
|---|
| 77 | K VALMCNT,VALMHDR,VALMBG,ORQUIT,ORVP,ORSEX,ORTAB,ORPNM,ORSSN,ORL,ORDOB,ORAGE,ORPD,ORNP,ORSC,ORTS,ORWARD,ORATTEND,ORNMBR,ORACTION,OREBUILD,OREBLD,ORRV,OREVENT | 
|---|
| 78 | Q | 
|---|
| 79 | ; | 
|---|
| 80 | TAB(NEWTAB,REBUILD) ; -- switch focus to new chart tab from ORTAB | 
|---|
| 81 | S VALMBCK="",VALMBG=$S($G(ORTAB)'=NEWTAB:1,'$G(VALMBG):1,1:VALMBG) | 
|---|
| 82 | S ORTAB=NEWTAB I '$G(^TMP("OR",$J,ORTAB,0))!($G(REBUILD)) D | 
|---|
| 83 | . W !,"Searching the patient's chart ..." | 
|---|
| 84 | . D FULL^VALM1,EN^ORCHTAB ; [re]build list | 
|---|
| 85 | D CLEAN^VALM10 M ^TMP("OR",$J,"CURRENT")=^TMP("OR",$J,ORTAB) | 
|---|
| 86 | M ^TMP("VALM VIDEO",$J,VALMEVL)=^TMP("OR",$J,"CURRENT","VIDEO") | 
|---|
| 87 | I $D(^TMP("OR",$J,"CURRENT","CAPTION")) D | 
|---|
| 88 | . N FLD,LBL S FLD="" | 
|---|
| 89 | . F  S FLD=$O(^TMP("OR",$J,"CURRENT","CAPTION",FLD)) Q:FLD=""  S LBL=$G(^(FLD)) D CHGCAP^VALM(FLD,LBL) | 
|---|
| 90 | S VALM("TITLE")=$G(^TMP("OR",$J,"CURRENT","TITLE")),VALM("RM")=^("RM") | 
|---|
| 91 | S:$D(^TMP("OR",$J,"CURRENT","MENU")) XQORM("HIJACK")=^("MENU") | 
|---|
| 92 | S VALMCNT=+$G(^TMP("OR",$J,"CURRENT",0)),VALMLFT=$P(VALMDDF("DATA"),U,2) | 
|---|
| 93 | D HDR S VALMBCK="R" ; reset VALMHDR nodes | 
|---|
| 94 | Q | 
|---|
| 95 | ; | 
|---|
| 96 | NEWPAT ; -- Select new patient | 
|---|
| 97 | I $$MORE^ORCMENU2 D  ;unsigned orders | 
|---|
| 98 | . ;I '$D(^TMP("ORNEW",$J)),'$D(^XUSEC("ORES",DUZ)) Q | 
|---|
| 99 | . W !!,"You have new or unsigned orders for this patient!" H 1 | 
|---|
| 100 | . S ORRV=1 D EN1^ORCMENU2,NOTIF^ORCMENU2 ;sign, notif if not all signed | 
|---|
| 101 | N TAB,OLD,T,ORT,CTXT K ORRV S OLD=+ORVP,TAB=ORTAB | 
|---|
| 102 | D EN^ORQPT I OLD=+ORVP S VALMBCK="R" D:$G(OREBUILD) REBLD^ORCMENU K OREBUILD Q  ; no change | 
|---|
| 103 | S T="" F  S T=$O(^TMP("OR",$J,T)) Q:T=""  D | 
|---|
| 104 | . I T="MEDS" K ^TMP("OR",$J,T) Q | 
|---|
| 105 | . S CTXT=$P($G(^TMP("OR",$J,T,0)),U,3) S:$L(CTXT) ORT(T,0)="^^"_$S(T="NOTES"&($P(CTXT,";",3)=1):"",1:CTXT)_U_$P(^(0),U,4) ; save tab contexts | 
|---|
| 106 | D UNLOCK^ORX2(+ORVP) K ^TMP("OR",$J),^TMP("ORNEW",$J),^TMP("LRRR",$J) | 
|---|
| 107 | K VALMHDR,ORTAB,ORNEW,OREBUILD,OREBLD | 
|---|
| 108 | M ^TMP("OR",$J)=ORT D TAB(TAB) S VALMBCK="R" | 
|---|
| 109 | Q | 
|---|
| 110 | ; | 
|---|
| 111 | ORDERS(ACTION) ; -- Return order numbers to act on, if action chosen first | 
|---|
| 112 | N X,Y,DIR,MAX S:'$L($G(ACTION)) ACTION="act on" | 
|---|
| 113 | S MAX=+$P($G(^TMP("OR",$J,ORTAB,0)),U,2) Q:MAX'>0 "^" | 
|---|
| 114 | S DIR(0)="LAO^1:"_MAX,DIR("A")="Select item(s): " S:MAX=1 DIR("B")=1 | 
|---|
| 115 | S DIR("?")="Enter the items you wish to "_ACTION_", as a range or list of numbers" | 
|---|
| 116 | D ^DIR S:$D(DTOUT)!(Y="") Y="^" | 
|---|
| 117 | Q Y | 
|---|
| 118 | ; | 
|---|
| 119 | ALL ; -- Return all items on ORTAB | 
|---|
| 120 | N X,Y,DIR,MAX | 
|---|
| 121 | S MAX=+$P($G(^TMP("OR",$J,ORTAB,0)),U,2) Q:MAX'>0 "" | 
|---|
| 122 | S DIR(0)="L^1:"_MAX,DIR("V")="",X="1-"_MAX D ^DIR | 
|---|
| 123 | Q Y | 
|---|
| 124 | ; | 
|---|
| 125 | SELECT(NMBR) ; -- rev video on selected items | 
|---|
| 126 | N ORI,ORJ,NUM,ROW,ROWS,VALID S VALID=0 | 
|---|
| 127 | F ORI=1:1:$L(NMBR,",") S NUM=$P(NMBR,",",ORI) I NUM D | 
|---|
| 128 | . I '$L($P($G(@VALMAR@("IDX",NUM)),U)) W !,NUM_" is not a valid selection." H 2 Q | 
|---|
| 129 | . S VALID=1 | 
|---|
| 130 | . S ROW=$P(@VALMAR@("IDX",NUM),U,2),ROWS=$P(^(NUM),U,3) | 
|---|
| 131 | . F ORJ=ROW:1:(ROW+ROWS-1) I ORJ'<VALMBG,ORJ'>(VALMBG+VALM("LINES")-1) D | 
|---|
| 132 | . . K ^TMP("VALM VIDEO",$J,VALMEVL,ORJ) | 
|---|
| 133 | . . D CNTRL^VALM10(ORJ,1,80,IORVON,IORVOFF) | 
|---|
| 134 | . . D WRITE^VALM10(ORJ) | 
|---|
| 135 | I 'VALID S XQORQUIT=1 | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | DESELECT(NMBR) ; -- norm video on selected items | 
|---|
| 139 | N ORI,ORJ,NUM,IFN,ROW,ROWS,ON,OFF,I,IDX | 
|---|
| 140 | F ORI=1:1:$L(NMBR,",") S NUM=$P(NMBR,",",ORI) I NUM D | 
|---|
| 141 | . S IDX=$G(@VALMAR@("IDX",NUM)) Q:'$L(IDX)  ;invalid NUM | 
|---|
| 142 | . S IFN=$P(IDX,U),ROW=$P(IDX,U,2),ROWS=$P(IDX,U,3) | 
|---|
| 143 | . F ORJ=ROW:1:(ROW+ROWS-1) I ORJ'<VALMBG,ORJ'>(VALMBG+VALM("LINES")-1) D | 
|---|
| 144 | . . K ^TMP("VALM VIDEO",$J,VALMEVL,ORJ) Q:'$L(IFN)  ;deleted | 
|---|
| 145 | . . S ON=IOINHI,OFF=IOINORM | 
|---|
| 146 | . . I ORTAB="ORDERS",$G(^OR(100,+IFN,8,+$P(IFN,";",2),3)) S ON=IORVON,OFF=IORVOFF ; flagged | 
|---|
| 147 | . . D CNTRL^VALM10(ORJ,1,5,ON,OFF) | 
|---|
| 148 | . . I ORTAB="ORDERS" S I=$F(^TMP("OR",$J,ORTAB,ORJ,0),"*UNSIGNED*") I I D CNTRL^VALM10(ORJ,I-10,10,IOINHI,IOINORM) | 
|---|
| 149 | . . I ORTAB="XRAYS" S I=$F(^TMP("OR",$J,ORTAB,ORJ,0),"*ABNORMAL*") I I D CNTRL^VALM10(ORJ,I-10,10,IOINHI,IOINORM) | 
|---|
| 150 | . . I ORTAB="LABS" D CNTRL^VALM10(ORJ,24,2,IOINHI,IOINORM) | 
|---|
| 151 | . . D:VALMBCK="" WRITE^VALM10(ORJ) | 
|---|
| 152 | Q | 
|---|
| 153 | ; | 
|---|
| 154 | CHANGE ; -- Change view of current list | 
|---|
| 155 | G EN^ORCHANGE | 
|---|
| 156 | Q | 
|---|
| 157 | ; | 
|---|
| 158 | REV(ORVP) ; -- Review orders for patient | 
|---|
| 159 | Q:'$G(ORVP)  Q:$D(ZTQUEUED)  Q:$G(DGQUIET)  ;silent | 
|---|
| 160 | I $D(SDAMEVT) Q:$S(SDAMEVT=1:0,1:1)  ;continue if new appt | 
|---|
| 161 | Q:'$$GET^XPAR("ALL","ORPF REVIEW ON PATIENT MVMT") | 
|---|
| 162 | Q:'$$ACCESS^ORCHTAB  ;CPRS not in user's option menu tree | 
|---|
| 163 | N X,Y,DIR,DTOUT,DUOUT,DIRUT,DIROUT,DFN ;protect DFN | 
|---|
| 164 | S DFN=+ORVP,ORVP=DFN_";DPT("  Q:'$D(^OR(100,"AC",ORVP))  ; no orders | 
|---|
| 165 | S DIR(0)="YA",DIR("A")="Review active orders? ",DIR("B")="YES" | 
|---|
| 166 | S DIR("?")="Answer YES to review this patient's active orders" | 
|---|
| 167 | D ^DIR Q:Y'>0  K DIR | 
|---|
| 168 | D SLCT1^ORQPT Q:'$G(ORVP) | 
|---|
| 169 | S ORTAB="ORDERS" D EN^VALM("OR CHART") | 
|---|
| 170 | Q | 
|---|
| 171 | ; | 
|---|
| 172 | VIEW() ; -- return line 3 of header w/current view of tab | 
|---|
| 173 | N BEGIN,END,ITEMS,STS,TEXT,X | 
|---|
| 174 | I $G(ORTAB)']"" Q "" | 
|---|
| 175 | S X=$P($G(^TMP("OR",$J,ORTAB,0)),U,3),TEXT="" | 
|---|
| 176 | S BEGIN=$P(X,";"),END=$P(X,";",2),STS=$P(X,";",3),ITEMS=$P(X,";",5) | 
|---|
| 177 | I ORTAB="NOTES",(STS'=5) S TEXT=$S(ITEMS:"up to "_ITEMS,1:"all")_$S(STS=1:" notes",STS=2:" unsigned notes",STS=3:" uncosigned notes",STS=4:" signed notes by author",1:"") | 
|---|
| 178 | E  D | 
|---|
| 179 | . S:$L(BEGIN)!$L(END) TEXT=$$FDATE^VALM1($$DT^ORCHTAB1(BEGIN))_" thru "_$$FDATE^VALM1($$DT^ORCHTAB1(END)) | 
|---|
| 180 | . I ORTAB="XRAYS",ITEMS>0 S TEXT=$S($L(TEXT):TEXT_", ",1:"")_"limit "_ITEMS | 
|---|
| 181 | S:$L(TEXT) TEXT="Current View: "_TEXT,TEXT=$J(TEXT,40+($L(TEXT)\2)) | 
|---|
| 182 | Q TEXT | 
|---|