| 1 | IBSDU ;ALB/TMP - ACRP API UTILITIES ;16-SEP-97 | 
|---|
| 2 | ;;2.0;INTEGRATED BILLING;**91,249,366**;21-MAR-94;Build 3 | 
|---|
| 3 | ;;Per VHA Directive 10-93-142, this routine should not be modified. | 
|---|
| 4 | ; | 
|---|
| 5 | SCAN(IBINDX,IBVAL,IBFILTER,IBCBK,IBCLOSE,IBQUERY,IBDIR,IBZXERR) ; Scan encountrs | 
|---|
| 6 | ;  *** NOTE *** When using this call, the variable passed as IBQUERY | 
|---|
| 7 | ;               must be  newed or killed in the calling program | 
|---|
| 8 | ; IBINDX = index name property of the query object | 
|---|
| 9 | ; IBVAL = array of data elements for start/end of search | 
|---|
| 10 | ;         IBVAL("DFN") = patient DFN | 
|---|
| 11 | ;         IBVAL("BDT") = begin date | 
|---|
| 12 | ;         IBVAL("EDT") = end date | 
|---|
| 13 | ;         IBVAL("VIS") = encounter file ien | 
|---|
| 14 | ; IBFILTER = the executable code to use to screen entries | 
|---|
| 15 | ; IBCBK = the executable scan callback code to create the result set | 
|---|
| 16 | ; IBCLOSE = Flag that says whether or not to close the QUERY object | 
|---|
| 17 | ;         1 = Perform close     0 or null = Do not close object | 
|---|
| 18 | ; IBQUERY = the # of the current query, if not a new query.  If passed | 
|---|
| 19 | ;          by reference and query closed, this variable will be nulled | 
|---|
| 20 | ; IBDIR = the direction of the scan (optional) | 
|---|
| 21 | ;         null, undefined or FORWARD : Scan forwards | 
|---|
| 22 | ;         BACKWARD : Scan backwards | 
|---|
| 23 | ; IBZXERR = the name of the error array to be returned (or none if null) | 
|---|
| 24 | ; | 
|---|
| 25 | N QUERY | 
|---|
| 26 | S QUERY=$G(IBQUERY) | 
|---|
| 27 | I $G(IBZXERR)="" K ^TMP("DIERR",$J) | 
|---|
| 28 | I $G(IBZXERR)'="" K @IBZXERR | 
|---|
| 29 | I '$G(QUERY) D | 
|---|
| 30 | .D OPEN^SDQ(.IBQUERY,$G(IBZXERR)) Q:'$G(IBQUERY) | 
|---|
| 31 | .D INDEX^SDQ(.IBQUERY,IBINDX,"SET",$G(IBZXERR)) | 
|---|
| 32 | .I $G(IBFILTER)'="" D FILTER^SDQ(.IBQUERY,IBFILTER,"SET",$G(IBZXERR)) | 
|---|
| 33 | .D SCANCB^SDQ(.IBQUERY,IBCBK,"SET",$G(IBZXERR)) | 
|---|
| 34 | I $G(QUERY) D ACTIVE^SDQ(.IBQUERY,"FALSE","SET",$G(IBZXERR)) | 
|---|
| 35 | D SETINDX(.IBQUERY,IBINDX) | 
|---|
| 36 | D ACTIVE^SDQ(.IBQUERY,"TRUE","SET",$G(IBZXERR)) | 
|---|
| 37 | S:$G(IBDIR)="" IBDIR="FORWARD" | 
|---|
| 38 | D SCAN^SDQ(.IBQUERY,IBDIR,$G(IBZXERR)) | 
|---|
| 39 | I $G(IBCLOSE) D CLOSE(.IBQUERY) | 
|---|
| 40 | I $G(IBZXERR)="" K ^TMP("DIERR",$J) | 
|---|
| 41 | Q | 
|---|
| 42 | ; | 
|---|
| 43 | CLOSE(IBQUERY) ; Close the query | 
|---|
| 44 | N IBERROR | 
|---|
| 45 | G:'$G(IBQUERY) CLOSEQ | 
|---|
| 46 | D CLOSE^SDQ(.IBQUERY) | 
|---|
| 47 | CLOSEQ Q | 
|---|
| 48 | ; | 
|---|
| 49 | SETINDX(IBQUERY,IBINDX) ; | 
|---|
| 50 | I IBINDX="PATIENT/DATE" D PAT,DATE | 
|---|
| 51 | I IBINDX="DATE/TIME" D DATE | 
|---|
| 52 | I IBINDX="PATIENT" D PAT | 
|---|
| 53 | I IBINDX="VISIT" D VIS | 
|---|
| 54 | Q | 
|---|
| 55 | ; | 
|---|
| 56 | PAT ; Verify patient | 
|---|
| 57 | D PAT^SDQ(.IBQUERY,$G(IBVAL("DFN")),"SET",$G(IBZXERR)) | 
|---|
| 58 | Q | 
|---|
| 59 | ; | 
|---|
| 60 | DATE ; Verify date range | 
|---|
| 61 | D DATE^SDQ(.IBQUERY,$G(IBVAL("BDT")),$G(IBVAL("EDT")),"SET",$G(IBZXERR)) | 
|---|
| 62 | Q | 
|---|
| 63 | ; | 
|---|
| 64 | VIS ; Verify visit | 
|---|
| 65 | D VISIT^SDQ(.IBQUERY,$G(IBVAL("VIS")),"SET",$G(IBZXERR)) | 
|---|
| 66 | Q | 
|---|
| 67 | ; | 
|---|
| 68 | EPTR(IBOE) ; Function returns extended pointer for encounter (IBOE) 0-node | 
|---|
| 69 | Q $$ER^SDOE(IBOE) | 
|---|
| 70 | ; | 
|---|
| 71 | SCE(IBOE,PC,NODE,IBZXERR) ; Returns the specific piece or entire node of the enctr | 
|---|
| 72 | ; NODE = the node to return ... if undefined, the 0-node is assumed | 
|---|
| 73 | ; If PC is null or undefined, the whole node is returned, otherwise | 
|---|
| 74 | ;   just the PC-piece is returned | 
|---|
| 75 | ; IBZXERR = the name of the array where errors should be passed back in | 
|---|
| 76 | ;       (pass in quotes I.E.: "IBERR").  If no name passed, errors are | 
|---|
| 77 | ;       not returned | 
|---|
| 78 | N IBX | 
|---|
| 79 | S:$G(NODE)="" NODE=0 | 
|---|
| 80 | I '$G(PC),NODE=0 S IBX=$$GETOE^SDOE(IBOE,$G(IBZXERR)) G SCEQ | 
|---|
| 81 | D GETGEN^SDOE(IBOE,"IBX",$G(IBZXERR)) | 
|---|
| 82 | S IBX=$S($G(PC):$P($G(IBX(NODE)),U,+PC),1:$G(IBX(NODE))) | 
|---|
| 83 | ; | 
|---|
| 84 | SCEQ I $G(IBZXERR)="" K ^TMP("DIERR",$J) | 
|---|
| 85 | Q IBX | 
|---|
| 86 | ; | 
|---|
| 87 | DISND(IBOE,IBOE0,PC,NODE) ; Returns the specific piece or all pieces of "DIS" | 
|---|
| 88 | ; (disposition) of the PATIENT file entry for the encounter IBOE | 
|---|
| 89 | ; NODE = the node to return ... if undefined, the 0-node is assumed | 
|---|
| 90 | ; If PC is null or undefined, the whole node is returned, otherwise | 
|---|
| 91 | ;   just the PC-piece is returned | 
|---|
| 92 | ; IBOE0 = 0-node of encounter file (optional) | 
|---|
| 93 | N DATA,IBOE0 | 
|---|
| 94 | S:$G(NODE)="" NODE=0 | 
|---|
| 95 | I $G(IBOE0)="" S IBOE0=$$SCE(IBOE) | 
|---|
| 96 | S DATA=$G(^DPT(+$P(IBOE0,U,2),"DIS",+$$EPTR^IBSDU(IBOE),NODE)) | 
|---|
| 97 | S:$G(PC) DATA=$P(DATA,U,+PC) | 
|---|
| 98 | Q DATA | 
|---|
| 99 | ; | 
|---|
| 100 | LAST(IBDFN) ; Returns the patient's Last Appointment | 
|---|
| 101 | ; ARRAYS IN DFN MUST BE LOCAL or ^TMP or ^UTILITY | 
|---|
| 102 | ; pass in single DFN or an open array reference (local or global) | 
|---|
| 103 | ; for array of patients, array will = last appt | 
|---|
| 104 | ; if '$d(array(dfn)) returned then unknown for that patient | 
|---|
| 105 | ; Unknown - cannot be determined, N/A - patient has none | 
|---|
| 106 | ; | 
|---|
| 107 | ; | 
|---|
| 108 | N IBARRAY,DFN,DATA,X K ^TMP($J,"SDAMA301") | 
|---|
| 109 | I 'IBDFN,$E(IBDFN)="^",$E(IBDFN,1,5)'="^TMP(",$E(IBDFN,1,9)'="^UTILITY(" S DATA="INVALID DFN" G LASTQ | 
|---|
| 110 | I IBDFN,$$GETICN^MPIF001(IBDFN)<1!($$IFLOCAL^MPIF001(IBDFN)) S DATA="Unknown" G LASTQ | 
|---|
| 111 | I 'IBDFN S DFN=0 F  S DFN=$O(@(IBDFN_DFN_")")) Q:'DFN  I $$GETICN^MPIF001(DFN)<1!($$IFLOCAL^MPIF001(DFN)) K @(IBDFN_DFN_")") | 
|---|
| 112 | I 'IBDFN,$D(@($E(IBDFN,1,$L(IBDFN)-1)_$S(IBDFN[",":")",1:"")))<9 S DATA=0 G LASTQ | 
|---|
| 113 | S IBARRAY(1)=";"_DT | 
|---|
| 114 | S IBARRAY(3)="R;I;NT" | 
|---|
| 115 | S IBARRAY(4)=IBDFN | 
|---|
| 116 | S IBARRAY("FLDS")=1 | 
|---|
| 117 | I IBDFN S IBARRAY("MAX")=-1 | 
|---|
| 118 | S IBARRAY("PURGED")=1 | 
|---|
| 119 | S IBARRAY("SORT")="P" | 
|---|
| 120 | S DATA=$$SDAPI^SDAMA301(.IBARRAY) | 
|---|
| 121 | I IBDFN S DATA=$S(DATA=0:"N/A",DATA=-1:-1,1:$O(^TMP($J,"SDAMA301",IBDFN,0))) | 
|---|
| 122 | I 'IBDFN S (DATA,DFN)=0 F  S DFN=$O(@(IBDFN_DFN_")")) Q:'DFN  S X=$O(^TMP($J,"SDAMA301",DFN,9999999),-1),@(IBDFN_DFN_")")=$S(X:X,1:"N/A"),DATA=DATA+1 | 
|---|
| 123 | ; | 
|---|
| 124 | LASTQ K ^TMP($J,"SDAMA301") | 
|---|
| 125 | Q DATA | 
|---|
| 126 | ; | 
|---|
| 127 | NEXT(IBDFN) ; Returns the patient's Next Appointment | 
|---|
| 128 | ; ARRAYS IN DFN MUST BE LOCAL or ^TMP or ^UTILITY | 
|---|
| 129 | ; pass in single DFN or an open array reference (local or global) | 
|---|
| 130 | ; for array of patients, array will = next appt | 
|---|
| 131 | ; if '$d(array(dfn)) returned then unknown for that patient | 
|---|
| 132 | ; Unknown - cannot be determined, N/A - patient has none | 
|---|
| 133 | ; Pass DATA by reference for list or $$ return for single | 
|---|
| 134 | ; | 
|---|
| 135 | ; | 
|---|
| 136 | N IBARRAY,DFN,DATA,X K ^TMP($J,"SDAMA301") | 
|---|
| 137 | I 'IBDFN,$E(IBDFN)="^",$E(IBDFN,1,5)'="^TMP(",$E(IBDFN,1,9)'="^UTILITY(" S DATA="INVALID DFN" G NEXTQ | 
|---|
| 138 | I IBDFN,$$GETICN^MPIF001(IBDFN)<1!($$IFLOCAL^MPIF001(IBDFN)) S DATA="Unknown" G NEXTQ | 
|---|
| 139 | I 'IBDFN S DFN=0 F  S DFN=$O(@(IBDFN_DFN_")")) Q:'DFN  I $$GETICN^MPIF001(DFN)<1!($$IFLOCAL^MPIF001(DFN)) K @(IBDFN_DFN_")") | 
|---|
| 140 | I 'IBDFN,$D(@($E(IBDFN,1,$L(IBDFN)-1)_$S(IBDFN[",":")",1:"")))<9 S DATA=0 G NEXTQ | 
|---|
| 141 | S IBARRAY(1)=DT | 
|---|
| 142 | S IBARRAY(3)="R;I;NT" | 
|---|
| 143 | S IBARRAY(4)=IBDFN | 
|---|
| 144 | S IBARRAY("FLDS")=1 | 
|---|
| 145 | I IBDFN S IBARRAY("MAX")=1 | 
|---|
| 146 | S IBARRAY("SORT")="P" | 
|---|
| 147 | S DATA=$$SDAPI^SDAMA301(.IBARRAY) | 
|---|
| 148 | I IBDFN S DATA=$S(DATA=0:"N/A",DATA=-1:-1,1:$O(^TMP($J,"SDAMA301",IBDFN,0))) | 
|---|
| 149 | I 'IBDFN S (DATA,DFN)=0 F  S DFN=$O(@(IBDFN_DFN_")")) Q:'DFN  S X=$O(^TMP($J,"SDAMA301",DFN,0)),@(IBDFN_DFN_")")=$S(X:X,1:"N/A"),DATA=DATA+1 | 
|---|
| 150 | ; | 
|---|
| 151 | NEXTQ K ^TMP($J,"SDAMA301") | 
|---|
| 152 | Q DATA | 
|---|
| 153 | ; | 
|---|