XUMVIENU ;MVI/CKN,MKO - Master Veteran Index Enrich New Person ; 1/26/21 3:10pm
;;8.0;KERNEL;**711,724,744,767**;Jul 10, 1995;Build 1
;Per VA Directive 6402, this routine should not be modified.
;**711,Story 977838 (mko/ckn): New routine
;Entry point: UPDATE^XUMVIENU(XURET,.XUARR,XUFLAG)
; called from rpc: XUS MVI ENRICH NEW PERSON
;
; Input:
; XUARR(subscript)=value to update
; XUFLAG = "A" : if RPC is being called to add a record to the New Person file
; "U" : if RPC is being called to edit an existing New Person file record.
;
; Return Parameter:
; On success:
; DUZ of New Person File entry edited or added
; Returned if there were no issues adding or editing the entry.
;
; DUZ^-1^errorMessage
; Returned if entry was edited, but some data was not valid and could
; not be filed.
; On failure:
; -1^errorMessage
; Returned for example if required data was not passed, entry could
; not be added when FLAG="A", or entry could not be found based on
; the NPI when FLAG="U".
;
UPDATE(XURET,XUARR,XUFLAG) ;RPC to enrich New Pperson file entry
N XUDBSEQ
S XUDBSEQ=$$RECORD(.XUARR,$G(XUFLAG))
D PROC(.XURET,.XUARR,.XUFLAG)
D RETURN(XUDBSEQ,XURET)
Q
;
PROC(XURET,XUARR,XUFLAG) ;Main code for RPC
N FDA,OLDTDATE,XUDUZ,XURSET
K XURET S XURSET=0
;
;Check inputs
S XURET=$$CHKINPUT(.XUARR,.XUFLAG)
Q:XURET<0
;
;Add or get New Person IEN in XUDUZ
S XURET=""
I $G(XUFLAG)="A" D
. ;Call entry point to add the record
. D:$G(XUARR("SubjectOrgan"))=""!($G(XUARR("SubjectOrganID"))="") SUBJDEF(.XUARR)
. S XUDUZ=$$ADDUSER^XUMVINPA(.XUARR)
. I $P(XUDUZ,"^",3)'=1 S XUFLAG="U",XURSET=1 ;**767 found exists already so process as update
. I XUDUZ<0 S XURET=XUDUZ ;If error, we'll return -1^errorMessage
. E I $P(XUDUZ,U,3)=1 S XUDUZ=+XUDUZ ;If record was added, set XUDUZ to new IEN
. E S XURET=+XUDUZ ;If record was found, not added, we'll just return DUZ -- no edit will take place
E D
. ;Lookup user based on NPI
. ;S XATTRIB(8)=XUARR("NPI") ; NPI
. ;S XUDUZ=$$FINDUSER^XUESSO2(.XATTRIB) ; find user based on NPI ; returns -1^Not authorized if DUZ("LOA")<2
. S XUDUZ=$O(^VA(200,"ANPI",XUARR("NPI"),0))
. S:XUDUZ'>0 XURET="-1^User with NPI "_XUARR("NPI")_" not found."
;
;If add or lookup above set XURET, we're done
I XURET]""&(XUFLAG="A") Q
;
;**744 - VAMPI-8213 (ckn)
;If update is from PPMS/PIE and if New Person have Primary Menu,
;then no update as this is a Dual Provider.
I $G(XUFLAG)="U",($G(XUARR("WHO"))="200PIEV"),($P($G(^VA(200,+XUDUZ,201)),"^")'="") S XURET="-1^Provider has a Primary Menu, no update." Q ;**744 - VAMPI-8213 (ckn)
;If update is from PPMS/PIE and if CPRS TAB multiple field have any other
;values than "NVA", then no update as this is a Dual Provider.
N QCPFLG,TABIEN S QCPFLG=0
I $G(XUFLAG)="U",($G(XUARR("WHO"))="200PIEV") D
.N ORDIEN S ORDIEN=$O(^ORD(101.13,"B","NVA",""))
.I $D(^VA(200,+XUDUZ,"ORD")) D
..S TABIEN=0 F S TABIEN=$O(^VA(200,+XUDUZ,"ORD","B",TABIEN)) Q:+TABIEN=0!(QCPFLG) D
...I TABIEN'=ORDIEN S QCPFLG=1
I QCPFLG S XURET="-1^Provider has Non-NVA values in CPRS TAB" Q
;
;Update 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 "".)
I $G(XUFLAG)'="A",$D(XUARR("NAME"))#2 D
. N NAME
. S NAME=$P($G(XUARR("NAME")),"|",5)
. S:NAME="" NAME=$$FMNAME^HLFNC($G(XUARR("NAME")),"|")
. I NAME]"" S FDA(200,+XUDUZ_",",.01)=NAME D FILER(.FDA,"E",.XURET)
;
;Set up FDA
D SETFDA(XUDUZ,.XUARR,.FDA)
;
;Remove Termination Date from FDA if it's in the future
D TERMDATE(.FDA,.XURES)
;
;Save the original Termination Date
S OLDTDATE=$P($G(^VA(200,XUDUZ,0)),U,11)
;
;Call the Filer
D FILER(.FDA,"E",.XURET)
;
;**744 - VAMPI-3039 (ckn) - Update CPRS tab
I $G(XUARR("WHO"))="200PIEV" D CPRSNVA^XUMVIEU1(XUDUZ,.XUARR,OLDTDATE)
;
;If Termination Date was added or deleted, remove or add Security keys PROVIDER and XUORES
D SECKEYS(XUDUZ,OLDTDATE,.XURET,XURSET) ;**767 OR if ADD is now UPDATE XURSET=1
;
;File the Person Class data
D PERSCLAS(XUDUZ,.XUARR,.XURET)
;
;File the DEA data
I $$PATCH^XPDUTL("XU*8.0*688"),$$VFIELD^DILFD(200,53.21),$$VFILE^DILFD(8991.9) D
. ;File NEW DEA #'S in multiple and add/edit entries in File #8991.9
. D NEWDEA(XUDUZ,.XUARR,.XURET)
. ;File first NEW DEA data into single-valued fields of NP file
. D NPDEA(XUDUZ,.XUARR,.XURET)
E D
. ;File first valid DEA # into file (NEW DEA#'s multiple doesn't exist)
. D FIRSTDEA(XUDUZ,.XUARR,.XURET)
;
;Return DUZ in first piece. If errors, also return -1^errMsg in 2nd and 3rd pieces.
S XURET=XUDUZ_$S(XURET<0:U_XURET,1:"")
Q
;
CHKINPUT(XUARR,XUFLAG) ;Check inputs
;Returns: "-1^errorMsg" if problem; otherwise return 0
Q:'$D(XUARR) "-1^No data passed"
Q:$G(XUARR("NPI"))="" "-1^Missing NPI"
Q:'$$CHKDGT^XUSNPI($G(XUARR("NPI"))) "-1^NPI is not valid"
Q:$G(XUARR("WHO"))="" "-1^Missing requesting Station number"
;
S:$G(XUFLAG)="" XUFLAG="U"
Q:"^A^U^"'[(U_$G(XUFLAG)_U) "-1^Invalid flag "_XUFLAG_" was passed."
Q 0
;
SETFDA(IEN,XUARR,FDA) ;Set FDA from XUARR for filing into File #200
;**744 VAMPI-3039 (ckn) - Moving this tag to new routine XUMVIEU1
D SETFDA^XUMVIEU1(IEN,.XUARR,.FDA)
Q
;
SUBJDEF(XUARR) ;Set default Subject Organization and ID
S XUARR("SubjectOrgan")="Department Of Veterans Affairs"
S XUARR("SubjectOrganID")="urn:oid:2.16.840.1.113883.4.349"
Q
;
TERMDATE(FDA,XURES) ;Remove Termination Date from FDA if it's in the future,
;or if Termination Date is passed but user has a Primary Menu, and return an error message
N IENS,TDATE
S IENS=$O(FDA(200,"")) Q:IENS=""
Q:"@"[$G(FDA(200,IENS,9.2))
;
;Get internal form
S TDATE=$$GETINT(200,9.2,FDA(200,IENS,9.2)) Q:TDATE=U
;
I $P($G(^VA(200,+IENS,201)),U)]"" D Q
. D ADDERR(.XURET,"User has a PRIMARY MENU and cannot be terminated.")
. K FDA(200,IENS,9.2)
;
;Remove from FDA if it's a future date, and add an error message
D:TDATE>DT
. D ADDERR(.XURET,"TERMINATION DATE '"_FDA(200,IENS,9.2)_"' is in the future.")
. K FDA(200,IENS,9.2)
Q
;
SECKEYS(XUDUZ,OLDTDATE,XURET,XURSET) ;Add or remove Security Keys PROVIDER and XUORES
;based on whether Termination Date is deleted or created
;**767 OR if ADD is now UPDATE XURSET=1
N KEY,KEYIEN,NEWTDATE
S XUDUZ=+$G(XUDUZ),OLDTDATE=$G(OLDTDATE)
S NEWTDATE=$P($G(^VA(200,XUDUZ,0)),U,11)
Q:$G(OLDTDATE)=NEWTDATE&(XURSET=0)
;
F KEY="PROVIDER","XUORES" D
. S KEYIEN=$O(^DIC(19.1,"B",KEY,0)) Q:KEYIEN'>0
. I OLDTDATE="",NEWTDATE]"" D
.. ;Delete the key
.. N DA,DIK
.. S DA=$O(^VA(200,XUDUZ,51,"B",KEYIEN,0)) Q:DA'>0
.. S DA(1)=XUDUZ,DIK="^VA(200,"_XUDUZ_",51,"
.. D ^DIK
.I OLDTDATE]"",NEWTDATE="" D ADDKEY(XUDUZ,KEYIEN)
.I XURSET=1 D ADDKEY(XUDUZ,KEYIEN)
Q
ADDKEY(XUDUZ,KEYIEN) ;Add the key
;**724,Story 1209890 (mko): The #.01 of the KEYS multiple is DINUM'd, so pass IEN(1)
; Also, GIVEN BY (#1) and DATE GIVEN (#2) are triggered by the #.01.
N IENS,FDA,IEN
Q:$O(^VA(200,XUDUZ,51,"B",KEYIEN,0))
S IENS="+1,"_XUDUZ_","
S (FDA(200.051,IENS,.01),IEN(1))=KEYIEN
D UPDATER(.FDA,"",.XURET,.IEN)
Q
;
PERSCLAS(XUDUZ,XUARR,XURET) ;Update PERSON CLASS multiple
N CNT,CURVAL,D0,FDA,IEN,IENS,NEWVAL,PCIEN,VACODE,X12CODE
S CNT=0 F S CNT=$O(XUARR("PersonClass",CNT)) Q:'CNT D
. S X12CODE=$G(XUARR("PersonClass",CNT,"PersonClass")) Q:X12CODE=""
. ;
. ;Lookup the Person Class entry in the multiple
. S PCIEN=0
. S VACODE=$S(X12CODE="207LP3000X":"V110403",X12CODE="2084B0040X":"V182914",X12CODE="390200000X":"V115500",1:"") I VACODE'="" S PCIEN=$O(^USC(8932.1,"F",VACODE,0)) ;to resolve duplicate x12 codes
. I 'PCIEN S PCIEN=$O(^USC(8932.1,"G",X12CODE,0))
. S IEN=$O(^VA(200,+XUDUZ,"USC1","B",+PCIEN,0))
. ;
. ;If not found, add it
. I IEN'>0 D Q:IEN'>0
.. S FDA(200.05,"+1,"_+XUDUZ_",",.01)=PCIEN ;now passing internal value of X12CODE
.. S IEN=$$UPDATER(.FDA,"",.XURET)
. ;
. ;Update the other values in the Person Class multiple
. S IENS=+IEN_","_+XUDUZ_","
. S CURVAL=$P($G(^VA(200,+XUDUZ,"USC1",+IEN,0)),U,2)
. S NEWVAL=$G(XUARR("PersonClass",CNT,"PersonClassActive"))
. I NEWVAL="",'$$ISPCACTV(XUDUZ,IEN) S FDA(200.05,IENS,2)="TODAY",FDA(200.05,IENS,3)="@"
. E I NEWVAL]"" S FDA(200.05,IENS,2)=NEWVAL
. S:$D(XUARR("PersonClass",CNT,"PersonClassExpire"))#2 FDA(200.05,IENS,3)=XUARR("PersonClass",CNT,"PersonClassExpire")
. S D0=+XUDUZ ;Needed by input transform of Effective Date (200.05,2)
. D FILER(.FDA,"E",.XURET)
Q
;
ISPCACTV(XUDUZ,SUBIEN) ;Is the Person Class active?
N EFFDT,EXPDT,ND
S ND=$G(^VA(200,+$G(XUDUZ),"USC1",+$G(SUBIEN),0)) Q:ND="" 0
S EFFDT=$P(ND,U,2),EXPDT=$P(ND,U,3)
I EFFDT,DT'<EFFDT,DT'>EXPDT Q 1
Q 0
;
NEWDEA(XUDUZ,XUARR,XURET) ;Update DEA NUMBERS File #8991.9
;and the NEW PERSON File NEW DEA #'s multiple
N CNT,DEA,DIERR,DIHELP,DIMSG,FDA,IEN,IENS,NDEAIEN,XUERR
N STR1,STR2,STR3,CITY,STATE,ZIP,ADDR
;
;Get address parts
D:$D(XUARR("ADDRESS DATA"))#2
. S ADDR=XUARR("ADDRESS DATA")
. S STR1=$E($P(ADDR,"|"),1,$$MAXLEN(8991.9,1.2))
. S STR2=$E($P(ADDR,"|",2),1,$$MAXLEN(8991.9,1.3))
. S STR3=$E($P(ADDR,"|",3),1,$$MAXLEN(8991.9,1.4))
. S CITY=$E($P(ADDR,"|",4),1,$$MAXLEN(8991.9,1.5))
. S STATE=$P(ADDR,"|",5)
. S ZIP=$TR($P(ADDR,"|",6),"-")
;
S CNT=0 F S CNT=$O(XUARR("DEA",CNT)) Q:'CNT D
. S DEA=$G(XUARR("DEA",CNT,"DEA"))
. Q:DEA=""
. ;
. ;Lookup or add a record to File #8991.9 with the passed DEA #
. S NDEAIEN=$O(^XTV(8991.9,"B",DEA,0))
. I NDEAIEN'>0 D Q:NDEAIEN'>0
.. K FDA
.. S IENS="+1,"
.. S FDA(8991.9,IENS,.01)=DEA
.. S FDA(8991.9,IENS,10.2)="NOW"
.. S NDEAIEN=$$UPDATER(.FDA,"E",.XURET)
. ;
. ;Update Expiration Date, Address, and Schedule fields for this File #8991.9 entry
. K FDA
. S IENS=NDEAIEN_","
. D:$D(XUARR("ADDRESS DATA"))#2
.. S FDA(8991.9,IENS,1.2)=STR1
.. S FDA(8991.9,IENS,1.3)=STR2
.. S FDA(8991.9,IENS,1.4)=STR3
.. S FDA(8991.9,IENS,1.5)=CITY
.. S FDA(8991.9,IENS,1.6)=$$STATEIEN(STATE)
.. S FDA(8991.9,IENS,1.7)=ZIP
. S:$D(XUARR("DEA",CNT,"Detox"))#2 FDA(8991.9,IENS,.03)=XUARR("DEA",CNT,"Detox")
. S:$D(XUARR("DEA",CNT,"DEAExpire"))#2 FDA(8991.9,IENS,.04)=XUARR("DEA",CNT,"DEAExpire")
. S:$D(XUARR("DEA",CNT,"SchedIINarc"))#2 FDA(8991.9,IENS,2.1)=XUARR("DEA",CNT,"SchedIINarc")
. S:$D(XUARR("DEA",CNT,"SchedIINonNarc"))#2 FDA(8991.9,IENS,2.2)=XUARR("DEA",CNT,"SchedIINonNarc")
. S:$D(XUARR("DEA",CNT,"SchedIIINarc"))#2 FDA(8991.9,IENS,2.3)=XUARR("DEA",CNT,"SchedIIINarc")
. S:$D(XUARR("DEA",CNT,"SchedIIINonNarc"))#2 FDA(8991.9,IENS,2.4)=XUARR("DEA",CNT,"SchedIIINonNarc")
. S:$D(XUARR("DEA",CNT,"SchedIV"))#2 FDA(8991.9,IENS,2.5)=XUARR("DEA",CNT,"SchedIV")
. S:$D(XUARR("DEA",CNT,"SchedV"))#2 FDA(8991.9,IENS,2.6)=XUARR("DEA",CNT,"SchedV")
. S:$D(FDA) FDA(8991.9,IENS,10.1)=$S($G(DUZ):"`"_DUZ,1:""),FDA(8991.9,IENS,10.2)="NOW"
. D FILER(.FDA,"E",.XURET)
. ;
. ;Lookup or add corresponding entry in New Person NEW DEA #'S multiple
. S IEN=$O(^VA(200,+XUDUZ,"PS4","B",DEA,0))
. I IEN'>0 D Q:IEN'>0
.. K FDA
.. S FDA(200.5321,"+1,"_+XUDUZ_",",.01)=DEA
.. S IEN=$$UPDATER(.FDA,"E",.XURET)
. ;
. ;Update the DEA POINTER value in the NEW DEA #'s multiple
. K FDA
. S FDA(200.5321,+IEN_","_+XUDUZ_",",.03)=NDEAIEN
. D FILER(.FDA,"",.XURET)
Q
;
NPDEA(XUDUZ,XUARR,XURET) ;Set the single-valued fields in the New Person file for
; DEA#, Detox #, DEA Expiration Date, and the Schedule fields from the first entry in
; the NEW DEA#'s multiple; Also default Auth to Write Med Orders to 1 if not already set,
; WHO is 200PIEV, and there's a DEA#
N DEAIEN,FDA,IENS,ND0,ND2,NDEAIEN
S DEAIEN=$O(^VA(200,XUDUZ,"PS4",0)) Q:'DEAIEN
S NDEAIEN=$P(^VA(200,XUDUZ,"PS4",DEAIEN,0),U,3) Q:NDEAIEN'>0
;
;Set up FDA with data from DEA NUMBERS entry
S IENS=+XUDUZ_","
S ND0=$G(^XTV(8991.9,+NDEAIEN,0)),ND2=$G(^(2)) Q:$P(ND0,U)=""
S FDA(200,IENS,53.2)=$P(ND0,U) ;DEA#
S FDA(200,IENS,53.11)=$P(ND0,U,3) ;DETOX NUMBER
S FDA(200,IENS,747.44)=$P(ND0,U,4) ;DEA EXPIRATION DATE
S FDA(200,IENS,55.1)=$P(ND2,U) ;SCHEDULE II NARCOTIC
S FDA(200,IENS,55.2)=$P(ND2,U,2) ;SCHEDULE II NON-NARCOTIC
S FDA(200,IENS,55.3)=$P(ND2,U,3) ;SCHEDULE III NARCOTIC
S FDA(200,IENS,55.4)=$P(ND2,U,4) ;SCHEDULE III NON-NARCOTIC
S FDA(200,IENS,55.5)=$P(ND2,U,5) ;SCHEDULE IV
S FDA(200,IENS,55.6)=$P(ND2,U,6) ;SCHEDULE V
I $G(XUARR("WHO"))="200PIEV",$G(XUARR("AuthWriteMedOrders"))="" S FDA(200,IENS,53.1)=1
D FILER(.FDA,"",.XURET)
Q
;
FIRSTDEA(XUDUZ,XUARR,XURET) ;File the first valid DEA in the XUARR input array
;into the single-value DEA fields of the NP file
N CNT,DEA,FDA,FIRST,IENS
;
;Find the first valid DEA number in the input array
S FIRST="",CNT=0 F S CNT=$O(XUARR("DEA",CNT)) Q:'CNT D Q:FIRST
. S DEA=$G(XUARR("DEA",CNT,"DEA")) Q:DEA=""
. S DEA=$$GETINT(200,53.2,DEA)
. S:DEA'=U FIRST=CNT
Q:'FIRST
;
;Set up FDA with data from DEA NUMBERS entry
S IENS=XUDUZ_","
S FDA(200,IENS,53.2)=DEA
S:$D(XUARR("DEA",FIRST,"Detox"))#2 FDA(200,IENS,53.11)=XUARR("DEA",FIRST,"Detox")
S:$D(XUARR("DEA",FIRST,"DEAExpire"))#2 FDA(200,IENS,747.44)=XUARR("DEA",FIRST,"DEAExpire")
S:$D(XUARR("DEA",FIRST,"SchedIINarc"))#2 FDA(200,IENS,55.1)=XUARR("DEA",FIRST,"SchedIINarc")
S:$D(XUARR("DEA",FIRST,"SchedIINonNarc"))#2 FDA(200,IENS,55.2)=XUARR("DEA",FIRST,"SchedIINonNarc")
S:$D(XUARR("DEA",FIRST,"SchedIIINarc"))#2 FDA(200,IENS,55.3)=XUARR("DEA",FIRST,"SchedIIINarc")
S:$D(XUARR("DEA",FIRST,"SchedIIINonNarc"))#2 FDA(200,IENS,55.4)=XUARR("DEA",FIRST,"SchedIIINonNarc")
S:$D(XUARR("DEA",FIRST,"SchedIV"))#2 FDA(200,IENS,55.5)=XUARR("DEA",FIRST,"SchedIV")
S:$D(XUARR("DEA",FIRST,"SchedV"))#2 FDA(200,IENS,55.6)=XUARR("DEA",FIRST,"SchedV")
I $G(XUARR("WHO"))="200PIEV",$G(XUARR("AuthWriteMedOrders"))="" S FDA(200,IENS,53.1)=1
D FILER(.FDA,"E",.XURET)
Q
;
FILER(XUMVIFDA,FLAG,XURET) ;Call the Filer
N DIERR,DIHELP,DIMSG,IENS,FILE,ROOT,XUMVIERR
Q:'$D(XUMVIFDA)
S FILE=$O(XUMVIFDA(0)),IENS=$O(XUMVIFDA(+FILE,"")),ROOT=$$ROOT^DILFD(FILE,IENS)_+IENS_")"
I $G(ROOT)="" D ADDERR(.XURET,"Unable to determine global root of File #"_FILE_", IENS '"_IENS_".") Q
L +@ROOT:10 E D ADDERR(.XURET,"Unable to lock global "_ROOT_".") Q
D FILE^DIE($G(FLAG),"XUMVIFDA","XUMVIERR")
L -@ROOT
D:$G(DIERR) ADDERR(.XURET,$$BLDERR("XUMVIERR"))
Q
;
UPDATER(XUMVIFDA,FLAG,XURET,XUMVIIEN) ;Call the Updater
;**724,Story 1209890 (mko): Add XUMVIIEN as an input paramater to allow controlling IEN of new record
N DIERR,DIHELP,DIMSG,XUMVIERR
D UPDATE^DIE(FLAG,"XUMVIFDA","XUMVIIEN","XUMVIERR")
I $G(DIERR) D ADDERR(.XURET,$$BLDERR("XUMVIERR")) Q 0
Q +$G(XUMVIIEN(1))
;
ADDERR(XURET,MSG) ;Add error MSG to XURET
Q:$G(MSG)=""
S XURET=$S(XURET]"":XURET_" ",1:"-1^")_MSG
Q
;
STATEIEN(STATE) ;Return "`"_IEN if valid abbreviation, VA code, or name
N IEN
Q:$G(STATE)="" ""
S IEN=$S(STATE="FG":$O(^DIC(5,"B","FOREIGN COUNTRY",0)),STATE="OT":$O(^DIC(5,"B","OTHER",0)),STATE="EU":$O(^DIC(5,"B","EUROPE",0)),1:$O(^DIC(5,"C",STATE,0)))
S:'IEN IEN=$O(^DIC(5,"B",STATE,""))
Q $S(IEN>0:"`"_IEN,1:STATE)
;
GETINT(FILE,FLD,VAL) ;Get the internal form of the data; returns "^" if not valid
N DIERR,DIHELP,DIMSG,XUMSG,XURES
Q:VAL="" ""
D CHK^DIE(FILE,FLD,"",VAL,.XURES,"XUMSG")
Q XURES
;
BLDERR(INROOT) ;Build a string containing error messages returned by FileMan
N ERRSTR,I,XUERMSGS
D MSG^DIALOG("AE",.XUERMSGS,"","",$G(INROOT))
S ERRSTR=""
S I=0 F S I=$O(XUERMSGS(I)) Q:'I S:XUERMSGS(I)]"" ERRSTR=ERRSTR_$E(" ",ERRSTR]"")_XUERMSGS(I)
Q ERRSTR
;
MAXLEN(FILE,FLD) ;Return the maximum length of field FLD in file FILE
N MAX
S MAX=$$GET1^DID(+FILE,+FLD,"","FIELD LENGTH") S:MAX'>0 MAX=999
Q MAX
;
;=================================================
; Code for storing debugging information in ^XTMP
;=================================================
RECORD(PARAM,FLAG,RPCNAME) ;Record RPC inputs for debugging
;Return seq# in ^XTMP
N NODE,NOW,SEQ,TODAY
Q:'$$ISDEBUG 0
S:$G(RPCNAME)="" RPCNAME="XUS MVI ENRICH NEW PERSON"
S NOW=$$NOW^XLFDT,TODAY=$P(NOW,".")
S NODE=$$NODE
;
L +^XTMP(NODE):2
D SETXTMP0(NODE)
S SEQ=$O(^XTMP(NODE," "),-1)+1
M ^XTMP(NODE,SEQ,"PARAM")=PARAM
S ^XTMP(NODE,SEQ,"FLAG")=$G(FLAG)
S ^XTMP(NODE,SEQ,"DT")=NOW
S ^XTMP(NODE,SEQ,"DUZ")=$G(DUZ)
S ^XTMP(NODE,SEQ,"RPC")=RPCNAME
L -^XTMP(NODE)
Q SEQ
;
RETURN(SEQ,RETURN) ;Record the return value
Q:'SEQ Q:'$$ISDEBUG
M ^XTMP($$NODE,SEQ,"RETURN")=RETURN
Q
;
DBON ;Set DEBUG on
N NODE
S NODE=$$NODE
D SETXTMP0
S ^XTMP(NODE,"DEBUG")=1
W !,$NA(^XTMP(NODE,"DEBUG"))_" set to 1.",!
Q
;
DBOFF ;Set DEBUG off
N NODE
S NODE=$$NODE
K ^XTMP(NODE,"DEBUG")
K:'$O(^XTMP(NODE,0)) ^XTMP(NODE)
W !,$NA(^XTMP(NODE,"DEBUG"))_" killed.",!
Q
;
ISDEBUG() ;Return 1 if DEBUG mode flag is set
Q $G(^XTMP($$NODE,"DEBUG"))
;
PURGE ;Purge the debugging data stored in ^XTMP
N ISDEBUG
S ISDEBUG=$$ISDEBUG
K ^XTMP($$NODE)
W !,$NA(^XTMP($$NODE))_" killed.",!
D:ISDEBUG DBON
Q
;
SETXTMP0(NODE,DESC,LIFE) ;Set 0 node of ^XTMP(node)
N CREATEDT
S:$G(NODE)="" NODE=$$NODE
S CREATEDT=$S($D(^XTMP(NODE,0))#2:$P(^(0),U,2),1:DT)
S:'$G(LIFE) LIFE=30
S:$G(DESC)="" DESC="New Person RPC Inputs and Outputs"
S ^XTMP(NODE,0)=$$FMADD^XLFDT(DT,LIFE)_U_CREATEDT_U_DESC
Q
;
NODE() ;Return ^XTMP Debug subscript
Q "XU_RPC_DEBUG_NP"
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUMVIENU 17592 printed Oct 16, 2024@18:12:05 Page 2
XUMVIENU ;MVI/CKN,MKO - Master Veteran Index Enrich New Person ; 1/26/21 3:10pm
+1 ;;8.0;KERNEL;**711,724,744,767**;Jul 10, 1995;Build 1
+2 ;Per VA Directive 6402, this routine should not be modified.
+3 ;**711,Story 977838 (mko/ckn): New routine
+4 ;Entry point: UPDATE^XUMVIENU(XURET,.XUARR,XUFLAG)
+5 ; called from rpc: XUS MVI ENRICH NEW PERSON
+6 ;
+7 ; Input:
+8 ; XUARR(subscript)=value to update
+9 ; XUFLAG = "A" : if RPC is being called to add a record to the New Person file
+10 ; "U" : if RPC is being called to edit an existing New Person file record.
+11 ;
+12 ; Return Parameter:
+13 ; On success:
+14 ; DUZ of New Person File entry edited or added
+15 ; Returned if there were no issues adding or editing the entry.
+16 ;
+17 ; DUZ^-1^errorMessage
+18 ; Returned if entry was edited, but some data was not valid and could
+19 ; not be filed.
+20 ; On failure:
+21 ; -1^errorMessage
+22 ; Returned for example if required data was not passed, entry could
+23 ; not be added when FLAG="A", or entry could not be found based on
+24 ; the NPI when FLAG="U".
+25 ;
UPDATE(XURET,XUARR,XUFLAG) ;RPC to enrich New Pperson file entry
+1 NEW XUDBSEQ
+2 SET XUDBSEQ=$$RECORD(.XUARR,$GET(XUFLAG))
+3 DO PROC(.XURET,.XUARR,.XUFLAG)
+4 DO RETURN(XUDBSEQ,XURET)
+5 QUIT
+6 ;
PROC(XURET,XUARR,XUFLAG) ;Main code for RPC
+1 NEW FDA,OLDTDATE,XUDUZ,XURSET
+2 KILL XURET
SET XURSET=0
+3 ;
+4 ;Check inputs
+5 SET XURET=$$CHKINPUT(.XUARR,.XUFLAG)
+6 if XURET<0
QUIT
+7 ;
+8 ;Add or get New Person IEN in XUDUZ
+9 SET XURET=""
+10 IF $GET(XUFLAG)="A"
Begin DoDot:1
+11 ;Call entry point to add the record
+12 if $GET(XUARR("SubjectOrgan"))=""!($GET(XUARR("SubjectOrganID"))="")
DO SUBJDEF(.XUARR)
+13 SET XUDUZ=$$ADDUSER^XUMVINPA(.XUARR)
+14 ;**767 found exists already so process as update
IF $PIECE(XUDUZ,"^",3)'=1
SET XUFLAG="U"
SET XURSET=1
+15 ;If error, we'll return -1^errorMessage
IF XUDUZ<0
SET XURET=XUDUZ
+16 ;If record was added, set XUDUZ to new IEN
IF '$TEST
IF $PIECE(XUDUZ,U,3)=1
SET XUDUZ=+XUDUZ
+17 ;If record was found, not added, we'll just return DUZ -- no edit will take place
IF '$TEST
SET XURET=+XUDUZ
End DoDot:1
+18 IF '$TEST
Begin DoDot:1
+19 ;Lookup user based on NPI
+20 ;S XATTRIB(8)=XUARR("NPI") ; NPI
+21 ;S XUDUZ=$$FINDUSER^XUESSO2(.XATTRIB) ; find user based on NPI ; returns -1^Not authorized if DUZ("LOA")<2
+22 SET XUDUZ=$ORDER(^VA(200,"ANPI",XUARR("NPI"),0))
+23 if XUDUZ'>0
SET XURET="-1^User with NPI "_XUARR("NPI")_" not found."
End DoDot:1
+24 ;
+25 ;If add or lookup above set XURET, we're done
+26 IF XURET]""&(XUFLAG="A")
QUIT
+27 ;
+28 ;**744 - VAMPI-8213 (ckn)
+29 ;If update is from PPMS/PIE and if New Person have Primary Menu,
+30 ;then no update as this is a Dual Provider.
+31 ;**744 - VAMPI-8213 (ckn)
IF $GET(XUFLAG)="U"
IF ($GET(XUARR("WHO"))="200PIEV")
IF ($PIECE($GET(^VA(200,+XUDUZ,201)),"^")'="")
SET XURET="-1^Provider has a Primary Menu, no update."
QUIT
+32 ;If update is from PPMS/PIE and if CPRS TAB multiple field have any other
+33 ;values than "NVA", then no update as this is a Dual Provider.
+34 NEW QCPFLG,TABIEN
SET QCPFLG=0
+35 IF $GET(XUFLAG)="U"
IF ($GET(XUARR("WHO"))="200PIEV")
Begin DoDot:1
+36 NEW ORDIEN
SET ORDIEN=$ORDER(^ORD(101.13,"B","NVA",""))
+37 IF $DATA(^VA(200,+XUDUZ,"ORD"))
Begin DoDot:2
+38 SET TABIEN=0
FOR
SET TABIEN=$ORDER(^VA(200,+XUDUZ,"ORD","B",TABIEN))
if +TABIEN=0!(QCPFLG)
QUIT
Begin DoDot:3
+39 IF TABIEN'=ORDIEN
SET QCPFLG=1
End DoDot:3
End DoDot:2
End DoDot:1
+40 IF QCPFLG
SET XURET="-1^Provider has Non-NVA values in CPRS TAB"
QUIT
+41 ;
+42 ;Update the NAME first. (Within a FILE^DIE call, triggers on the .01 that in turn call FILE^DIE
+43 ;may cause the Filer flag to change from "E", to "".)
+44 IF $GET(XUFLAG)'="A"
IF $DATA(XUARR("NAME"))#2
Begin DoDot:1
+45 NEW NAME
+46 SET NAME=$PIECE($GET(XUARR("NAME")),"|",5)
+47 if NAME=""
SET NAME=$$FMNAME^HLFNC($GET(XUARR("NAME")),"|")
+48 IF NAME]""
SET FDA(200,+XUDUZ_",",.01)=NAME
DO FILER(.FDA,"E",.XURET)
End DoDot:1
+49 ;
+50 ;Set up FDA
+51 DO SETFDA(XUDUZ,.XUARR,.FDA)
+52 ;
+53 ;Remove Termination Date from FDA if it's in the future
+54 DO TERMDATE(.FDA,.XURES)
+55 ;
+56 ;Save the original Termination Date
+57 SET OLDTDATE=$PIECE($GET(^VA(200,XUDUZ,0)),U,11)
+58 ;
+59 ;Call the Filer
+60 DO FILER(.FDA,"E",.XURET)
+61 ;
+62 ;**744 - VAMPI-3039 (ckn) - Update CPRS tab
+63 IF $GET(XUARR("WHO"))="200PIEV"
DO CPRSNVA^XUMVIEU1(XUDUZ,.XUARR,OLDTDATE)
+64 ;
+65 ;If Termination Date was added or deleted, remove or add Security keys PROVIDER and XUORES
+66 ;**767 OR if ADD is now UPDATE XURSET=1
DO SECKEYS(XUDUZ,OLDTDATE,.XURET,XURSET)
+67 ;
+68 ;File the Person Class data
+69 DO PERSCLAS(XUDUZ,.XUARR,.XURET)
+70 ;
+71 ;File the DEA data
+72 IF $$PATCH^XPDUTL("XU*8.0*688")
IF $$VFIELD^DILFD(200,53.21)
IF $$VFILE^DILFD(8991.9)
Begin DoDot:1
+73 ;File NEW DEA #'S in multiple and add/edit entries in File #8991.9
+74 DO NEWDEA(XUDUZ,.XUARR,.XURET)
+75 ;File first NEW DEA data into single-valued fields of NP file
+76 DO NPDEA(XUDUZ,.XUARR,.XURET)
End DoDot:1
+77 IF '$TEST
Begin DoDot:1
+78 ;File first valid DEA # into file (NEW DEA#'s multiple doesn't exist)
+79 DO FIRSTDEA(XUDUZ,.XUARR,.XURET)
End DoDot:1
+80 ;
+81 ;Return DUZ in first piece. If errors, also return -1^errMsg in 2nd and 3rd pieces.
+82 SET XURET=XUDUZ_$SELECT(XURET<0:U_XURET,1:"")
+83 QUIT
+84 ;
CHKINPUT(XUARR,XUFLAG) ;Check inputs
+1 ;Returns: "-1^errorMsg" if problem; otherwise return 0
+2 if '$DATA(XUARR)
QUIT "-1^No data passed"
+3 if $GET(XUARR("NPI"))=""
QUIT "-1^Missing NPI"
+4 if '$$CHKDGT^XUSNPI($GET(XUARR("NPI")))
QUIT "-1^NPI is not valid"
+5 if $GET(XUARR("WHO"))=""
QUIT "-1^Missing requesting Station number"
+6 ;
+7 if $GET(XUFLAG)=""
SET XUFLAG="U"
+8 if "^A^U^"'[(U_$GET(XUFLAG)_U)
QUIT "-1^Invalid flag "_XUFLAG_" was passed."
+9 QUIT 0
+10 ;
SETFDA(IEN,XUARR,FDA) ;Set FDA from XUARR for filing into File #200
+1 ;**744 VAMPI-3039 (ckn) - Moving this tag to new routine XUMVIEU1
+2 DO SETFDA^XUMVIEU1(IEN,.XUARR,.FDA)
+3 QUIT
+4 ;
SUBJDEF(XUARR) ;Set default Subject Organization and ID
+1 SET XUARR("SubjectOrgan")="Department Of Veterans Affairs"
+2 SET XUARR("SubjectOrganID")="urn:oid:2.16.840.1.113883.4.349"
+3 QUIT
+4 ;
TERMDATE(FDA,XURES) ;Remove Termination Date from FDA if it's in the future,
+1 ;or if Termination Date is passed but user has a Primary Menu, and return an error message
+2 NEW IENS,TDATE
+3 SET IENS=$ORDER(FDA(200,""))
if IENS=""
QUIT
+4 if "@"[$GET(FDA(200,IENS,9.2))
QUIT
+5 ;
+6 ;Get internal form
+7 SET TDATE=$$GETINT(200,9.2,FDA(200,IENS,9.2))
if TDATE=U
QUIT
+8 ;
+9 IF $PIECE($GET(^VA(200,+IENS,201)),U)]""
Begin DoDot:1
+10 DO ADDERR(.XURET,"User has a PRIMARY MENU and cannot be terminated.")
+11 KILL FDA(200,IENS,9.2)
End DoDot:1
QUIT
+12 ;
+13 ;Remove from FDA if it's a future date, and add an error message
+14 if TDATE>DT
Begin DoDot:1
+15 DO ADDERR(.XURET,"TERMINATION DATE '"_FDA(200,IENS,9.2)_"' is in the future.")
+16 KILL FDA(200,IENS,9.2)
End DoDot:1
+17 QUIT
+18 ;
SECKEYS(XUDUZ,OLDTDATE,XURET,XURSET) ;Add or remove Security Keys PROVIDER and XUORES
+1 ;based on whether Termination Date is deleted or created
+2 ;**767 OR if ADD is now UPDATE XURSET=1
+3 NEW KEY,KEYIEN,NEWTDATE
+4 SET XUDUZ=+$GET(XUDUZ)
SET OLDTDATE=$GET(OLDTDATE)
+5 SET NEWTDATE=$PIECE($GET(^VA(200,XUDUZ,0)),U,11)
+6 if $GET(OLDTDATE)=NEWTDATE&(XURSET=0)
QUIT
+7 ;
+8 FOR KEY="PROVIDER","XUORES"
Begin DoDot:1
+9 SET KEYIEN=$ORDER(^DIC(19.1,"B",KEY,0))
if KEYIEN'>0
QUIT
+10 IF OLDTDATE=""
IF NEWTDATE]""
Begin DoDot:2
+11 ;Delete the key
+12 NEW DA,DIK
+13 SET DA=$ORDER(^VA(200,XUDUZ,51,"B",KEYIEN,0))
if DA'>0
QUIT
+14 SET DA(1)=XUDUZ
SET DIK="^VA(200,"_XUDUZ_",51,"
+15 DO ^DIK
End DoDot:2
+16 IF OLDTDATE]""
IF NEWTDATE=""
DO ADDKEY(XUDUZ,KEYIEN)
+17 IF XURSET=1
DO ADDKEY(XUDUZ,KEYIEN)
End DoDot:1
+18 QUIT
ADDKEY(XUDUZ,KEYIEN) ;Add the key
+1 ;**724,Story 1209890 (mko): The #.01 of the KEYS multiple is DINUM'd, so pass IEN(1)
+2 ; Also, GIVEN BY (#1) and DATE GIVEN (#2) are triggered by the #.01.
+3 NEW IENS,FDA,IEN
+4 if $ORDER(^VA(200,XUDUZ,51,"B",KEYIEN,0))
QUIT
+5 SET IENS="+1,"_XUDUZ_","
+6 SET (FDA(200.051,IENS,.01),IEN(1))=KEYIEN
+7 DO UPDATER(.FDA,"",.XURET,.IEN)
+8 QUIT
+9 ;
PERSCLAS(XUDUZ,XUARR,XURET) ;Update PERSON CLASS multiple
+1 NEW CNT,CURVAL,D0,FDA,IEN,IENS,NEWVAL,PCIEN,VACODE,X12CODE
+2 SET CNT=0
FOR
SET CNT=$ORDER(XUARR("PersonClass",CNT))
if 'CNT
QUIT
Begin DoDot:1
+3 SET X12CODE=$GET(XUARR("PersonClass",CNT,"PersonClass"))
if X12CODE=""
QUIT
+4 ;
+5 ;Lookup the Person Class entry in the multiple
+6 SET PCIEN=0
+7 ;to resolve duplicate x12 codes
SET VACODE=$SELECT(X12CODE="207LP3000X":"V110403",X12CODE="2084B0040X":"V182914",X12CODE="390200000X":"V115500",1:"")
IF VACODE'=""
SET PCIEN=$ORDER(^USC(8932.1,"F",VACODE,0))
+8 IF 'PCIEN
SET PCIEN=$ORDER(^USC(8932.1,"G",X12CODE,0))
+9 SET IEN=$ORDER(^VA(200,+XUDUZ,"USC1","B",+PCIEN,0))
+10 ;
+11 ;If not found, add it
+12 IF IEN'>0
Begin DoDot:2
+13 ;now passing internal value of X12CODE
SET FDA(200.05,"+1,"_+XUDUZ_",",.01)=PCIEN
+14 SET IEN=$$UPDATER(.FDA,"",.XURET)
End DoDot:2
if IEN'>0
QUIT
+15 ;
+16 ;Update the other values in the Person Class multiple
+17 SET IENS=+IEN_","_+XUDUZ_","
+18 SET CURVAL=$PIECE($GET(^VA(200,+XUDUZ,"USC1",+IEN,0)),U,2)
+19 SET NEWVAL=$GET(XUARR("PersonClass",CNT,"PersonClassActive"))
+20 IF NEWVAL=""
IF '$$ISPCACTV(XUDUZ,IEN)
SET FDA(200.05,IENS,2)="TODAY"
SET FDA(200.05,IENS,3)="@"
+21 IF '$TEST
IF NEWVAL]""
SET FDA(200.05,IENS,2)=NEWVAL
+22 if $DATA(XUARR("PersonClass",CNT,"PersonClassExpire"))#2
SET FDA(200.05,IENS,3)=XUARR("PersonClass",CNT,"PersonClassExpire")
+23 ;Needed by input transform of Effective Date (200.05,2)
SET D0=+XUDUZ
+24 DO FILER(.FDA,"E",.XURET)
End DoDot:1
+25 QUIT
+26 ;
ISPCACTV(XUDUZ,SUBIEN) ;Is the Person Class active?
+1 NEW EFFDT,EXPDT,ND
+2 SET ND=$GET(^VA(200,+$GET(XUDUZ),"USC1",+$GET(SUBIEN),0))
if ND=""
QUIT 0
+3 SET EFFDT=$PIECE(ND,U,2)
SET EXPDT=$PIECE(ND,U,3)
+4 IF EFFDT
IF DT'<EFFDT
IF DT'>EXPDT
QUIT 1
+5 QUIT 0
+6 ;
NEWDEA(XUDUZ,XUARR,XURET) ;Update DEA NUMBERS File #8991.9
+1 ;and the NEW PERSON File NEW DEA #'s multiple
+2 NEW CNT,DEA,DIERR,DIHELP,DIMSG,FDA,IEN,IENS,NDEAIEN,XUERR
+3 NEW STR1,STR2,STR3,CITY,STATE,ZIP,ADDR
+4 ;
+5 ;Get address parts
+6 if $DATA(XUARR("ADDRESS DATA"))#2
Begin DoDot:1
+7 SET ADDR=XUARR("ADDRESS DATA")
+8 SET STR1=$EXTRACT($PIECE(ADDR,"|"),1,$$MAXLEN(8991.9,1.2))
+9 SET STR2=$EXTRACT($PIECE(ADDR,"|",2),1,$$MAXLEN(8991.9,1.3))
+10 SET STR3=$EXTRACT($PIECE(ADDR,"|",3),1,$$MAXLEN(8991.9,1.4))
+11 SET CITY=$EXTRACT($PIECE(ADDR,"|",4),1,$$MAXLEN(8991.9,1.5))
+12 SET STATE=$PIECE(ADDR,"|",5)
+13 SET ZIP=$TRANSLATE($PIECE(ADDR,"|",6),"-")
End DoDot:1
+14 ;
+15 SET CNT=0
FOR
SET CNT=$ORDER(XUARR("DEA",CNT))
if 'CNT
QUIT
Begin DoDot:1
+16 SET DEA=$GET(XUARR("DEA",CNT,"DEA"))
+17 if DEA=""
QUIT
+18 ;
+19 ;Lookup or add a record to File #8991.9 with the passed DEA #
+20 SET NDEAIEN=$ORDER(^XTV(8991.9,"B",DEA,0))
+21 IF NDEAIEN'>0
Begin DoDot:2
+22 KILL FDA
+23 SET IENS="+1,"
+24 SET FDA(8991.9,IENS,.01)=DEA
+25 SET FDA(8991.9,IENS,10.2)="NOW"
+26 SET NDEAIEN=$$UPDATER(.FDA,"E",.XURET)
End DoDot:2
if NDEAIEN'>0
QUIT
+27 ;
+28 ;Update Expiration Date, Address, and Schedule fields for this File #8991.9 entry
+29 KILL FDA
+30 SET IENS=NDEAIEN_","
+31 if $DATA(XUARR("ADDRESS DATA"))#2
Begin DoDot:2
+32 SET FDA(8991.9,IENS,1.2)=STR1
+33 SET FDA(8991.9,IENS,1.3)=STR2
+34 SET FDA(8991.9,IENS,1.4)=STR3
+35 SET FDA(8991.9,IENS,1.5)=CITY
+36 SET FDA(8991.9,IENS,1.6)=$$STATEIEN(STATE)
+37 SET FDA(8991.9,IENS,1.7)=ZIP
End DoDot:2
+38 if $DATA(XUARR("DEA",CNT,"Detox"))#2
SET FDA(8991.9,IENS,.03)=XUARR("DEA",CNT,"Detox")
+39 if $DATA(XUARR("DEA",CNT,"DEAExpire"))#2
SET FDA(8991.9,IENS,.04)=XUARR("DEA",CNT,"DEAExpire")
+40 if $DATA(XUARR("DEA",CNT,"SchedIINarc"))#2
SET FDA(8991.9,IENS,2.1)=XUARR("DEA",CNT,"SchedIINarc")
+41 if $DATA(XUARR("DEA",CNT,"SchedIINonNarc"))#2
SET FDA(8991.9,IENS,2.2)=XUARR("DEA",CNT,"SchedIINonNarc")
+42 if $DATA(XUARR("DEA",CNT,"SchedIIINarc"))#2
SET FDA(8991.9,IENS,2.3)=XUARR("DEA",CNT,"SchedIIINarc")
+43 if $DATA(XUARR("DEA",CNT,"SchedIIINonNarc"))#2
SET FDA(8991.9,IENS,2.4)=XUARR("DEA",CNT,"SchedIIINonNarc")
+44 if $DATA(XUARR("DEA",CNT,"SchedIV"))#2
SET FDA(8991.9,IENS,2.5)=XUARR("DEA",CNT,"SchedIV")
+45 if $DATA(XUARR("DEA",CNT,"SchedV"))#2
SET FDA(8991.9,IENS,2.6)=XUARR("DEA",CNT,"SchedV")
+46 if $DATA(FDA)
SET FDA(8991.9,IENS,10.1)=$SELECT($GET(DUZ):"`"_DUZ,1:"")
SET FDA(8991.9,IENS,10.2)="NOW"
+47 DO FILER(.FDA,"E",.XURET)
+48 ;
+49 ;Lookup or add corresponding entry in New Person NEW DEA #'S multiple
+50 SET IEN=$ORDER(^VA(200,+XUDUZ,"PS4","B",DEA,0))
+51 IF IEN'>0
Begin DoDot:2
+52 KILL FDA
+53 SET FDA(200.5321,"+1,"_+XUDUZ_",",.01)=DEA
+54 SET IEN=$$UPDATER(.FDA,"E",.XURET)
End DoDot:2
if IEN'>0
QUIT
+55 ;
+56 ;Update the DEA POINTER value in the NEW DEA #'s multiple
+57 KILL FDA
+58 SET FDA(200.5321,+IEN_","_+XUDUZ_",",.03)=NDEAIEN
+59 DO FILER(.FDA,"",.XURET)
End DoDot:1
+60 QUIT
+61 ;
NPDEA(XUDUZ,XUARR,XURET) ;Set the single-valued fields in the New Person file for
+1 ; DEA#, Detox #, DEA Expiration Date, and the Schedule fields from the first entry in
+2 ; the NEW DEA#'s multiple; Also default Auth to Write Med Orders to 1 if not already set,
+3 ; WHO is 200PIEV, and there's a DEA#
+4 NEW DEAIEN,FDA,IENS,ND0,ND2,NDEAIEN
+5 SET DEAIEN=$ORDER(^VA(200,XUDUZ,"PS4",0))
if 'DEAIEN
QUIT
+6 SET NDEAIEN=$PIECE(^VA(200,XUDUZ,"PS4",DEAIEN,0),U,3)
if NDEAIEN'>0
QUIT
+7 ;
+8 ;Set up FDA with data from DEA NUMBERS entry
+9 SET IENS=+XUDUZ_","
+10 SET ND0=$GET(^XTV(8991.9,+NDEAIEN,0))
SET ND2=$GET(^(2))
if $PIECE(ND0,U)=""
QUIT
+11 ;DEA#
SET FDA(200,IENS,53.2)=$PIECE(ND0,U)
+12 ;DETOX NUMBER
SET FDA(200,IENS,53.11)=$PIECE(ND0,U,3)
+13 ;DEA EXPIRATION DATE
SET FDA(200,IENS,747.44)=$PIECE(ND0,U,4)
+14 ;SCHEDULE II NARCOTIC
SET FDA(200,IENS,55.1)=$PIECE(ND2,U)
+15 ;SCHEDULE II NON-NARCOTIC
SET FDA(200,IENS,55.2)=$PIECE(ND2,U,2)
+16 ;SCHEDULE III NARCOTIC
SET FDA(200,IENS,55.3)=$PIECE(ND2,U,3)
+17 ;SCHEDULE III NON-NARCOTIC
SET FDA(200,IENS,55.4)=$PIECE(ND2,U,4)
+18 ;SCHEDULE IV
SET FDA(200,IENS,55.5)=$PIECE(ND2,U,5)
+19 ;SCHEDULE V
SET FDA(200,IENS,55.6)=$PIECE(ND2,U,6)
+20 IF $GET(XUARR("WHO"))="200PIEV"
IF $GET(XUARR("AuthWriteMedOrders"))=""
SET FDA(200,IENS,53.1)=1
+21 DO FILER(.FDA,"",.XURET)
+22 QUIT
+23 ;
FIRSTDEA(XUDUZ,XUARR,XURET) ;File the first valid DEA in the XUARR input array
+1 ;into the single-value DEA fields of the NP file
+2 NEW CNT,DEA,FDA,FIRST,IENS
+3 ;
+4 ;Find the first valid DEA number in the input array
+5 SET FIRST=""
SET CNT=0
FOR
SET CNT=$ORDER(XUARR("DEA",CNT))
if 'CNT
QUIT
Begin DoDot:1
+6 SET DEA=$GET(XUARR("DEA",CNT,"DEA"))
if DEA=""
QUIT
+7 SET DEA=$$GETINT(200,53.2,DEA)
+8 if DEA'=U
SET FIRST=CNT
End DoDot:1
if FIRST
QUIT
+9 if 'FIRST
QUIT
+10 ;
+11 ;Set up FDA with data from DEA NUMBERS entry
+12 SET IENS=XUDUZ_","
+13 SET FDA(200,IENS,53.2)=DEA
+14 if $DATA(XUARR("DEA",FIRST,"Detox"))#2
SET FDA(200,IENS,53.11)=XUARR("DEA",FIRST,"Detox")
+15 if $DATA(XUARR("DEA",FIRST,"DEAExpire"))#2
SET FDA(200,IENS,747.44)=XUARR("DEA",FIRST,"DEAExpire")
+16 if $DATA(XUARR("DEA",FIRST,"SchedIINarc"))#2
SET FDA(200,IENS,55.1)=XUARR("DEA",FIRST,"SchedIINarc")
+17 if $DATA(XUARR("DEA",FIRST,"SchedIINonNarc"))#2
SET FDA(200,IENS,55.2)=XUARR("DEA",FIRST,"SchedIINonNarc")
+18 if $DATA(XUARR("DEA",FIRST,"SchedIIINarc"))#2
SET FDA(200,IENS,55.3)=XUARR("DEA",FIRST,"SchedIIINarc")
+19 if $DATA(XUARR("DEA",FIRST,"SchedIIINonNarc"))#2
SET FDA(200,IENS,55.4)=XUARR("DEA",FIRST,"SchedIIINonNarc")
+20 if $DATA(XUARR("DEA",FIRST,"SchedIV"))#2
SET FDA(200,IENS,55.5)=XUARR("DEA",FIRST,"SchedIV")
+21 if $DATA(XUARR("DEA",FIRST,"SchedV"))#2
SET FDA(200,IENS,55.6)=XUARR("DEA",FIRST,"SchedV")
+22 IF $GET(XUARR("WHO"))="200PIEV"
IF $GET(XUARR("AuthWriteMedOrders"))=""
SET FDA(200,IENS,53.1)=1
+23 DO FILER(.FDA,"E",.XURET)
+24 QUIT
+25 ;
FILER(XUMVIFDA,FLAG,XURET) ;Call the Filer
+1 NEW DIERR,DIHELP,DIMSG,IENS,FILE,ROOT,XUMVIERR
+2 if '$DATA(XUMVIFDA)
QUIT
+3 SET FILE=$ORDER(XUMVIFDA(0))
SET IENS=$ORDER(XUMVIFDA(+FILE,""))
SET ROOT=$$ROOT^DILFD(FILE,IENS)_+IENS_")"
+4 IF $GET(ROOT)=""
DO ADDERR(.XURET,"Unable to determine global root of File #"_FILE_", IENS '"_IENS_".")
QUIT
+5 LOCK +@ROOT:10
IF '$TEST
DO ADDERR(.XURET,"Unable to lock global "_ROOT_".")
QUIT
+6 DO FILE^DIE($GET(FLAG),"XUMVIFDA","XUMVIERR")
+7 LOCK -@ROOT
+8 if $GET(DIERR)
DO ADDERR(.XURET,$$BLDERR("XUMVIERR"))
+9 QUIT
+10 ;
UPDATER(XUMVIFDA,FLAG,XURET,XUMVIIEN) ;Call the Updater
+1 ;**724,Story 1209890 (mko): Add XUMVIIEN as an input paramater to allow controlling IEN of new record
+2 NEW DIERR,DIHELP,DIMSG,XUMVIERR
+3 DO UPDATE^DIE(FLAG,"XUMVIFDA","XUMVIIEN","XUMVIERR")
+4 IF $GET(DIERR)
DO ADDERR(.XURET,$$BLDERR("XUMVIERR"))
QUIT 0
+5 QUIT +$GET(XUMVIIEN(1))
+6 ;
ADDERR(XURET,MSG) ;Add error MSG to XURET
+1 if $GET(MSG)=""
QUIT
+2 SET XURET=$SELECT(XURET]"":XURET_" ",1:"-1^")_MSG
+3 QUIT
+4 ;
STATEIEN(STATE) ;Return "`"_IEN if valid abbreviation, VA code, or name
+1 NEW IEN
+2 if $GET(STATE)=""
QUIT ""
+3 SET IEN=$SELECT(STATE="FG":$ORDER(^DIC(5,"B","FOREIGN COUNTRY",0)),STATE="OT":$ORDER(^DIC(5,"B","OTHER",0)),STATE="EU":$ORDER(^DIC(5,"B","EUROPE",0)),1:$ORDER(^DIC(5,"C",STATE,0)))
+4 if 'IEN
SET IEN=$ORDER(^DIC(5,"B",STATE,""))
+5 QUIT $SELECT(IEN>0:"`"_IEN,1:STATE)
+6 ;
GETINT(FILE,FLD,VAL) ;Get the internal form of the data; returns "^" if not valid
+1 NEW DIERR,DIHELP,DIMSG,XUMSG,XURES
+2 if VAL=""
QUIT ""
+3 DO CHK^DIE(FILE,FLD,"",VAL,.XURES,"XUMSG")
+4 QUIT XURES
+5 ;
BLDERR(INROOT) ;Build a string containing error messages returned by FileMan
+1 NEW ERRSTR,I,XUERMSGS
+2 DO MSG^DIALOG("AE",.XUERMSGS,"","",$GET(INROOT))
+3 SET ERRSTR=""
+4 SET I=0
FOR
SET I=$ORDER(XUERMSGS(I))
if 'I
QUIT
if XUERMSGS(I)]""
SET ERRSTR=ERRSTR_$EXTRACT(" ",ERRSTR]"")_XUERMSGS(I)
+5 QUIT ERRSTR
+6 ;
MAXLEN(FILE,FLD) ;Return the maximum length of field FLD in file FILE
+1 NEW MAX
+2 SET MAX=$$GET1^DID(+FILE,+FLD,"","FIELD LENGTH")
if MAX'>0
SET MAX=999
+3 QUIT MAX
+4 ;
+5 ;=================================================
+6 ; Code for storing debugging information in ^XTMP
+7 ;=================================================
RECORD(PARAM,FLAG,RPCNAME) ;Record RPC inputs for debugging
+1 ;Return seq# in ^XTMP
+2 NEW NODE,NOW,SEQ,TODAY
+3 if '$$ISDEBUG
QUIT 0
+4 if $GET(RPCNAME)=""
SET RPCNAME="XUS MVI ENRICH NEW PERSON"
+5 SET NOW=$$NOW^XLFDT
SET TODAY=$PIECE(NOW,".")
+6 SET NODE=$$NODE
+7 ;
+8 LOCK +^XTMP(NODE):2
+9 DO SETXTMP0(NODE)
+10 SET SEQ=$ORDER(^XTMP(NODE," "),-1)+1
+11 MERGE ^XTMP(NODE,SEQ,"PARAM")=PARAM
+12 SET ^XTMP(NODE,SEQ,"FLAG")=$GET(FLAG)
+13 SET ^XTMP(NODE,SEQ,"DT")=NOW
+14 SET ^XTMP(NODE,SEQ,"DUZ")=$GET(DUZ)
+15 SET ^XTMP(NODE,SEQ,"RPC")=RPCNAME
+16 LOCK -^XTMP(NODE)
+17 QUIT SEQ
+18 ;
RETURN(SEQ,RETURN) ;Record the return value
+1 if 'SEQ
QUIT
if '$$ISDEBUG
QUIT
+2 MERGE ^XTMP($$NODE,SEQ,"RETURN")=RETURN
+3 QUIT
+4 ;
DBON ;Set DEBUG on
+1 NEW NODE
+2 SET NODE=$$NODE
+3 DO SETXTMP0
+4 SET ^XTMP(NODE,"DEBUG")=1
+5 WRITE !,$NAME(^XTMP(NODE,"DEBUG"))_" set to 1.",!
+6 QUIT
+7 ;
DBOFF ;Set DEBUG off
+1 NEW NODE
+2 SET NODE=$$NODE
+3 KILL ^XTMP(NODE,"DEBUG")
+4 if '$ORDER(^XTMP(NODE,0))
KILL ^XTMP(NODE)
+5 WRITE !,$NAME(^XTMP(NODE,"DEBUG"))_" killed.",!
+6 QUIT
+7 ;
ISDEBUG() ;Return 1 if DEBUG mode flag is set
+1 QUIT $GET(^XTMP($$NODE,"DEBUG"))
+2 ;
PURGE ;Purge the debugging data stored in ^XTMP
+1 NEW ISDEBUG
+2 SET ISDEBUG=$$ISDEBUG
+3 KILL ^XTMP($$NODE)
+4 WRITE !,$NAME(^XTMP($$NODE))_" killed.",!
+5 if ISDEBUG
DO DBON
+6 QUIT
+7 ;
SETXTMP0(NODE,DESC,LIFE) ;Set 0 node of ^XTMP(node)
+1 NEW CREATEDT
+2 if $GET(NODE)=""
SET NODE=$$NODE
+3 SET CREATEDT=$SELECT($DATA(^XTMP(NODE,0))#2:$PIECE(^(0),U,2),1:DT)
+4 if '$GET(LIFE)
SET LIFE=30
+5 if $GET(DESC)=""
SET DESC="New Person RPC Inputs and Outputs"
+6 SET ^XTMP(NODE,0)=$$FMADD^XLFDT(DT,LIFE)_U_CREATEDT_U_DESC
+7 QUIT
+8 ;
NODE() ;Return ^XTMP Debug subscript
+1 QUIT "XU_RPC_DEBUG_NP"