ORWGTASK ; SLC/STAFF - Graph Task ;3/17/08  10:48
 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**243**;Dec 17, 1997;Build 242
 ;
SETLAST(PAT) ; from ORWGAPI - set whenever patient is graphed
 N NOW,USER
 S PAT=+$G(PAT)
 S USER=+$G(DUZ)
 S NOW=$$NOW^ORWGAPIX
 I USER,PAT D
 . S ^XTMP("ORGDATA","TP",PAT)=NOW
 . S ^XTMP("ORGDATA","TP",PAT,"U",USER)=NOW
 . S ^XTMP("ORGDATA","TU",USER)=NOW
 . D COUNT("G",PAT,USER)
 Q
 ;
INIT(OK) ; from ORMTIM02 - run by ORMTIME (OK=0) 
 N BACKTO,CNT,DFN,ITEM,LASTDFN,NOW,PURGE,TASKED,TIME
 S OK=+$G(OK,0)
 I $G(^XTMP("ORGRAPH","FORCE"))="ON" D  ; set in ORY243 (post-init v27)
 . S OK=1
 . D CLEANALL
 I 'OK D  ; unless forced, run one time on Saturday
 . I $P($G(^XTMP("ORGRAPH",0)),U,2)=DT Q
 . I $E(DT,6)="0",$$DOW^XLFDT(DT)="Saturday",$L($G(^XTMP("ORGRAPH",0))) D  Q  ; cleanup on 1st Sat of the month
 .. S OK=1
 .. D CLEANALL
 . I $$DOW^XLFDT(DT)="Saturday",$L($G(^XTMP("ORGRAPH",0))) S OK=1 Q
 I 'OK Q
 S BACKTO=$$FMADD^XLFDT(DT,-30) ;clear old data on non-graphed patients backto this date 
 S PURGE=$$FMADD^XLFDT(DT,180) ; when to purge XTMP nodes
 S NOW=$$NOW^ORWGAPIX
 S ^XTMP("ORGDATA",0)=PURGE_U_DT_U_"CPRS Graphing - Patient Data Cache Stats"_U_NOW
 S ^XTMP("ORGRAPH",0)=PURGE_U_DT_U_"CPRS Graphing - Patient Data Cache"
 S CNT=0
 S LASTDFN=0
 S DFN=""
 F  S DFN=$O(^XTMP("ORGDATA","TP",DFN)) Q:DFN=""  D
 . S TIME=$O(^XTMP("ORGDATA","TP",DFN))
 . I '$L(TIME) Q
 . I TIME<BACKTO D CLRDATA(DFN) Q
 . S ^XTMP("ORGRAPH","QUEUE",NOW_"^0^"_DFN)=NOW ; put patients to update on queue
 . S LASTDFN=DFN
 . S CNT=CNT+1
 . S OK=1
 D UPDATE(.TASKED,LASTDFN,0,0) ; last patient starts the updates
 S ^XTMP("ORGRAPH","INIT")=NOW_U_$$NOW^ORWGAPIX_U_CNT
 S ^XTMP("ORGDATA",0)=^XTMP("ORGDATA",0)_U_$$NOW^ORWGAPIX_U_CNT
 Q
 ;
CLEANALL ;
 K ^XTMP("ORGDATA")
 K ^XTMP("ORGRAPH")
 Q
 ;
CLRDATA(DFN) ;
 N PATUSER,USER
 S USER=.9
 F  S USER=$O(^XTMP("ORGDATA","TP",DFN,"U",USER)) Q:USER<1  D
 . S PATUSER=DFN_U_USER
 . K ^XTMP("ORGRAPH","ALL DATA",PATUSER)
 . K ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
 . K ^XTMP("ORGRAPH","ALL LABS",PATUSER)
 . K ^XTMP("ORGRAPH","OLD DATA",DFN)
 . K ^XTMP("ORGRAPH","OLD LABS",DFN)
 K ^XTMP("ORGDATA","TP",DFN)
 Q
 ;
