XUIAMXML ;BHM/DLR,DRI - IAM ENTERPRISE NEW PERSON PROBABILISTIC SEARCH ;1/20/23 10:39
;;8.0;KERNEL;**731,799**;Jul 10, 1995;Build 3
;;Per VHA Directive 2004-038, this routine should not be modified
;
;Utilizes SPML (Service Provisioning Markup Language) for IAM lookup to
;PSIM (Person Services Identity Management)
;
;**731, VAMPI-8214 (dri) - create api to lookup user by secid and retrieve user traits **799 VAMPI-22625
USER(RETURN,MPIARR) ; - query PSIM to find USER traits
; Input (one of the following):
; MPIARR("samacctnm") = SECURITY ACCOUNT MANAGER/NETWORK USERNAME
; or MPIARR("VAemail") = ACTIVE DIRECTORY USER PRINCIPLE NAME/EMAIL ADDRESS
; or MPIARR("secId") = SECURITY ID
;
; Output (array of traits):
; RETURN("city")=CITY
; RETURN("dob")=DOB (HL7 format)
; RETURN("email")=EMAIL ADDRESS
; RETURN("firstName")=FIRST NAME
; RETURN("gender")=SEX
; RETURN("identityTheft")="N" or "Y"
; RETURN("lastName")=FAMILY (LAST) NAME
; RETURN("mcid")=PSIM MESSAGE CONTROL ID
; RETURN("middleName")=MIDDLE NAME
; RETURN("orgId")=SUBJECT ORGANIZATION
; RETURN("phone")=PHONE NUMBER
; RETURN("pnid")=PERSON NUMBER IDENTIFIED/SSN
; RETURN("postalCode")=ZIP CODE
; RETURN("samacctnm")=SECURITY ACCOUNT MANAGER/NETWORK USERNAME
; RETURN("secId")=SECURITY ID
; RETURN("state")=STATE
; RETURN("street_1")=STREET ADDRESS 1
; RETURN("subjectOrg")=SUBJECT ORGANIZATION
; RETURN("vauid")=VA ACTIVE DIRECTORY UNIQUE ID (for 200AD)
; RETURN("vistaid")=STATION NUMBER|USERID or DUZ^SOURCE ID TYPE^STATION NUMBER^ASSIGNING AUTHORITY| (repeating)
;
; Example calling api:
; S MPIARR("VAemail")="first.lastname@domain.ext"
; or S MPIARR("samacctnm")="VHAMOCLASTNAMEF"
; or S MPIARR("secId")=##########
;
; D USER^XUIAMXML(.RETURN,.MPIARR)
; ZW RETURN ;returns array of traits
;
N MPIXML,MPIXMLR,MPID,MPIPAT K RETURN
S MPIXML=$$SXMLBLD(.MPIARR) ;build spml search request
D POST(MPIXML,.MPIXMLR) ;send spml to psim
I '$D(MPIXMLR) S RETURN="-1^Unable to communicate with the Enterprise Database." Q
D SPARSE(.RETURN,.MPIXMLR) ;parse psim response of returned spml
N MPIFLD F MPIFLD="firstName","middleName","lastName","gender" I $G(RETURN(MPIFLD))?.E1L.E S RETURN(MPIFLD)=$$UP^XLFSTR(RETURN(MPIFLD)) ;insure upper case
Q
;
SNDUSER(RETURN,MPIARR) ; - update PSIM with USER traits
; Input: MPIARR - Array of trait(s) to update
; Output: RETURN - Array of traits psim has
;
N MPIXML,MPIXMLR,MPID,MPIPAT K RETURN
S MPIXML=$$AXMLBLD(.MPIARR) ;build spml for psim
D POST(MPIXML,.MPIXMLR) ;send spml to psim
I '$D(MPIXMLR) S RETURN="-1^Unable to communicate with the Enterprise Database." Q
D SPARSE(.RETURN,.MPIXMLR) ;parse psim response of returned spml
Q
;
QRYUSER(RETURN,MPIARR) ; - query PSIM with additional traits to find USER traits ;**663 - STORY 783347 (dri)
; Input: MPIARR - Array of trait(s) to use for lookup
; Output: RETURN - Array of traits psim has
;
N MPIXML,MPIXMLR,MPID,MPIPAT K RETURN
S MPIXML=$$QXMLBLD(.MPIARR) ;build spml for psim
D POST(MPIXML,.MPIXMLR) ;send spml to psim
I '$D(MPIXMLR) S RETURN="-1^Unable to communicate with the Enterprise Database." Q
D PARSE(.RETURN,.MPIXMLR) ;parse psim response of returned spml
I $O(RETURN(0)) D ;massage returned person(s) data
.N L S L="RETURN" F S L=$Q(@L) Q:L="" S @L=$$STRIP^XLFSTR(@L,"""") ;strip out double quotes
.N CNT,MPIFLD S CNT=0 F S CNT=$O(RETURN(CNT)) Q:'CNT D
..F MPIFLD="firstName","middleName","lastName","gender" I $G(RETURN(CNT,MPIFLD))?.E1L.E S RETURN(CNT,MPIFLD)=$$UP^XLFSTR(RETURN(CNT,MPIFLD)) ;insure upper case
Q
;
ORCHUSER(RETURN,MPIARR) ; - orchestrate USER so SECID is returned ;**663 - STORY 783347 (dri) **799 VAMPI-22625
; Input: MPIARR - Array of trait(s) to use for lookup
; Output: RETURN - Array of traits psim has
;
N MPIXML,MPIXMLR,MPID,MPIPAT K RETURN
S MPIXML=$$OXMLBLD(.MPIARR) ;build spml for psim
D POST(MPIXML,.MPIXMLR) ;send spml to psim
I '$D(MPIXMLR) S RETURN="-1^Unable to communicate with the Enterprise Database." Q
D PARSE(.RETURN,.MPIXMLR) ;parse psim response of returned spml
I $O(RETURN(0)) D ;massage returned person(s) data
.N L S L="RETURN" F S L=$Q(@L) Q:L="" S @L=$$STRIP^XLFSTR(@L,"""") ;strip out double quotes
.N CNT,MPIFLD S CNT=0 F S CNT=$O(RETURN(CNT)) Q:'CNT D
..F MPIFLD="firstName","middleName","lastName","gender" I $G(RETURN(CNT,MPIFLD))?.E1L.E S RETURN(CNT,MPIFLD)=$$UP^XLFSTR(RETURN(CNT,MPIFLD)) ;insure upper case
Q
;
SXMLBLD(MPIARR) ; setup xml to search for user
; Input: MPIARR - Array of traits to search
; Output: XML for the search
; $$SITE^VASITE - IA #10112
;
N MPIXML,MPISITE,QUOTE,MPITHRES,MPIDT,MPIDUZ,MPIPRID
S QUOTE="""",MPISITE=$P($$SITE^VASITE,"^",3),MPIPRID=$P($$PARAM^HLCS2,"^",3),MPIDT=$$FMTHL7^XLFDT($$NOW^XLFDT),MPITHRES=80
I $G(DUZ)>0 S MPIDUZ=$P(^VA(200,DUZ,0),"^") D STDNAME^XLFNAME(.MPIDUZ,"C")
; heading
S MPIXML="<spml:lookupRequest requestID="_QUOTE_516.2018053111223344_QUOTE_" returnData="_QUOTE_"data"_QUOTE_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_">"
I $G(MPIARR("secId"))'="" S MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_MPIARR("secId")_"^PN^200PROV^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>" ;lookup secid
I $G(MPIARR("secId"))="" S MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$S($G(MPIARR("VAemail"))'="":MPIARR("VAemail"),1:$G(MPIARR("samacctnm")))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>" ;or lookup by vaemail or samacctnm
S MPIXML=MPIXML_"</spml:lookupRequest>"
K MPIARR("MPIVar")
Q MPIXML
;
MSGID() ;
N XUNOW S XUNOW=$$NOW^XLFDT
Q $P($$SITE^VASITE,"^",3)_"."_$P(XUNOW,".",1)_$P(XUNOW,".",2)_$J_$R(999999)
;
AXMLBLD(MPIARR) ; setup xml to add or modify a user
; Input: MPIARR - Array of traits for add or modify
; Output: XML for the add or modify
; $$SITE^VASITE - IA #10112
;
N MPIXML
S MPIXML=$$AXMLBLD^XUIAMXML2(.MPIARR) ;MOVED DUE TO ROUTINE SIZE
Q MPIXML
;
QXMLBLD(MPIARR) ;setup xml for enhanced query of PSIM for user
; Input: MPIARR - Array of traits for enhanced search
; Output: XML for the enhanced search
; $$SITE^VASITE - IA #10112
;
N MPIPRID,MPISITE,MPIXML,QUOTE
S QUOTE="""",MPISITE=$P($$SITE^VASITE,"^",3) ;station number
S MPIPRID=$P($$PARAM^HLCS2,"^",3) ;'p'roduction or 't'est
; heading
S MPIXML="<spml:modifyRequest"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" requestID="_QUOTE_$$MSGID()_QUOTE_" targetID="_QUOTE_$P($$SITE^VASITE(),"^",3)_QUOTE_" executionMode="_QUOTE_"synchronous"_QUOTE_">"
S MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$S($G(MPIARR("VAemail"))'="":MPIARR("VAemail"),1:$G(MPIARR("samacctnm")))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>" ;pass vaemail or samacctnm
S MPIXML=MPIXML_"<spml:modification"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" modificationMode="_QUOTE_"add"_QUOTE_">"
S MPIXML=MPIXML_"<spml:data>"
S MPIXML=MPIXML_"<spml:user>"
; user data
D IFADD("firstName",.MPIARR,.MPIXML,"spml:firstName")
;D IFADD("middleName",.MPIARR,.MPIXML,"spml:middleName")
D IFADD("lastName",.MPIARR,.MPIXML,"spml:lastName")
;
D IFADD("gender",.MPIARR,.MPIXML,"spml:gender")
D IFADD("dob",.MPIARR,.MPIXML,"spml:dob")
D IFADD("pnid",.MPIARR,.MPIXML,"spml:ssn") ;ssn
;
S MPIXML=MPIXML_"</spml:user>"
S MPIXML=MPIXML_"</spml:data>"
S MPIXML=MPIXML_"<spml:capabilityData>"
S MPIXML=MPIXML_"<spml:operationData requestor="_QUOTE_MPIARR("WHO")_QUOTE_">"
S MPIXML=MPIXML_"</spml:operationData>"
S MPIXML=MPIXML_"</spml:capabilityData>"
S MPIXML=MPIXML_"</spml:modification>"
S MPIXML=MPIXML_"</spml:"_"modifyRequest"_">"
Q MPIXML
;
OXMLBLD(MPIARR) ;setup xml for PSIM to orchestrate user
; Input: MPIARR - Array of traits for orchestration
; Output: XML for the orchestration (a secid should be returned)
; $$SITE^VASITE - IA #10112
;
N MPIPRID,MPISITE,MPIXML,QUOTE
S QUOTE="""",MPISITE=$P($$SITE^VASITE,"^",3) ;station number
S MPIPRID=$P($$PARAM^HLCS2,"^",3) ;'p'roduction or 't'est
; heading
S MPIXML="<spml:addRequest"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" requestID="_QUOTE_$$MSGID()_QUOTE_" targetID="_QUOTE_$G(MPIARR("icn"))_QUOTE
S MPIXML=MPIXML_" returnData="_QUOTE_"Identifier"_QUOTE_" executionMode="_QUOTE_"synchronous"_QUOTE_">"
S MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$G(MPIARR("email"))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_$G(MPIARR("icn"))_QUOTE_"/>" ;pass email
S MPIXML=MPIXML_"<spml:data>"
S MPIXML=MPIXML_"<spml:user>"
S MPIXML=MPIXML_"<note>"_$G(MPIARR("note"))_"</note>"
; user data
D IFADD("firstName",.MPIARR,.MPIXML,"spml:firstName")
D IFADD("lastName",.MPIARR,.MPIXML,"spml:lastName")
D IFADD("dob",.MPIARR,.MPIXML,"spml:dob")
D IFADD("pnid",.MPIARR,.MPIXML,"spml:ssn") ;ssn
;
S MPIXML=MPIXML_"</spml:user>"
S MPIXML=MPIXML_"</spml:data>"
S MPIXML=MPIXML_"<spml:capabilityData>"
S MPIXML=MPIXML_"<spml:environment code="_QUOTE_MPIPRID_QUOTE_"/>"
S MPIXML=MPIXML_"<spml:operationData requestor="_QUOTE_MPIARR("WHO")_QUOTE_"/>"
S MPIXML=MPIXML_"</spml:capabilityData>"
S MPIXML=MPIXML_"</spml:"_"addRequest"_">"
Q MPIXML
;
IFADD(MPIVAR,MPIARR,MPIXML,MPIXMLN) ;check if there, if so add it to the XML
; MPIVAR is the MPIARR variable name
; MPIXMLN is the name of the XML to encase
; modifies MPIXML to add if it is there
I $G(MPIARR(MPIVAR))'="" S MPIXML=MPIXML_"<"_MPIXMLN_">"_MPIARR(MPIVAR)_"</"_MPIXMLN_">"
Q
;
SPARSE(MPIDATA,MPIXML) ; - parse the data from user query or user update
; EN^MXMLPRSE - IA #4149
;
K ^TMP($J,"XUIAMXML_PARSE")
N MPICB,MPIUSE,MPIVAR,MPIPAT,MPIALIAS,MPILOC,MPIIDS
S (MPIPAT,MPIIDS)=0
S MPICB("STARTELEMENT")="SE^XUIAMXML",MPICB("CHARACTERS")="VALUE^XUIAMXML"
S ^TMP($J,"XUIAMXML_PARSE",1)=MPIXML
D EN^MXMLPRSE($NA(^TMP($J,"XUIAMXML_PARSE")),.MPICB)
K ^TMP($J,"XUIAMXML_PARSE")
Q
;
SE(MPIN,MPIA) ; - used by the parser for user query or user update to call back with STARTELEMENT
; just to protect the process
S MPIN=$G(MPIN),MPIVAR=""""_MPIN_"""",MPILOC="MPIDATA("
S MPIA("error")=$G(MPIA("error"))
S MPIA("lastName")=$G(MPIA("lastName"))
S MPIA("middleName")=$G(MPIA("middleName"))
S MPIA("firstName")=$G(MPIA("firstName"))
S MPIA("dob")=$G(MPIA("dob"))
S MPIA("pnid")=$G(MPIA("pnid"))
S MPIA("secId")=$G(MPIA("secId"))
S MPIA("dob")=$G(MPIA("dob"))
S MPIA("vistaid")=$G(MPIA("vistaid"))
S MPIA("gender")=$G(MPIA("gender"))
; my variable to protect
;I MPIN="user" S MPIPAT=MPIPAT+1,MPIALIAS=0,MPILOC="MPIDATA("_MPIPAT Q
S MPIUSE=$G(MPIUSE)
; got a business rule error
;I MPIN="RESULT",MPIA("type")="AA",MPIA("subtype")="QE" S MPIDATA("Result")="QE" Q
; don't use these
Q
;
PARSE(MPIDATA,MPIXML) ; - parse the data from additional traits user query
; EN^MXMLPRSE - IA #4149
;
K ^TMP($J,"XUIAMXML_PARSE")
N MPICB,MPIVAR,MPIPAT,MPILOC,MPIIDS
S (MPIPAT,MPIIDS)=0
S MPICB("STARTELEMENT")="SEQ^XUIAMXML",MPICB("CHARACTERS")="VALUE^XUIAMXML"
S ^TMP($J,"XUIAMXML_PARSE",1)=MPIXML
D EN^MXMLPRSE($NA(^TMP($J,"XUIAMXML_PARSE")),.MPICB)
K ^TMP($J,"XUIAMXML_PARSE")
Q
;
SEQ(MPIN,MPIA) ; - used by the parser for additional traits user query to call back with STARTELEMENT
I MPIN="user" S MPIPAT=MPIPAT+1,MPILOC="MPIDATA("_MPIPAT_"," ;Q
I '$D(MPILOC) S MPILOC="MPIDATA(" ;no 'user' traits, an error being returned
S MPIVAR=""""_MPIN_""""
Q
;
VALUE(MPIT) ; - used by the parser to call back with CHARACTERS
S:$D(MPIVAR) @(MPILOC_MPIVAR_")")=MPIT K MPIVAR Q
Q
;
POST(MPIXML,MPIXMLR) ; - post XML to the execute server
; $$GETPROXY^XOBWLIB - IA #5421
N $ETRAP,$ESTACK,SVC
S $ETRAP="DO ERROR^XUIAMXML" ; set error trap
I $D(^XTMP("XUIAMXML_EDIT")) D TEST("OUTGOING",.MPIXML) ; test mode (outgoing)?
S SVC=$$GETPROXY^XOBWLIB("MPI_PSIM_NEW EXECUTE","MPI_PSIM_NEW EXECUTE")
S MPIXMLR=SVC.execute(MPIXML)
; in case debugging needed, save both out and return
I $D(^XTMP("XUIAMXML_DEBUG")) D
.N XUIAMSAVE
.S XUIAMSAVE=$O(^XTMP("XUIAMXML_DEBUG",":"),-1)+1
.S ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,0)=$$NOW^XLFDT
.S ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,"OUT")=MPIXML
.S ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,"RETURN")=MPIXMLR
; test mode (return)?
I $D(^XTMP("XUIAMXML_EDIT")) D TEST("RETURN",.MPIXMLR)
Q
;
ERROR ; - catch errors
; Set ecode to empty to return to calling function
; $$EOFAC^XOBWLIB, ZTER^XOBWLIB - IA #5421
; UNWIND^%ZTER - IA #1621
N MPIERR
S MPIERR=$$EOFAC^XOBWLIB()
D ZTER^XOBWLIB(MPIERR)
S $ECODE=""
D UNWIND^%ZTER
Q
;
TEST(TYPE,MPIXML) ; - call to possibly edit the xml string
; used for testing purposes only.
; production NOT allowed
I $$PROD^XUPROD Q
I $E($G(IOST),1,2)'="C-" Q
N DIC,X,L,T,C,%,%Y
W !!,"Do you want to edit the "_TYPE_" XML"
S %=2 D YN^DICN I %'=1 Q
K ^TMP("XUIAMXML_TEST",$J)
S L=0,T=""
F X=1:1 S C=$E(MPIXML,X) Q:C="" D
. I C="<",T'="" S L=L+1,^TMP("XUIAMXML_TEST",$J,L,0)=T,T=C Q
. S T=T_C
S DIC="^TMP(""XUIAMXML_TEST"",$J,"
D EN^DIWE
S MPIXML=""
S X=0 F S X=$O(^TMP("XUIAMXML_TEST",$J,X)) Q:'X S MPIXML=MPIXML_^TMP("XUIAMXML_TEST",$J,X,0)
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUIAMXML 13248 printed Jan 29, 2026@15:08:18 Page 2
XUIAMXML ;BHM/DLR,DRI - IAM ENTERPRISE NEW PERSON PROBABILISTIC SEARCH ;1/20/23 10:39
+1 ;;8.0;KERNEL;**731,799**;Jul 10, 1995;Build 3
+2 ;;Per VHA Directive 2004-038, this routine should not be modified
+3 ;
+4 ;Utilizes SPML (Service Provisioning Markup Language) for IAM lookup to
+5 ;PSIM (Person Services Identity Management)
+6 ;
+7 ;**731, VAMPI-8214 (dri) - create api to lookup user by secid and retrieve user traits **799 VAMPI-22625
USER(RETURN,MPIARR) ; - query PSIM to find USER traits
+1 ; Input (one of the following):
+2 ; MPIARR("samacctnm") = SECURITY ACCOUNT MANAGER/NETWORK USERNAME
+3 ; or MPIARR("VAemail") = ACTIVE DIRECTORY USER PRINCIPLE NAME/EMAIL ADDRESS
+4 ; or MPIARR("secId") = SECURITY ID
+5 ;
+6 ; Output (array of traits):
+7 ; RETURN("city")=CITY
+8 ; RETURN("dob")=DOB (HL7 format)
+9 ; RETURN("email")=EMAIL ADDRESS
+10 ; RETURN("firstName")=FIRST NAME
+11 ; RETURN("gender")=SEX
+12 ; RETURN("identityTheft")="N" or "Y"
+13 ; RETURN("lastName")=FAMILY (LAST) NAME
+14 ; RETURN("mcid")=PSIM MESSAGE CONTROL ID
+15 ; RETURN("middleName")=MIDDLE NAME
+16 ; RETURN("orgId")=SUBJECT ORGANIZATION
+17 ; RETURN("phone")=PHONE NUMBER
+18 ; RETURN("pnid")=PERSON NUMBER IDENTIFIED/SSN
+19 ; RETURN("postalCode")=ZIP CODE
+20 ; RETURN("samacctnm")=SECURITY ACCOUNT MANAGER/NETWORK USERNAME
+21 ; RETURN("secId")=SECURITY ID
+22 ; RETURN("state")=STATE
+23 ; RETURN("street_1")=STREET ADDRESS 1
+24 ; RETURN("subjectOrg")=SUBJECT ORGANIZATION
+25 ; RETURN("vauid")=VA ACTIVE DIRECTORY UNIQUE ID (for 200AD)
+26 ; RETURN("vistaid")=STATION NUMBER|USERID or DUZ^SOURCE ID TYPE^STATION NUMBER^ASSIGNING AUTHORITY| (repeating)
+27 ;
+28 ; Example calling api:
+29 ; S MPIARR("VAemail")="first.lastname@domain.ext"
+30 ; or S MPIARR("samacctnm")="VHAMOCLASTNAMEF"
+31 ; or S MPIARR("secId")=##########
+32 ;
+33 ; D USER^XUIAMXML(.RETURN,.MPIARR)
+34 ; ZW RETURN ;returns array of traits
+35 ;
+36 NEW MPIXML,MPIXMLR,MPID,MPIPAT
KILL RETURN
+37 ;build spml search request
SET MPIXML=$$SXMLBLD(.MPIARR)
+38 ;send spml to psim
DO POST(MPIXML,.MPIXMLR)
+39 IF '$DATA(MPIXMLR)
SET RETURN="-1^Unable to communicate with the Enterprise Database."
QUIT
+40 ;parse psim response of returned spml
DO SPARSE(.RETURN,.MPIXMLR)
+41 ;insure upper case
NEW MPIFLD
FOR MPIFLD="firstName","middleName","lastName","gender"
IF $GET(RETURN(MPIFLD))?.E1L.E
SET RETURN(MPIFLD)=$$UP^XLFSTR(RETURN(MPIFLD))
+42 QUIT
+43 ;
SNDUSER(RETURN,MPIARR) ; - update PSIM with USER traits
+1 ; Input: MPIARR - Array of trait(s) to update
+2 ; Output: RETURN - Array of traits psim has
+3 ;
+4 NEW MPIXML,MPIXMLR,MPID,MPIPAT
KILL RETURN
+5 ;build spml for psim
SET MPIXML=$$AXMLBLD(.MPIARR)
+6 ;send spml to psim
DO POST(MPIXML,.MPIXMLR)
+7 IF '$DATA(MPIXMLR)
SET RETURN="-1^Unable to communicate with the Enterprise Database."
QUIT
+8 ;parse psim response of returned spml
DO SPARSE(.RETURN,.MPIXMLR)
+9 QUIT
+10 ;
QRYUSER(RETURN,MPIARR) ; - query PSIM with additional traits to find USER traits ;**663 - STORY 783347 (dri)
+1 ; Input: MPIARR - Array of trait(s) to use for lookup
+2 ; Output: RETURN - Array of traits psim has
+3 ;
+4 NEW MPIXML,MPIXMLR,MPID,MPIPAT
KILL RETURN
+5 ;build spml for psim
SET MPIXML=$$QXMLBLD(.MPIARR)
+6 ;send spml to psim
DO POST(MPIXML,.MPIXMLR)
+7 IF '$DATA(MPIXMLR)
SET RETURN="-1^Unable to communicate with the Enterprise Database."
QUIT
+8 ;parse psim response of returned spml
DO PARSE(.RETURN,.MPIXMLR)
+9 ;massage returned person(s) data
IF $ORDER(RETURN(0))
Begin DoDot:1
+10 ;strip out double quotes
NEW L
SET L="RETURN"
FOR
SET L=$QUERY(@L)
if L=""
QUIT
SET @L=$$STRIP^XLFSTR(@L,"""")
+11 NEW CNT,MPIFLD
SET CNT=0
FOR
SET CNT=$ORDER(RETURN(CNT))
if 'CNT
QUIT
Begin DoDot:2
+12 ;insure upper case
FOR MPIFLD="firstName","middleName","lastName","gender"
IF $GET(RETURN(CNT,MPIFLD))?.E1L.E
SET RETURN(CNT,MPIFLD)=$$UP^XLFSTR(RETURN(CNT,MPIFLD))
End DoDot:2
End DoDot:1
+13 QUIT
+14 ;
ORCHUSER(RETURN,MPIARR) ; - orchestrate USER so SECID is returned ;**663 - STORY 783347 (dri) **799 VAMPI-22625
+1 ; Input: MPIARR - Array of trait(s) to use for lookup
+2 ; Output: RETURN - Array of traits psim has
+3 ;
+4 NEW MPIXML,MPIXMLR,MPID,MPIPAT
KILL RETURN
+5 ;build spml for psim
SET MPIXML=$$OXMLBLD(.MPIARR)
+6 ;send spml to psim
DO POST(MPIXML,.MPIXMLR)
+7 IF '$DATA(MPIXMLR)
SET RETURN="-1^Unable to communicate with the Enterprise Database."
QUIT
+8 ;parse psim response of returned spml
DO PARSE(.RETURN,.MPIXMLR)
+9 ;massage returned person(s) data
IF $ORDER(RETURN(0))
Begin DoDot:1
+10 ;strip out double quotes
NEW L
SET L="RETURN"
FOR
SET L=$QUERY(@L)
if L=""
QUIT
SET @L=$$STRIP^XLFSTR(@L,"""")
+11 NEW CNT,MPIFLD
SET CNT=0
FOR
SET CNT=$ORDER(RETURN(CNT))
if 'CNT
QUIT
Begin DoDot:2
+12 ;insure upper case
FOR MPIFLD="firstName","middleName","lastName","gender"
IF $GET(RETURN(CNT,MPIFLD))?.E1L.E
SET RETURN(CNT,MPIFLD)=$$UP^XLFSTR(RETURN(CNT,MPIFLD))
End DoDot:2
End DoDot:1
+13 QUIT
+14 ;
SXMLBLD(MPIARR) ; setup xml to search for user
+1 ; Input: MPIARR - Array of traits to search
+2 ; Output: XML for the search
+3 ; $$SITE^VASITE - IA #10112
+4 ;
+5 NEW MPIXML,MPISITE,QUOTE,MPITHRES,MPIDT,MPIDUZ,MPIPRID
+6 SET QUOTE=""""
SET MPISITE=$PIECE($$SITE^VASITE,"^",3)
SET MPIPRID=$PIECE($$PARAM^HLCS2,"^",3)
SET MPIDT=$$FMTHL7^XLFDT($$NOW^XLFDT)
SET MPITHRES=80
+7 IF $GET(DUZ)>0
SET MPIDUZ=$PIECE(^VA(200,DUZ,0),"^")
DO STDNAME^XLFNAME(.MPIDUZ,"C")
+8 ; heading
+9 SET MPIXML="<spml:lookupRequest requestID="_QUOTE_516.2018053111223344_QUOTE_" returnData="_QUOTE_"data"_QUOTE_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_">"
+10 ;lookup secid
IF $GET(MPIARR("secId"))'=""
SET MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_MPIARR("secId")_"^PN^200PROV^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>"
+11 ;or lookup by vaemail or samacctnm
IF $GET(MPIARR("secId"))=""
SET MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$SELECT($GET(MPIARR("VAemail"))'="":MPIARR("VAemail"),1:$GET(MPIARR("samacctnm")))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>"
+12 SET MPIXML=MPIXML_"</spml:lookupRequest>"
+13 KILL MPIARR("MPIVar")
+14 QUIT MPIXML
+15 ;
MSGID() ;
+1 NEW XUNOW
SET XUNOW=$$NOW^XLFDT
+2 QUIT $PIECE($$SITE^VASITE,"^",3)_"."_$PIECE(XUNOW,".",1)_$PIECE(XUNOW,".",2)_$JOB_$RANDOM(999999)
+3 ;
AXMLBLD(MPIARR) ; setup xml to add or modify a user
+1 ; Input: MPIARR - Array of traits for add or modify
+2 ; Output: XML for the add or modify
+3 ; $$SITE^VASITE - IA #10112
+4 ;
+5 NEW MPIXML
+6 ;MOVED DUE TO ROUTINE SIZE
SET MPIXML=$$AXMLBLD^XUIAMXML2(.MPIARR)
+7 QUIT MPIXML
+8 ;
QXMLBLD(MPIARR) ;setup xml for enhanced query of PSIM for user
+1 ; Input: MPIARR - Array of traits for enhanced search
+2 ; Output: XML for the enhanced search
+3 ; $$SITE^VASITE - IA #10112
+4 ;
+5 NEW MPIPRID,MPISITE,MPIXML,QUOTE
+6 ;station number
SET QUOTE=""""
SET MPISITE=$PIECE($$SITE^VASITE,"^",3)
+7 ;'p'roduction or 't'est
SET MPIPRID=$PIECE($$PARAM^HLCS2,"^",3)
+8 ; heading
+9 SET MPIXML="<spml:modifyRequest"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" requestID="_QUOTE_$$MSGID()_QUOTE_" targetID="_QUOTE_$PIECE($$SITE^VASITE(),"^",3)_QUOTE_" executionMode="_QUOTE_"synchronous"_QUOTE_">"
+10 ;pass vaemail or samacctnm
SET MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$SELECT($GET(MPIARR("VAemail"))'="":MPIARR("VAemail"),1:$GET(MPIARR("samacctnm")))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_"not_used"_QUOTE_"/>"
+11 SET MPIXML=MPIXML_"<spml:modification"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" modificationMode="_QUOTE_"add"_QUOTE_">"
+12 SET MPIXML=MPIXML_"<spml:data>"
+13 SET MPIXML=MPIXML_"<spml:user>"
+14 ; user data
+15 DO IFADD("firstName",.MPIARR,.MPIXML,"spml:firstName")
+16 ;D IFADD("middleName",.MPIARR,.MPIXML,"spml:middleName")
+17 DO IFADD("lastName",.MPIARR,.MPIXML,"spml:lastName")
+18 ;
+19 DO IFADD("gender",.MPIARR,.MPIXML,"spml:gender")
+20 DO IFADD("dob",.MPIARR,.MPIXML,"spml:dob")
+21 ;ssn
DO IFADD("pnid",.MPIARR,.MPIXML,"spml:ssn")
+22 ;
+23 SET MPIXML=MPIXML_"</spml:user>"
+24 SET MPIXML=MPIXML_"</spml:data>"
+25 SET MPIXML=MPIXML_"<spml:capabilityData>"
+26 SET MPIXML=MPIXML_"<spml:operationData requestor="_QUOTE_MPIARR("WHO")_QUOTE_">"
+27 SET MPIXML=MPIXML_"</spml:operationData>"
+28 SET MPIXML=MPIXML_"</spml:capabilityData>"
+29 SET MPIXML=MPIXML_"</spml:modification>"
+30 SET MPIXML=MPIXML_"</spml:"_"modifyRequest"_">"
+31 QUIT MPIXML
+32 ;
OXMLBLD(MPIARR) ;setup xml for PSIM to orchestrate user
+1 ; Input: MPIARR - Array of traits for orchestration
+2 ; Output: XML for the orchestration (a secid should be returned)
+3 ; $$SITE^VASITE - IA #10112
+4 ;
+5 NEW MPIPRID,MPISITE,MPIXML,QUOTE
+6 ;station number
SET QUOTE=""""
SET MPISITE=$PIECE($$SITE^VASITE,"^",3)
+7 ;'p'roduction or 't'est
SET MPIPRID=$PIECE($$PARAM^HLCS2,"^",3)
+8 ; heading
+9 SET MPIXML="<spml:addRequest"_" xmlns:spml="_QUOTE_"urn:oasis:names:tc:SPML:2:0"_QUOTE_" requestID="_QUOTE_$$MSGID()_QUOTE_" targetID="_QUOTE_$GET(MPIARR("icn"))_QUOTE
+10 SET MPIXML=MPIXML_" returnData="_QUOTE_"Identifier"_QUOTE_" executionMode="_QUOTE_"synchronous"_QUOTE_">"
+11 ;pass email
SET MPIXML=MPIXML_"<spml:psoID ID="_QUOTE_$GET(MPIARR("email"))_"^PN^200AD^USDVA"_QUOTE_" targetID="_QUOTE_$GET(MPIARR("icn"))_QUOTE_"/>"
+12 SET MPIXML=MPIXML_"<spml:data>"
+13 SET MPIXML=MPIXML_"<spml:user>"
+14 SET MPIXML=MPIXML_"<note>"_$GET(MPIARR("note"))_"</note>"
+15 ; user data
+16 DO IFADD("firstName",.MPIARR,.MPIXML,"spml:firstName")
+17 DO IFADD("lastName",.MPIARR,.MPIXML,"spml:lastName")
+18 DO IFADD("dob",.MPIARR,.MPIXML,"spml:dob")
+19 ;ssn
DO IFADD("pnid",.MPIARR,.MPIXML,"spml:ssn")
+20 ;
+21 SET MPIXML=MPIXML_"</spml:user>"
+22 SET MPIXML=MPIXML_"</spml:data>"
+23 SET MPIXML=MPIXML_"<spml:capabilityData>"
+24 SET MPIXML=MPIXML_"<spml:environment code="_QUOTE_MPIPRID_QUOTE_"/>"
+25 SET MPIXML=MPIXML_"<spml:operationData requestor="_QUOTE_MPIARR("WHO")_QUOTE_"/>"
+26 SET MPIXML=MPIXML_"</spml:capabilityData>"
+27 SET MPIXML=MPIXML_"</spml:"_"addRequest"_">"
+28 QUIT MPIXML
+29 ;
IFADD(MPIVAR,MPIARR,MPIXML,MPIXMLN) ;check if there, if so add it to the XML
+1 ; MPIVAR is the MPIARR variable name
+2 ; MPIXMLN is the name of the XML to encase
+3 ; modifies MPIXML to add if it is there
+4 IF $GET(MPIARR(MPIVAR))'=""
SET MPIXML=MPIXML_"<"_MPIXMLN_">"_MPIARR(MPIVAR)_"</"_MPIXMLN_">"
+5 QUIT
+6 ;
SPARSE(MPIDATA,MPIXML) ; - parse the data from user query or user update
+1 ; EN^MXMLPRSE - IA #4149
+2 ;
+3 KILL ^TMP($JOB,"XUIAMXML_PARSE")
+4 NEW MPICB,MPIUSE,MPIVAR,MPIPAT,MPIALIAS,MPILOC,MPIIDS
+5 SET (MPIPAT,MPIIDS)=0
+6 SET MPICB("STARTELEMENT")="SE^XUIAMXML"
SET MPICB("CHARACTERS")="VALUE^XUIAMXML"
+7 SET ^TMP($JOB,"XUIAMXML_PARSE",1)=MPIXML
+8 DO EN^MXMLPRSE($NAME(^TMP($JOB,"XUIAMXML_PARSE")),.MPICB)
+9 KILL ^TMP($JOB,"XUIAMXML_PARSE")
+10 QUIT
+11 ;
SE(MPIN,MPIA) ; - used by the parser for user query or user update to call back with STARTELEMENT
+1 ; just to protect the process
+2 SET MPIN=$GET(MPIN)
SET MPIVAR=""""_MPIN_""""
SET MPILOC="MPIDATA("
+3 SET MPIA("error")=$GET(MPIA("error"))
+4 SET MPIA("lastName")=$GET(MPIA("lastName"))
+5 SET MPIA("middleName")=$GET(MPIA("middleName"))
+6 SET MPIA("firstName")=$GET(MPIA("firstName"))
+7 SET MPIA("dob")=$GET(MPIA("dob"))
+8 SET MPIA("pnid")=$GET(MPIA("pnid"))
+9 SET MPIA("secId")=$GET(MPIA("secId"))
+10 SET MPIA("dob")=$GET(MPIA("dob"))
+11 SET MPIA("vistaid")=$GET(MPIA("vistaid"))
+12 SET MPIA("gender")=$GET(MPIA("gender"))
+13 ; my variable to protect
+14 ;I MPIN="user" S MPIPAT=MPIPAT+1,MPIALIAS=0,MPILOC="MPIDATA("_MPIPAT Q
+15 SET MPIUSE=$GET(MPIUSE)
+16 ; got a business rule error
+17 ;I MPIN="RESULT",MPIA("type")="AA",MPIA("subtype")="QE" S MPIDATA("Result")="QE" Q
+18 ; don't use these
+19 QUIT
+20 ;
PARSE(MPIDATA,MPIXML) ; - parse the data from additional traits user query
+1 ; EN^MXMLPRSE - IA #4149
+2 ;
+3 KILL ^TMP($JOB,"XUIAMXML_PARSE")
+4 NEW MPICB,MPIVAR,MPIPAT,MPILOC,MPIIDS
+5 SET (MPIPAT,MPIIDS)=0
+6 SET MPICB("STARTELEMENT")="SEQ^XUIAMXML"
SET MPICB("CHARACTERS")="VALUE^XUIAMXML"
+7 SET ^TMP($JOB,"XUIAMXML_PARSE",1)=MPIXML
+8 DO EN^MXMLPRSE($NAME(^TMP($JOB,"XUIAMXML_PARSE")),.MPICB)
+9 KILL ^TMP($JOB,"XUIAMXML_PARSE")
+10 QUIT
+11 ;
SEQ(MPIN,MPIA) ; - used by the parser for additional traits user query to call back with STARTELEMENT
+1 ;Q
IF MPIN="user"
SET MPIPAT=MPIPAT+1
SET MPILOC="MPIDATA("_MPIPAT_","
+2 ;no 'user' traits, an error being returned
IF '$DATA(MPILOC)
SET MPILOC="MPIDATA("
+3 SET MPIVAR=""""_MPIN_""""
+4 QUIT
+5 ;
VALUE(MPIT) ; - used by the parser to call back with CHARACTERS
+1 if $DATA(MPIVAR)
SET @(MPILOC_MPIVAR_")")=MPIT
KILL MPIVAR
QUIT
+2 QUIT
+3 ;
POST(MPIXML,MPIXMLR) ; - post XML to the execute server
+1 ; $$GETPROXY^XOBWLIB - IA #5421
+2 NEW $ETRAP,$ESTACK,SVC
+3 ; set error trap
SET $ETRAP="DO ERROR^XUIAMXML"
+4 ; test mode (outgoing)?
IF $DATA(^XTMP("XUIAMXML_EDIT"))
DO TEST("OUTGOING",.MPIXML)
+5 SET SVC=$$GETPROXY^XOBWLIB("MPI_PSIM_NEW EXECUTE","MPI_PSIM_NEW EXECUTE")
+6 SET MPIXMLR=SVC.execute(MPIXML)
+7 ; in case debugging needed, save both out and return
+8 IF $DATA(^XTMP("XUIAMXML_DEBUG"))
Begin DoDot:1
+9 NEW XUIAMSAVE
+10 SET XUIAMSAVE=$ORDER(^XTMP("XUIAMXML_DEBUG",":"),-1)+1
+11 SET ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,0)=$$NOW^XLFDT
+12 SET ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,"OUT")=MPIXML
+13 SET ^XTMP("XUIAMXML_DEBUG",XUIAMSAVE,"RETURN")=MPIXMLR
End DoDot:1
+14 ; test mode (return)?
+15 IF $DATA(^XTMP("XUIAMXML_EDIT"))
DO TEST("RETURN",.MPIXMLR)
+16 QUIT
+17 ;
ERROR ; - catch errors
+1 ; Set ecode to empty to return to calling function
+2 ; $$EOFAC^XOBWLIB, ZTER^XOBWLIB - IA #5421
+3 ; UNWIND^%ZTER - IA #1621
+4 NEW MPIERR
+5 SET MPIERR=$$EOFAC^XOBWLIB()
+6 DO ZTER^XOBWLIB(MPIERR)
+7 SET $ECODE=""
+8 DO UNWIND^%ZTER
+9 QUIT
+10 ;
TEST(TYPE,MPIXML) ; - call to possibly edit the xml string
+1 ; used for testing purposes only.
+2 ; production NOT allowed
+3 IF $$PROD^XUPROD
QUIT
+4 IF $EXTRACT($GET(IOST),1,2)'="C-"
QUIT
+5 NEW DIC,X,L,T,C,%,%Y
+6 WRITE !!,"Do you want to edit the "_TYPE_" XML"
+7 SET %=2
DO YN^DICN
IF %'=1
QUIT
+8 KILL ^TMP("XUIAMXML_TEST",$JOB)
+9 SET L=0
SET T=""
+10 FOR X=1:1
SET C=$EXTRACT(MPIXML,X)
if C=""
QUIT
Begin DoDot:1
+11 IF C="<"
IF T'=""
SET L=L+1
SET ^TMP("XUIAMXML_TEST",$JOB,L,0)=T
SET T=C
QUIT
+12 SET T=T_C
End DoDot:1
+13 SET DIC="^TMP(""XUIAMXML_TEST"",$J,"
+14 DO EN^DIWE
+15 SET MPIXML=""
+16 SET X=0
FOR
SET X=$ORDER(^TMP("XUIAMXML_TEST",$JOB,X))
if 'X
QUIT
SET MPIXML=MPIXML_^TMP("XUIAMXML_TEST",$JOB,X,0)
+17 QUIT
+18 ;