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

VPRSDAV.m

Go to the documentation of this file.
  1. VPRSDAV ;SLC/MKB -- SDA Visit utilities ;10/25/18 15:29
  1. ;;1.0;VIRTUAL PATIENT RECORD;**20,26,27,28,29,30**;Sep 01, 2011;Build 9
  1. ;;Per VHA Directive 6402, this routine should not be modified.
  1. ;
  1. ; External References DBIA#
  1. ; ------------------- -----
  1. ; ^AUPNVSIT 2028
  1. ; ^DDE 7014
  1. ; ^DGPM 1865
  1. ; ^DIC(42 10039
  1. ; ^DPT 10035
  1. ; ^EDP(230 7180
  1. ; ^SC 10040
  1. ; ^SCE("AVSIT" 2045
  1. ; ^SRF 5675
  1. ; DIQ 2056
  1. ; PXAPI, ^TMP("PXKENC",$J 1894
  1. ; PXPXRM 4250
  1. ; SDOE 2546
  1. ; VADPT 10061
  1. ; VADPT2 325
  1. ;
  1. QRY ; -- get visits (all types)
  1. ; Query called from GET^DDE, returns DLIST(#)=ien
  1. ; Expects context variables DFN, DSTRT, DSTOP, DMAX
  1. ;
  1. N BEG,END,IDT,TYPE,OK,VPRN,ID
  1. S BEG=DSTRT,END=DSTOP D IDT^VPRDVSIT
  1. S VPRN=0,IDT=BEG,TYPE=$G(FILTER("type")) ;I,O,E
  1. F S IDT=$O(^AUPNVSIT("AA",DFN,IDT)) Q:IDT<1!(IDT>END) D Q:VPRN'<DMAX
  1. . S ID=0 F S ID=$O(^AUPNVSIT("AA",DFN,IDT,ID)) Q:ID<1 D
  1. .. Q:"CS"[$P($G(^AUPNVSIT(ID,150)),U,3) ;skip stop code child visits
  1. .. I TYPE'="" D Q:'OK ;filter
  1. ... N X S OK=0
  1. ... S X=$S($O(^EDP(230,"V",ID,0)):"E",$P($G(^AUPNVSIT(ID,0)),U,7)="H":"I",1:"O")
  1. ... I TYPE[X S OK=1 Q
  1. .. S VPRN=VPRN+1,DLIST(VPRN)=ID
  1. Q
  1. ;
  1. ADMQ ; -- Admissions only (visits)
  1. ; Query for VPR ADMISSION via Test option
  1. N IDT,BEG,END,ID,VPRN,VAINDT,VADMVT,VAERR S VPRN=0
  1. S BEG=DSTRT,END=DSTOP D IDT^VPRDVSIT
  1. S IDT=BEG F S IDT=$O(^AUPNVSIT("AAH",DFN,IDT)) Q:IDT<1!(IDT>END) D Q:VPRN'<DMAX
  1. . S ID=0 F S ID=$O(^AUPNVSIT("AAH",DFN,IDT,ID)) Q:ID<1 D
  1. .. S VAINDT=(9999999-$P(IDT,"."))_"."_$P(IDT,".",2)
  1. .. D ADM^VADPT2 Q:'$G(VADMVT)
  1. .. S VPRN=VPRN+1,DLIST(VPRN)=VADMVT_"~"_ID
  1. Q
  1. ;
  1. EDPQ ; -- Emergency Dept only (visits)
  1. ; Query for VPR EDP LOG via Test option
  1. N IDT,BEG,END,VST,ID,VPRN
  1. S BEG=DSTRT,END=DSTOP D IDT^VPRDVSIT
  1. S VPRN=0,IDT=BEG
  1. F S IDT=$O(^AUPNVSIT("AA",DFN,IDT)) Q:IDT<1!(IDT>END) D Q:VPRN'<DMAX
  1. . S VST=0 F S VST=$O(^AUPNVSIT("AA",DFN,IDT,VST)) Q:VST<1 D
  1. .. S ID=+$O(^EDP(230,"V",VST,0))
  1. .. S:ID VPRN=VPRN+1,DLIST(VPRN)=ID
  1. Q
  1. ;
  1. VST ; -- get info for a VISIT in @VPRVST [ID Action]
  1. S DIEN=+$G(DIEN) I DIEN<1 S DDEOUT=1 Q
  1. N VADMVT,PX0A,EDP S PX0A=$G(^AUPNVSIT(DIEN,0))
  1. I PX0A="" D STUB(DIEN) Q
  1. ; ck DFN (in case re-added at diff Enc#)
  1. I $G(DFN),DFN'=$P(PX0A,U,5) D STUB(DIEN) Q
  1. S:'$G(DFN) DFN=+$P(PX0A,U,5)
  1. ; switch to Admission entity?
  1. I $P(PX0A,U,7)="H" D Q:$G(VADMVT)
  1. . N VAINDT,ENT S VAINDT=+PX0A D ADM^VADPT2 Q:'$G(VADMVT)
  1. . S ENT=+$O(^DDE("B","VPR ADMISSION",0)) I ENT<1 K VADMVT Q
  1. . S DIENTY=ENT,DIFN=405,DIEN=VADMVT_"~"_DIEN
  1. . D VAIP
  1. ; switch to EDP Log entity?
  1. S EDP=+$O(^EDP(230,"V",DIEN,0)) I EDP D Q:$G(EDP)
  1. . N ENT S EDP=+$O(^EDP(230,"V",DIEN,0))
  1. . S ENT=+$O(^DDE("B","VPR EDP LOG",0)) I ENT<1 K EDP Q
  1. . S DIENTY=ENT,DIFN=230,DIEN=EDP
  1. . D EDP1
  1. ; continue with Visit
  1. D ENCEVENT^PXAPI(DIEN)
  1. S VPRVST=$NA(^TMP("PXKENC",$J,DIEN,"VST",DIEN))
  1. ; validate Visit, Check-Out D/T
  1. N D S D=$P(+$G(@VPRVST@(0)),".")
  1. I D,'$$VALID^VPRSDA(D) S $P(@VPRVST@(0),U)=$P(@VPRVST@(0),U,2) ;created
  1. S D=$P($G(@VPRVST@(0)),U,18)
  1. I D,'$$VALID^VPRSDA(D) S $P(@VPRVST@(0),U,18)=""
  1. Q
  1. ;
  1. STUB(VST) ; -- switch to stub entity for deleted visits
  1. N ENT S ENT=+$O(^DDE("B","VPR VISIT STUB",0))
  1. I ENT<1 S DDEOUT=1 Q
  1. S DIENTY=ENT,DIEN=+$G(VST)
  1. Q
  1. ;
  1. VDEL ; -- old V file Entry Action: I ID["~" D VDEL^VPRSDAV
  1. ; Expects ID & FILE
  1. ; Returns VPRVST, VPRVFN, VPRVT & resets DTYPE for entity
  1. S VPRVST=+$P($G(ID),"~",2),ID=+$G(ID),VPRVFN=+$G(FILE),VPRVT=DTYPE
  1. S DTYPE=$O(^DDE("B","VPR VFILE DELETE",0))
  1. Q
  1. ;
  1. DEL1 ; -- ID Action for Vfile Delete entities, returns VPR0=data
  1. N SEQ,VST S VPR0=""
  1. S SEQ=+$G(FILTER("sequence")) I SEQ D
  1. . S VPR0=$G(^XTMP("VPR-"_SEQ,+$G(DIEN),0)) Q:$L(VPR0)
  1. . S VST=$P($G(^XTMP("VPR-"_SEQ,+$G(DIEN))),U,5) S:VST VPR0="^^"_VST
  1. Q
  1. ;
  1. EDP1 ; -- get info for single EDP Log record [VST/ID Action]
  1. ; Returns EDP0, EDP1, EDP3, VPRV, VPRVST to Entity
  1. S EDP0=$G(^EDP(230,DIEN,0)),EDP1=$G(^(1)),EDP3=$G(^(3))
  1. S VPRV=+$P(EDP0,U,12) I 'VPRV S DDEOUT=1 Q
  1. D ENCEVENT^PXAPI(VPRV)
  1. S VPRVST=$NA(^TMP("PXKENC",$J,VPRV,"VST",VPRV))
  1. Q
  1. ;
  1. VAIP ; -- get admission info & Visit# [ID Action]
  1. ; Expects DIEN = #405 ien ~ #9000010 ien
  1. ; Validates DFN = #2 ien
  1. ; Return VAIP(#)= array of movements
  1. ; VPRVST = Visit#
  1. ; VPRCA = Current Adm# (or 0)
  1. ; DIEN = Movement#
  1. N VAERR,VADMVT K VAIP,VAINDT
  1. S DIEN=$G(DIEN),DFN=+$G(DFN)
  1. S VPRVST=+$P(DIEN,"~",2),DIEN=+DIEN
  1. S:'DFN DFN=+$P($G(^DGPM(DIEN,0)),U,3)
  1. I 'DFN!'DIEN S DDEOUT=1 Q
  1. S VPRCA=+$G(^DPT(DFN,.105)) S:DIEN'=VPRCA VAIP("E")=DIEN
  1. D IN5^VADPT
  1. I $G(VAIP(13)),+VAIP(13)'=DIEN S DIEN=+VAIP(13),VPRVST=0
  1. S:'VPRVST VPRVST=$$VNUM(DIEN)
  1. I VPRVST<1 S DDEOUT=1 Q
  1. Q
  1. ;
  1. MVTS(ADM) ; -- get movements for an ADMission in DLIST(#)=mvt ien
  1. ; Expects DFN
  1. N MVTS,IDX,DA,X0,PHYMVT,DATE,N,TS
  1. S ADM=+$G(ADM) Q:ADM<1
  1. S IDX=$NA(^DGPM("APCA",DFN,ADM)) ;get all physical mvts
  1. F S IDX=$Q(@IDX) Q:$QS(IDX,3)'=ADM D
  1. . S DA=$QS(IDX,5),DATE=+$G(^DGPM(DA,0))
  1. . I DATE,DA S MVTS(DATE,DA)=""
  1. S IDX=$NA(^DGPM("ATS",DFN,ADM)) ;add TS mvts to list
  1. F S IDX=$Q(@IDX) Q:$QS(IDX,3)'=ADM S DA=$QS(IDX,6) D
  1. . S X0=$G(^DGPM(DA,0)),PHYMVT=+$P(X0,U,24)
  1. . I PHYMVT,$D(MVTS(+X0,PHYMVT)) S MVTS(+X0,PHYMVT)=DA Q
  1. . S MVTS(+X0,DA)=DA
  1. ; create return DLIST from MVTS
  1. S (DATE,N)=0 F S DATE=$O(MVTS(DATE)) Q:DATE<1 D
  1. . S DA=0 F S DA=$O(MVTS(DATE,DA)) Q:DA<1 D
  1. .. S TS=$G(MVTS(DATE,DA))
  1. .. S N=N+1,DLIST(N)=DA_$S(TS:";"_TS,1:"")
  1. Q
  1. ;
  1. VNUM(ADM) ; -- find Visit# for an admission [expects DFN]
  1. N Y,ADM0,ADMDT,HLOC,VIEN
  1. S ADM0=$G(^DGPM(+$G(ADM),0)),ADMDT=+ADM0
  1. S HLOC=+$G(^DIC(42,+$P(ADM0,U,6),44)),(Y,VIEN)=""
  1. F S VIEN=$O(^AUPNVSIT("AET",DFN,ADMDT,HLOC,"P",VIEN)) Q:'VIEN D Q:Y
  1. . I $P(^AUPNVSIT(VIEN,0),U,7)="H" S Y=VIEN
  1. I 'Y D ;try w/o location
  1. . N IDT S IDT=(9999999-$P(ADMDT,"."))_"."_$P(ADMDT,".",2)
  1. . S Y=$O(^AUPNVSIT("AAH",DFN,IDT,0))
  1. Q Y
  1. ;
  1. WARDFAC(IEN) ; -- return #4 ien for a Ward Location
  1. N HLOC,Y
  1. S HLOC=+$G(^DIC(42,+$G(IEN),44)),Y=""
  1. S:HLOC Y=$P($G(^SC(HLOC,0)),U,4)
  1. Q Y
  1. ;
  1. SPEC ; -- build DLIST(#)=45.7 iens using VAIP array
  1. N I,X,SPEC
  1. F I=13:1:17 S X=$G(VAIP(I,6)) S:X SPEC(+X)=""
  1. S (I,X)=0 F S X=$O(SPEC(X)) Q:X<1 S I=I+1,DLIST(I)=X
  1. Q
  1. ;
  1. VSTR() ; -- build Visit string of Type;date.time[;location]
  1. N Y S Y=""
  1. I $G(VAIP(13)) S Y="H;"_+VAIP(13)
  1. E S X=$G(@VPRVST@(0)),Y=$P(X,U,7)_";"_+X_";"_$P(X,U,22)
  1. Q Y
  1. ;
  1. CPT(VISIT) ; -- Return CPT code of encounter type
  1. N DA,Y,X,X0 S Y=""
  1. S DA=0 F S DA=$O(^TMP("PXKENC",$J,VISIT,"CPT",DA)) Q:DA<1 S X0=$G(^(DA,0)) D Q:$L(Y)
  1. . S X=$P(X0,U) I X?1"992"2N S Y=X Q
  1. Q Y
  1. ;
  1. VPRV(VISIT) ; -- build DLIST(n)=#200 ien for V Providers
  1. N I,X,R S I=0
  1. F S I=$O(^TMP("PXKENC",$J,VISIT,"PRV",I)) Q:I<1 S X=$G(^(I,0)) D
  1. . S R=$P(X,U,4)
  1. . S DLIST(I)=+X_U_$S(R="P":"PRIMARY",R="S":"SECONDARY",1:"")
  1. Q
  1. ;
  1. HF1 ; -- get info for single HF record [ID Action]
  1. ; Expects/updates DIEN = #9000010.23 ien
  1. ; Returns VPRVST = #9000010 ien
  1. ; VPRVST0 = Visit zero node
  1. ; VPRHF array
  1. K VPRHF D:$$ZERO^VPRENC("HF",+DIEN) VHF^PXPXRM(+DIEN,.VPRHF)
  1. S VPRVST=+$G(VPRHF("VISIT")),VPRVST0=$G(^AUPNVSIT(+VPRVST,0))
  1. S VPRHF=DIEN,DIEN=+DIEN
  1. Q
  1. ;
  1. VTO(VISIT) ; -- determine ToTime for a visit based on type
  1. N TYPE,INPT,Y S Y="",VISIT=+$G(VISIT)
  1. S TYPE=$P($G(@VPRVST@(0)),U,7),INPT=$P($G(@VPRVST@(150)),U,2)
  1. ; should not have any inpatient episodes here, handled via DGPM
  1. I "H^R"[TYPE,INPT Q Y
  1. ; look for an appointment check-out time
  1. I "A^I^O"[TYPE S Y=$$CKOUT(VISIT) I Y Q Y
  1. ; check Surgery for Time Out of OR
  1. I TYPE="S" D I Y Q Y
  1. . N I S I=$O(^SRF("AV",VISIT,0))
  1. . S:I Y=$$GET1^DIQ(130,I_",",.232,"I")
  1. ; otherwise use the Visit Time
  1. I "H^R^A^I^O^S"'[TYPE!(+$G(@VPRVST@(0))<DT) S Y=+$G(@VPRVST@(0))
  1. Q Y
  1. ;
  1. CKOUT(VISIT) ; -- get Check-out date from Outpt Enc or EDP Log file
  1. N X,Y,IEN S VISIT=+$G(VISIT)
  1. I $G(VPREDP) S Y=$$GET1^DIQ(230,VPREDP,.09,"I") Q Y
  1. S IEN=$O(^SCE("AVSIT",VISIT,0)),(X,Y)=""
  1. S:IEN X=$$GETOE^SDOE(IEN),Y=$P(X,U,7)
  1. Q Y
  1. ;
  1. LAST(DFN) ; -- return date.time of last visit (last treated)
  1. N IDT,X,Y S Y=""
  1. I '$G(DFN) Q ""
  1. S IDT=(9999999-DT-.000001),X=$O(^AUPNVSIT("AA",DFN,IDT))
  1. S:X Y=(9999999-$P(X,"."))_$S($L(X,".")>1:"."_$P(X,".",2),1:"")
  1. Q Y