UPDATE(TASKED,DFN,USER,OLDDFN) ; from ORWGAPI
 ; whenever patient is selected
 ; to update, cache must exist and user/patient combo has used graphs
 ;D CLEANALL Q  ; ******** temporary disabled BA 1/16/08 *********
 N NOW,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE K ZTSAVE
 ;S ^XTMP("ZZZBOB")=$G(TASKED)_U_$G(DFN)_U_$G(USER)_U_$G(OLDDFN)
 S TASKED=-1 ; cache turned off
 I '$L($G(^XTMP("ORGRAPH",0))) Q
 S TASKED=0 ; not building cache
 I USER,DFN D COUNT("P",DFN,USER)
 I USER,'$G(^XTMP("ORGDATA","TU",USER)) Q  ; user must use graphing to cache
 I USER,OLDDFN D CLEARPT(OLDDFN,USER)
 I 'DFN Q
 I '$G(^XTMP("ORGDATA","TP",DFN)) Q  ; patient must be used with graphing to cache
 I USER,'$G(^XTMP("ORGDATA","TP",DFN,"U",USER)) Q  ; pat/user combo to cache **** comment this out for better graph speed - but more cache
 S TASKED=1 ; building cache
 S NOW=$$NOW^ORWGAPIX
 I USER D CLEARPT(DFN,USER)
 S ZTIO="ORWG GRAPHING RESOURCE",ZTDTH=$H,ZTDESC="process graph data"
 S ZTSAVE("ORMTIME")=$$MNOW
 S ZTSAVE("ORPAT")=DFN
 S ZTSAVE("ORTSTMP")=NOW
 S ZTSAVE("ORUSER")=USER
 S ZTRTN="UP^ORWGTASK"
 D ^%ZTLOAD
 Q
 ;
COUNT(EVENT,DFN,USER) ;
 I EVENT="P" D  Q
 . S ^("C")=1+$G(^XTMP("ORGDATA","P",DFN,"C"))
 . S ^(USER)=1+$G(^XTMP("ORGDATA","P",DFN,"C-U",USER))
 . S ^("C")=1+$G(^XTMP("ORGDATA","U",USER,"C"))
 . S ^(DFN)=1+$G(^XTMP("ORGDATA","U",USER,"C-P",DFN))
 I EVENT="G" D  Q
 . S ^("CG")=1+$G(^XTMP("ORGDATA","P",DFN,"CG"))
 . S ^(USER)=1+$G(^XTMP("ORGDATA","P",DFN,"CG-U",USER))
 . S ^("CG")=1+$G(^XTMP("ORGDATA","U",USER,"CG"))
 . S ^(DFN)=1+$G(^XTMP("ORGDATA","U",USER,"CG-P",DFN))
 Q
 ;
CLEARPT(DFN,USER) ;
 N PATUSER
 S PATUSER=DFN_U_USER
 K ^XTMP("ORGRAPH","ALL DATA",PATUSER)
 K ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
 K ^XTMP("ORGRAPH","ALL LABS",PATUSER)
 Q
 ;
UP ; dequeued from ORWGTASK
 ; ORUSER, ORPAT, ORTSTMP were saved
 N GNOW,GSTAMP,NOW,STAMP
 S STAMP=ORTSTMP_U_ORUSER_U_ORPAT
 S GSTAMP=ORMTIME_U_ORUSER_U_ORPAT
 S NOW=$$NOW^ORWGAPIX
 S GNOW=$$MNOW
 I $D(ZTQUEUED) S ZTREQ="@"
 S ^XTMP("ORGRAPH","QUEUE",STAMP)=NOW_U_ORMTIME
 S ^XTMP("ORGDATA","Q",GSTAMP)=GSTAMP
 S ^XTMP("ORGDATA","QT",ORUSER_U_ORPAT)=ORMTIME
 D GSTAMP(GSTAMP,ORMTIME,GNOW,4)
 I 'ORUSER S $P(^XTMP("ORGRAPH","INIT"),U,4)=NOW
 I $G(^XTMP("ORGRAPH","STATUS"))'="ACTIVE" D START
 S ^XTMP("ORGRAPH","STATUS")="INACTIVE"
 Q
 ;
START ;
 S ^XTMP("ORGRAPH","STATUS")="ACTIVE"
 N COUNT,MAX,NEXT,STOP,TIMES
 S MAX=5
 S COUNT=0
 S STOP=0
 S NEXT=""
 F  S NEXT=$O(^XTMP("ORGRAPH","QUEUE",NEXT)) D  Q:STOP
 . I NEXT="" D  Q
 .. H 1
 .. S COUNT=COUNT+1
 .. I COUNT>MAX S STOP=1 Q
 . S TIMES=^XTMP("ORGRAPH","QUEUE",NEXT)
 . K ^XTMP("ORGRAPH","QUEUE",NEXT)
 . D PROCESS(NEXT,TIMES)
 . K ^XTMP("ORGRAPH","QUEUE",NEXT)
 Q
 ;
PROCESS(NEXT,TIMES) ;
 N DFN,GSTAMP,IN,OUT,TSTMP,USER
 S TSTMP=+$P(NEXT,U)
 S USER=+$P(NEXT,U,2)
 S DFN=$P(NEXT,U,3)
 S GSTAMP=$P(TIMES,U,2)_U_USER_U_DFN
 D ALL(GSTAMP,DFN,USER)
 I 'USER S $P(^XTMP("ORGRAPH","INIT"),U,5)=$$NOW^ORWGAPIX
 Q
 ;
