XUMVINPU ;MVI/DRI - Master Veteran Index New Person Utilities ;7/31/20 15:04
;;8.0;KERNEL;**691,711,710,732,733**;Jul 10, 1995;Build 0
;Per VA Directive 6402, this routine should not be modified.
;
;**711, Story 977780 (jfw)
;**732, Story 1204309 (mko)
;**733, Story 1291666 (dri)
;
GET(XURET,XUDUZ,SECID,NPI,SSN) ;rpc to retrieve new person file data
; called from rpc: XUS MVI NEW PERSON GET
; Input (ONE of the following):
; XUDUZ = NEW PERSON IEN SECID=SECURITY ID NPI=NATIONAL PROVIDER IDENTIFIER SSN=SOCIAL SECURITY NUMBER
; Output:
; Success: XURET = ^TMP("XUMVINPU",$J)
; @XURET@(#) = FILE #;FIELD #<SUBFIELD #><FILE POINTER>^FIELD NAME^<COUNTER #>^INTERNAL VALUE^EXTERNAL VALUE
; <> Denotes optional values. If Counter populated, denotes multiple value <1-n>.
; @XURET@(#)="200;IEN^DUZ^^^"
; @XURET@(#)="200;.01^NAME^^^"
; @XURET@(#)="200;4^SEX^^^"
; @XURET@(#)="200;5^DOB^^^" ;**732,1204309 (mko): Return DOB
; @XURET@(#)="200;8^TITLE^^^"
; @XURET@(#)="200;7^DISUSER^^^"
; @XURET@(#)="200;9.2^TERMINATION DATE^^^"
; @XURET@(#)="200;9.4^Termination Reason^^^"
; @XURET@(#)="200;15^PROHIBITED TIMES FOR SIGN-ON^^^"
; @XURET@(#)="200;11.2^DATE VERIFY CODE LAST CHANGED^^^"
; @XURET@(#)="200;.111^STREET ADDRESS 1^^^"
; @XURET@(#)="200;.112^STREET ADDRESS 2^^^"
; @XURET@(#)="200;.113^STREET ADDRESS 3^^^"
; @XURET@(#)="200;.114^CITY^^^"
; @XURET@(#)="200;.115^STATE^^^"
; @XURET@(#)="200;.116^ZIP CODE^^^"
; @XURET@(#)="200;.132^OFFICE PHONE^^^"
; @XURET@(#)="200;.136^FAX NUMBER^^^"
; @XURET@(#)="200;.151^EMAIL ADDRESS^^^"
; @XURET@(#)="200;30^DATE ENTERED^^^"
; @XURET@(#)="200;31^CREATOR^^^"
; @XURET@(#)="200;41.98^NPI ENTRY STATUS^^"
; @XURET@(#)="200;41.99^NPI^^^"
; @XURET@(#)="200;9^SSN^^^"
; @XURET@(#)="200;42;.01^EFFECTIVE DATE/TIME^<#>^^"
; @XURET@(#)="200;42;.02^STATUS^<#>^^"
; @XURET@(#)="200;42;.03^NPI^<#>^^"
; @XURET@(#)="200;101.13;.01^CPRS TAB^<#>^^"
; @XURET@(#)="200;101.13;.02^EFFECTIVE DATE^<#>^^"
; @XURET@(#)="200;101.13;.03^EXPIRATION DATE^<#>^^"
; @XURET@(#)="200;202^LAST SIGN-ON DATE/TIME^^^"
; @XURET@(#)="200;202.02^XUS Logon Attempt Count^^^"
; @XURET@(#)="200;202.03^XUS Active User^^^"
; @XURET@(#)="200;202.04^Entry Last Edit Date^^^"
; @XURET@(#)="200;202.05^LOCKOUT USER UNTIL^^^"
; @XURET@(#)="200;16;.01^DIVISION^<1-n>^^"
; @XURET@(#)="200;10.1^NAME COMPONENTS^^^"
; @XURET@(#)="20;1^FAMILY (LAST) NAME^^^"
; @XURET@(#)="20;2^GIVEN (FIRST) NAME^^^"
; @XURET@(#)="20;3^MIDDLE NAME^^^"
; @XURET@(#)="20;4^PREFIX^^^"
; @XURET@(#)="20;5^SUFFIX^^^"
; @XURET@(#)="20;6^DEGREE^^^"
; @XURET@(#)="200;29^SERVICE/SECTION^^^"
; @XURET@(#)="200;201^PRIMARY MENU OPTION^^^"
; @XURET@(#)="200;203;.01^SECONDARY MENU OPTIONS^<1-n>^^"
; @XURET@(#)="200;51;.01^KEYS^<1-n>^^"
; @XURET@(#)="200;205.1^SECID^^^"
; @XURET@(#)="200;205.2^SUBJECT ORGANIZATION^^^"
; @XURET@(#)="200;205.3^SUBJECT ORGANIZATION ID^^^"
; @XURET@(#)="200;205.4^UNIQUE USER ID^^^"
; @XURET@(#)="200;205.5^ADUPN^^^"
; @XURET@(#)="200;501.1^NETWORK USERNAME^^^"
; @XURET@(#)="200;8932.1;.01^PERSON CLASS^<1-n>^^"
; @XURET@(#)="200;8932.1;2^EFFECTIVE DATE^<#>^^"
; @XURET@(#)="200;8932.1;3^EXPIRATION DATE^<#>^^"
; @XURET@(#)="200;53.1^AUTHORIZED TO WRITE MED ORDERS^^^"
; @XURET@(#)="200;53.11^DETOX/MAINTENANCE ID NUMBER^^^"
; @XURET@(#)="200;53.2^DEA#^^^"
; @XURET@(#)="200;747.44^DEA EXPIRATION DATE^^^"
; @XURET@(#)="200;53.4^INACTIVE DATE^^^"
; @XURET@(#)="200;53.5^PROVIDER CLASS^^^"
; @XURET@(#)="200;53.6^PROVIDER TYPE^^^"
; @XURET@(#)="200;53.9^REMARKS^^^"
; @XURET@(#)="200;53.91^NON-VA PRESCRIBER^^^"
; @XURET@(#)="200;53.92^TAX ID^^^"
; @XURET@(#)="200;55.1^SCHEDULE II NARCOTIC^^^"
; @XURET@(#)="200;55.2^SCHEDULE II NON-NARCOTIC^^^"
; @XURET@(#)="200;55.3^SCHEDULE III NARCOTIC^^^"
; @XURET@(#)="200;55.4^SCHEDULE III NON-NARCOTIC^^^"
; @XURET@(#)="200;55.5^SCHEDULE IV^^^"
; @XURET@(#)="200;55.6^SCHEDULE V^^^"
;
; **The following are ONLY returned if patch
; **XU*8.0*688 has been installed.
; **Subscript Counter (#) will denote the DEA Data that belongs to the DEA NUMBER subscript
; ** New DEA Data will always follow the DEA NUMBER entry!
; @XURET@(#)="200;9001^DETOX CALCULATED^^^"
; @XURET@(#)="200;53.21;.01;8991.9^DEA NUMBER^<1-n>^^"
; @XURET@(#)="200;53.21;.02^INDIVIDUAL DEA SUFFIX^<#>^^"
; **Only returned if there is a DEA NUMBER (200.5321) value!!**
; @XURET@(#)="8991.9;.02^BUSINESS ACTIVITY CODE^<#>^^"
; @XURET@(#)="8991.9;.03^DETOX NUMBER^<#>^^"
; @XURET@(#)="8991.9;.04^EXPIRATION DATE^<#>^^"
; @XURET@(#)="8991.9;.06^USE FOR INPATIENT ORDERS?^<#>^^"
; @XURET@(#)="8991.9;.07^TYPE^<#>^^"
; @XURET@(#)="8991.9;1.1^NAME (PROVIDER OR INSTITUTION)^<#>^^"
; @XURET@(#)="8991.9;1.2^STREET ADDRESS 1^<#>^^"
; @XURET@(#)="8991.9;1.3^STREET ADDRESS 2^<#>^^"
; @XURET@(#)="8991.9;1.4^STREET ADDRESS 3^<#>^^"
; @XURET@(#)="8991.9;1.5^CITY^<#>^^"
; @XURET@(#)="8991.9;1.6^STATE^<#>^^"
; @XURET@(#)="8991.9;1.7^ZIP CODE^<#>^^"
; @XURET@(#)="8991.9;2.1^SCHEDULE II NARCOTIC?^<#>^^"
; @XURET@(#)="8991.9;2.2^SCHEDULE II NON-NARCOTIC?^<#>^^"
; @XURET@(#)="8991.9;2.3^SCHEDULE III NARCOTIC?^<#>^^"
; @XURET@(#)="8991.9;2.4^SCHEDULE III NON-NARCOTIC?^<#>^^"
; @XURET@(#)="8991.9;2.5^SCHEDULE IV?^<#>^^"
; @XURET@(#)="8991.9;2.6^SCHEDULE V?^<#>^^"
; @XURET@(#)="8991.9;10.1^LAST UPDATED BY^<#>^^"
; @XURET@(#)="8991.9;10.2^LAST UPDATED DATE/TIME^<#>^^"
; @XURET@(#)="8991.9;10.3^LAST DOJ UPDATE DATE/TIME^<#>^^"
;
; Fail:
; XURET = ^TMP("XUMVINPU",$J)
; @XURET@(1)="-1^Invalid User"
; or
; @XURET@(1)="-1^No Data for User: ######"
;
; Example calling rpc from VistA:
; >D GET^XUMVINPU(.XURET,12596)
; >ZW XURET
; >XURET="^TMP(""XUMVINPU"",17226)"
;
; D ^%G would return:
; ^TMP("XUMVINPU",17226,1)="200;IEN^DUZ^12596^12596"
; 2)="200;.01^NAME^LAST,FIRST^LAST,FIRST"
; 3)="200;7^DISUSER^^"
; #)=continuation of returned data
;
; Example calling rpc from MVI:
; D DIRECT^XWB2HL7(.XURET,SITE,"XUS MVI NEW PERSON GET","",$G(XUDUZ),$G(SECID),$G(NPI),$G(SSN))
;
N I,CNT,FILE,FLD,FLDS,FLDCNT,FLDNM,XUARR,XUGBL S XUGBL="^TMP("_"""XUMVINPU"""_","_$J_")",CNT=1,FILE=200 K @XUGBL,XURET
I $G(SECID)'="" S XUDUZ=$O(^VA(FILE,"ASECID",SECID,0))
I $G(NPI)'="" S XUDUZ=$O(^VA(FILE,"ANPI",NPI,0))
I $G(SSN)'="" S XUDUZ=$O(^VA(FILE,"SSN",SSN,0))
I $G(XUDUZ)="" S @XUGBL@(CNT)="-1^Invalid User" S XURET=$NA(@XUGBL) Q
I '$D(^VA(FILE,XUDUZ)) S @XUGBL@(CNT)="-1^No Data for User: "_XUDUZ S XURET=$NA(@XUGBL) Q
S @XUGBL@(CNT)=FILE_";IEN^DUZ^^"_XUDUZ_"^"_XUDUZ S CNT=CNT+1
S FLDS=".01;4;5;8;7;9.2;9.4;15;11.2;.111;.112;.113;.114;.115;.116;.132;.136;.151;30;31;41.98;41.99;9;42*;101.13*;202;202.02;202.03;"
S FLDS=FLDS_"202.04;202.05;16*;10.1;29;201;203*;51*;205.1;205.2;205.3;205.4;205.5;501.1;8932.1*;53.1;53.11;53.2;"
S FLDS=FLDS_"747.44;53.4;53.5;53.6;53.9;53.91;53.92;55.1;55.2;55.3;55.4;55.5;55.6"
S:($$PATCH^XPDUTL("XU*8.0*688")) FLDS=FLDS_";9001;53.21*" ;NEW DETOX CALCULATED and DEA #'S multiple | DBIA #10141 (Supported)
S FLDCNT=$L(FLDS,";") D GETS^DIQ(FILE,+XUDUZ_",",FLDS,"EI","XUARR") ;retrieve data
F I=1:1:FLDCNT D
.S FLD=$P($P(FLDS,";",I),"*") D FIELD^DID(FILE,FLD,"","LABEL","FLDNM")
.I FLD=16 D Q ;division multiple
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.02,SUBFLD=.01 D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
..I '$D(XUARR(SUBFILE)) S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^" S CNT=CNT+1 Q
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")) S MCNT=MCNT+1,CNT=CNT+1
.I FLD=10.1 D Q ;name components
..S @XUGBL@(CNT)=FILE_";"_FLD_"^"_(FLDNM("LABEL"))_"^^"_$G(XUARR(FILE,XUDUZ_",",FLD,"I"))_"^"_$G(XUARR(FILE,XUDUZ_",",FLD,"E")) S CNT=CNT+1
..N NCFILE,NCFLD S NCFILE=20 D GETS^DIQ(NCFILE,+$G(XUARR(FILE,XUDUZ_",",FLD,"I"))_",","1;2;3;4;5;6","EI","XUARR") ;retrieve name component data
..F NCFLD=1,2,3,4,5,6 D
...D FIELD^DID(NCFILE,NCFLD,"","LABEL","FLDNM")
...S @XUGBL@(CNT)=NCFILE_";"_NCFLD_"^"_(FLDNM("LABEL"))_"^^"_$G(XUARR(NCFILE,+$G(XUARR(FILE,XUDUZ_",",FLD,"I"))_",",NCFLD,"I"))_"^"_$G(XUARR(NCFILE,+$G(XUARR(FILE,XUDUZ_",",FLD,"I"))_",",NCFLD,"E")) S CNT=CNT+1
.I FLD=42 D Q ;**732,Story 1204309 (mko): EFFECTIVE DATE/TIME (#42) (Multiple-200.042)
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.042
..I '$D(XUARR(SUBFILE)) D Q ;No EFFECTIVE DATE/TIME
...F SUBFLD=.01,.02,.03 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM") S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_FLDNM("LABEL")_"^"_MCNT_"^^",CNT=CNT+1
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" D
...F SUBFLD=.01,.02,.03 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
....S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_FLDNM("LABEL")_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")),CNT=CNT+1
...S MCNT=MCNT+1
.I FLD=51 D Q ;KEYS multiple
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.051,SUBFLD=.01 D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
..I '$D(XUARR(SUBFILE)) S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^",CNT=CNT+1 Q
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")),MCNT=MCNT+1,CNT=CNT+1
.I FLD=53.21 D Q ;NEW DEA #'s multiple
..N I,IEN,IENS,MCNT,SUBFILE,SUBFLD,DEAARR,DEAFILE,DEAFLD,DEAFLDS,DEAFLDCNT S MCNT=1,SUBFILE=200.5321,SUBFLD=.01,DEAFILE=8991.9
..D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
..I '$D(XUARR(SUBFILE)) D Q
...S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_";8991.9^"_(FLDNM("LABEL"))_"^"_MCNT_"^^",CNT=CNT+1 D FIELD^DID(SUBFILE,.02,"","LABEL","FLDNM")
...S @XUGBL@(CNT)=FILE_";"_FLD_";"_.02_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^",CNT=CNT+1
..S DEAFLDS=".02;.03;.04;.06;.07;1.1;1.2;1.3;1.4;1.5;1.6;1.7;2.1;2.2;2.3;2.4;2.5;2.6;10.1;10.2;10.3",DEAFLDCNT=$L(DEAFLDS,";")
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" D
...S IEN=$G(XUARR(SUBFILE,IENS,.03,"I")) D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
...S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_";8991.9^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_IEN_"^"_$G(XUARR(SUBFILE,IENS,.03,"E")),CNT=CNT+1
...D FIELD^DID(SUBFILE,.02,"","LABEL","FLDNM")
...S @XUGBL@(CNT)=FILE_";"_FLD_";.02^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,.02,"I"))_"^"_$G(XUARR(SUBFILE,IENS,.02,"E")),CNT=CNT+1
...D GETS^DIQ(DEAFILE,IEN_",",DEAFLDS,"EI","DEAARR") ;retrieve DEA data
...F I=1:1:DEAFLDCNT D
....S DEAFLD=$P(DEAFLDS,";",I) D FIELD^DID(DEAFILE,DEAFLD,"","LABEL","FLDNM")
....S @XUGBL@(CNT)=DEAFILE_";"_DEAFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(DEAARR(DEAFILE,IEN_",",DEAFLD,"I"))_"^"_$G(DEAARR(DEAFILE,IEN_",",DEAFLD,"E")),CNT=CNT+1
...S MCNT=MCNT+1
.I FLD=101.13 D Q ;CPRS TAB multiple ;**733 - STORY 1291666 (dri) add field 101.13
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.010113 I '$D(XUARR(SUBFILE)) D Q ;No CPRS TAB
...F SUBFLD=.01,.03,.03 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM") S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^",CNT=CNT+1
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" D
...F SUBFLD=.01,.02,.03 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
....S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")),CNT=CNT+1
...S MCNT=MCNT+1
.I FLD=203 D Q ;secondary menu options multiple
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.03,SUBFLD=.01 D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
..I '$D(XUARR(SUBFILE)) S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^" S CNT=CNT+1 Q
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")) S MCNT=MCNT+1,CNT=CNT+1
.I FLD=8932.1 D Q ;PERSON CLASS multiple
..N IENS,MCNT,SUBFILE,SUBFLD S MCNT=1,SUBFILE=200.05 I '$D(XUARR(SUBFILE)) D Q ;No Person Class(es)
...F SUBFLD=.01,2,3 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM") S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^",CNT=CNT+1
..S IENS="" F S IENS=$O(XUARR(SUBFILE,IENS)) Q:IENS="" D
...F SUBFLD=.01,2,3 D
....D FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
....S @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$G(XUARR(SUBFILE,IENS,SUBFLD,"E")),CNT=CNT+1
...S MCNT=MCNT+1
.S @XUGBL@(CNT)=FILE_";"_FLD_"^"_(FLDNM("LABEL"))_"^^"_XUARR(FILE,XUDUZ_",",FLD,"I")_"^"_XUARR(FILE,XUDUZ_",",FLD,"E") S CNT=CNT+1 ;all other fields
S XURET=$NA(@XUGBL)
Q
;
UPDATE(XURET,XUARR) ;rpc to update new person file data
; called from rpc: XUS MVI NEW PERSON UPDATE
; Input:
; XUARR(#) = FILE #;FIELD #<SUBFIELD #><FILE POINTER>^FIELD NAME^<COUNTER #>^INTERNAL VALUE^EXTERNAL VALUE
; <> Denotes optional values. If Counter populated, denotes multiple value <1-n>.
; XUARR(0)="200;IEN^DUZ^^^"
; XUARR(#)="200;.01^NAME^^^"
; XUARR(#)="200;205.1^SECID^^"
; XUARR(#)="200;205.2^SUBJECT ORGANIZATION^^^"
; XUARR(#)="200;205.3^SUBJECT ORGANIZATION ID^^^"
; XUARR(#)="200;205.4^UNIQUE USER ID^^^"
; XUARR(#)="200;205.5^ADUPN^^^"
; **711, Story 977821 (jfw) - Allow additional fields to be updated.
; XUARR(#)="200;.151^EMAIL ADDRESS^^^"
; XUARR(#)="200;501.1^NETWORK USERNAME^^^"
; **710, Story 1100018 (jfw) - Add NPI field to be updated.
; XUARR(#)="200;41.99^NPI^^^"
; **732,Story 1204309 (mko): Add NPI ENTRY STATUS (#41.98)
; XUARR(#)=200;41.98^NPI ENTRY STATUS^^<value>
; **732, story 1278983 (cmc) add EFFECTIVE DATE (#42) MULTIPLE
; XUARR(#)="200;42;.01^EFFECTIVE DATE/TIME^<#>^^"
; XUARR(#)="200;42;.02^STATUS^<#>^^"
; XUARR(#)="200;42;.03^NPI^<#>^^"
; Success:
; XURET(0) = 1
; Fail:
; XURET(0) = "-1^No data passed"
; XURET(0) = "-1^Invalid User DUZ (null)"
; XURET(0) = "-1^User '"_XUDUZ_"' does not exist"
; XURET(0) = "-1^Invalid Name Component IEN"
; XURET(0) = "-1^No Data for Name Component IEN: "_NCIEN
; XURET(0) = "-1^No data to file for record '"_XUDUZ_"' in file 200"
; XURET(0) = "-1^Unable to lock record '"_XUDUZ_"' in file 200"
; XURET(0) = "-1^"_$G(XUERR("DIERR",1,"TEXT",1))
;
; Example calling rpc from VistA:
; >D UPDATE^XUMVINPU(.XURET,.XUARR)
; >ZW XURET
; >XURET(0)=1
; Example calling rpc from MVI:
; D DIRECT^XWB2HL7(.XURET,SITE,"XUS MVI NEW PERSON UPDATE","",.XUARR)
K XURET N ARR,FILENUM,FLDNAM,FLDNUM,IDATA,NCIEN,NPIIN,NPIERR,NPINEW,XUDUZ,XUERR,XUFDA S ARR="XUARR"
I '$D(XUARR) S XURET(0)="-1^No data passed" Q
F S ARR=$Q(@ARR) Q:ARR="" S FILENUM=+$P($P(@ARR,"^",1),";",1),FLDNUM=+$P($P(@ARR,"^",1),";",2),FLDNAM=$P(@ARR,"^",2),IDATA=$P(@ARR,"^",4) D I $G(XURET(0))<0 Q
. I FLDNAM="DUZ" D Q ;first parameter passed
. . S XUDUZ=IDATA ;duz ien
. . I $G(XUDUZ)="" S XURET(0)="-1^Invalid User DUZ (null)" Q
. . I '$D(^VA(FILENUM,XUDUZ,0)) S XURET(0)="-1^User '"_XUDUZ_"' does not exist" Q
. I FLDNAM="NAME COMPONENTS" D Q
. . S NCIEN=IDATA ;name component ien
. . I $G(NCIEN)="" S XURET(0)="-1^Invalid Name Component IEN"
. . I '$D(^VA(20,NCIEN,0)) S XURET(0)="-1^No Data for Name Components IEN: "_NCIEN
. ;**732,Story 1204309 (mko): If NPI is passed, not null, and doesn't yet exist
. ; in the EFFECTIVE DATE/TIME multiple, add it, and let the "AC" xref update
. ; the single-valued fields AUTHORIZE RELEASE OF NPI (#41.97), NPI ENTRY STATUS (#41.98), and NPI (#41.99) at the top file level.
. ; IF NPI IS NOT BEING DELETED BUT ADDING A VALUE
. I FLDNAM="NPI",IDATA'="@" D Q
. . N IENS,ERR,XUFDA,DIERR,DIHELP,DIMSG S NPIIN=IDATA
. . Q:IDATA="" Q:$O(^VA(200,XUDUZ,"NPISTATUS","C",IDATA,""))
. . S NPINEW=1,IENS="+1,"_XUDUZ_",",XUFDA(200.042,IENS,.01)="NOW",XUFDA(200.042,IENS,.02)=1,XUFDA(200.042,IENS,.03)=IDATA
. . D UPDATE^DIE("E","XUFDA","","ERR") S:$G(DIERR) NPIERR=$$BLDERR("ERR")
. I FLDNAM="NPI",IDATA="@" D Q
. . S XUFDA(200,XUDUZ_",",41.99)=IDATA,XUFDA(200,XUDUZ_",",41.98)=IDATA
. . ;GET NPI TO BE DELETED FROM ARR(X+1)
. . S ARR=$Q(@ARR) S NPI=$P(@ARR,"^",3),IENS=$O(^VA(200,XUDUZ,"NPISTATUS","C",NPI,""))_","_XUDUZ_",",XUFDA(200.042,IENS,.01)="@"
. S XUFDA(FILENUM,$S(FILENUM=200:+$G(XUDUZ),1:+$G(NCIEN))_",",FLDNUM)=IDATA
Q:$G(XURET(0))<0
I '$G(NPINEW),'$D(XUFDA) S XURET(0)="-1^No data to file for record '"_XUDUZ_"' in file 200" Q
;**732,Story 1204309 (mko): If NPI (#41.99) is not the NPI coming in, don't update NPI ENTRY STATUS (#41.98)
I $G(NPIIN)]"",$P($G(^VA(200,XUDUZ,"NPI")),U)'=NPIIN K XUFDA(200,XUDUZ_",",41.98)
;**732,Story 1204309 (mko): File the Name first (Within a FILE^DIE call,
; triggers on the .01 that in turn call FILE^DIE may cause the Filer flag to change from "E", to "". FDA must be also be namespaced)
I $D(XUFDA(200,XUDUZ_",",.01))#2 D Q:$G(XURET(0))["Unable to lock record"
. N NAMEFDA S NAMEFDA(200,XUDUZ_",",.01)=XUFDA(200,XUDUZ_",",.01) D FILER(XUDUZ,.NAMEFDA,.XURET) K XUFDA(200,XUDUZ_",",.01)
;**732,Story 1204309 (mko): Move code to call Filer to subroutine
D FILER(XUDUZ,.XUFDA,.XURET) Q:$G(XURET(0))["Unable to lock record"
;**732,Story 1204309 (mko): Add NPIERR to XURET(0)
S:$G(NPIERR)]"" XURET(0)=$$ADDERR(XURET(0),NPIERR)
;Return 1 in first piece to indicate Filer/Updater calls were made. If errors, also return -1^errMsg in 2nd and 3rd pieces.
S XURET(0)=1_$S($G(XURET(0))<0:U_XURET(0),1:"")
Q
;
FILER(XUDUZ,XUMVIFDA,XURET) ;Call the Filer
;**732,Story 1204309 (mko): Move the code to call the Filer into a separate subroutine, since it is called multiple times.
N DIERR,DIHELP,DIMSG,XUERR
Q:'$G(XUDUZ) Q:'$D(XUMVIFDA)
L +^VA(200,XUDUZ):10 I '$T S XURET(0)="-1^Unable to lock record '"_XUDUZ_"' in file 200" Q
;**710, Story 1100018 (jfw) - Process fields as External Values now so Input Transform checks fire
;**732,Story 1204309 (mko): Unlock the record before checking for DIERR
D FILE^DIE("E","XUMVIFDA","XUERR") L -^VA(200,XUDUZ)
;**732,Story 1204309 (mko): Put all error messages into XURET(0)
S:$G(DIERR) XURET(0)=$$ADDERR($G(XURET(0)),$$BLDERR("XUERR"))
Q
;
ADDERR(RET,MSG) ;Return RET with MSG appended to it, and 1st piece equal to -1
Q:$G(MSG)="" $G(RET)
Q $S($G(RET)]"":RET_" ",1:"-1^")_MSG
;
BLDERR(INROOT) ;Build a string containing error messages returned by FileMan
N ERRSTR,I,XUERMSGS D MSG^DIALOG("AE",.XUERMSGS,"","",$G(INROOT))
S ERRSTR="",I=0 F S I=$O(XUERMSGS(I)) Q:'I S:XUERMSGS(I)]"" ERRSTR=ERRSTR_$E(" ",ERRSTR]"")_XUERMSGS(I)
Q ERRSTR
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUMVINPU 19431 printed Oct 16, 2024@18:12:08 Page 2
XUMVINPU ;MVI/DRI - Master Veteran Index New Person Utilities ;7/31/20 15:04
+1 ;;8.0;KERNEL;**691,711,710,732,733**;Jul 10, 1995;Build 0
+2 ;Per VA Directive 6402, this routine should not be modified.
+3 ;
+4 ;**711, Story 977780 (jfw)
+5 ;**732, Story 1204309 (mko)
+6 ;**733, Story 1291666 (dri)
+7 ;
GET(XURET,XUDUZ,SECID,NPI,SSN) ;rpc to retrieve new person file data
+1 ; called from rpc: XUS MVI NEW PERSON GET
+2 ; Input (ONE of the following):
+3 ; XUDUZ = NEW PERSON IEN SECID=SECURITY ID NPI=NATIONAL PROVIDER IDENTIFIER SSN=SOCIAL SECURITY NUMBER
+4 ; Output:
+5 ; Success: XURET = ^TMP("XUMVINPU",$J)
+6 ; @XURET@(#) = FILE #;FIELD #<SUBFIELD #><FILE POINTER>^FIELD NAME^<COUNTER #>^INTERNAL VALUE^EXTERNAL VALUE
+7 ; <> Denotes optional values. If Counter populated, denotes multiple value <1-n>.
+8 ; @XURET@(#)="200;IEN^DUZ^^^"
+9 ; @XURET@(#)="200;.01^NAME^^^"
+10 ; @XURET@(#)="200;4^SEX^^^"
+11 ; @XURET@(#)="200;5^DOB^^^" ;**732,1204309 (mko): Return DOB
+12 ; @XURET@(#)="200;8^TITLE^^^"
+13 ; @XURET@(#)="200;7^DISUSER^^^"
+14 ; @XURET@(#)="200;9.2^TERMINATION DATE^^^"
+15 ; @XURET@(#)="200;9.4^Termination Reason^^^"
+16 ; @XURET@(#)="200;15^PROHIBITED TIMES FOR SIGN-ON^^^"
+17 ; @XURET@(#)="200;11.2^DATE VERIFY CODE LAST CHANGED^^^"
+18 ; @XURET@(#)="200;.111^STREET ADDRESS 1^^^"
+19 ; @XURET@(#)="200;.112^STREET ADDRESS 2^^^"
+20 ; @XURET@(#)="200;.113^STREET ADDRESS 3^^^"
+21 ; @XURET@(#)="200;.114^CITY^^^"
+22 ; @XURET@(#)="200;.115^STATE^^^"
+23 ; @XURET@(#)="200;.116^ZIP CODE^^^"
+24 ; @XURET@(#)="200;.132^OFFICE PHONE^^^"
+25 ; @XURET@(#)="200;.136^FAX NUMBER^^^"
+26 ; @XURET@(#)="200;.151^EMAIL ADDRESS^^^"
+27 ; @XURET@(#)="200;30^DATE ENTERED^^^"
+28 ; @XURET@(#)="200;31^CREATOR^^^"
+29 ; @XURET@(#)="200;41.98^NPI ENTRY STATUS^^"
+30 ; @XURET@(#)="200;41.99^NPI^^^"
+31 ; @XURET@(#)="200;9^SSN^^^"
+32 ; @XURET@(#)="200;42;.01^EFFECTIVE DATE/TIME^<#>^^"
+33 ; @XURET@(#)="200;42;.02^STATUS^<#>^^"
+34 ; @XURET@(#)="200;42;.03^NPI^<#>^^"
+35 ; @XURET@(#)="200;101.13;.01^CPRS TAB^<#>^^"
+36 ; @XURET@(#)="200;101.13;.02^EFFECTIVE DATE^<#>^^"
+37 ; @XURET@(#)="200;101.13;.03^EXPIRATION DATE^<#>^^"
+38 ; @XURET@(#)="200;202^LAST SIGN-ON DATE/TIME^^^"
+39 ; @XURET@(#)="200;202.02^XUS Logon Attempt Count^^^"
+40 ; @XURET@(#)="200;202.03^XUS Active User^^^"
+41 ; @XURET@(#)="200;202.04^Entry Last Edit Date^^^"
+42 ; @XURET@(#)="200;202.05^LOCKOUT USER UNTIL^^^"
+43 ; @XURET@(#)="200;16;.01^DIVISION^<1-n>^^"
+44 ; @XURET@(#)="200;10.1^NAME COMPONENTS^^^"
+45 ; @XURET@(#)="20;1^FAMILY (LAST) NAME^^^"
+46 ; @XURET@(#)="20;2^GIVEN (FIRST) NAME^^^"
+47 ; @XURET@(#)="20;3^MIDDLE NAME^^^"
+48 ; @XURET@(#)="20;4^PREFIX^^^"
+49 ; @XURET@(#)="20;5^SUFFIX^^^"
+50 ; @XURET@(#)="20;6^DEGREE^^^"
+51 ; @XURET@(#)="200;29^SERVICE/SECTION^^^"
+52 ; @XURET@(#)="200;201^PRIMARY MENU OPTION^^^"
+53 ; @XURET@(#)="200;203;.01^SECONDARY MENU OPTIONS^<1-n>^^"
+54 ; @XURET@(#)="200;51;.01^KEYS^<1-n>^^"
+55 ; @XURET@(#)="200;205.1^SECID^^^"
+56 ; @XURET@(#)="200;205.2^SUBJECT ORGANIZATION^^^"
+57 ; @XURET@(#)="200;205.3^SUBJECT ORGANIZATION ID^^^"
+58 ; @XURET@(#)="200;205.4^UNIQUE USER ID^^^"
+59 ; @XURET@(#)="200;205.5^ADUPN^^^"
+60 ; @XURET@(#)="200;501.1^NETWORK USERNAME^^^"
+61 ; @XURET@(#)="200;8932.1;.01^PERSON CLASS^<1-n>^^"
+62 ; @XURET@(#)="200;8932.1;2^EFFECTIVE DATE^<#>^^"
+63 ; @XURET@(#)="200;8932.1;3^EXPIRATION DATE^<#>^^"
+64 ; @XURET@(#)="200;53.1^AUTHORIZED TO WRITE MED ORDERS^^^"
+65 ; @XURET@(#)="200;53.11^DETOX/MAINTENANCE ID NUMBER^^^"
+66 ; @XURET@(#)="200;53.2^DEA#^^^"
+67 ; @XURET@(#)="200;747.44^DEA EXPIRATION DATE^^^"
+68 ; @XURET@(#)="200;53.4^INACTIVE DATE^^^"
+69 ; @XURET@(#)="200;53.5^PROVIDER CLASS^^^"
+70 ; @XURET@(#)="200;53.6^PROVIDER TYPE^^^"
+71 ; @XURET@(#)="200;53.9^REMARKS^^^"
+72 ; @XURET@(#)="200;53.91^NON-VA PRESCRIBER^^^"
+73 ; @XURET@(#)="200;53.92^TAX ID^^^"
+74 ; @XURET@(#)="200;55.1^SCHEDULE II NARCOTIC^^^"
+75 ; @XURET@(#)="200;55.2^SCHEDULE II NON-NARCOTIC^^^"
+76 ; @XURET@(#)="200;55.3^SCHEDULE III NARCOTIC^^^"
+77 ; @XURET@(#)="200;55.4^SCHEDULE III NON-NARCOTIC^^^"
+78 ; @XURET@(#)="200;55.5^SCHEDULE IV^^^"
+79 ; @XURET@(#)="200;55.6^SCHEDULE V^^^"
+80 ;
+81 ; **The following are ONLY returned if patch
+82 ; **XU*8.0*688 has been installed.
+83 ; **Subscript Counter (#) will denote the DEA Data that belongs to the DEA NUMBER subscript
+84 ; ** New DEA Data will always follow the DEA NUMBER entry!
+85 ; @XURET@(#)="200;9001^DETOX CALCULATED^^^"
+86 ; @XURET@(#)="200;53.21;.01;8991.9^DEA NUMBER^<1-n>^^"
+87 ; @XURET@(#)="200;53.21;.02^INDIVIDUAL DEA SUFFIX^<#>^^"
+88 ; **Only returned if there is a DEA NUMBER (200.5321) value!!**
+89 ; @XURET@(#)="8991.9;.02^BUSINESS ACTIVITY CODE^<#>^^"
+90 ; @XURET@(#)="8991.9;.03^DETOX NUMBER^<#>^^"
+91 ; @XURET@(#)="8991.9;.04^EXPIRATION DATE^<#>^^"
+92 ; @XURET@(#)="8991.9;.06^USE FOR INPATIENT ORDERS?^<#>^^"
+93 ; @XURET@(#)="8991.9;.07^TYPE^<#>^^"
+94 ; @XURET@(#)="8991.9;1.1^NAME (PROVIDER OR INSTITUTION)^<#>^^"
+95 ; @XURET@(#)="8991.9;1.2^STREET ADDRESS 1^<#>^^"
+96 ; @XURET@(#)="8991.9;1.3^STREET ADDRESS 2^<#>^^"
+97 ; @XURET@(#)="8991.9;1.4^STREET ADDRESS 3^<#>^^"
+98 ; @XURET@(#)="8991.9;1.5^CITY^<#>^^"
+99 ; @XURET@(#)="8991.9;1.6^STATE^<#>^^"
+100 ; @XURET@(#)="8991.9;1.7^ZIP CODE^<#>^^"
+101 ; @XURET@(#)="8991.9;2.1^SCHEDULE II NARCOTIC?^<#>^^"
+102 ; @XURET@(#)="8991.9;2.2^SCHEDULE II NON-NARCOTIC?^<#>^^"
+103 ; @XURET@(#)="8991.9;2.3^SCHEDULE III NARCOTIC?^<#>^^"
+104 ; @XURET@(#)="8991.9;2.4^SCHEDULE III NON-NARCOTIC?^<#>^^"
+105 ; @XURET@(#)="8991.9;2.5^SCHEDULE IV?^<#>^^"
+106 ; @XURET@(#)="8991.9;2.6^SCHEDULE V?^<#>^^"
+107 ; @XURET@(#)="8991.9;10.1^LAST UPDATED BY^<#>^^"
+108 ; @XURET@(#)="8991.9;10.2^LAST UPDATED DATE/TIME^<#>^^"
+109 ; @XURET@(#)="8991.9;10.3^LAST DOJ UPDATE DATE/TIME^<#>^^"
+110 ;
+111 ; Fail:
+112 ; XURET = ^TMP("XUMVINPU",$J)
+113 ; @XURET@(1)="-1^Invalid User"
+114 ; or
+115 ; @XURET@(1)="-1^No Data for User: ######"
+116 ;
+117 ; Example calling rpc from VistA:
+118 ; >D GET^XUMVINPU(.XURET,12596)
+119 ; >ZW XURET
+120 ; >XURET="^TMP(""XUMVINPU"",17226)"
+121 ;
+122 ; D ^%G would return:
+123 ; ^TMP("XUMVINPU",17226,1)="200;IEN^DUZ^12596^12596"
+124 ; 2)="200;.01^NAME^LAST,FIRST^LAST,FIRST"
+125 ; 3)="200;7^DISUSER^^"
+126 ; #)=continuation of returned data
+127 ;
+128 ; Example calling rpc from MVI:
+129 ; D DIRECT^XWB2HL7(.XURET,SITE,"XUS MVI NEW PERSON GET","",$G(XUDUZ),$G(SECID),$G(NPI),$G(SSN))
+130 ;
+131 NEW I,CNT,FILE,FLD,FLDS,FLDCNT,FLDNM,XUARR,XUGBL
SET XUGBL="^TMP("_"""XUMVINPU"""_","_$JOB_")"
SET CNT=1
SET FILE=200
KILL @XUGBL,XURET
+132 IF $GET(SECID)'=""
SET XUDUZ=$ORDER(^VA(FILE,"ASECID",SECID,0))
+133 IF $GET(NPI)'=""
SET XUDUZ=$ORDER(^VA(FILE,"ANPI",NPI,0))
+134 IF $GET(SSN)'=""
SET XUDUZ=$ORDER(^VA(FILE,"SSN",SSN,0))
+135 IF $GET(XUDUZ)=""
SET @XUGBL@(CNT)="-1^Invalid User"
SET XURET=$NAME(@XUGBL)
QUIT
+136 IF '$DATA(^VA(FILE,XUDUZ))
SET @XUGBL@(CNT)="-1^No Data for User: "_XUDUZ
SET XURET=$NAME(@XUGBL)
QUIT
+137 SET @XUGBL@(CNT)=FILE_";IEN^DUZ^^"_XUDUZ_"^"_XUDUZ
SET CNT=CNT+1
+138 SET FLDS=".01;4;5;8;7;9.2;9.4;15;11.2;.111;.112;.113;.114;.115;.116;.132;.136;.151;30;31;41.98;41.99;9;42*;101.13*;202;202.02;202.03;"
+139 SET FLDS=FLDS_"202.04;202.05;16*;10.1;29;201;203*;51*;205.1;205.2;205.3;205.4;205.5;501.1;8932.1*;53.1;53.11;53.2;"
+140 SET FLDS=FLDS_"747.44;53.4;53.5;53.6;53.9;53.91;53.92;55.1;55.2;55.3;55.4;55.5;55.6"
+141 ;NEW DETOX CALCULATED and DEA #'S multiple | DBIA #10141 (Supported)
if ($$PATCH^XPDUTL("XU*8.0*688"))
SET FLDS=FLDS_";9001;53.21*"
+142 ;retrieve data
SET FLDCNT=$LENGTH(FLDS,";")
DO GETS^DIQ(FILE,+XUDUZ_",",FLDS,"EI","XUARR")
+143 FOR I=1:1:FLDCNT
Begin DoDot:1
+144 SET FLD=$PIECE($PIECE(FLDS,";",I),"*")
DO FIELD^DID(FILE,FLD,"","LABEL","FLDNM")
+145 ;division multiple
IF FLD=16
Begin DoDot:2
+146 NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.02
SET SUBFLD=.01
DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+147 IF '$DATA(XUARR(SUBFILE))
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
QUIT
+148 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET MCNT=MCNT+1
SET CNT=CNT+1
End DoDot:2
QUIT
+149 ;name components
IF FLD=10.1
Begin DoDot:2
+150 SET @XUGBL@(CNT)=FILE_";"_FLD_"^"_(FLDNM("LABEL"))_"^^"_$GET(XUARR(FILE,XUDUZ_",",FLD,"I"))_"^"_$GET(XUARR(FILE,XUDUZ_",",FLD,"E"))
SET CNT=CNT+1
+151 ;retrieve name component data
NEW NCFILE,NCFLD
SET NCFILE=20
DO GETS^DIQ(NCFILE,+$GET(XUARR(FILE,XUDUZ_",",FLD,"I"))_",","1;2;3;4;5;6","EI","XUARR")
+152 FOR NCFLD=1,2,3,4,5,6
Begin DoDot:3
+153 DO FIELD^DID(NCFILE,NCFLD,"","LABEL","FLDNM")
+154 SET @XUGBL@(CNT)=NCFILE_";"_NCFLD_"^"_(FLDNM("LABEL"))_"^^"_$GET(XUARR(NCFILE,+$GET(XUARR(FILE,XUDUZ_",",FLD,"I"))_",",NCFLD,"I"))_"^"_$GET(XUARR(NCFILE,+$GET(XUARR(FILE,XUDUZ_",",FLD,"I"))_",",NCFLD,"E"))
SET CNT=CNT+1
End DoDot:3
End DoDot:2
QUIT
+155 ;**732,Story 1204309 (mko): EFFECTIVE DATE/TIME (#42) (Multiple-200.042)
IF FLD=42
Begin DoDot:2
+156 NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.042
+157 ;No EFFECTIVE DATE/TIME
IF '$DATA(XUARR(SUBFILE))
Begin DoDot:3
+158 FOR SUBFLD=.01,.02,.03
Begin DoDot:4
+159 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_FLDNM("LABEL")_"^"_MCNT_"^^"
SET CNT=CNT+1
End DoDot:4
End DoDot:3
QUIT
+160 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
Begin DoDot:3
+161 FOR SUBFLD=.01,.02,.03
Begin DoDot:4
+162 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+163 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_FLDNM("LABEL")_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET CNT=CNT+1
End DoDot:4
+164 SET MCNT=MCNT+1
End DoDot:3
End DoDot:2
QUIT
+165 ;KEYS multiple
IF FLD=51
Begin DoDot:2
+166 NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.051
SET SUBFLD=.01
DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+167 IF '$DATA(XUARR(SUBFILE))
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
QUIT
+168 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET MCNT=MCNT+1
SET CNT=CNT+1
End DoDot:2
QUIT
+169 ;NEW DEA #'s multiple
IF FLD=53.21
Begin DoDot:2
+170 NEW I,IEN,IENS,MCNT,SUBFILE,SUBFLD,DEAARR,DEAFILE,DEAFLD,DEAFLDS,DEAFLDCNT
SET MCNT=1
SET SUBFILE=200.5321
SET SUBFLD=.01
SET DEAFILE=8991.9
+171 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+172 IF '$DATA(XUARR(SUBFILE))
Begin DoDot:3
+173 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_";8991.9^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
DO FIELD^DID(SUBFILE,.02,"","LABEL","FLDNM")
+174 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_.02_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
End DoDot:3
QUIT
+175 SET DEAFLDS=".02;.03;.04;.06;.07;1.1;1.2;1.3;1.4;1.5;1.6;1.7;2.1;2.2;2.3;2.4;2.5;2.6;10.1;10.2;10.3"
SET DEAFLDCNT=$LENGTH(DEAFLDS,";")
+176 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
Begin DoDot:3
+177 SET IEN=$GET(XUARR(SUBFILE,IENS,.03,"I"))
DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+178 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_";8991.9^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_IEN_"^"_$GET(XUARR(SUBFILE,IENS,.03,"E"))
SET CNT=CNT+1
+179 DO FIELD^DID(SUBFILE,.02,"","LABEL","FLDNM")
+180 SET @XUGBL@(CNT)=FILE_";"_FLD_";.02^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,.02,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,.02,"E"))
SET CNT=CNT+1
+181 ;retrieve DEA data
DO GETS^DIQ(DEAFILE,IEN_",",DEAFLDS,"EI","DEAARR")
+182 FOR I=1:1:DEAFLDCNT
Begin DoDot:4
+183 SET DEAFLD=$PIECE(DEAFLDS,";",I)
DO FIELD^DID(DEAFILE,DEAFLD,"","LABEL","FLDNM")
+184 SET @XUGBL@(CNT)=DEAFILE_";"_DEAFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(DEAARR(DEAFILE,IEN_",",DEAFLD,"I"))_"^"_$GET(DEAARR(DEAFILE,IEN_",",DEAFLD,"E"))
SET CNT=CNT+1
End DoDot:4
+185 SET MCNT=MCNT+1
End DoDot:3
End DoDot:2
QUIT
+186 ;CPRS TAB multiple ;**733 - STORY 1291666 (dri) add field 101.13
IF FLD=101.13
Begin DoDot:2
+187 ;No CPRS TAB
NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.010113
IF '$DATA(XUARR(SUBFILE))
Begin DoDot:3
+188 FOR SUBFLD=.01,.03,.03
Begin DoDot:4
+189 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
End DoDot:4
End DoDot:3
QUIT
+190 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
Begin DoDot:3
+191 FOR SUBFLD=.01,.02,.03
Begin DoDot:4
+192 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+193 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET CNT=CNT+1
End DoDot:4
+194 SET MCNT=MCNT+1
End DoDot:3
End DoDot:2
QUIT
+195 ;secondary menu options multiple
IF FLD=203
Begin DoDot:2
+196 NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.03
SET SUBFLD=.01
DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+197 IF '$DATA(XUARR(SUBFILE))
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
QUIT
+198 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET MCNT=MCNT+1
SET CNT=CNT+1
End DoDot:2
QUIT
+199 ;PERSON CLASS multiple
IF FLD=8932.1
Begin DoDot:2
+200 ;No Person Class(es)
NEW IENS,MCNT,SUBFILE,SUBFLD
SET MCNT=1
SET SUBFILE=200.05
IF '$DATA(XUARR(SUBFILE))
Begin DoDot:3
+201 FOR SUBFLD=.01,2,3
Begin DoDot:4
+202 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^^"
SET CNT=CNT+1
End DoDot:4
End DoDot:3
QUIT
+203 SET IENS=""
FOR
SET IENS=$ORDER(XUARR(SUBFILE,IENS))
if IENS=""
QUIT
Begin DoDot:3
+204 FOR SUBFLD=.01,2,3
Begin DoDot:4
+205 DO FIELD^DID(SUBFILE,SUBFLD,"","LABEL","FLDNM")
+206 SET @XUGBL@(CNT)=FILE_";"_FLD_";"_SUBFLD_"^"_(FLDNM("LABEL"))_"^"_MCNT_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"I"))_"^"_$GET(XUARR(SUBFILE,IENS,SUBFLD,"E"))
SET CNT=CNT+1
End DoDot:4
+207 SET MCNT=MCNT+1
End DoDot:3
End DoDot:2
QUIT
+208 ;all other fields
SET @XUGBL@(CNT)=FILE_";"_FLD_"^"_(FLDNM("LABEL"))_"^^"_XUARR(FILE,XUDUZ_",",FLD,"I")_"^"_XUARR(FILE,XUDUZ_",",FLD,"E")
SET CNT=CNT+1
End DoDot:1
+209 SET XURET=$NAME(@XUGBL)
+210 QUIT
+211 ;
UPDATE(XURET,XUARR) ;rpc to update new person file data
+1 ; called from rpc: XUS MVI NEW PERSON UPDATE
+2 ; Input:
+3 ; XUARR(#) = FILE #;FIELD #<SUBFIELD #><FILE POINTER>^FIELD NAME^<COUNTER #>^INTERNAL VALUE^EXTERNAL VALUE
+4 ; <> Denotes optional values. If Counter populated, denotes multiple value <1-n>.
+5 ; XUARR(0)="200;IEN^DUZ^^^"
+6 ; XUARR(#)="200;.01^NAME^^^"
+7 ; XUARR(#)="200;205.1^SECID^^"
+8 ; XUARR(#)="200;205.2^SUBJECT ORGANIZATION^^^"
+9 ; XUARR(#)="200;205.3^SUBJECT ORGANIZATION ID^^^"
+10 ; XUARR(#)="200;205.4^UNIQUE USER ID^^^"
+11 ; XUARR(#)="200;205.5^ADUPN^^^"
+12 ; **711, Story 977821 (jfw) - Allow additional fields to be updated.
+13 ; XUARR(#)="200;.151^EMAIL ADDRESS^^^"
+14 ; XUARR(#)="200;501.1^NETWORK USERNAME^^^"
+15 ; **710, Story 1100018 (jfw) - Add NPI field to be updated.
+16 ; XUARR(#)="200;41.99^NPI^^^"
+17 ; **732,Story 1204309 (mko): Add NPI ENTRY STATUS (#41.98)
+18 ; XUARR(#)=200;41.98^NPI ENTRY STATUS^^<value>
+19 ; **732, story 1278983 (cmc) add EFFECTIVE DATE (#42) MULTIPLE
+20 ; XUARR(#)="200;42;.01^EFFECTIVE DATE/TIME^<#>^^"
+21 ; XUARR(#)="200;42;.02^STATUS^<#>^^"
+22 ; XUARR(#)="200;42;.03^NPI^<#>^^"
+23 ; Success:
+24 ; XURET(0) = 1
+25 ; Fail:
+26 ; XURET(0) = "-1^No data passed"
+27 ; XURET(0) = "-1^Invalid User DUZ (null)"
+28 ; XURET(0) = "-1^User '"_XUDUZ_"' does not exist"
+29 ; XURET(0) = "-1^Invalid Name Component IEN"
+30 ; XURET(0) = "-1^No Data for Name Component IEN: "_NCIEN
+31 ; XURET(0) = "-1^No data to file for record '"_XUDUZ_"' in file 200"
+32 ; XURET(0) = "-1^Unable to lock record '"_XUDUZ_"' in file 200"
+33 ; XURET(0) = "-1^"_$G(XUERR("DIERR",1,"TEXT",1))
+34 ;
+35 ; Example calling rpc from VistA:
+36 ; >D UPDATE^XUMVINPU(.XURET,.XUARR)
+37 ; >ZW XURET
+38 ; >XURET(0)=1
+39 ; Example calling rpc from MVI:
+40 ; D DIRECT^XWB2HL7(.XURET,SITE,"XUS MVI NEW PERSON UPDATE","",.XUARR)
+41 KILL XURET
NEW ARR,FILENUM,FLDNAM,FLDNUM,IDATA,NCIEN,NPIIN,NPIERR,NPINEW,XUDUZ,XUERR,XUFDA
SET ARR="XUARR"
+42 IF '$DATA(XUARR)
SET XURET(0)="-1^No data passed"
QUIT
+43 FOR
SET ARR=$QUERY(@ARR)
if ARR=""
QUIT
SET FILENUM=+$PIECE($PIECE(@ARR,"^",1),";",1)
SET FLDNUM=+$PIECE($PIECE(@ARR,"^",1),";",2)
SET FLDNAM=$PIECE(@ARR,"^",2)
SET IDATA=$PIECE(@ARR,"^",4)
Begin DoDot:1
+44 ;first parameter passed
IF FLDNAM="DUZ"
Begin DoDot:2
+45 ;duz ien
SET XUDUZ=IDATA
+46 IF $GET(XUDUZ)=""
SET XURET(0)="-1^Invalid User DUZ (null)"
QUIT
+47 IF '$DATA(^VA(FILENUM,XUDUZ,0))
SET XURET(0)="-1^User '"_XUDUZ_"' does not exist"
QUIT
End DoDot:2
QUIT
+48 IF FLDNAM="NAME COMPONENTS"
Begin DoDot:2
+49 ;name component ien
SET NCIEN=IDATA
+50 IF $GET(NCIEN)=""
SET XURET(0)="-1^Invalid Name Component IEN"
+51 IF '$DATA(^VA(20,NCIEN,0))
SET XURET(0)="-1^No Data for Name Components IEN: "_NCIEN
End DoDot:2
QUIT
+52 ;**732,Story 1204309 (mko): If NPI is passed, not null, and doesn't yet exist
+53 ; in the EFFECTIVE DATE/TIME multiple, add it, and let the "AC" xref update
+54 ; the single-valued fields AUTHORIZE RELEASE OF NPI (#41.97), NPI ENTRY STATUS (#41.98), and NPI (#41.99) at the top file level.
+55 ; IF NPI IS NOT BEING DELETED BUT ADDING A VALUE
+56 IF FLDNAM="NPI"
IF IDATA'="@"
Begin DoDot:2
+57 NEW IENS,ERR,XUFDA,DIERR,DIHELP,DIMSG
SET NPIIN=IDATA
+58 if IDATA=""
QUIT
if $ORDER(^VA(200,XUDUZ,"NPISTATUS","C",IDATA,""))
QUIT
+59 SET NPINEW=1
SET IENS="+1,"_XUDUZ_","
SET XUFDA(200.042,IENS,.01)="NOW"
SET XUFDA(200.042,IENS,.02)=1
SET XUFDA(200.042,IENS,.03)=IDATA
+60 DO UPDATE^DIE("E","XUFDA","","ERR")
if $GET(DIERR)
SET NPIERR=$$BLDERR("ERR")
End DoDot:2
QUIT
+61 IF FLDNAM="NPI"
IF IDATA="@"
Begin DoDot:2
+62 SET XUFDA(200,XUDUZ_",",41.99)=IDATA
SET XUFDA(200,XUDUZ_",",41.98)=IDATA
+63 ;GET NPI TO BE DELETED FROM ARR(X+1)
+64 SET ARR=$QUERY(@ARR)
SET NPI=$PIECE(@ARR,"^",3)
SET IENS=$ORDER(^VA(200,XUDUZ,"NPISTATUS","C",NPI,""))_","_XUDUZ_","
SET XUFDA(200.042,IENS,.01)="@"
End DoDot:2
QUIT
+65 SET XUFDA(FILENUM,$SELECT(FILENUM=200:+$GET(XUDUZ),1:+$GET(NCIEN))_",",FLDNUM)=IDATA
End DoDot:1
IF $GET(XURET(0))<0
QUIT
+66 if $GET(XURET(0))<0
QUIT
+67 IF '$GET(NPINEW)
IF '$DATA(XUFDA)
SET XURET(0)="-1^No data to file for record '"_XUDUZ_"' in file 200"
QUIT
+68 ;**732,Story 1204309 (mko): If NPI (#41.99) is not the NPI coming in, don't update NPI ENTRY STATUS (#41.98)
+69 IF $GET(NPIIN)]""
IF $PIECE($GET(^VA(200,XUDUZ,"NPI")),U)'=NPIIN
KILL XUFDA(200,XUDUZ_",",41.98)
+70 ;**732,Story 1204309 (mko): File the Name first (Within a FILE^DIE call,
+71 ; triggers on the .01 that in turn call FILE^DIE may cause the Filer flag to change from "E", to "". FDA must be also be namespaced)
+72 IF $DATA(XUFDA(200,XUDUZ_",",.01))#2
Begin DoDot:1
+73 NEW NAMEFDA
SET NAMEFDA(200,XUDUZ_",",.01)=XUFDA(200,XUDUZ_",",.01)
DO FILER(XUDUZ,.NAMEFDA,.XURET)
KILL XUFDA(200,XUDUZ_",",.01)
End DoDot:1
if $GET(XURET(0))["Unable to lock record"
QUIT
+74 ;**732,Story 1204309 (mko): Move code to call Filer to subroutine
+75 DO FILER(XUDUZ,.XUFDA,.XURET)
if $GET(XURET(0))["Unable to lock record"
QUIT
+76 ;**732,Story 1204309 (mko): Add NPIERR to XURET(0)
+77 if $GET(NPIERR)]""
SET XURET(0)=$$ADDERR(XURET(0),NPIERR)
+78 ;Return 1 in first piece to indicate Filer/Updater calls were made. If errors, also return -1^errMsg in 2nd and 3rd pieces.
+79 SET XURET(0)=1_$SELECT($GET(XURET(0))<0:U_XURET(0),1:"")
+80 QUIT
+81 ;
FILER(XUDUZ,XUMVIFDA,XURET) ;Call the Filer
+1 ;**732,Story 1204309 (mko): Move the code to call the Filer into a separate subroutine, since it is called multiple times.
+2 NEW DIERR,DIHELP,DIMSG,XUERR
+3 if '$GET(XUDUZ)
QUIT
if '$DATA(XUMVIFDA)
QUIT
+4 LOCK +^VA(200,XUDUZ):10
IF '$TEST
SET XURET(0)="-1^Unable to lock record '"_XUDUZ_"' in file 200"
QUIT
+5 ;**710, Story 1100018 (jfw) - Process fields as External Values now so Input Transform checks fire
+6 ;**732,Story 1204309 (mko): Unlock the record before checking for DIERR
+7 DO FILE^DIE("E","XUMVIFDA","XUERR")
LOCK -^VA(200,XUDUZ)
+8 ;**732,Story 1204309 (mko): Put all error messages into XURET(0)
+9 if $GET(DIERR)
SET XURET(0)=$$ADDERR($GET(XURET(0)),$$BLDERR("XUERR"))
+10 QUIT
+11 ;
ADDERR(RET,MSG) ;Return RET with MSG appended to it, and 1st piece equal to -1
+1 if $GET(MSG)=""
QUIT $GET(RET)
+2 QUIT $SELECT($GET(RET)]"":RET_" ",1:"-1^")_MSG
+3 ;
BLDERR(INROOT) ;Build a string containing error messages returned by FileMan
+1 NEW ERRSTR,I,XUERMSGS
DO MSG^DIALOG("AE",.XUERMSGS,"","",$GET(INROOT))
+2 SET ERRSTR=""
SET I=0
FOR
SET I=$ORDER(XUERMSGS(I))
if 'I
QUIT
if XUERMSGS(I)]""
SET ERRSTR=ERRSTR_$EXTRACT(" ",ERRSTR]"")_XUERMSGS(I)
+3 QUIT ERRSTR