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

BUSARPC.m

Go to the documentation of this file.
  1. BUSARPC ;GDIT/HS/BEE-IHS USER SECURITY AUDIT Utility Program ; 31 Jan 2013 9:53 AM
  1. ;;1.0;IHS USER SECURITY AUDIT;;Nov 05, 2013;Build 65
  1. ;
  1. Q
  1. ;
  1. BMX(BUSAP) ;PEP - Log audit entry from BMXNet
  1. ;
  1. NEW BUSABKR,BUSARPC,RPCIEN,BUSAIEN,BUSADVAL,BUSAOVAL,STS,MINP
  1. NEW TYPE,CAT,ACT,X,DESC,XDESC,DFNLOC,DFNEXE,VSTLOC,VSTEXE
  1. NEW MULT,BUSADVAL,DVAL,VVAL,DETEXE,NEWEXE,ORGEXE,SKIP,ADVEXE,MINPD,MINPL
  1. ;
  1. S SKIP=""
  1. ;
  1. ;Make sure logging switch is on
  1. I '+$$STATUS^BUSAOPT("B") S STS="0^BMX audit logging switch is off" G XBMX
  1. ;
  1. ;Define Application Variables
  1. S BUSABKR="B" ;Set Broker to BMX
  1. S BUSARPC=$G(BUSAP(2,"CAPI")) ;Get the RPC
  1. I BUSARPC="" S STS="0^Missing RPC" G XBMX
  1. ;
  1. ;Find RPC IEN and skip if not defined
  1. S RPCIEN=$O(^XWB(8994,"B",BUSARPC,0)) I RPCIEN="" S STS="0^Invalid RPC" G XBMX
  1. ;
  1. ;See if RPC is set up to be audited
  1. S BUSAIEN=$O(^BUSA(9002319.03,"B",BUSARPC,"")) I BUSAIEN="" S STS="0^RPC not set to be tracked" G XBMX
  1. ;
  1. ;Check for inactive
  1. I $$GET1^DIQ(9002319.03,BUSAIEN_",",.07,"I") S STS="0^RPC call is inactive" G XBMX
  1. ;
  1. ;Pull definition
  1. S STS=$$DEF(BUSAIEN,.BUSAD) I 'STS G XBMX
  1. ;
  1. ;Assemble Summary Information
  1. ;
  1. ;Define Type as RPC
  1. S TYPE="R"
  1. ;
  1. ;Pull the CATEGORY
  1. S CAT=$G(BUSAD(.02)) I CAT="" S STS="0^Invalid definition category" G XBMX
  1. ;
  1. ;Pull the ACTION
  1. S ACT=$G(BUSAD(.03))
  1. ;
  1. ;Determine the Entry Description
  1. S X="",XDESC=$G(BUSAD(.06)) X:XDESC]"" XDESC
  1. S DESC=$G(X)
  1. ;
  1. ;Assemble Detail Information
  1. ;
  1. ;Retrieve DFN definition
  1. S DFNLOC=$G(BUSAD(1.01))
  1. S DFNEXE=$G(BUSAD(1.02))
  1. ;
  1. ;Retrieve VIEN definition
  1. S VSTLOC=$G(BUSAD(2.01))
  1. S VSTEXE=$G(BUSAD(2.02))
  1. ;
  1. ;Retrieve Multiple input info
  1. S MINP=0
  1. S MINPL=$G(BUSAD(2.03))
  1. S MINPD=$G(BUSAD(2.04))
  1. I MINPL]"",MINPD]"" S MINP=1
  1. ;
  1. ;Look for multiple results
  1. S MULT=0 I $P(DFNLOC,"^")="R"!($P(VSTLOC,"^")="R") S MULT=1
  1. I MINP,MULT S STS="0^DFN/VIEN cannot be pulled from both multiple inputs and results" G XBMX
  1. ;
  1. ;Stuff the DFN
  1. I $P(DFNLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(DFNLOC,U),$P(DFNLOC,U,2),"B",BUSARPC,.DVAL) I 'STS G XBMX
  1. I MINP=1,MINPL="D" D MINP^BUSAUTIL(.DVAL,MINPD,MINPL,DFNEXE,.BUSADVAL) ;Multiple Input DFNs
  1. I MINP=0 D BFILE^BUSAUTIL(.DVAL,.BUSADVAL,1,DFNEXE,MULT,MINP) ;Single DFN or Result DFNs
  1. ;
  1. ;Stuff the VIEN (and possibly the DFN)
  1. I $P(VSTLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(VSTLOC,U),$P(VSTLOC,U,2),"B",BUSARPC,.VVAL) I 'STS G XBMX
  1. I MINP=1,MINPL="V" D MINP^BUSAUTIL(.VVAL,MINPD,MINPL,VSTEXE,.BUSADVAL) ;Multiple Input VIENs
  1. I MINP=0 D BFILE^BUSAUTIL(.VVAL,.BUSADVAL,2,VSTEXE,MULT,MINP) ;Single VIEN or Result VIENs
  1. ;
  1. ;Stuff the detail description
  1. S DETEXE=$G(BUSAD(3))
  1. I DETEXE]"" D BFILE^BUSAUTIL("",.BUSADVAL,3,DETEXE,MULT,MINP)
  1. ;
  1. ;Stuff the new value
  1. S NEWEXE=$G(BUSAD(4))
  1. I NEWEXE]"" D BFILE^BUSAUTIL("",.BUSADVAL,4,NEWEXE,MULT,MINP)
  1. ;
  1. ;Stuff the original value
  1. S ORGEXE=$G(BUSAD(5))
  1. I ORGEXE]"" D BFILE^BUSAUTIL("",.BUSADVAL,5,ORGEXE,MULT,MINP)
  1. ;
  1. ;Advance definition executable
  1. S ADVEXE=$G(BUSAD(6))
  1. I ADVEXE]"" X ADVEXE
  1. ;
  1. ;Look for SKIP
  1. I +$G(SKIP) S STS="0^Skipped log entry" G XBMX
  1. ;
  1. ;Make API call
  1. S STS=$$LOG^BUSAAPI(TYPE,CAT,ACT,BUSARPC,DESC,"BUSADVAL")
  1. ;
  1. XBMX Q STS
  1. ;
  1. CIA(XWBPTYPE,RTN,BUSAARY) ;PEP - Log audit entry from CIA Broker
  1. ;
  1. ;Make sure logging switch is on
  1. I '+$$STATUS^BUSAOPT("C") S STS="0^CIA Broker audit logging switch is off" G XCIA
  1. ;
  1. NEW BUSABKR,BUSARPC,RPCIEN,BUSAIEN,BUSADVAL,BUSAOVAL,STS,MINP
  1. NEW TYPE,CAT,ACT,X,DESC,XDESC,DFNLOC,DFNEXE,VSTLOC,VSTEXE
  1. NEW MULT,BUSADVAL,DVAL,VVAL,DETEXE,NEWEXE,ORGEXE,SKIP,ADVEXE,MINPD,MINPL
  1. ;
  1. ;Define Application Variables
  1. S BUSABKR="C" ;Set Broker to CIA
  1. S BUSARPC=$G(BUSAARY) ;Get the RPC
  1. I BUSARPC="" S STS="0^Missing RPC" G XCIA
  1. S SKIP=""
  1. ;
  1. ;Find RPC IEN and skip if not defined
  1. S RPCIEN=$O(^XWB(8994,"B",BUSARPC,0)) I RPCIEN="" S STS="0^Invalid RPC" G XCIA
  1. ;
  1. ;See if RPC is set up to be audited
  1. S BUSAIEN=$O(^BUSA(9002319.03,"B",BUSARPC,"")) I BUSAIEN="" S STS="0^RPC not set to be tracked" G XCIA
  1. ;
  1. ;Check for inactive
  1. I $$GET1^DIQ(9002319.03,BUSAIEN_",",.07,"I") S STS="0^RPC call is inactive" G XCIA
  1. ;
  1. ;Pull definition
  1. S STS=$$DEF(BUSAIEN,.BUSAD) I 'STS G XCIA
  1. ;
  1. ;Assemble Summary Information
  1. ;
  1. ;Define Type as RPC
  1. S TYPE="R"
  1. ;
  1. ;Pull the CATEGORY
  1. S CAT=$G(BUSAD(.02)) I CAT="" S STS="0^Invalid definition category" G XCIA
  1. ;
  1. ;Pull the ACTION
  1. S ACT=$G(BUSAD(.03))
  1. ;
  1. ;Determine the Entry Description
  1. S X="",XDESC=$G(BUSAD(.06)),XDESC=$TR(XDESC,"~","^") X:XDESC]"" XDESC
  1. S DESC=$G(X)
  1. ;
  1. ;Assemble Detail Information
  1. ;
  1. ;Retrieve DFN definition
  1. S DFNLOC=$G(BUSAD(1.01))
  1. S DFNEXE=$G(BUSAD(1.02))
  1. ;
  1. ;Retrieve VIEN definition
  1. S VSTLOC=$G(BUSAD(2.01))
  1. S VSTEXE=$G(BUSAD(2.02))
  1. ;
  1. ;Retrieve Multiple input info
  1. S MINP=0
  1. S MINPL=$G(BUSAD(2.03))
  1. S MINPD=$G(BUSAD(2.04))
  1. I MINPL]"",MINPD]"" S MINP=1
  1. ;
  1. ;Look for multiple results
  1. S MULT=0 I $P(DFNLOC,"^")="R"!($P(VSTLOC,"^")="R") S MULT=1
  1. I MINP,MULT S STS="0^DFN/VIEN cannot be pulled from both multiple inputs and results" G XCIA
  1. ;
  1. ;Stuff the DFN
  1. I $P(DFNLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(DFNLOC,U),$P(DFNLOC,U,2),"C",BUSARPC,.DVAL) I 'STS G XCIA
  1. I MINP=1,MINPL="D" D MINP^BUSAUTIL(.DVAL,MINPD,MINPL,DFNEXE,.BUSADVAL) ;Multiple Input DFNs
  1. I MINP=0 D CFILE^BUSAUTIL(.DVAL,.BUSADVAL,1,DFNEXE,MULT,MINP) ;Single DFN or Result DFNs
  1. ;
  1. ;Stuff the VIEN
  1. I $P(VSTLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(VSTLOC,U),$P(VSTLOC,U,2),"C",BUSARPC,.VVAL) I 'STS G XCIA
  1. I MINP=1,MINPL="V" D MINP^BUSAUTIL(.VVAL,MINPD,MINPL,VSTEXE,.BUSADVAL) ;Multiple Input VIENs
  1. I MINP=0 D CFILE^BUSAUTIL(.VVAL,.BUSADVAL,2,VSTEXE,MULT,MINP) ;Single VIEN or Result VIENs
  1. ;
  1. ;Stuff the detail description
  1. S DETEXE=$G(BUSAD(3))
  1. I DETEXE]"" D CFILE^BUSAUTIL("",.BUSADVAL,3,DETEXE,MULT,MINP)
  1. ;
  1. ;Stuff the new value
  1. S NEWEXE=$G(BUSAD(4))
  1. I NEWEXE]"" D CFILE^BUSAUTIL("",.BUSADVAL,4,NEWEXE,MULT,MINP)
  1. ;
  1. ;Stuff the original value
  1. S ORGEXE=$G(BUSAD(5))
  1. I ORGEXE]"" D CFILE^BUSAUTIL("",.BUSADVAL,5,ORGEXE,MULT,MINP)
  1. ;
  1. ;Advance definition executable
  1. S ADVEXE=$G(BUSAD(6))
  1. I ADVEXE]"" X ADVEXE
  1. ;
  1. ;Look for SKIP
  1. I +$G(SKIP) S STS="0^Skipped log entry" G XCIA
  1. ;
  1. ;Create the log entry
  1. S STS=$$LOG^BUSAAPI(TYPE,CAT,ACT,BUSARPC,DESC,"BUSADVAL")
  1. ;
  1. XCIA Q STS
  1. ;
  1. XWB(BUSAP) ;PEP - Log audit entry from XWB Broker
  1. ;
  1. NEW BUSABKR,BUSARPC,RPCIEN,BUSAIEN,BUSADVAL,BUSAOVAL,STS,MINP
  1. NEW TYPE,CAT,ACT,X,DESC,XDESC,DFNLOC,DFNEXE,VSTLOC,VSTEXE
  1. NEW MULT,BUSADVAL,DVAL,VVAL,DETEXE,NEWEXE,ORGEXE,SKIP,ADVEXE,MINPD,MINPL
  1. ;
  1. S SKIP=""
  1. ;
  1. ;Make sure logging switch is on
  1. I '+$$STATUS^BUSAOPT("B") S STS="0^BMX audit logging switch is off" G XXWB
  1. ;
  1. ;Define Application Variables
  1. S BUSABKR="W" ;Set Broker to XWB Broker
  1. ;
  1. ;Get the RPC
  1. S BUSARPC=$G(BUSAP(2,"RPC")) S:BUSARPC="" BUSARPC=$G(BUSAP(2,"CAPI"))
  1. I BUSARPC="" S STS="0^Missing RPC" G XXWB
  1. ;
  1. ;Find RPC IEN and skip if not defined
  1. S RPCIEN=$O(^XWB(8994,"B",BUSARPC,0)) I RPCIEN="" S STS="0^Invalid RPC" G XXWB
  1. ;
  1. ;See if RPC is set up to be audited
  1. S BUSAIEN=$O(^BUSA(9002319.03,"B",BUSARPC,"")) I BUSAIEN="" S STS="0^RPC not set to be tracked" G XXWB
  1. ;
  1. ;Check for inactive
  1. I $$GET1^DIQ(9002319.03,BUSAIEN_",",.07,"I") S STS="0^RPC call is inactive" G XXWB
  1. ;
  1. ;Pull definition
  1. S STS=$$DEF(BUSAIEN,.BUSAD) I 'STS G XXWB
  1. ;
  1. ;Assemble Summary Information
  1. ;
  1. ;Define Type as RPC
  1. S TYPE="R"
  1. ;
  1. ;Pull the CATEGORY
  1. S CAT=$G(BUSAD(.02)) I CAT="" S STS="0^Invalid definition category" G XXWB
  1. ;
  1. ;Pull the ACTION
  1. S ACT=$G(BUSAD(.03))
  1. ;
  1. ;Determine the Entry Description
  1. S X="",XDESC=$G(BUSAD(.06)) X:XDESC]"" XDESC
  1. S DESC=$G(X)
  1. ;
  1. ;Assemble Detail Information
  1. ;
  1. ;Retrieve DFN definition
  1. S DFNLOC=$G(BUSAD(1.01))
  1. S DFNEXE=$G(BUSAD(1.02))
  1. ;
  1. ;Retrieve VIEN definition
  1. S VSTLOC=$G(BUSAD(2.01))
  1. S VSTEXE=$G(BUSAD(2.02))
  1. ;
  1. ;Retrieve Multiple input info
  1. S MINP=0
  1. S MINPL=$G(BUSAD(2.03))
  1. S MINPD=$G(BUSAD(2.04))
  1. I MINPL]"",MINPD]"" S MINP=1
  1. ;
  1. ;Look for multiple results
  1. S MULT=0 I $P(DFNLOC,"^")="R"!($P(VSTLOC,"^")="R") S MULT=1
  1. I MINP,MULT S STS="0^DFN/VIEN cannot be pulled from both multiple inputs and results" G XXWB
  1. ;
  1. ;Stuff the DFN
  1. I $P(DFNLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(DFNLOC,U),$P(DFNLOC,U,2),"W",BUSARPC,.DVAL) I 'STS G XXWB
  1. I MINP=1,MINPL="D" D MINP^BUSAUTIL(.DVAL,MINPD,MINPL,DFNEXE,.BUSADVAL) ;Multiple Input DFNs
  1. I MINP=0 D WFILE^BUSAUTIL(.DVAL,.BUSADVAL,1,DFNEXE,MULT,MINP) ;Single DFN or Result DFNs
  1. ;
  1. ;Stuff the VIEN (and possibly the DFN)
  1. I $P(VSTLOC,U,2)]"" S STS=$$VAL^BUSAUTIL($P(VSTLOC,U),$P(VSTLOC,U,2),"W",BUSARPC,.VVAL) I 'STS G XXWB
  1. I MINP=1,MINPL="V" D MINP^BUSAUTIL(.VVAL,MINPD,MINPL,VSTEXE,.BUSADVAL) ;Multiple Input VIENs
  1. I MINP=0 D WFILE^BUSAUTIL(.VVAL,.BUSADVAL,2,VSTEXE,MULT,MINP) ;Single VIEN or Result VIENs
  1. ;
  1. ;Stuff the detail description
  1. S DETEXE=$G(BUSAD(3))
  1. I DETEXE]"" D WFILE^BUSAUTIL("",.BUSADVAL,3,DETEXE,MULT,MINP)
  1. ;
  1. ;Stuff the new value
  1. S NEWEXE=$G(BUSAD(4))
  1. I NEWEXE]"" D WFILE^BUSAUTIL("",.BUSADVAL,4,NEWEXE,MULT,MINP)
  1. ;
  1. ;Stuff the original value
  1. S ORGEXE=$G(BUSAD(5))
  1. I ORGEXE]"" D WFILE^BUSAUTIL("",.BUSADVAL,5,ORGEXE,MULT,MINP)
  1. ;
  1. ;Advance definition executable
  1. S ADVEXE=$G(BUSAD(6))
  1. I ADVEXE]"" X ADVEXE
  1. ;
  1. ;Look for SKIP
  1. I +$G(SKIP) S STS="0^Skipped log entry" G XXWB
  1. ;
  1. ;Make API call
  1. S STS=$$LOG^BUSAAPI(TYPE,CAT,ACT,BUSARPC,DESC,"BUSADVAL")
  1. ;
  1. XXWB Q STS
  1. ;
  1. DEF(BUSAIEN,BUSAD) ;EP - Set up entry definition array
  1. ;
  1. NEW FLD
  1. F FLD=".01",".02",".03",".06",1.01,1.02,2.01,2.02,2.03,2.04,3,4,5,6 S BUSAD(FLD)=$TR($$GET1^DIQ(9002319.03,BUSAIEN_",",FLD,"I"),"~","^")
  1. Q $S($D(BUSAD)>1:1,1:"0^Invalid Definition")
  1. ;
  1. RPC(DATA,INPUT) ;EP - BUSA LOG SECURITY AUDIT ENTRY
  1. ;
  1. ; Required variable:
  1. ; DUZ - Pointer to NEW PERSON (#200) file
  1. ;
  1. ;Input Parameters:
  1. ;
  1. ; INPUT
  1. ;
  1. ; Piece ("|" delimiter)
  1. ;
  1. ; 1 - CAT (Required) - The category of the event to log (S:System Event;
  1. ; P:Patient Related;D:Definition Change;O:Other Event)
  1. ; 2 - ACTION (Required for CAT="P") - The action for the event to log
  1. ; (A:Additions;D:Deletions;Q:Queries;P:Print;
  1. ; E:Changes;C:Copy)
  1. ; 3 - CALL - (Required) - Free text entry describing the call which
  1. ; originated the audit event (Maximum length
  1. ; 200 characters)
  1. ; Examples could be an RPC value or calling
  1. ; routine
  1. ; 4 - DESC - (Required) - Free text entry describing the call action
  1. ; (Maximum length 250 characters)
  1. ; Examples could be 'Patient demographic update',
  1. ; 'Copied iCare panel to clipboard' or 'POV Entry'
  1. ; 5 - DETAIL (Required for CAT="P") - Delimited list of patient/visit records
  1. ; to log. Required for patient related events.
  1. ; Optional for other event types
  1. ;
  1. ; Format: DETAIL = DFN1_$C(29)_VIEN1_$C(29)_EVENT DESCRIPTION1_$C(29)_NEW VALUE1 ...
  1. ; ... _$C(29)_ORIGINAL VALUE1_$C(28)_DFN2_$C(29)_VIEN2_$C(29) ...
  1. ; ... _EVENT DESCRIPTION2_$C(29)_NEW VALUE2_$C(29)_ORIGINAL VALUE2 ...
  1. ; ... $C(28)_DFN3 ...
  1. ;
  1. ; Where:
  1. ; DFN# - (Optional for non-patient related calls) - Pointer to VA PATIENT file (#2)
  1. ; VIEN# - (Optional for non-visit related calls) - Pointer to VISIT file (#9000010)
  1. ; EVENT DESCRIPTION# -(Optional) - Additional detail to log for this entry
  1. ; NEW VALUE# - (Optional) - New value after call completion, if applicable
  1. ; ORIGINAL VALUE# - (Optional) - Original value prior to call execution, if applicable
  1. ;
  1. NEW CAT,ACTION,CALL,DESC,DETAIL,DCNT,I,DET,BUSAII,UID,RES,ENTRY
  1. ;
  1. S UID=$S($G(ZTSK):"Z"_ZTSK,1:$J)
  1. S DATA=$NA(^TMP("BUSARPC",UID))
  1. K @DATA
  1. ;
  1. S BUSAII=0
  1. ;
  1. ;Create header
  1. S @DATA@(0)="I00001RESULT^T00250ERROR_MESSAGE"_$C(30)
  1. ;
  1. NEW $ESTACK,$ETRAP S $ETRAP="D ERR^BUSARPC D UNWIND^%ZTER" ; SAC 2009 2.2.3.17
  1. ;
  1. ;Check for DUZ
  1. I $G(DUZ)="" S RES="0^DUZ is not defined" G XBRPC
  1. ;
  1. ;Move input to local variables
  1. S INPUT=$G(INPUT,"")
  1. S CAT=$P(INPUT,"|")
  1. S ACTION=$P(INPUT,"|",2)
  1. S CALL=$P(INPUT,"|",3)
  1. S DESC=$P(INPUT,"|",4)
  1. S DETAIL=$P(INPUT,"|",5)
  1. ;
  1. ;Format DETAIL
  1. S DCNT=0
  1. F I=1:1:$L(DETAIL,$C(28)) S ENTRY=$P(DETAIL,$C(28),I) I $TR(ENTRY,$C(29))]"" D
  1. . NEW DFN,VIEN,EDESC,NVAL,OVAL
  1. . S DFN=$P(ENTRY,$C(29))
  1. . S VIEN=$P(ENTRY,$C(29),2)
  1. . S EDESC=$P(ENTRY,$C(29),3)
  1. . S NVAL=$P(ENTRY,$C(29),4)
  1. . S OVAL=$P(ENTRY,$C(29),5)
  1. . S DCNT=DCNT+1
  1. . S DET(DCNT)=DFN_U_VIEN_U_EDESC_U_NVAL_U_OVAL
  1. ;
  1. ;Perform the call
  1. S RES=$$LOG^BUSAAPI("R",CAT,ACTION,CALL,DESC,"DET")
  1. ;
  1. XBRPC S BUSAII=BUSAII+1,@DATA@(BUSAII)=RES_$C(30)
  1. S BUSAII=BUSAII+1,@DATA@(BUSAII)=$C(31)
  1. Q
  1. ;
  1. ERR ;
  1. D ^%ZTER
  1. NEW Y,ERRDTM
  1. S Y=$$NOW^XLFDT() X ^DD("DD") S ERRDTM=Y
  1. S BMXSEC="Recording that an error occurred at "_ERRDTM
  1. I $D(BUSAII),$D(DATA) S BUSAII=BUSAII+1,@DATA@(BUSAII)=$C(31)
  1. Q