ALL(GSTAMP,DFN,USER) ;
 N BACKTO,CNT,LASTDATE,NUM,PATUSER,PREV,START,TIMED,TIMEI,TIMEL,TIMEZ,TYPE
 K ^TMP("ORGAI",$J),^TMP("ORGI",$J),^TMP("ORGT",$J)
 S START=$$NOW^ORWGAPIX
 S DFN=+$G(DFN) I 'DFN Q
 S USER=+$G(USER)
 S PATUSER=DFN_U_USER
 S TIMEI=START
 D GSTAMP(GSTAMP,+GSTAMP,$$MNOW,5)
 S GTIME=$$MNOW
 D TYPES^ORWGAPI("ORGT",DFN)
 I '$L($O(^TMP("ORGT",$J,""))) Q
 S NUM=""
 F  S NUM=$O(^TMP("ORGT",$J,NUM)) Q:NUM=""  D
 . S TYPE=$P(^TMP("ORGT",$J,NUM),U)
 . K ^TMP("ORGI",$J)
 . S CNT=0
 . D ITEMS^ORWGAPIR("ORGI",DFN,TYPE,3,,,.CNT,2)
 . M ^TMP("ORGAI",$J)=^TMP("ORGI",$J)
 K ^TMP("ORGI",$J)
 S PREV=1
 I '$D(^XTMP("ORGRAPH","OLD DATA",DFN)) S PREV=0
 I '$D(^XTMP("ORGRAPH","OLD LABS",DFN)) S PREV=0
 I USER D  ; user is 0 when doing init
 . L +^XTMP("ORGRAPH","ALL ITEMS",PATUSER):1 I '$T Q
 . M ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)=^TMP("ORGAI",$J)
 . L -^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
 S LASTDATE=+$G(^XTMP("ORGRAPH","LAST BUILD",DFN))
 I 'LASTDATE S LASTDATE=DT
 S BACKTO=$$FMADD^XLFDT(LASTDATE,-30) ; *** backto value is 30 days ********************
 S TIMED=$$NOW^ORWGAPIX
 D GETDATA("DATA",GSTAMP,GTIME,PATUSER,START,BACKTO)
 S TIMEL=$$NOW^ORWGAPIX
 D GETDATA("LABS",GSTAMP,GTIME,PATUSER,START,BACKTO)
 S TIMEZ=$$NOW^ORWGAPIX
 S ^XTMP("ORGRAPH","LAST BUILD",DFN)=DT
 K ^TMP("ORGAI",$J),^TMP("ORGI",$J),^TMP("ORGT",$J)
 Q
 ;
GETDATA(TYPES,GSTAMP,GTIME,PATUSER,START,BACKTO) ;
 N ALLSUBS,CNT,DATA,DFN,NUM,NUM1,OLDSUBS,SUB,TYPEITEM,USER
 K ^TMP("ORGD",$J),^TMP("ORGID",$J),^TMP("ORGNI",$J)
 S OLDSUBS="OLD "_TYPES
 S ALLSUBS="ALL "_TYPES
 S DFN=+PATUSER
 S USER=+$P(PATUSER,U,2)
 S SIZE=0
 I $D(^XTMP("ORGRAPH",OLDSUBS,DFN)) D
 . S SUB=""
 . F  S SUB=$O(^TMP("ORGAI",$J,SUB)) Q:SUB=""  D
 .. S TYPEITEM=$G(^TMP("ORGAI",$J,SUB))
 .. I TYPES="DATA",$P(TYPEITEM,U)=63 Q
 .. I TYPES="LABS",$P(TYPEITEM,U)'=63 Q
 .. I $P(TYPEITEM,U,6)>BACKTO S ^TMP("ORGNI",$J,SUB)=TYPEITEM
 . S CNT=0
 . S NUM=""
 . F  S NUM=$O(^TMP("ORGNI",$J,NUM)) Q:NUM=""  D
 .. S TYPEITEM=^TMP("ORGNI",$J,NUM)
 .. D SIZE(TYPEITEM,START,DFN,BACKTO,.SIZE)
 . D GSTAMP(GSTAMP,GTIME,$$MNOW,6)
 . S $P(^XTMP("ORGDATA","Q",GSTAMP),U,16)=SIZE+$P(^XTMP("ORGDATA","Q",GSTAMP),U,16)
 E  D
 . S NUM=""
 . F  S NUM=$O(^TMP("ORGAI",$J,NUM)) Q:NUM=""  D
 .. S TYPEITEM=^TMP("ORGAI",$J,NUM)
 .. I TYPES="DATA",$P(TYPEITEM,U)=63 Q
 .. I TYPES="LABS",$P(TYPEITEM,U)'=63 Q
 .. D SIZE(TYPEITEM,START,DFN,2700101,.SIZE)
 . D GSTAMP(GSTAMP,GTIME,$$MNOW,7)
 . S $P(^XTMP("ORGDATA","Q",GSTAMP),U,17)=SIZE+$P(^XTMP("ORGDATA","Q",GSTAMP),U,17)
 S GTIME=$$MNOW
 M ^XTMP("ORGRAPH",OLDSUBS,DFN)=^TMP("ORGD",$J)
 I USER D  ; user is 0 when doing init
 . L +^XTMP("ORGRAPH",ALLSUBS,PATUSER):1 I '$T Q
 . M ^XTMP("ORGRAPH",ALLSUBS,PATUSER)=^XTMP("ORGRAPH",OLDSUBS,DFN)
 . L -^XTMP("ORGRAPH",ALLSUBS,PATUSER)
 K ^TMP("ORGD",$J),^TMP("ORGID",$J),^TMP("ORGNI",$J)
 D GSTAMP(GSTAMP,GTIME,$$MNOW,8)
 Q
 ;
