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

VPRDPT.m

Go to the documentation of this file.
  1. VPRDPT ;SLC/MKB -- Patient demographics extract ;8/11/11 15:29
  1. ;;1.0;VIRTUAL PATIENT RECORD;**1,4,5,7,35**;Sep 01, 2011;Build 16
  1. ;;Per VHA Directive 2004-038, this routine should not be modified.
  1. ;
  1. ; External References DBIA#
  1. ; ------------------- -----
  1. ; ^AUPNVSIT 2028
  1. ; ^DGSL(38.1 767
  1. ; ^DIC(4 10090
  1. ; ^DIC(31 733
  1. ; ^DIC(42 723,10039
  1. ; ^DPT 3581,5597,10035
  1. ; ^VA(200 10060
  1. ; DGCV 4156
  1. ; DGMSTAPI 2716
  1. ; DGNTAPI 3457
  1. ; DGPFAPI 3860
  1. ; DGRPDB 4807
  1. ; DIC 2051
  1. ; DILFD 2055
  1. ; DIQ 2056
  1. ; MPIF001 2701
  1. ; SCAPMC 1916
  1. ; SCAPMCA 2848
  1. ; SDUTL3 1252
  1. ; VADPT 10061
  1. ; VAFCTFU1 2990
  1. ; VASITE 10112
  1. ; XUAF4 2171
  1. ;
  1. ; ------------ Get data from VistA ------------
  1. ;
  1. EN(DFN,BEG,END,MAX,ID) ; -- find current patient demographics
  1. ; [BEG,END,MAX,ID not currently used]
  1. S DFN=+$G(DFN) Q:DFN<1 ;invalid patient
  1. N PAT,SYS S SYS=$$SITE^VASITE
  1. D DEM,SVC,PRF,ATC,SUPP,ALIAS,FAC,INPT,PC
  1. I $D(PAT)>9 D XML(.PAT)
  1. Q
  1. ;
  1. DEM ;-demographic data
  1. N VADM,VA,VAERR,X
  1. S X=+$$GETICN^MPIF001(DFN) S:X>1 PAT("icn")=X
  1. D DEM^VADPT S X=VADM(1),PAT("fullName")=X
  1. S PAT("familyName")=$P(X,","),PAT("givenNames")=$P(X,",",2,99)
  1. S PAT("ssn")=$P(VADM(2),U),PAT("id")=DFN
  1. S:$D(VA("BID")) PAT("bid")=$E(X)_VA("BID")
  1. S PAT("dob")=+$P($P(VADM(3),U),".")
  1. S PAT("gender")=$P(VADM(5),U)
  1. S PAT("lrdfn")=+$G(^DPT(DFN,"LR"))
  1. S X=+$P($P(VADM(6),U),".") S:X PAT("died")=X
  1. S X=$$GET1^DIQ(38.1,DFN_",",2,"I") S:$L(X) PAT("sensitive")=X
  1. S X=+VADM(9) S:X PAT("religion")=X
  1. S X=$P(VADM(10),U,2) S:$L(X) PAT("maritalStatus")=$E(X)
  1. I VADM(11) D
  1. . N I S I=0
  1. . F S I=$O(VADM(11,I)) Q:I<1 S X=+VADM(11,I),PAT("ethnicity",X)=$$GET1^DIQ(2.06,X_","_DFN_",",".01:3")
  1. I VADM(12) D
  1. . N I S I=0
  1. . F S I=$O(VADM(12,I)) Q:I<1 S X=+VADM(12,I),PAT("race",X)=$$GET1^DIQ(2.02,X_","_DFN_",",".01:3")
  1. I $G(VADM(13)) D
  1. . N I S I=+$O(VADM(13,0)),X=$P($G(VADM(13,I)),U,2)
  1. . S I=$$FIND1^DIC(.85,,"X",X)
  1. . S PAT("language")=$$GET1^DIQ(.85,I_",",.02)_U_X
  1. Q
  1. SVC ;-service data
  1. N VAEL,VASV,VAERR,X,Y,I,AO,IR,PGF,HNC,MST,CV
  1. D 7^VADPT
  1. S PAT("veteran")=VAEL(4)
  1. S PAT("sc")=+VAEL(3) S:VAEL(3) PAT("scPercent")=+$P(VAEL(3),U,2)
  1. S:VAEL(2) PAT("servicePeriod")=$P(VAEL(2),U,2)
  1. I VAEL(1) D
  1. . S PAT("eligibility",+VAEL(1))=$P(VAEL(1),U,2)_"^1",I=0
  1. . F S I=$O(VAEL(1,I)) Q:I<1 S PAT("eligibility",I)=$P(VAEL(1,I),U,2)
  1. S:$L(VAEL(8)) PAT("eligibilityStatus")=$P(VAEL(8),U,2)
  1. S:$L(VAEL(9)) PAT("meansTest")=$P(VAEL(9),U,2)
  1. ;
  1. ; exposures
  1. S AO=VASV(2),IR=VASV(3)
  1. S PGF=VASV(11)!VASV(12)!VASV(13) ;OIF/OEF
  1. S X=$$GETCUR^DGNTAPI(DFN,"HNC"),X=+($G(HNC("STAT")))
  1. S HNC=$S(X=4:1,X=5:1,X=1:0,X=6:0,1:"")
  1. S X=$P($$GETSTAT^DGMSTAPI(DFN),U,2),MST=$S(X="Y":1,X="N":0,1:"")
  1. S X=$$CVEDT^DGCV(DFN),CV=$S(+X<0:"",+X=0:0,$P(X,U,3):1,1:0)
  1. S PAT("exposures")=AO_U_IR_U_PGF_U_HNC_U_MST_U_CV
  1. ;
  1. ; rated disabilities [DGRPDB]
  1. N VPRDIS,DIS,NM,DX,IENS,ODT,CDT
  1. D RDIS^DGRPDB(DFN,.VPRDIS)
  1. S I=0 F S I=$O(VPRDIS(I)) Q:I<1 D
  1. . S DIS=VPRDIS(I)
  1. . S NM=$$GET1^DIQ(31,+DIS_",",.01),DX=$$GET1^DIQ(31,+DIS_",",2)
  1. . S IENS=I_","_DFN
  1. . S ODT=$$GET1^DIQ(2.04,IENS_",",5),CDT=$$GET1^DIQ(2.04,IENS_",",6)
  1. . S PAT("disability",+DX_"x"_I)=NM_U_$P(DIS,U,3)_U_$P(DIS,U,2)_U_$P(DIS,U,4)_U_ODT_U_CDT ;name^sc^%^extr^orig ed^curr ed
  1. Q
  1. PRF ;-patient record flags
  1. N VPRPF,I,NAME,TEXT
  1. Q:'$$GETACT^DGPFAPI(DFN,"VPRPF")
  1. S I=0 F S I=$O(VPRPF(I)) Q:I<1 D
  1. . S NAME=$P(VPRPF(I,"FLAG"),U,2)
  1. . M TEXT=VPRPF(I,"NARR")
  1. . S PAT("flag",I)=NAME_U_$$STRING^VPRD(.TEXT)
  1. Q
  1. ATC ;-address & telecom
  1. N VAPA,I,X
  1. S VAPA("P")="" D ADD^VADPT ;permanent address
  1. S X="" F I=1:1:4 S X=X_VAPA(I)_U
  1. S X=X_$P(VAPA(5),U,2)_U_$P(VAPA(11),U,2)
  1. S PAT("address")=X ;street1^st2^st3^city^state^zip
  1. S X=$$FORMAT(VAPA(8))_U_$$FORMAT($$GET1^DIQ(2,DFN_",",.134))_U_$$FORMAT($$GET1^DIQ(2,DFN_",",.132))
  1. S PAT("telecom")=X ;home^cell^work phones
  1. Q
  1. SUPP ;-support contacts
  1. N VAOA,A,I,X,TYPE
  1. F A="",1 K VAOA D
  1. . S:A VAOA("A")=A D OAD^VADPT Q:'$L($G(VAOA(9)))
  1. . S TYPE=$S(A=1:"ECON",1:"NOK")
  1. . S PAT("support",TYPE)=VAOA(9)_U_VAOA(10) ;name^relationship
  1. . S X="" F I=1:1:4 S X=X_VAOA(I)_U
  1. . S X=X_$P(VAOA(5),U,2)_U_$P(VAOA(11),U,2)
  1. . S PAT("support",TYPE,"address")=X ;street1^st2^st3^city^state^zip
  1. . S I=$S(A=1:.33011,1:.21011),X=$$FORMAT(VAOA(8))_U_U_$$FORMAT($$GET1^DIQ(2,DFN_",",I))
  1. . S PAT("support",TYPE,"telecom")=X ;home^cell^work phones
  1. Q
  1. ALIAS ;-other names used
  1. N I,X
  1. S I=0 F S I=$O(^DPT(DFN,.01,I)) Q:I<1 S X=$P($G(^(I,0)),U) D
  1. . S PAT("alias",I)=X_U_$P(X,",")_U_$P(X,",",2,99)
  1. Q
  1. FORMAT(X) ; -- enforce (xxx)xxx-xxxx phone format
  1. S X=$G(X) I X?1"("3N1")"3N1"-"4N.E Q X
  1. N P,N,I,Y S P=""
  1. F I=1:1:$L(X) S N=$E(X,I) I N=+N S P=P_N
  1. S:$L(P)<10 P=$E("0000000000",1,10-$L(P))_P
  1. S Y=$S(P:"("_$E(P,1,3)_")"_$E(P,4,6)_"-"_$E(P,7,10),1:"")
  1. Q Y
  1. FAC ;-treating facilities [see FACLIST^ORWCIRN]
  1. N IFN S DFN=+$G(DFN) Q:DFN<1
  1. N VPRY,HOME,LAST,I,X,IEN
  1. I $L($T(TFL^VAFCTFU1)) D TFL^VAFCTFU1(.VPRY,DFN)
  1. S HOME=+$P($G(^DPT(DFN,"MPI")),U,3) ;home facility
  1. I $P($G(VPRY(1)),U)<0 D Q ;not setup
  1. . S X=$O(^AUPNVSIT("AA",DFN,0)),LAST=$S(X:9999999-$P(X,"."),1:"")
  1. . S X=$$SITE^VASITE
  1. . S PAT("facility",+X)=$P(X,U,3)_U_$P(X,U,2)_U_LAST_U_$$GET1^DIQ(4,+X_",",60)
  1. S I=0 F S I=$O(VPRY(I)) Q:I<1 D
  1. . S X=VPRY(I) Q:$P(X,U)="" ;unknown
  1. . S IEN=+$$IEN^XUAF4($P(X,U))
  1. . I +X=776!(+X=200) S $P(X,U,2)="DEPT. OF DEFENSE"
  1. . S PAT("facility",IEN)=$P(X,U,1,2)_U_$P($P(X,U,3),".")
  1. . ; = stn# ^ name ^ last date ^ VistA domain
  1. . S $P(PAT("facility",IEN),U,4)=$$GET1^DIQ(4,IEN_",",60)
  1. . I IEN=HOME S $P(PAT("facility",IEN),U,5)=1
  1. Q
  1. INPT ;-current inpt status
  1. N ADM,X,VAIN,VAERR,HLOC,SVC
  1. S ADM=+$G(^DPT(DFN,.105)) I ADM D
  1. . D INP^VADPT S PAT("admitted")=ADM_U_+VAIN(7)
  1. . S PAT("ward")=VAIN(4),PAT("roomBed")=VAIN(5)
  1. . S HLOC=+$G(^DIC(42,+VAIN(4),44)),SVC=$P($G(^(0)),U,3)
  1. . S PAT("location")=HLOC_U_$P(VAIN(4),U,2)
  1. . S:$L(SVC) PAT("locSvc")=SVC_U_$$EXTERNAL^DILFD(42,.03,,SVC)
  1. . S PAT("specialty")=VAIN(3)
  1. . S PAT("attending")=VAIN(11)
  1. . S X=$$FAC^VPRD(HLOC),PAT("site")=X
  1. S PAT("inpatient")=$S(ADM:"true",1:"false")
  1. Q
  1. ZPC ;-primary care [not used: GETALL not returning team members]
  1. N TEAM,VPRPC,VPRI,VPRTM,PCPR,FAC,X,ST
  1. S TEAM=$$INSTPCTM^SCAPMC(DFN) Q:'TEAM ;teamIEN^name^instIEN^name
  1. S PAT("pcTeam")=$P(TEAM,U,1,2)
  1. D GETALL^SCAPMCA(DFN,,.VPRPC)
  1. S VPRI=+$O(@VPRPC@(DFN,"TM",+TEAM,0)),VPRTM=$G(^(VPRI))
  1. S:$P(VPRTM,U,4) PAT("pcAssigned")=$P(VPRTM,U,4)
  1. S PCPR=$G(@VPRPC@(DFN,"PCPR",1)) I PCPR D
  1. . S PAT("pcProvider")=$P(PCPR,U,1,2)_U_$$PROVSPC^VPRD(+PCPR)
  1. . S FAC=$P(TEAM,U,3,4) S:FAC<1 FAC=$$SITE^VASITE
  1. . S X=$$PADD^XUAF4(+FAC) ;street^city^st^zip
  1. . S ST=$$GET1^DIQ(4,+FAC_",",.02) S:ST="" ST=$P(X,U,3) ;get state name
  1. . S PAT("pcProvider","address")=$P(X,U)_"^^^"_$P(X,U,2)_U_ST_U_$P(X,U,4)
  1. ; get team members
  1. S VPRI=0 F S VPRI=$O(@VPRPC@(DFN,"TM",+VPRTM,+$P(VPRTM,U,3),"POS",VPRI)) Q:VPRI<1 I +$G(^(VPRI))'=$P(PCPR,U,3) D
  1. . S I=+$O(@VPRPC@(DFN,"TM",+VPRTM,+$P(VPRTM,U,3),"POS",VPRI,"PROV",0)),X=$G(^(I)) Q:X=""
  1. . S POS=$S($L($P(X,U,8)):$P(X,U,8),1:$P(X,U,4))
  1. . S PAT("pcTeamMember",I)=$P(X,U,1,2)_U_POS_U_$$PROVSPC^VPRD(+X)
  1. K @VPRPC
  1. Q
  1. ;
  1. PC ;-primary care
  1. N TEAM,X,VPRT,PRV,POS,FAC,ST,I
  1. S TEAM=$$INSTPCTM^SCAPMC(DFN) I TEAM D ;PC teamIEN^name^instIEN^name
  1. . S PAT("pcTeam")=$P(TEAM,U,1,2)
  1. . S X=$$TMPT^SCAPMC(DFN,,,.VPRT) I X S I=0 F S I=$O(@VPRT@(I)) Q:I<1 I +$G(@VPRT@(I))=+TEAM S PAT("pcAssigned")=$P(@VPRT@(I),U,4) Q
  1. . K @VPRT,VPRT,X
  1. . S X=$$PRTM^SCAPMC(+TEAM,,,,.VPRT) Q:'X
  1. . S (I,PRV)=0 F S PRV=+$O(@VPRT@("SCPR",PRV)) Q:PRV<1 D
  1. .. S POS=$O(@VPRT@("SCPR",PRV,0))
  1. .. S X=PRV_U_$P($G(^VA(200,PRV,0)),U)
  1. .. S POS=$$GET1^DIQ(404.57,POS_",",.01)
  1. .. S I=I+1,PAT("pcTeamMember",I)=X_U_POS_U_$$PROVSPC^VPRD(+X)
  1. . K @VPRT,VPRT,X
  1. S X=$$OUTPTPR^SDUTL3(DFN) I X D
  1. . S PAT("pcProvider")=X_U_$$PROVSPC^VPRD(+X)
  1. . S FAC=$P(TEAM,U,3,4) S:FAC<1 FAC=$$SITE^VASITE
  1. . S X=$$PADD^XUAF4(+FAC) ;street^city^st^zip
  1. . S ST=$$GET1^DIQ(4,+FAC_",",.02) S:ST="" ST=$P(X,U,3) ;get state name
  1. . S PAT("pcProvider","address")=$P(X,U)_"^^^"_$P(X,U,2)_U_ST_U_$P(X,U,4)
  1. Q
  1. ;
  1. ; ------------ Return data to middle tier ------------
  1. ;
  1. XML(ITEM) ; -- Return patient data as XML in @VPR@(n)
  1. ; as <element code='123' displayName='ABC' />
  1. N ATT,X,Y,NAMES,I,ID
  1. D ADD("<patient>") S VPRTOTL=$G(VPRTOTL)+1
  1. S ATT="" F S ATT=$O(ITEM(ATT)) Q:ATT="" D D:$L(Y) ADD(Y)
  1. . S X=$G(ITEM(ATT)),NAMES=$$LABELS(ATT),Y=""
  1. . I ATT="pcProvider" D Q
  1. .. S Y="<"_ATT_" "_$$LOOP_">" D ADD(Y)
  1. .. S X=$G(ITEM(ATT,"address")) I $L(X) D ADDR(X)
  1. .. D ADD("</"_ATT_">") S Y=""
  1. . ;
  1. . I $L($O(ITEM(ATT,""))) D Q ;multiples
  1. .. S ID=$S($E(ATT,$L(ATT))="s":ATT_"es",$E(ATT,$L(ATT))="y":$E(ATT,1,$L(ATT)-1)_"ies",1:ATT_"s")
  1. .. D ADD("<"_ID_">")
  1. .. S I="" F S I=$O(ITEM(ATT,I)) Q:I="" D
  1. ... S X=ITEM(ATT,I),Y="<"_ATT_" "
  1. ... I ATT="support" D S Y="" Q
  1. .... S Y=Y_"contactType='"_I_"' "_$$LOOP_">" D ADD(Y)
  1. .... S X=$G(ITEM(ATT,I,"address")) I $L(X) D ADDR(X)
  1. .... S X=$G(ITEM(ATT,I,"telecom")) I $L(X) D PHONE(X)
  1. .... D ADD("</support>")
  1. ... I ATT="disability" S Y=Y_"vaCode='"_+I_"' "
  1. ... S Y=Y_$$LOOP_"/>" D ADD(Y)
  1. .. D ADD("</"_ID_">") S Y=""
  1. . ;
  1. . I ATT="exposures" D:X["1" S Y="" Q
  1. .. S I=0,Y="<exposures>" D ADD(Y)
  1. .. F ID="AO","IR","PG","HNC","MST","CV" S I=I+1 I $P(X,U,I) S Y="<exposure value='"_ID_"' />" D ADD(Y)
  1. .. D ADD("</exposures>")
  1. . ;
  1. . I ATT="address" D ADDR(X) S Y="" Q
  1. . I ATT="telecom" D PHONE(X) S Y="" Q
  1. . ;
  1. . Q:X="" ;no data
  1. . I X'["^" S Y="<"_ATT_" value='"_$$ESC^VPRD(X)_"' />" Q
  1. . I $L(X)>1 S Y="<"_ATT_" "_$$LOOP_"/>"
  1. D ADD("</patient>")
  1. Q
  1. ;
  1. ADDR(X) ; -- XML address node from X=street1^st2^st3^city^state^zip
  1. N I,Y Q:$L(X)'>5 ;no data
  1. S Y="<address"
  1. F I=1,2,3 I $L($P(X,U,I)) S Y=Y_" streetLine"_I_"='"_$$ESC^VPRD($P(X,U,I))_"'"
  1. I $L($P(X,U,4)) S Y=Y_" city='"_$$ESC^VPRD($P(X,U,4))_"'"
  1. I $L($P(X,U,5)) S Y=Y_" stateProvince='"_$P(X,U,5)_"'"
  1. I $L($P(X,U,6)) S Y=Y_" postalCode='"_$P(X,U,6)_"'"
  1. S Y=Y_" />" D ADD(Y)
  1. Q
  1. ;
  1. PHONE(X) ; -- XML telecom node from X=home^cell^work numbers
  1. N I,Y Q:$L(X)'>2 ;no data
  1. D ADD("<telecomList>")
  1. I $L($P(X,U,1)) S Y="<telecom usageType='H' value='"_$P(X,U,1)_"' />" D ADD(Y)
  1. I $L($P(X,U,2)) S Y="<telecom usageType='MC' value='"_$P(X,U,2)_"' />" D ADD(Y)
  1. I $L($P(X,U,3)) S Y="<telecom usageType='WP' value='"_$P(X,U,3)_"' />" D ADD(Y)
  1. D ADD("</telecomList>")
  1. Q
  1. ;
  1. LOOP() ; -- build sub-items string from NAMES and X
  1. N STR,P,TAG S STR=""
  1. F P=1:1 S TAG=$P(NAMES,U,P) Q:TAG="Z" I $L($P(X,U,P)) S STR=STR_TAG_"='"_$$ESC^VPRD($P(X,U,P))_"' "
  1. Q STR
  1. ;
  1. ADD(X) ; Add a line @VPR@(n)=X
  1. S VPRI=$G(VPRI)+1
  1. S @VPR@(VPRI)=X
  1. Q
  1. ;
  1. LABELS(X) ; -- return string of attribute labels for element X
  1. N Y S Y="code^name^Z"
  1. I X="pcProvider" S Y="code^name^"_$$PROVTAGS^VPRD_"^Z"
  1. I X="support" S Y="name^relationship^Z"
  1. I X="eligibility" S Y="name^primary^Z"
  1. I X="disability" S Y="printName^sc^scPercent^extr^origEffDate^currEffDate^Z"
  1. I X="alias" S Y="fullName^familyName^givenNames^Z"
  1. I X="flag" S Y="name^text^Z"
  1. I X="facility" S Y="code^name^latestDate^domain^homeSite^Z"
  1. I X="pcTeamMember" S Y="code^name^role^"_$$PROVTAGS^VPRD_"^Z"
  1. I X="ethnicity"!(X="race") S Y="value^Z"
  1. I X="admitted" S Y="id^date^Z"
  1. Q Y