XUIAMNPB ;BHM/DRI - IAM BACKGROUND JOB TO TRANSMIT NEW PERSON DATA ;26-Feb-2025 11:02 AM
;;8.0;KERNEL;**799**;Jul 10, 1995;Build 3
;;Per VHA Directive 2004-038, this routine should not be modified
;
Q
;
EN1 ;entry point for new person field monitor batch update background job
;**663 - STORY 1203257 (dri) Background job monitoring New Person Field Monitor file
; **799 VAMPI-22625 Option Name: XUS IAM NPFM BATCH UPDATE
;
;attempt lock to insure only one process running
L +^XTV(8933.1,"XUS IAM NPFM BATCH UPDATE"):1 I '$T Q
;
NEW XUDUZ,XUMIEN,CT,EN,FLDCNT,STN
S XUDUZ=0 F S XUDUZ=$O(^XTV(8933.1,"ACXMIT",XUDUZ)) Q:'XUDUZ S XUMIEN=0 F S XUMIEN=$O(^XTV(8933.1,"ACXMIT",XUDUZ,XUMIEN)) Q:'XUMIEN D ;new person who was modified
.NEW XUARR,XUFILE,XUFLDS,XUIAM,XURET,XUWHO
.I '$D(^VA(200,XUDUZ,0)) D XMITFLG(XUMIEN) Q ;if user doesn't exist mark record so it will get purged
.S XUWHO=$P($G(^XTV(8933.1,XUMIEN,0)),"^",5) ;last edited by
.I XUWHO="" S XUWHO=XUDUZ ;if only fields like 'LAST SIGN-ON DATE/TIME' logged we won't have a 'LAST EDITED BY'
.S XUFILE=200 ;new person file
.S XUFLDS=".151;4;5;7;9;9.2;10.1;41.99;205.1;205.2;205.3;205.4;205.5;202;501.1;201"
.D GETS^DIQ(XUFILE,XUDUZ_",",XUFLDS,"IE","XUARR") ;retrieve data
.I $G(XUARR(200,XUDUZ_",",10.1,"I")) D
..D GETS^DIQ(20,+$G(XUARR(XUFILE,XUDUZ_",",10.1,"I"))_",","1;2;3;4;5;6","I","XUARR")
..S XUIAM("firstName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",2,"I") ;given (first) name
..S XUIAM("lastName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",1,"I") ;family (last) name
..S XUIAM("middleName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",3,"I") ;middle name
..S XUIAM("prefixName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",4,"I") ;prefix name
..S XUIAM("suffixName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",5,"I") ;suffix name
..S XUIAM("degree")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",6,"I") ;degree
.S XUIAM("gender")=XUARR(200,XUDUZ_",",4,"I") ;sex/gender
.S XUIAM("dob")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",5,"I")) ;dob - convert to hl7 format
.S XUIAM("email")=$$ESC(XUARR(200,XUDUZ_",",.151,"I")) ;external or va email
.S XUIAM("pnid")=XUARR(200,XUDUZ_",",9,"I") ;ssn
.S XUIAM("npi")=XUARR(200,XUDUZ_",",41.99,"I") ;national provider identifier
.S XUIAM("samAccountName")=XUARR(200,XUDUZ_",",501.1,"I") ;network username
.;
.S XUIAM("secId")=XUARR(200,XUDUZ_",",205.1,"I") ;security id
.S XUIAM("subjectOrg")=XUARR(200,XUDUZ_",",205.2,"I") ;subject organization
.S XUIAM("orgId")=XUARR(200,XUDUZ_",",205.3,"I") ;subject organization id
.S XUIAM("uid")=XUARR(200,XUDUZ_",",205.4,"I") ;unique user id (usually the same as the secid)
.S XUIAM("adUPN")=XUARR(200,XUDUZ_",",205.5,"I") ;active directory user principle name (va email)
.;
.S XUIAM("disabled")=$E(XUARR(200,XUDUZ_",",7,"E"),1) ;disuser
.S XUIAM("termDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",9.2,"I")) ;termination date
.S XUIAM("lastAccess")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202,"I")) ;last sign-on date/time
.S XUIAM("primaryMenuInfor")=$$ESC(XUARR(200,XUDUZ_",",201,"E")) ;primary menu
.;
.S XUIAM("vistaid")=XUDUZ_"^PN^"_$P($$SITE^VASITE(),"^",3)_"^USDVA" ;user being modified
.;
.S XUIAM("WHO")=XUWHO_"^PN^"_$P($$SITE^VASITE(),"^",3)_"^USDVA" ;last edited by
.S XUIAM("REQTYPE")="MODIFY" ;passing 'add' or 'modify' to ^xuiamxml
.;
.;INCLUDING MORE FIELDS NOW PRIMARY MENU WILL BE USED TO DETERMINE IF VISITOR ACCOUNT, OTHER FIELDS ARE FOR FUTURE USE
.S XUFILE=200 ;new person file
.S XUFLDS="8;9.4;15;11.2;.111;.112;.113;.114;.115;.116;.132;.136;30;31;41.98;9;42*;101.13*;202.02;202.03;"
.S XUFLDS=XUFLDS_"202.04;202.05;16*;10.1;29;201;203*;51*;8932.1*;53.1;53.11;53.2;"
.S XUFLDS=XUFLDS_"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;8910*"
.S:($$PATCH^XPDUTL("XU*8.0*688")) XUFLDS=XUFLDS_";9001;53.21*" ;NEW DETOX CALCULATED and DEA #'S multiple | DBIA #10141 (Supported)
.S FLDCNT=$L(XUFLDS,";") D GETS^DIQ(XUFILE,+XUDUZ_",",XUFLDS,"EI","XUARR") ;retrieve data
.;
.S XUIAM("title")=$$ESC(XUARR(200,XUDUZ_",",8,"E")) ;TITLE
.S XUIAM("termReason")=$$ESC(XUARR(200,XUDUZ_",",9.4,"I")) ;termination reason
.S XUIAM("prohibTime")=XUARR(200,XUDUZ_",",15,"I") ;PROHIBITED TIMES FOR SIGN-ON (FREE TEXT FIELD)
.S XUIAM("verifyChangeDate")=XUARR(200,XUDUZ_",",11.2,"E") ;DATE VERIFY CODE LAST CHANGED
.S XUIAM("addStreetLine1")=$$ESC(XUARR(200,XUDUZ_",",.111,"I")) ; STREET LINE 1
.S XUIAM("addStreetLine2")=$$ESC(XUARR(200,XUDUZ_",",.112,"I")) ; STREET LINE 2
.S XUIAM("addStreetLine3")=$$ESC(XUARR(200,XUDUZ_",",.113,"I")) ; STREET LINE 3
.S XUIAM("addCity")=$$ESC(XUARR(200,XUDUZ_",",.114,"I")) ; city
.S XUIAM("addState")=XUARR(200,XUDUZ_",",.115,"E") ; State
.S XUIAM("addZip")=XUARR(200,XUDUZ_",",.116,"I") ; zipcode
.S XUIAM("workPhone")=$$ESC(XUARR(200,XUDUZ_",",.132,"I")) ; office phone
.S XUIAM("workFax")=$$ESC(XUARR(200,XUDUZ_",",.136,"I")) ; fax number
.S XUIAM("createDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",30,"I")) ; date entered
.S XUIAM("npiStatus")=XUARR(200,XUDUZ_",",41.98,"E") ;NPI ENTRY STATUS (set of codes)
.S XUIAM("xusLogCount")=XUARR(200,XUDUZ_",",202.02,"E") ;XUS Logon Attempt Count
.S XUIAM("xusActive")=XUARR(200,XUDUZ_",",202.03,"E") ;XUS Active User
.S XUIAM("lastEditDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202.04,"I")) ;Entry Last Edit Date
.S XUIAM("lockoutDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202.05,"I")) ;LOCKOUT USER UNTIL
.S XUIAM("service")=$$ESC(XUARR(200,XUDUZ_",",29,"E")) ; service/section
.S XUIAM("authWriteMedOrder")=XUARR(200,XUDUZ_",",53.1,"E") ;AUTHORIZED TO WRITE MED ORDERS
.S XUIAM("detoxMaintID")=XUARR(200,XUDUZ_",",53.11,"E") ;DETOX/MAINTENANCE ID NUMBER
.S XUIAM("dea")=XUARR(200,XUDUZ_",",53.2,"E") ;DEA#
.S XUIAM("deaExpireDate")=XUARR(200,XUDUZ_",",747.44,"E") ;DEA EXPIRATION DATE
.S XUIAM("inactDate")=XUARR(200,XUDUZ_",",53.4,"E") ;INACTIVE DATE
.S XUIAM("providerClass")=$$ESC(XUARR(200,XUDUZ_",",53.5,"E")) ;PROVIDER CLASS
.S XUIAM("providerType")=$$ESC(XUARR(200,XUDUZ_",",53.6,"E")) ;PROVIER TYPE
.S XUIAM("Remarks")=$$ESC(XUARR(200,XUDUZ_",",53.9,"E")) ;REMARKS
.S XUIAM("nonVAPrescriber")=XUARR(200,XUDUZ_",",53.91,"E") ;NON-VA PRESCRIBER
.S XUIAM("taxID")=XUARR(200,XUDUZ_",",53.92,"E") ;TAX ID
.S XUIAM("schedIINarc")=XUARR(200,XUDUZ_",",55.1,"E") ;SCHEDULE 2 NARCOTIC
.S XUIAM("schedIINonNarc")=XUARR(200,XUDUZ_",",55.2,"E") ;SCHEDULE 2 NON-NARCOTIC
.S XUIAM("schedIIINarc")=XUARR(200,XUDUZ_",",55.3,"E") ;SCHEDULE 3 NARCOTIC
.S XUIAM("schedIIINonNarc")=XUARR(200,XUDUZ_",",55.4,"E") ;SCHEDLE 3 NON-NARCOTIC
.S XUIAM("schedIV")=XUARR(200,XUDUZ_",",55.5,"E") ;SCHEDULE IV
.S XUIAM("schedV")=XUARR(200,XUDUZ_",",55.6,"E") ;SCHEDULE V
.S XUIAM("creator")=XUARR(200,XUDUZ_",",31,"I")_"^"_XUARR(200,XUDUZ_",",31,"E") ;creator DUZ^NAME
.;
.;DIVISION - MULTIPLE INCLUDING DEFAULT IS SETUP -- STATION#^name^DEFAULT
.S CT=1,EN="" F S EN=$O(XUARR(200.02,EN)) Q:EN="" D
..S STN=$$STA^XUAF4($P(EN,",")),XUIAM("division",CT)=STN_"^"_$$ESC($G(XUARR(200.02,EN,.01,"E")))_"^"_$G(XUARR(200.02,EN,1,"E")),CT=CT+1
.;
.;SECONDARY MENU: MENU NAME/POINTER, SYNONYM
.S CT=1,EN="" F S EN=$O(XUARR(200.03,EN)) Q:EN="" S XUIAM("secondary",CT)=$$ESC($G(XUARR(200.03,EN,.01,"E"))),CT=CT+1
.;
.;KEYS - keyname^who assigned duz^whos assigned name^date when assigned^review date
.S CT=1,EN="" F S EN=$O(XUARR(200.051,EN)) Q:EN="" D
..S XUIAM("keys",CT)=$$ESC($G(XUARR(200.051,EN,.01,"E")))_"^"_$G(XUARR(200.051,EN,1,"I"))_"^"_$G(XUARR(200.051,EN,1,"E"))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.051,EN,2,"I")))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.051,EN,3,"I")))
..S CT=CT+1
.;
.;VISITOR- STATION NUMBER, NAME OF SITE, DUZ AT SITE, FIRST DATE VISIT, LAST DATE VISIT, PHONE AT SITE
.S CT=1,EN="" F S EN=$O(XUARR(200.06,EN)) Q:EN="" D
..S XUIAM("visits",CT)=$G(XUARR(200.06,EN,.01,"E"))_"^"_$G(XUARR(200.06,EN,1,"I"))_"^"_$G(XUARR(200.06,EN,2,"E"))
..S XUIAM("visits",CT)=$G(XUIAM("visits",CT))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.06,EN,3,"I")))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.06,EN,4,"I")))_"^"_$$ESC($G(XUARR(200.06,EN,5,"I")))
..S CT=CT+1
.;
.;PERSON CLASS MULIPLE - CLASS NAME, EFFECTIVE DATE, EXPIRE DATE
.S CT=1,EN="" F S EN=$O(XUARR(200.05,EN)) Q:EN="" D
..S XUIAM("personClass",CT)=$$ESC($G(XUARR(200.05,EN,.01,"E")))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.05,EN,2,"I")))_"^"_$$FMTHL7^XLFDT($G(XUARR(200.05,EN,3,"I")))
..S CT=CT+1
.;
.;NPI MULTIPLE EFFECTIVE DATE^STATUS^NPI
.S CT=1,EN="" F S EN=$O(XUARR(200.042,EN)) Q:EN="" D
..S XUIAM("npiMulti",CT)=$$FMTHL7^XLFDT($G(XUARR(200,EN,.01,"I")))_"^"_$G(XUARR(200,EN,.02,"E"))_"^"_$G(XUARR(200,EN,.03,"E"))
.;
.;DEA# multiple - dea#^INDIVIDUAL DEA SUFFIX^DEA POINTER
.S CT=1,EN="" F S EN=$O(XUARR(200.5321,EN)) Q:EN="" D
..S XUIAM("deaMulti",CT)=$G(XUARR(200.5321,EN,.01,"E"))_"^"_$G(XUARR(200.5321,EN,.02,"E"))_"^"_$G(XUARR(200.5321,EN,.03,"E"))
.;
.D SNDUSER^XUIAMXML(.XURET,.XUIAM) ;update person at the enterprise
.;
.I $S($G(XURET)<0:0,$D(XURET("error")):0,$D(XURET("errorMessage")):0,1:1) D ;if enterprise update was successful
..D UPDNP(XUDUZ,.XURET,.XUIAM) ;update new person file with returned data
..D XMITFLG(XUMIEN) ;mark as transmitted
;
L -^XTV(8933.1,"XUS IAM NPFM BATCH UPDATE")
Q
;
ESC(NAME) ;
;escape & and < to be handled correctly in the spml
I NAME["&" S NAME=$$STRGREP(NAME,"&","\\amp;")
I NAME["<" S NAME=$$STRGREP(NAME,"<","<")
I NAME["\\amp;" S NAME=$$STRGREP(NAME,"\\amp;","&")
Q NAME
;
STRGREP(T,F,W) ;api to replace to string with from string
N I F Q:T'[F S T=$P(T,F)_W_$P(T,F,2,999)
Q T
;
UPDNP(XUDUZ,XURET,XUIAM) ;update 205 node and related fields of new person file
;deletes and updating of other fields will be a future enhancement
;make sure difference isn't just case by comparing lowercase to lowercase
I '$G(XUDUZ) Q
N XUFDA
;**799,VAMPI-22625 (mko): Quit if the SECID returned matches the SECID of another record
I $G(XURET("secId"))'="" Q:$$SECIDFND(XURET("secId"),XUDUZ) I ($$LOW^XLFSTR(XURET("secId"))'=$$LOW^XLFSTR(XUIAM("secId"))) S XUFDA(200,XUDUZ_",",205.1)=XURET("secId")
I $G(XURET("subjectOrg"))'="",($$LOW^XLFSTR(XURET("subjectOrg"))'=$$LOW^XLFSTR(XUIAM("subjectOrg"))) S XUFDA(200,XUDUZ_",",205.2)=XURET("subjectOrg")
I $G(XURET("orgId"))'="",($$LOW^XLFSTR(XURET("orgId"))'=$$LOW^XLFSTR(XUIAM("orgId"))) S XUFDA(200,XUDUZ_",",205.3)=XURET("orgId")
;I $G(XURET("uid"))'="",(XURET("uid")'=XUIAM("uid")) S XUFDA(200,XUDUZ_",",205.4)=XURET("uid") ;psim is not currently returning uid
I $G(XURET("secId"))'="",(XURET("secId")'=XUIAM("uid")) S XUFDA(200,XUDUZ_",",205.4)=XURET("secId") ;per danny, uid should be converted to secid
I $G(XURET("adUPN"))'="",($$LOW^XLFSTR(XURET("adUPN"))'=$$LOW^XLFSTR(XUIAM("adUPN"))) S XUFDA(200,XUDUZ_",",205.5)=XURET("adUPN")
;
I $G(XURET("npi"))'="",(XURET("npi")'=XUIAM("npi")) S XUFDA(200,XUDUZ_",",205.1)=XURET("npi")
I $G(XURET("samAccountName"))'="",($$LOW^XLFSTR(XURET("samAccountName"))'=$$LOW^XLFSTR(XUIAM("samAccountName"))) S XUFDA(200,XUDUZ_",",501.1)=XURET("samAccountName")
N XUIAMNPF S XUIAMNPF=1 ;**663 - STORY 1203246 (dri) don't set 'AVIAM' x-ref, don't want background job to process again
;**799 VAMPI-22625
L +^VA(200,XUDUZ):10 I '$T Q
I $D(XUFDA) D FILE^DIE("","XUFDA")
L -^VA(200,XUDUZ)
Q
;
SECIDFND(SECID,XUDUZ) ;Does the SECID exist on a record other than XUDUZ?
;**799,VAMPI-22625 (mko): New function
N FND,IEN
Q:$G(XUDUZ)'>0 0 Q:$G(SECID)="" 0
S (FND,IEN)=0 F S IEN=$O(^VA(200,"ASECID",$E(SECID,1,30),IEN)) Q:IEN'>0 I IEN'=XUDUZ S FND=1 Q
Q FND
;
XMITFLG(XUMIEN) ;update transmission flag
N XUFDA
S XUFDA(8933.1,XUMIEN_",",.03)=0 ;requires transmission = no
S XUFDA(8933.1,XUMIEN_",",.04)=$$NOW^XLFDT ;last transmitted date/time = now
L +^XTV(8933.1,XUMIEN):10 I '$T Q
D FILE^DIE("","XUFDA")
L -^XTV(8933.1,XUMIEN)
Q
;
EN2 ;entry point for new person field monitor purge background job
;**663 - STORY 1203257 (dri) Background job to purge New Person Field Monitor file
; **799 VAMPI-22625 Option Name: XUS IAM NPFM PURGE
;
;attempt lock to insure only one process running
L +^XTV(8933.1,"XUS IAM NPFM PURGE"):1 I '$T Q
N DA,DIK,X1,X2,X,XUDAT,XUDOMIEN,XUMIEN,XUPRGDAY,XURETDAT,XUSER
S XUDOMIEN=$O(^XTV(8989.3,0)) I 'XUDOMIEN Q ;domain
S XUPRGDAY=$$GET1^DIQ(8989.3,XUDOMIEN_",",875,"I") ;new person field monitor purge - days of transmitted data to retain.
I 'XUPRGDAY S XUPRGDAY=365 ;default if not defined
S X1=DT,X2=-XUPRGDAY D C^%DTC S XURETDAT=X ;retain date
S XUDAT=0 F S XUDAT=$O(^XTV(8933.1,"B",XUDAT)) Q:'XUDAT!(XUDAT>XURETDAT) D
.S XUMIEN=0 F S XUMIEN=$O(^XTV(8933.1,"B",XUDAT,XUMIEN)) Q:'XUMIEN S XUSER=+$P($G(^XTV(8933.1,XUMIEN,0)),"^",2) I '$D(^XTV(8933.1,"ACXMIT",XUSER,XUMIEN)) D ;if not pending transmission then
..S DA=XUMIEN,DIK="^XTV(8933.1," D ^DIK ;delete
L -^XTV(8933.1,"XUS IAM NPFM PURGE")
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUIAMNPB 13028 printed Jan 29, 2026@15:08:15 Page 2
XUIAMNPB ;BHM/DRI - IAM BACKGROUND JOB TO TRANSMIT NEW PERSON DATA ;26-Feb-2025 11:02 AM
+1 ;;8.0;KERNEL;**799**;Jul 10, 1995;Build 3
+2 ;;Per VHA Directive 2004-038, this routine should not be modified
+3 ;
+4 QUIT
+5 ;
EN1 ;entry point for new person field monitor batch update background job
+1 ;**663 - STORY 1203257 (dri) Background job monitoring New Person Field Monitor file
+2 ; **799 VAMPI-22625 Option Name: XUS IAM NPFM BATCH UPDATE
+3 ;
+4 ;attempt lock to insure only one process running
+5 LOCK +^XTV(8933.1,"XUS IAM NPFM BATCH UPDATE"):1
IF '$TEST
QUIT
+6 ;
+7 NEW XUDUZ,XUMIEN,CT,EN,FLDCNT,STN
+8 ;new person who was modified
SET XUDUZ=0
FOR
SET XUDUZ=$ORDER(^XTV(8933.1,"ACXMIT",XUDUZ))
if 'XUDUZ
QUIT
SET XUMIEN=0
FOR
SET XUMIEN=$ORDER(^XTV(8933.1,"ACXMIT",XUDUZ,XUMIEN))
if 'XUMIEN
QUIT
Begin DoDot:1
+9 NEW XUARR,XUFILE,XUFLDS,XUIAM,XURET,XUWHO
+10 ;if user doesn't exist mark record so it will get purged
IF '$DATA(^VA(200,XUDUZ,0))
DO XMITFLG(XUMIEN)
QUIT
+11 ;last edited by
SET XUWHO=$PIECE($GET(^XTV(8933.1,XUMIEN,0)),"^",5)
+12 ;if only fields like 'LAST SIGN-ON DATE/TIME' logged we won't have a 'LAST EDITED BY'
IF XUWHO=""
SET XUWHO=XUDUZ
+13 ;new person file
SET XUFILE=200
+14 SET XUFLDS=".151;4;5;7;9;9.2;10.1;41.99;205.1;205.2;205.3;205.4;205.5;202;501.1;201"
+15 ;retrieve data
DO GETS^DIQ(XUFILE,XUDUZ_",",XUFLDS,"IE","XUARR")
+16 IF $GET(XUARR(200,XUDUZ_",",10.1,"I"))
Begin DoDot:2
+17 DO GETS^DIQ(20,+$GET(XUARR(XUFILE,XUDUZ_",",10.1,"I"))_",","1;2;3;4;5;6","I","XUARR")
+18 ;given (first) name
SET XUIAM("firstName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",2,"I")
+19 ;family (last) name
SET XUIAM("lastName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",1,"I")
+20 ;middle name
SET XUIAM("middleName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",3,"I")
+21 ;prefix name
SET XUIAM("prefixName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",4,"I")
+22 ;suffix name
SET XUIAM("suffixName")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",5,"I")
+23 ;degree
SET XUIAM("degree")=XUARR(20,+XUARR(200,XUDUZ_",",10.1,"I")_",",6,"I")
End DoDot:2
+24 ;sex/gender
SET XUIAM("gender")=XUARR(200,XUDUZ_",",4,"I")
+25 ;dob - convert to hl7 format
SET XUIAM("dob")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",5,"I"))
+26 ;external or va email
SET XUIAM("email")=$$ESC(XUARR(200,XUDUZ_",",.151,"I"))
+27 ;ssn
SET XUIAM("pnid")=XUARR(200,XUDUZ_",",9,"I")
+28 ;national provider identifier
SET XUIAM("npi")=XUARR(200,XUDUZ_",",41.99,"I")
+29 ;network username
SET XUIAM("samAccountName")=XUARR(200,XUDUZ_",",501.1,"I")
+30 ;
+31 ;security id
SET XUIAM("secId")=XUARR(200,XUDUZ_",",205.1,"I")
+32 ;subject organization
SET XUIAM("subjectOrg")=XUARR(200,XUDUZ_",",205.2,"I")
+33 ;subject organization id
SET XUIAM("orgId")=XUARR(200,XUDUZ_",",205.3,"I")
+34 ;unique user id (usually the same as the secid)
SET XUIAM("uid")=XUARR(200,XUDUZ_",",205.4,"I")
+35 ;active directory user principle name (va email)
SET XUIAM("adUPN")=XUARR(200,XUDUZ_",",205.5,"I")
+36 ;
+37 ;disuser
SET XUIAM("disabled")=$EXTRACT(XUARR(200,XUDUZ_",",7,"E"),1)
+38 ;termination date
SET XUIAM("termDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",9.2,"I"))
+39 ;last sign-on date/time
SET XUIAM("lastAccess")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202,"I"))
+40 ;primary menu
SET XUIAM("primaryMenuInfor")=$$ESC(XUARR(200,XUDUZ_",",201,"E"))
+41 ;
+42 ;user being modified
SET XUIAM("vistaid")=XUDUZ_"^PN^"_$PIECE($$SITE^VASITE(),"^",3)_"^USDVA"
+43 ;
+44 ;last edited by
SET XUIAM("WHO")=XUWHO_"^PN^"_$PIECE($$SITE^VASITE(),"^",3)_"^USDVA"
+45 ;passing 'add' or 'modify' to ^xuiamxml
SET XUIAM("REQTYPE")="MODIFY"
+46 ;
+47 ;INCLUDING MORE FIELDS NOW PRIMARY MENU WILL BE USED TO DETERMINE IF VISITOR ACCOUNT, OTHER FIELDS ARE FOR FUTURE USE
+48 ;new person file
SET XUFILE=200
+49 SET XUFLDS="8;9.4;15;11.2;.111;.112;.113;.114;.115;.116;.132;.136;30;31;41.98;9;42*;101.13*;202.02;202.03;"
+50 SET XUFLDS=XUFLDS_"202.04;202.05;16*;10.1;29;201;203*;51*;8932.1*;53.1;53.11;53.2;"
+51 SET XUFLDS=XUFLDS_"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;8910*"
+52 ;NEW DETOX CALCULATED and DEA #'S multiple | DBIA #10141 (Supported)
if ($$PATCH^XPDUTL("XU*8.0*688"))
SET XUFLDS=XUFLDS_";9001;53.21*"
+53 ;retrieve data
SET FLDCNT=$LENGTH(XUFLDS,";")
DO GETS^DIQ(XUFILE,+XUDUZ_",",XUFLDS,"EI","XUARR")
+54 ;
+55 ;TITLE
SET XUIAM("title")=$$ESC(XUARR(200,XUDUZ_",",8,"E"))
+56 ;termination reason
SET XUIAM("termReason")=$$ESC(XUARR(200,XUDUZ_",",9.4,"I"))
+57 ;PROHIBITED TIMES FOR SIGN-ON (FREE TEXT FIELD)
SET XUIAM("prohibTime")=XUARR(200,XUDUZ_",",15,"I")
+58 ;DATE VERIFY CODE LAST CHANGED
SET XUIAM("verifyChangeDate")=XUARR(200,XUDUZ_",",11.2,"E")
+59 ; STREET LINE 1
SET XUIAM("addStreetLine1")=$$ESC(XUARR(200,XUDUZ_",",.111,"I"))
+60 ; STREET LINE 2
SET XUIAM("addStreetLine2")=$$ESC(XUARR(200,XUDUZ_",",.112,"I"))
+61 ; STREET LINE 3
SET XUIAM("addStreetLine3")=$$ESC(XUARR(200,XUDUZ_",",.113,"I"))
+62 ; city
SET XUIAM("addCity")=$$ESC(XUARR(200,XUDUZ_",",.114,"I"))
+63 ; State
SET XUIAM("addState")=XUARR(200,XUDUZ_",",.115,"E")
+64 ; zipcode
SET XUIAM("addZip")=XUARR(200,XUDUZ_",",.116,"I")
+65 ; office phone
SET XUIAM("workPhone")=$$ESC(XUARR(200,XUDUZ_",",.132,"I"))
+66 ; fax number
SET XUIAM("workFax")=$$ESC(XUARR(200,XUDUZ_",",.136,"I"))
+67 ; date entered
SET XUIAM("createDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",30,"I"))
+68 ;NPI ENTRY STATUS (set of codes)
SET XUIAM("npiStatus")=XUARR(200,XUDUZ_",",41.98,"E")
+69 ;XUS Logon Attempt Count
SET XUIAM("xusLogCount")=XUARR(200,XUDUZ_",",202.02,"E")
+70 ;XUS Active User
SET XUIAM("xusActive")=XUARR(200,XUDUZ_",",202.03,"E")
+71 ;Entry Last Edit Date
SET XUIAM("lastEditDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202.04,"I"))
+72 ;LOCKOUT USER UNTIL
SET XUIAM("lockoutDate")=$$FMTHL7^XLFDT(XUARR(200,XUDUZ_",",202.05,"I"))
+73 ; service/section
SET XUIAM("service")=$$ESC(XUARR(200,XUDUZ_",",29,"E"))
+74 ;AUTHORIZED TO WRITE MED ORDERS
SET XUIAM("authWriteMedOrder")=XUARR(200,XUDUZ_",",53.1,"E")
+75 ;DETOX/MAINTENANCE ID NUMBER
SET XUIAM("detoxMaintID")=XUARR(200,XUDUZ_",",53.11,"E")
+76 ;DEA#
SET XUIAM("dea")=XUARR(200,XUDUZ_",",53.2,"E")
+77 ;DEA EXPIRATION DATE
SET XUIAM("deaExpireDate")=XUARR(200,XUDUZ_",",747.44,"E")
+78 ;INACTIVE DATE
SET XUIAM("inactDate")=XUARR(200,XUDUZ_",",53.4,"E")
+79 ;PROVIDER CLASS
SET XUIAM("providerClass")=$$ESC(XUARR(200,XUDUZ_",",53.5,"E"))
+80 ;PROVIER TYPE
SET XUIAM("providerType")=$$ESC(XUARR(200,XUDUZ_",",53.6,"E"))
+81 ;REMARKS
SET XUIAM("Remarks")=$$ESC(XUARR(200,XUDUZ_",",53.9,"E"))
+82 ;NON-VA PRESCRIBER
SET XUIAM("nonVAPrescriber")=XUARR(200,XUDUZ_",",53.91,"E")
+83 ;TAX ID
SET XUIAM("taxID")=XUARR(200,XUDUZ_",",53.92,"E")
+84 ;SCHEDULE 2 NARCOTIC
SET XUIAM("schedIINarc")=XUARR(200,XUDUZ_",",55.1,"E")
+85 ;SCHEDULE 2 NON-NARCOTIC
SET XUIAM("schedIINonNarc")=XUARR(200,XUDUZ_",",55.2,"E")
+86 ;SCHEDULE 3 NARCOTIC
SET XUIAM("schedIIINarc")=XUARR(200,XUDUZ_",",55.3,"E")
+87 ;SCHEDLE 3 NON-NARCOTIC
SET XUIAM("schedIIINonNarc")=XUARR(200,XUDUZ_",",55.4,"E")
+88 ;SCHEDULE IV
SET XUIAM("schedIV")=XUARR(200,XUDUZ_",",55.5,"E")
+89 ;SCHEDULE V
SET XUIAM("schedV")=XUARR(200,XUDUZ_",",55.6,"E")
+90 ;creator DUZ^NAME
SET XUIAM("creator")=XUARR(200,XUDUZ_",",31,"I")_"^"_XUARR(200,XUDUZ_",",31,"E")
+91 ;
+92 ;DIVISION - MULTIPLE INCLUDING DEFAULT IS SETUP -- STATION#^name^DEFAULT
+93 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.02,EN))
if EN=""
QUIT
Begin DoDot:2
+94 SET STN=$$STA^XUAF4($PIECE(EN,","))
SET XUIAM("division",CT)=STN_"^"_$$ESC($GET(XUARR(200.02,EN,.01,"E")))_"^"_$GET(XUARR(200.02,EN,1,"E"))
SET CT=CT+1
End DoDot:2
+95 ;
+96 ;SECONDARY MENU: MENU NAME/POINTER, SYNONYM
+97 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.03,EN))
if EN=""
QUIT
SET XUIAM("secondary",CT)=$$ESC($GET(XUARR(200.03,EN,.01,"E")))
SET CT=CT+1
+98 ;
+99 ;KEYS - keyname^who assigned duz^whos assigned name^date when assigned^review date
+100 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.051,EN))
if EN=""
QUIT
Begin DoDot:2
+101 SET XUIAM("keys",CT)=$$ESC($GET(XUARR(200.051,EN,.01,"E")))_"^"_$GET(XUARR(200.051,EN,1,"I"))_"^"_$GET(XUARR(200.051,EN,1,"E"))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.051,EN,2,"I")))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.051,EN,3,"I"
)))
+102 SET CT=CT+1
End DoDot:2
+103 ;
+104 ;VISITOR- STATION NUMBER, NAME OF SITE, DUZ AT SITE, FIRST DATE VISIT, LAST DATE VISIT, PHONE AT SITE
+105 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.06,EN))
if EN=""
QUIT
Begin DoDot:2
+106 SET XUIAM("visits",CT)=$GET(XUARR(200.06,EN,.01,"E"))_"^"_$GET(XUARR(200.06,EN,1,"I"))_"^"_$GET(XUARR(200.06,EN,2,"E"))
+107 SET XUIAM("visits",CT)=$GET(XUIAM("visits",CT))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.06,EN,3,"I")))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.06,EN,4,"I")))_"^"_$$ESC($GET(XUARR(200.06,EN,5,"I")))
+108 SET CT=CT+1
End DoDot:2
+109 ;
+110 ;PERSON CLASS MULIPLE - CLASS NAME, EFFECTIVE DATE, EXPIRE DATE
+111 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.05,EN))
if EN=""
QUIT
Begin DoDot:2
+112 SET XUIAM("personClass",CT)=$$ESC($GET(XUARR(200.05,EN,.01,"E")))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.05,EN,2,"I")))_"^"_$$FMTHL7^XLFDT($GET(XUARR(200.05,EN,3,"I")))
+113 SET CT=CT+1
End DoDot:2
+114 ;
+115 ;NPI MULTIPLE EFFECTIVE DATE^STATUS^NPI
+116 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.042,EN))
if EN=""
QUIT
Begin DoDot:2
+117 SET XUIAM("npiMulti",CT)=$$FMTHL7^XLFDT($GET(XUARR(200,EN,.01,"I")))_"^"_$GET(XUARR(200,EN,.02,"E"))_"^"_$GET(XUARR(200,EN,.03,"E"))
End DoDot:2
+118 ;
+119 ;DEA# multiple - dea#^INDIVIDUAL DEA SUFFIX^DEA POINTER
+120 SET CT=1
SET EN=""
FOR
SET EN=$ORDER(XUARR(200.5321,EN))
if EN=""
QUIT
Begin DoDot:2
+121 SET XUIAM("deaMulti",CT)=$GET(XUARR(200.5321,EN,.01,"E"))_"^"_$GET(XUARR(200.5321,EN,.02,"E"))_"^"_$GET(XUARR(200.5321,EN,.03,"E"))
End DoDot:2
+122 ;
+123 ;update person at the enterprise
DO SNDUSER^XUIAMXML(.XURET,.XUIAM)
+124 ;
+125 ;if enterprise update was successful
IF $SELECT($GET(XURET)<0:0,$DATA(XURET("error")):0,$DATA(XURET("errorMessage")):0,1:1)
Begin DoDot:2
+126 ;update new person file with returned data
DO UPDNP(XUDUZ,.XURET,.XUIAM)
+127 ;mark as transmitted
DO XMITFLG(XUMIEN)
End DoDot:2
End DoDot:1
+128 ;
+129 LOCK -^XTV(8933.1,"XUS IAM NPFM BATCH UPDATE")
+130 QUIT
+131 ;
ESC(NAME) ;
+1 ;escape & and < to be handled correctly in the spml
+2 IF NAME["&"
SET NAME=$$STRGREP(NAME,"&","\\amp;")
+3 IF NAME["<"
SET NAME=$$STRGREP(NAME,"<","<")
+4 IF NAME["\\amp;"
SET NAME=$$STRGREP(NAME,"\\amp;","&")
+5 QUIT NAME
+6 ;
STRGREP(T,F,W) ;api to replace to string with from string
+1 NEW I
FOR
if T'[F
QUIT
SET T=$PIECE(T,F)_W_$PIECE(T,F,2,999)
+2 QUIT T
+3 ;
UPDNP(XUDUZ,XURET,XUIAM) ;update 205 node and related fields of new person file
+1 ;deletes and updating of other fields will be a future enhancement
+2 ;make sure difference isn't just case by comparing lowercase to lowercase
+3 IF '$GET(XUDUZ)
QUIT
+4 NEW XUFDA
+5 ;**799,VAMPI-22625 (mko): Quit if the SECID returned matches the SECID of another record
+6 IF $GET(XURET("secId"))'=""
if $$SECIDFND(XURET("secId"),XUDUZ)
QUIT
IF ($$LOW^XLFSTR(XURET("secId"))'=$$LOW^XLFSTR(XUIAM("secId")))
SET XUFDA(200,XUDUZ_",",205.1)=XURET("secId")
+7 IF $GET(XURET("subjectOrg"))'=""
IF ($$LOW^XLFSTR(XURET("subjectOrg"))'=$$LOW^XLFSTR(XUIAM("subjectOrg")))
SET XUFDA(200,XUDUZ_",",205.2)=XURET("subjectOrg")
+8 IF $GET(XURET("orgId"))'=""
IF ($$LOW^XLFSTR(XURET("orgId"))'=$$LOW^XLFSTR(XUIAM("orgId")))
SET XUFDA(200,XUDUZ_",",205.3)=XURET("orgId")
+9 ;I $G(XURET("uid"))'="",(XURET("uid")'=XUIAM("uid")) S XUFDA(200,XUDUZ_",",205.4)=XURET("uid") ;psim is not currently returning uid
+10 ;per danny, uid should be converted to secid
IF $GET(XURET("secId"))'=""
IF (XURET("secId")'=XUIAM("uid"))
SET XUFDA(200,XUDUZ_",",205.4)=XURET("secId")
+11 IF $GET(XURET("adUPN"))'=""
IF ($$LOW^XLFSTR(XURET("adUPN"))'=$$LOW^XLFSTR(XUIAM("adUPN")))
SET XUFDA(200,XUDUZ_",",205.5)=XURET("adUPN")
+12 ;
+13 IF $GET(XURET("npi"))'=""
IF (XURET("npi")'=XUIAM("npi"))
SET XUFDA(200,XUDUZ_",",205.1)=XURET("npi")
+14 IF $GET(XURET("samAccountName"))'=""
IF ($$LOW^XLFSTR(XURET("samAccountName"))'=$$LOW^XLFSTR(XUIAM("samAccountName")))
SET XUFDA(200,XUDUZ_",",501.1)=XURET("samAccountName")
+15 ;**663 - STORY 1203246 (dri) don't set 'AVIAM' x-ref, don't want background job to process again
NEW XUIAMNPF
SET XUIAMNPF=1
+16 ;**799 VAMPI-22625
+17 LOCK +^VA(200,XUDUZ):10
IF '$TEST
QUIT
+18 IF $DATA(XUFDA)
DO FILE^DIE("","XUFDA")
+19 LOCK -^VA(200,XUDUZ)
+20 QUIT
+21 ;
SECIDFND(SECID,XUDUZ) ;Does the SECID exist on a record other than XUDUZ?
+1 ;**799,VAMPI-22625 (mko): New function
+2 NEW FND,IEN
+3 if $GET(XUDUZ)'>0
QUIT 0
if $GET(SECID)=""
QUIT 0
+4 SET (FND,IEN)=0
FOR
SET IEN=$ORDER(^VA(200,"ASECID",$EXTRACT(SECID,1,30),IEN))
if IEN'>0
QUIT
IF IEN'=XUDUZ
SET FND=1
QUIT
+5 QUIT FND
+6 ;
XMITFLG(XUMIEN) ;update transmission flag
+1 NEW XUFDA
+2 ;requires transmission = no
SET XUFDA(8933.1,XUMIEN_",",.03)=0
+3 ;last transmitted date/time = now
SET XUFDA(8933.1,XUMIEN_",",.04)=$$NOW^XLFDT
+4 LOCK +^XTV(8933.1,XUMIEN):10
IF '$TEST
QUIT
+5 DO FILE^DIE("","XUFDA")
+6 LOCK -^XTV(8933.1,XUMIEN)
+7 QUIT
+8 ;
EN2 ;entry point for new person field monitor purge background job
+1 ;**663 - STORY 1203257 (dri) Background job to purge New Person Field Monitor file
+2 ; **799 VAMPI-22625 Option Name: XUS IAM NPFM PURGE
+3 ;
+4 ;attempt lock to insure only one process running
+5 LOCK +^XTV(8933.1,"XUS IAM NPFM PURGE"):1
IF '$TEST
QUIT
+6 NEW DA,DIK,X1,X2,X,XUDAT,XUDOMIEN,XUMIEN,XUPRGDAY,XURETDAT,XUSER
+7 ;domain
SET XUDOMIEN=$ORDER(^XTV(8989.3,0))
IF 'XUDOMIEN
QUIT
+8 ;new person field monitor purge - days of transmitted data to retain.
SET XUPRGDAY=$$GET1^DIQ(8989.3,XUDOMIEN_",",875,"I")
+9 ;default if not defined
IF 'XUPRGDAY
SET XUPRGDAY=365
+10 ;retain date
SET X1=DT
SET X2=-XUPRGDAY
DO C^%DTC
SET XURETDAT=X
+11 SET XUDAT=0
FOR
SET XUDAT=$ORDER(^XTV(8933.1,"B",XUDAT))
if 'XUDAT!(XUDAT>XURETDAT)
QUIT
Begin DoDot:1
+12 ;if not pending transmission then
SET XUMIEN=0
FOR
SET XUMIEN=$ORDER(^XTV(8933.1,"B",XUDAT,XUMIEN))
if 'XUMIEN
QUIT
SET XUSER=+$PIECE($GET(^XTV(8933.1,XUMIEN,0)),"^",2)
IF '$DATA(^XTV(8933.1,"ACXMIT",XUSER,XUMIEN))
Begin DoDot:2
+13 ;delete
SET DA=XUMIEN
SET DIK="^XTV(8933.1,"
DO ^DIK
End DoDot:2
End DoDot:1
+14 LOCK -^XTV(8933.1,"XUS IAM NPFM PURGE")
+15 QUIT
+16 ;