SIZE(TYPEITEM,START,DFN,BACKTO,SIZE) ;
 N DATA,NUM
 K ^TMP("ORGID",$J)
 D ITEMDATA^ORWGAPI("ORGID",TYPEITEM,START,DFN,BACKTO)
 S NUM=""
 F  S NUM=$O(^TMP("ORGID",$J,NUM)) Q:NUM=""  D
 . S DATA=^TMP("ORGID",$J,NUM)
 . S ^TMP("ORGD",$J,$P(DATA,U,1,3))=DATA
 . S SIZE=$L(DATA)+SIZE
 Q
 ;
RESOURCE ; from ORWGAPIU on post init, setup graphing resource device
 N X
 S X=$$RES^XUDHSET("ORWG GRAPHING RESOURCE",,3,"CPRS GUI graphing data retrieval")
 Q
 ;
GSTAMP(GSTAMP,TIME1,TIME2,PIECE) ;
 S $P(^XTMP("ORGDATA","Q",GSTAMP),"^",PIECE)=TIME2-TIME1
 Q
 ;
MNOW() ;
 Q $$ZZ^ORWGAPIX
 ;
CLEAN ;
 K ^XTMP("ORGRAPH")
 Q
 ;
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORWGTASK   8811     printed  Sep 23, 2025@20:12:51                                                                                                                                                                                                    Page 2
ORWGTASK  ; SLC/STAFF - Graph Task ;3/17/08  10:48
 +1       ;;3.0;ORDER ENTRY/RESULTS REPORTING;**243**;Dec 17, 1997;Build 242
 +2       ;
SETLAST(PAT) ; from ORWGAPI - set whenever patient is graphed
 +1        NEW NOW,USER
 +2        SET PAT=+$GET(PAT)
 +3        SET USER=+$GET(DUZ)
 +4        SET NOW=$$NOW^ORWGAPIX
 +5        IF USER
               IF PAT
                   Begin DoDot:1
 +6                    SET ^XTMP("ORGDATA","TP",PAT)=NOW
 +7                    SET ^XTMP("ORGDATA","TP",PAT,"U",USER)=NOW
 +8                    SET ^XTMP("ORGDATA","TU",USER)=NOW
 +9                    DO COUNT("G",PAT,USER)
                   End DoDot:1
 +10       QUIT 
 +11      ;
