VistA-WorldVistAEHR/r/LAB_SERVICE-LR-LS/LRLOG.m

183 lines
5.1 KiB
Mathematica

LRLOG ;SLC/STAFF - Edit Log ;10/15/03 09:08
;;5.2;LAB SERVICE;**295**;Sep 27, 1994
;
TIMESTMP(PAT,SUB,CDT,USER,TIMESTMP) ; set a timestamp entry in edit log
; from LRPX,LRPXRM
;N DATA,NUM
;S PAT=+$G(PAT)
;S SUB=$G(SUB)
;S CDT=$G(CDT)
;Q:'PAT Q:'$L(SUB) Q:'CDT
;I '$G(TIMESTMP) S TIMESTMP=$$NOW^XLFDT
;S USER=$G(USER)
;S NUM=+$P(^LRLOG(0),U,3)
;S DATA=TIMESTMP_U_PAT_U_SUB_U_CDT_U_USER
;L +^LRLOG(0):20 I '$T Q
;S NUM=1+$P(^LRLOG(0),U,3)
;F Q:'$D(^LRLOG(NUM)) S NUM=NUM+1
;S $P(^LRLOG(0),U,3)=NUM,$P(^(0),U,4)=$P(^(0),U,4)+1
;S ^LRLOG(NUM)=DATA
;L -^LRLOG(0)
;S ^LRLOG("B",TIMESTMP,NUM)=""
;S ^LRLOG("P",PAT,TIMESTMP,NUM)=""
Q
;
INIT ; initialize setup of edit log
; sets last edit as timestamp on old data
; does not set user
;N CDT,DATA,DFN,I,IDT,LRDFN,RELEASE,SUB,TIMESTMP
;S I=0 F S I=$O(^LRLOG(I)) Q:I="" K ^LRLOG(I)
;S $P(^LRLOG(0),U,3,4)="0^0"
;S LRDFN=.9
;F S LRDFN=$O(^LR(LRDFN)) Q:LRDFN<1 D
;. S DFN=$$DFN^LRPXAPIU(LRDFN)
;. I 'DFN Q
;. S SUB="CH"
;. S IDT=0
;. F S IDT=$O(^LR(LRDFN,SUB,IDT)) Q:IDT<1 D
;.. S DATA=$G(^LR(LRDFN,SUB,IDT,0))
;.. I '$L(DATA) Q
;.. S TIMESTMP=+$P(DATA,U,3)
;.. I 'TIMESTMP Q
;.. S CDT=+DATA
;.. I 'CDT Q
;.. D TIMESTMP(DFN,SUB,CDT,,TIMESTMP)
;. S SUB="MI"
;. S IDT=0
;. F S IDT=$O(^LR(LRDFN,SUB,IDT)) Q:IDT<1 D
;.. S DATA=$G(^LR(LRDFN,SUB,IDT,0))
;.. I '$L(DATA) Q
;.. S CDT=+DATA
;.. I 'CDT Q
;.. S TIMESTMP=+$P(DATA,U,3)
;.. F I=1,5,8,11,16 I $G(^LR(LRDFN,SUB,IDT,I))>TIMESTMP S TIMESTMP=+^(I)
;.. I 'TIMESTMP Q
;.. D TIMESTMP(DFN,SUB,CDT,,TIMESTMP)
;. F SUB="CY","EM","SP" D
;.. S IDT=0
;.. F S IDT=$O(^LR(LRDFN,SUB,IDT)) Q:IDT<1 D
;... S DATA=$G(^LR(LRDFN,SUB,IDT,0))
;... I '$L(DATA) Q
;... S TIMESTMP=+$P(DATA,U,3)
;... I 'TIMESTMP Q
;... S RELEASE=+$P(DATA,U,11)
;... I 'RELEASE Q
;... I RELEASE>TIMESTMP S TIMESTMP=RELEASE
;... S CDT=+DATA
;... I 'CDT Q
;... D TIMESTMP(DFN,SUB,CDT,,TIMESTMP)
;. S SUB="AU"
;. S DATA=$G(^LR(LRDFN,SUB))
;. I 'DATA Q
;. S TIMESTMP=+$P(DATA,U,3)
;. I 'TIMESTMP Q
;. S RELEASE=+$P(DATA,U,15)
;. I 'RELEASE Q
;. I RELEASE>TIMESTMP S TIMESTMP=RELEASE
;. S CDT=$$DOD^LRPXAPIU(DFN)
;. I 'CDT Q
;. D TIMESTMP(DFN,SUB,CDT,,TIMESTMP)
Q
;
DATEINTG(DATE1,DATE2,CNT) ; check integrity on patient's that were edited during a time range
; returns ^TMP("LRLOG",$J),^TMP("LRLOG PATS",$J) - must kill after use
;N DFN,NUMBER
;S DATE1=+$G(DATE1,1),DATE2=+$G(DATE2,9999999)
;D PATS(DATE1,DATE2,.CNT)
;I 'CNT S ^TMP("LRLOG",$J)="0^0" Q
;S (CNT,DFN,NUMBER)=0
;F S DFN=$O(^TMP("LRLOG PATS",$J,DFN)) Q:DFN<1 D
;. D PATINTEG(DFN,.CNT)
;. S NUMBER=NUMBER+1
;S ^TMP("LRLOG",$J)=CNT_U_NUMBER
Q
;
PATS(DATE1,DATE2,CNT) ; get patients that were edited during a time range
; returns ^TMP("LRLOG PATS",$J) - must kill after use
;N BEGCDT,CDT,DATA,DFN,ENDCDT,NUM,TSDT
;K ^TMP("LRLOG PATS",$J)
;S BEGCDT=9999999,(CNT,ENDCDT)=0
;S TSDT=$G(DATE1)-.00001
;F S TSDT=$O(^LRLOG("B",TSDT)) Q:TSDT<1 Q:TSDT>DATE2 D
;. S NUM=0
;. F S NUM=$O(^LRLOG("B",TSDT,NUM)) Q:NUM<1 D
;.. S DATA=$G(^LRLOG(NUM))
;.. S DFN=+$P(DATA,U,2)
;.. S CDT=+$P(DATA,U,4)
;.. I CDT<BEGCDT S BEGCDT=CDT
;.. I CDT>ENDCDT S ENDCDT=CDT
;.. Q:'DFN Q:'CDT
;.. I '$D(^TMP("LRLOG PATS",$J,DFN)) S CNT=CNT+1
;.. S ^TMP("LRLOG PATS",$J,DFN)=BEGCDT_U_ENDCDT
;.. S ^TMP("LRLOG PATS",$J,DFN,NUM)=""
;S ^TMP("LRLOG PATS",$J)=CNT
Q
;
PATINTEG(DFN,CNT) ; check integrity of a patient
; returns ^TMP("LRLOG",$J) - must kill after use
;K ^TMP("LRLOG",$J,DFN)
;S CNT=+$G(CNT)
;D CHKPAT^LRPXCHK(DFN)
;I $D(^TMP("LRLOG",$J,DFN)) S CNT=CNT+1
Q
;
TESTP ; test for patient integrity
;N DIC,X,Y K DIC
;S DIC=2,DIC(0)="AEMOQ"
;D ^DIC I Y<1 Q
;D PATINTEG(+Y)
;K ^TMP("LRLOG",$J)
Q
;
TESTD ; test for integrity of patients that were edited during a date range
;N CNT,DFN,ERR,FROM,TO
;D GETDATE^LRPXAPPU(.FROM,.TO,.ERR) I ERR Q
;S CNT=0
;D DATEINTG(FROM,TO,.CNT)
;S DFN=0
;F S DFN=$O(^TMP("LRLOG PATS",$J,DFN)) Q:DFN<.5 W !,DFN," ",$P(^DPT(DFN,0),U)," checked"
;K ^TMP("LRLOG",$J),^TMP("LRLOG PATS",$J)
Q
;
LTS() ; $$() -> last timestamp ien
;N TSDT
;S TSDT=+$O(^LRLOG("B",""),-1)
;Q +$O(^LRLOG("B",TSDT,0))
Q 0 ;remove after testing
;
LPTS(DFN) ; $$(dfn) -> patient's last timestamp ien
;N TSDT
;S DFN=+$G(DFN)
;S TSDT=+$O(^LRLOG("P",DFN,""),-1)
;Q +$O(^LRLOG("P",DFN,TSDT,0))
Q 0 ;remove after testing
;
TSDT(TSDT,TS) ; API - returns array of timestamps for a timestamp date/time
;N NUM K TS
;S TSDT=+$G(TSDT)
;S NUM=0
;F S NUM=$O(^LRLOG("B",TSDT,NUM)) Q:NUM<1 S TS(NUM)=""
Q
;
PTSDT(DFN,TSDT,TS) ; API - returns patient's array of timestamps for a timestamp date/time
;N NUM K TS
;S DFN=+$G(DFN),TSDT=+$G(TSDT)
;S NUM=0
;F S NUM=$O(^LRLOG("P",DFN,TSDT,NUM)) Q:NUM<1 S TS(NUM)=""
Q
;
NTSDT(TSDT) ; $$(timestamp date/time) -> next timestamp ien from a timestamp date/time
;S TSDT=+$G(TSDT)
;Q +$O(^LRLOG("B",TSDT),-1)
Q 0 ;remove after testing
;
NPTSDT(DFN,TSDT) ; $$(dfn,timestamp date/time) -> patient's next timestamp date/time
;S DFN=+$G(DFN),TSDT=+$G(TSDT)
;Q +$O(^LRLOG("P",DFN,TSDT),-1)
Q 0 ;remove after testing
;
LOG(TS) ; $$(timestamp ien) -> timestamp entry: timestamp^dfn^sub^cdt^user
;Q $G(^LRLOG(+$G(TS)))
Q 0 ;remove after testing
;