INIT(OK)  ; from ORMTIM02 - run by ORMTIME (OK=0) 
 +1        NEW BACKTO,CNT,DFN,ITEM,LASTDFN,NOW,PURGE,TASKED,TIME
 +2        SET OK=+$GET(OK,0)
 +3       ; set in ORY243 (post-init v27)
           IF $GET(^XTMP("ORGRAPH","FORCE"))="ON"
               Begin DoDot:1
 +4                SET OK=1
 +5                DO CLEANALL
               End DoDot:1
 +6       ; unless forced, run one time on Saturday
           IF 'OK
               Begin DoDot:1
 +7                IF $PIECE($GET(^XTMP("ORGRAPH",0)),U,2)=DT
                       QUIT 
 +8       ; cleanup on 1st Sat of the month
                   IF $EXTRACT(DT,6)="0"
                       IF $$DOW^XLFDT(DT)="Saturday"
                           IF $LENGTH($GET(^XTMP("ORGRAPH",0)))
                               Begin DoDot:2
 +9                                SET OK=1
 +10                               DO CLEANALL
                               End DoDot:2
                               QUIT 
 +11               IF $$DOW^XLFDT(DT)="Saturday"
                       IF $LENGTH($GET(^XTMP("ORGRAPH",0)))
                           SET OK=1
                           QUIT 
               End DoDot:1
 +12       IF 'OK
               QUIT 
 +13      ;clear old data on non-graphed patients backto this date 
           SET BACKTO=$$FMADD^XLFDT(DT,-30)
 +14      ; when to purge XTMP nodes
           SET PURGE=$$FMADD^XLFDT(DT,180)
 +15       SET NOW=$$NOW^ORWGAPIX
 +16       SET ^XTMP("ORGDATA",0)=PURGE_U_DT_U_"CPRS Graphing - Patient Data Cache Stats"_U_NOW
 +17       SET ^XTMP("ORGRAPH",0)=PURGE_U_DT_U_"CPRS Graphing - Patient Data Cache"
 +18       SET CNT=0
 +19       SET LASTDFN=0
 +20       SET DFN=""
 +21       FOR 
               SET DFN=$ORDER(^XTMP("ORGDATA","TP",DFN))
               if DFN=""
                   QUIT 
               Begin DoDot:1
 +22               SET TIME=$ORDER(^XTMP("ORGDATA","TP",DFN))
 +23               IF '$LENGTH(TIME)
                       QUIT 
 +24               IF TIME<BACKTO
                       DO CLRDATA(DFN)
                       QUIT 
 +25      ; put patients to update on queue
                   SET ^XTMP("ORGRAPH","QUEUE",NOW_"^0^"_DFN)=NOW
 +26               SET LASTDFN=DFN
 +27               SET CNT=CNT+1
 +28               SET OK=1
               End DoDot:1
 +29      ; last patient starts the updates
           DO UPDATE(.TASKED,LASTDFN,0,0)
 +30       SET ^XTMP("ORGRAPH","INIT")=NOW_U_$$NOW^ORWGAPIX_U_CNT
 +31       SET ^XTMP("ORGDATA",0)=^XTMP("ORGDATA",0)_U_$$NOW^ORWGAPIX_U_CNT
 +32       QUIT 
 +33      ;
CLEANALL  ;
 +1        KILL ^XTMP("ORGDATA")
 +2        KILL ^XTMP("ORGRAPH")
 +3        QUIT 
 +4       ;
CLRDATA(DFN) ;
 +1        NEW PATUSER,USER
 +2        SET USER=.9
 +3        FOR 
               SET USER=$ORDER(^XTMP("ORGDATA","TP",DFN,"U",USER))
               if USER<1
                   QUIT 
               Begin DoDot:1
 +4                SET PATUSER=DFN_U_USER
 +5                KILL ^XTMP("ORGRAPH","ALL DATA",PATUSER)
 +6                KILL ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
 +7                KILL ^XTMP("ORGRAPH","ALL LABS",PATUSER)
 +8                KILL ^XTMP("ORGRAPH","OLD DATA",DFN)
 +9                KILL ^XTMP("ORGRAPH","OLD LABS",DFN)
               End DoDot:1
 +10       KILL ^XTMP("ORGDATA","TP",DFN)
 +11       QUIT 
 +12      ;
UPDATE(TASKED,DFN,USER,OLDDFN) ; from ORWGAPI
 +1       ; whenever patient is selected
 +2       ; to update, cache must exist and user/patient combo has used graphs
 +3       ;D CLEANALL Q  ; ******** temporary disabled BA 1/16/08 *********
 +4        NEW NOW,ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE
           KILL ZTSAVE
 +5       ;S ^XTMP("ZZZBOB")=$G(TASKED)_U_$G(DFN)_U_$G(USER)_U_$G(OLDDFN)
 +6       ; cache turned off
           SET TASKED=-1
 +7        IF '$LENGTH($GET(^XTMP("ORGRAPH",0)))
               QUIT 
 +8       ; not building cache
           SET TASKED=0
 +9        IF USER
               IF DFN
                   DO COUNT("P",DFN,USER)
 +10      ; user must use graphing to cache
           IF USER
               IF '$GET(^XTMP("ORGDATA","TU",USER))
                   QUIT 
 +11       IF USER
               IF OLDDFN
                   DO CLEARPT(OLDDFN,USER)
 +12       IF 'DFN
               QUIT 
 +13      ; patient must be used with graphing to cache
           IF '$GET(^XTMP("ORGDATA","TP",DFN))
               QUIT 
 +14      ; pat/user combo to cache **** comment this out for better graph speed - but more cache
           IF USER
               IF '$GET(^XTMP("ORGDATA","TP",DFN,"U",USER))
                   QUIT 
 +15      ; building cache
           SET TASKED=1
 +16       SET NOW=$$NOW^ORWGAPIX
 +17       IF USER
               DO CLEARPT(DFN,USER)
 +18       SET ZTIO="ORWG GRAPHING RESOURCE"
           SET ZTDTH=$HOROLOG
           SET ZTDESC="process graph data"
 +19       SET ZTSAVE("ORMTIME")=$$MNOW
 +20       SET ZTSAVE("ORPAT")=DFN
 +21       SET ZTSAVE("ORTSTMP")=NOW
 +22       SET ZTSAVE("ORUSER")=USER
 +23       SET ZTRTN="UP^ORWGTASK"
 +24       DO ^%ZTLOAD
 +25       QUIT 
 +26      ;
COUNT(EVENT,DFN,USER) ;
 +1        IF EVENT="P"
               Begin DoDot:1
 +2                SET ^("C")=1+$GET(^XTMP("ORGDATA","P",DFN,"C"))
 +3                SET ^(USER)=1+$GET(^XTMP("ORGDATA","P",DFN,"C-U",USER))
 +4                SET ^("C")=1+$GET(^XTMP("ORGDATA","U",USER,"C"))
 +5                SET ^(DFN)=1+$GET(^XTMP("ORGDATA","U",USER,"C-P",DFN))
               End DoDot:1
               QUIT 
 +6        IF EVENT="G"
               Begin DoDot:1
 +7                SET ^("CG")=1+$GET(^XTMP("ORGDATA","P",DFN,"CG"))
 +8                SET ^(USER)=1+$GET(^XTMP("ORGDATA","P",DFN,"CG-U",USER))
 +9                SET ^("CG")=1+$GET(^XTMP("ORGDATA","U",USER,"CG"))
 +10               SET ^(DFN)=1+$GET(^XTMP("ORGDATA","U",USER,"CG-P",DFN))
               End DoDot:1
               QUIT 
 +11       QUIT 
 +12      ;
CLEARPT(DFN,USER) ;
 +1        NEW PATUSER
 +2        SET PATUSER=DFN_U_USER
 +3        KILL ^XTMP("ORGRAPH","ALL DATA",PATUSER)
 +4        KILL ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
 +5        KILL ^XTMP("ORGRAPH","ALL LABS",PATUSER)
 +6        QUIT 
 +7       ;
UP        ; dequeued from ORWGTASK
 +1       ; ORUSER, ORPAT, ORTSTMP were saved
 +2        NEW GNOW,GSTAMP,NOW,STAMP
 +3        SET STAMP=ORTSTMP_U_ORUSER_U_ORPAT
 +4        SET GSTAMP=ORMTIME_U_ORUSER_U_ORPAT
 +5        SET NOW=$$NOW^ORWGAPIX
 +6        SET GNOW=$$MNOW
 +7        IF $DATA(ZTQUEUED)
               SET ZTREQ="@"
 +8        SET ^XTMP("ORGRAPH","QUEUE",STAMP)=NOW_U_ORMTIME
 +9        SET ^XTMP("ORGDATA","Q",GSTAMP)=GSTAMP
 +10       SET ^XTMP("ORGDATA","QT",ORUSER_U_ORPAT)=ORMTIME
 +11       DO GSTAMP(GSTAMP,ORMTIME,GNOW,4)
 +12       IF 'ORUSER
               SET $PIECE(^XTMP("ORGRAPH","INIT"),U,4)=NOW
 +13       IF $GET(^XTMP("ORGRAPH","STATUS"))'="ACTIVE"
               DO START
 +14       SET ^XTMP("ORGRAPH","STATUS")="INACTIVE"
 +15       QUIT 
 +16      ;
START     ;
 +1        SET ^XTMP("ORGRAPH","STATUS")="ACTIVE"
 +2        NEW COUNT,MAX,NEXT,STOP,TIMES
 +3        SET MAX=5
 +4        SET COUNT=0
 +5        SET STOP=0
 +6        SET NEXT=""
 +7        FOR 
               SET NEXT=$ORDER(^XTMP("ORGRAPH","QUEUE",NEXT))
               Begin DoDot:1
 +8                IF NEXT=""
                       Begin DoDot:2
 +9                        HANG 1
 +10                       SET COUNT=COUNT+1
 +11                       IF COUNT>MAX
                               SET STOP=1
                               QUIT 
                       End DoDot:2
                       QUIT 
 +12               SET TIMES=^XTMP("ORGRAPH","QUEUE",NEXT)
 +13               KILL ^XTMP("ORGRAPH","QUEUE",NEXT)
 +14               DO PROCESS(NEXT,TIMES)
 +15               KILL ^XTMP("ORGRAPH","QUEUE",NEXT)
               End DoDot:1
               if STOP
                   QUIT 
 +16       QUIT 
 +17      ;
PROCESS(NEXT,TIMES) ;
 +1        NEW DFN,GSTAMP,IN,OUT,TSTMP,USER
 +2        SET TSTMP=+$PIECE(NEXT,U)
 +3        SET USER=+$PIECE(NEXT,U,2)
 +4        SET DFN=$PIECE(NEXT,U,3)
 +5        SET GSTAMP=$PIECE(TIMES,U,2)_U_USER_U_DFN
 +6        DO ALL(GSTAMP,DFN,USER)
 +7        IF 'USER
               SET $PIECE(^XTMP("ORGRAPH","INIT"),U,5)=$$NOW^ORWGAPIX
 +8        QUIT 
 +9       ;
ALL(GSTAMP,DFN,USER) ;
 +1        NEW BACKTO,CNT,LASTDATE,NUM,PATUSER,PREV,START,TIMED,TIMEI,TIMEL,TIMEZ,TYPE
 +2        KILL ^TMP("ORGAI",$JOB),^TMP("ORGI",$JOB),^TMP("ORGT",$JOB)
 +3        SET START=$$NOW^ORWGAPIX
 +4        SET DFN=+$GET(DFN)
           IF 'DFN
               QUIT 
 +5        SET USER=+$GET(USER)
 +6        SET PATUSER=DFN_U_USER
 +7        SET TIMEI=START
 +8        DO GSTAMP(GSTAMP,+GSTAMP,$$MNOW,5)
 +9        SET GTIME=$$MNOW
 +10       DO TYPES^ORWGAPI("ORGT",DFN)
 +11       IF '$LENGTH($ORDER(^TMP("ORGT",$JOB,"")))
               QUIT 
 +12       SET NUM=""
 +13       FOR 
               SET NUM=$ORDER(^TMP("ORGT",$JOB,NUM))
               if NUM=""
                   QUIT 
               Begin DoDot:1
 +14               SET TYPE=$PIECE(^TMP("ORGT",$JOB,NUM),U)
 +15               KILL ^TMP("ORGI",$JOB)
 +16               SET CNT=0
 +17               DO ITEMS^ORWGAPIR("ORGI",DFN,TYPE,3,,,.CNT,2)
 +18               MERGE ^TMP("ORGAI",$JOB)=^TMP("ORGI",$JOB)
               End DoDot:1
 +19       KILL ^TMP("ORGI",$JOB)
 +20       SET PREV=1
 +21       IF '$DATA(^XTMP("ORGRAPH","OLD DATA",DFN))
               SET PREV=0
 +22       IF '$DATA(^XTMP("ORGRAPH","OLD LABS",DFN))
               SET PREV=0
 +23      ; user is 0 when doing init
           IF USER
               Begin DoDot:1
 +24               LOCK +^XTMP("ORGRAPH","ALL ITEMS",PATUSER):1
                   IF '$TEST
                       QUIT 
 +25               MERGE ^XTMP("ORGRAPH","ALL ITEMS",PATUSER)=^TMP("ORGAI",$JOB)
 +26               LOCK -^XTMP("ORGRAPH","ALL ITEMS",PATUSER)
               End DoDot:1
 +27       SET LASTDATE=+$GET(^XTMP("ORGRAPH","LAST BUILD",DFN))
 +28       IF 'LASTDATE
               SET LASTDATE=DT
 +29      ; *** backto value is 30 days ********************
           SET BACKTO=$$FMADD^XLFDT(LASTDATE,-30)
 +30       SET TIMED=$$NOW^ORWGAPIX
 +31       DO GETDATA("DATA",GSTAMP,GTIME,PATUSER,START,BACKTO)
 +32       SET TIMEL=$$NOW^ORWGAPIX
 +33       DO GETDATA("LABS",GSTAMP,GTIME,PATUSER,START,BACKTO)
 +34       SET TIMEZ=$$NOW^ORWGAPIX
 +35       SET ^XTMP("ORGRAPH","LAST BUILD",DFN)=DT
 +36       KILL ^TMP("ORGAI",$JOB),^TMP("ORGI",$JOB),^TMP("ORGT",$JOB)
 +37       QUIT 
 +38      ;
GETDATA(TYPES,GSTAMP,GTIME,PATUSER,START,BACKTO) ;
 +1        NEW ALLSUBS,CNT,DATA,DFN,NUM,NUM1,OLDSUBS,SUB,TYPEITEM,USER
 +2        KILL ^TMP("ORGD",$JOB),^TMP("ORGID",$JOB),^TMP("ORGNI",$JOB)
 +3        SET OLDSUBS="OLD "_TYPES
 +4        SET ALLSUBS="ALL "_TYPES
 +5        SET DFN=+PATUSER
 +6        SET USER=+$PIECE(PATUSER,U,2)
 +7        SET SIZE=0
 +8        IF $DATA(^XTMP("ORGRAPH",OLDSUBS,DFN))
               Begin DoDot:1
 +9                SET SUB=""
 +10               FOR 
                       SET SUB=$ORDER(^TMP("ORGAI",$JOB,SUB))
                       if SUB=""
                           QUIT 
                       Begin DoDot:2
 +11                       SET TYPEITEM=$GET(^TMP("ORGAI",$JOB,SUB))
 +12                       IF TYPES="DATA"
                               IF $PIECE(TYPEITEM,U)=63
                                   QUIT 
 +13                       IF TYPES="LABS"
                               IF $PIECE(TYPEITEM,U)'=63
                                   QUIT 
 +14                       IF $PIECE(TYPEITEM,U,6)>BACKTO
                               SET ^TMP("ORGNI",$JOB,SUB)=TYPEITEM
                       End DoDot:2
 +15               SET CNT=0
 +16               SET NUM=""
 +17               FOR 
                       SET NUM=$ORDER(^TMP("ORGNI",$JOB,NUM))
                       if NUM=""
                           QUIT 
                       Begin DoDot:2
 +18                       SET TYPEITEM=^TMP("ORGNI",$JOB,NUM)
 +19                       DO SIZE(TYPEITEM,START,DFN,BACKTO,.SIZE)
                       End DoDot:2
 +20               DO GSTAMP(GSTAMP,GTIME,$$MNOW,6)
 +21               SET $PIECE(^XTMP("ORGDATA","Q",GSTAMP),U,16)=SIZE+$PIECE(^XTMP("ORGDATA","Q",GSTAMP),U,16)
               End DoDot:1
 +22      IF '$TEST
               Begin DoDot:1
 +23               SET NUM=""
 +24               FOR 
                       SET NUM=$ORDER(^TMP("ORGAI",$JOB,NUM))
                       if NUM=""
                           QUIT 
                       Begin DoDot:2
 +25                       SET TYPEITEM=^TMP("ORGAI",$JOB,NUM)
 +26                       IF TYPES="DATA"
                               IF $PIECE(TYPEITEM,U)=63
                                   QUIT 
 +27                       IF TYPES="LABS"
                               IF $PIECE(TYPEITEM,U)'=63
                                   QUIT 
 +28                       DO SIZE(TYPEITEM,START,DFN,2700101,.SIZE)
                       End DoDot:2
 +29               DO GSTAMP(GSTAMP,GTIME,$$MNOW,7)
 +30               SET $PIECE(^XTMP("ORGDATA","Q",GSTAMP),U,17)=SIZE+$PIECE(^XTMP("ORGDATA","Q",GSTAMP),U,17)
               End DoDot:1
 +31       SET GTIME=$$MNOW
 +32       MERGE ^XTMP("ORGRAPH",OLDSUBS,DFN)=^TMP("ORGD",$JOB)
 +33      ; user is 0 when doing init
           IF USER
               Begin DoDot:1
 +34               LOCK +^XTMP("ORGRAPH",ALLSUBS,PATUSER):1
                   IF '$TEST
                       QUIT 
 +35               MERGE ^XTMP("ORGRAPH",ALLSUBS,PATUSER)=^XTMP("ORGRAPH",OLDSUBS,DFN)
 +36               LOCK -^XTMP("ORGRAPH",ALLSUBS,PATUSER)
               End DoDot:1
 +37       KILL ^TMP("ORGD",$JOB),^TMP("ORGID",$JOB),^TMP("ORGNI",$JOB)
 +38       DO GSTAMP(GSTAMP,GTIME,$$MNOW,8)
 +39       QUIT 
 +40      ;
SIZE(TYPEITEM,START,DFN,BACKTO,SIZE) ;
 +1        NEW DATA,NUM
 +2        KILL ^TMP("ORGID",$JOB)
 +3        DO ITEMDATA^ORWGAPI("ORGID",TYPEITEM,START,DFN,BACKTO)
 +4        SET NUM=""
 +5        FOR 
               SET NUM=$ORDER(^TMP("ORGID",$JOB,NUM))
               if NUM=""
                   QUIT 
               Begin DoDot:1
 +6                SET DATA=^TMP("ORGID",$JOB,NUM)
 +7                SET ^TMP("ORGD",$JOB,$PIECE(DATA,U,1,3))=DATA
 +8                SET SIZE=$LENGTH(DATA)+SIZE
               End DoDot:1
 +9        QUIT 
 +10      ;
RESOURCE  ; from ORWGAPIU on post init, setup graphing resource device
 +1        NEW X
 +2        SET X=$$RES^XUDHSET("ORWG GRAPHING RESOURCE",,3,"CPRS GUI graphing data retrieval")
 +3        QUIT 
 +4       ;
GSTAMP(GSTAMP,TIME1,TIME2,PIECE) ;
 +1        SET $PIECE(^XTMP("ORGDATA","Q",GSTAMP),"^",PIECE)=TIME2-TIME1
 +2        QUIT 
 +3       ;
MNOW()    ;
 +1        QUIT $$ZZ^ORWGAPIX
 +2       ;
CLEAN     ;
 +1        KILL ^XTMP("ORGRAPH")
 +2        QUIT 
 +3       ;