1 | RORUTL02 ;HCIOFO/SG - UTILITIES ; 8/25/05 10:20am
|
---|
2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
|
---|
3 | ;
|
---|
4 | ; This routine uses the following IAs:
|
---|
5 | ;
|
---|
6 | ; #2701 $$GETICN^MPIF001 Gets ICN (supported)
|
---|
7 | ; #3556 $$GCPR^LA7QRY
|
---|
8 | ; #3557 Access to the field .01 and x-ref "B"
|
---|
9 | ; of the file 95.3
|
---|
10 | ; #3646 $$EMPL^DGSEC4
|
---|
11 | ; #10035 Access to the field #.09 of the file #2
|
---|
12 | ;
|
---|
13 | Q
|
---|
14 | ;
|
---|
15 | ;***** REMOVES THE INACTIVE REGISTRIES FROM THE LIST
|
---|
16 | ;
|
---|
17 | ; .REGLST( A list of registry names (as subscripts)
|
---|
18 | ; RegName) Registry IEN (output)
|
---|
19 | ;
|
---|
20 | ; Return values:
|
---|
21 | ; <0 Error code
|
---|
22 | ; 0 Ok
|
---|
23 | ;
|
---|
24 | ; This function removes names of those registries that are
|
---|
25 | ; inactive or cannot be updated for any other reasons from
|
---|
26 | ; the list. It also associates registry IENs with the names
|
---|
27 | ; of registries remaining on the list.
|
---|
28 | ;
|
---|
29 | ; Moreover, it records corresponding messages about skipped
|
---|
30 | ; registries to the current open log.
|
---|
31 | ;
|
---|
32 | ARLST(REGLST) ;
|
---|
33 | N INFO,RC,REGIEN,REGNAME,RORBUF,TMP K DSTLST
|
---|
34 | S REGNAME="",RC=0
|
---|
35 | F S REGNAME=$O(REGLST(REGNAME)) Q:REGNAME="" D Q:RC<0
|
---|
36 | . S REGIEN=$$REGIEN(REGNAME,"@;11I;21.05I",.RORBUF)
|
---|
37 | . ;--- Cannot find (or load) the registry parameters
|
---|
38 | . I REGIEN'>0 D Q
|
---|
39 | . . D ERROR^RORERR(REGIEN,,REGNAME)
|
---|
40 | . . K REGLST(REGNAME)
|
---|
41 | . ;--- Check if the registry is marked as 'inactive'
|
---|
42 | . I $G(RORBUF("DILIST","ID",1,11)) D Q
|
---|
43 | . . D ERROR^RORERR(-48,,,,REGNAME)
|
---|
44 | . . K REGLST(REGNAME)
|
---|
45 | . ;--- Check if the registry has not been populated
|
---|
46 | . I '$G(RORBUF("DILIST","ID",1,21.05)),'$G(RORPARM("SETUP")) D Q
|
---|
47 | . . D TEXT^RORTXT(7980000.02,.INFO)
|
---|
48 | . . D ERROR^RORERR(-103,,.INFO,,REGNAME)
|
---|
49 | . . K INFO,REGLST(REGNAME)
|
---|
50 | . ;--- Store the registry IEN
|
---|
51 | . S REGLST(REGNAME)=REGIEN
|
---|
52 | Q RC
|
---|
53 | ;
|
---|
54 | ;***** RETURNS A FULL ICN OF THE PATIENT
|
---|
55 | ;
|
---|
56 | ; PTIEN Patient IEN
|
---|
57 | ;
|
---|
58 | ; Return Values:
|
---|
59 | ; <0 Error code
|
---|
60 | ; "" ICN has not been assigned
|
---|
61 | ; >0 Patient ICN
|
---|
62 | ;
|
---|
63 | ICN(PTIEN) ;
|
---|
64 | N ICN,L,TMP
|
---|
65 | S ICN=$$GETICN^MPIF001(PTIEN)
|
---|
66 | I ICN'>0 D Q ""
|
---|
67 | . S TMP=$$ERROR^RORERR(-57,,$P(ICN,U,2),PTIEN,+ICN,"$$GETICN^MPIF001")
|
---|
68 | ;--- Validate the checksum (just in case ;-)
|
---|
69 | S L=$L($P(ICN,"V",2))
|
---|
70 | Q $S(L<6:$P(ICN,"V")_"V"_$E("000000",1,6-L)_$P(ICN,"V",2),1:ICN)
|
---|
71 | ;
|
---|
72 | ;***** LOADS THE LAB RESULTS
|
---|
73 | ;
|
---|
74 | ; PTIEN Patient IEN
|
---|
75 | ;
|
---|
76 | ; SDT Start date of the results
|
---|
77 | ; EDT End date of the results
|
---|
78 | ;
|
---|
79 | ; [ROR8DST] Closed root of the destination array
|
---|
80 | ; (the ^TMP("RORTMP",$J) node, by default)
|
---|
81 | ;
|
---|
82 | ; Return values:
|
---|
83 | ; <0 Error code
|
---|
84 | ; 0 Ok
|
---|
85 | ;
|
---|
86 | LABRSLTS(PTIEN,SDT,EDT,ROR8DST) ;
|
---|
87 | N H7CH,RC,RORMSG,TMP
|
---|
88 | S:$G(ROR8DST)="" ROR8DST=$NA(^TMP("RORTMP",$J))
|
---|
89 | K @ROR8DST
|
---|
90 | I $D(RORLRC)<10 Q:$G(RORLRC)="" 0
|
---|
91 | ;--- Get the Patient ID (ICN or SSN)
|
---|
92 | S PTID=$$PTID(PTIEN) Q:PTID<0 PTID
|
---|
93 | ;--- Get the Lab data
|
---|
94 | S H7CH=$G(RORHL("FS"))_$G(RORHL("ECH"))
|
---|
95 | S RC=$$GCPR^LA7QRY(PTID,SDT,EDT,.RORLRC,"*",.RORMSG,ROR8DST,H7CH)
|
---|
96 | I RC="",$D(RORMSG)>1 D
|
---|
97 | . N ERR,I,LST
|
---|
98 | . S (ERR,LST)=""
|
---|
99 | . F I=1:1 S ERR=$O(RORMSG(ERR)) Q:ERR="" D
|
---|
100 | . . S LST=LST_","_ERR,TMP=RORMSG(ERR)
|
---|
101 | . . K RORMSG(ERR) S RORMSG(I)=TMP
|
---|
102 | . S LST=$P(LST,",",2,999) Q:(LST=3)!(LST=99)
|
---|
103 | . S RC=$$ERROR^RORERR(-27,,.RORMSG,PTIEN)
|
---|
104 | Q $S(RC<0:RC,1:0)
|
---|
105 | ;
|
---|
106 | ;***** RETURNS THE LOINC CODE WITH THE CONTROL DIGIT
|
---|
107 | ;
|
---|
108 | ; LNCODE LOINC code
|
---|
109 | ;
|
---|
110 | ; Besides adding a control digit to the LOINC code, the function
|
---|
111 | ; checks the code against the LAB LOINC file (#95.3).
|
---|
112 | ;
|
---|
113 | ; Return values:
|
---|
114 | ; <0 Error code
|
---|
115 | ; >0 LOINC code with the control digit
|
---|
116 | ;
|
---|
117 | LNCODE(LNCODE) ;
|
---|
118 | N RC,RORBUF,RORMSG
|
---|
119 | D FIND^DIC(95.3,,"@;.01E","X",$P(LNCODE,"-"),2,"B",,,"RORBUF","RORMSG")
|
---|
120 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,95.3)
|
---|
121 | I $G(RORBUF("DILIST",0))<1 D Q RC ; Non-existent code
|
---|
122 | . S RC=$$ERROR^RORERR(-29,,,,LNCODE)
|
---|
123 | I $G(RORBUF("DILIST",0))>1 D Q RC ; Duplicate records
|
---|
124 | . S RC=$$ERROR^RORERR(-30,,,,LNCODE)
|
---|
125 | Q RORBUF("DILIST","ID",1,.01)
|
---|
126 | ;
|
---|
127 | ;***** LOCK/UNLOCK REGISTRIES BEING PROCESSED
|
---|
128 | ;
|
---|
129 | ; .REGLST Reference to a local array containing registry names
|
---|
130 | ; as subscripts and optional registry IENs as values
|
---|
131 | ; [MODE] 0 - Unlock (default), 1 - Lock
|
---|
132 | ; [TO] LOCK timeout (3 sec by defualt)
|
---|
133 | ; [NAME] Name of the process/task
|
---|
134 | ;
|
---|
135 | ; Return Values:
|
---|
136 | ; <0 Error code
|
---|
137 | ; 0 Some of the registries has been locked by another job
|
---|
138 | ; 1 Ok
|
---|
139 | ;
|
---|
140 | LOCKREG(REGLST,MODE,TO,NAME) ;
|
---|
141 | Q:$D(REGLST)<10 1
|
---|
142 | N LOCKLST,RC,REGIEN,REGNAME
|
---|
143 | S REGNAME=""
|
---|
144 | F S REGNAME=$O(REGLST(REGNAME)) Q:REGNAME="" D Q:REGIEN<0
|
---|
145 | . S REGIEN=+$G(REGLST(REGNAME))
|
---|
146 | . I REGIEN'>0 S REGIEN=$$REGIEN^RORUTL02(REGNAME) Q:REGIEN'>0
|
---|
147 | . S LOCKLST(798.1,REGIEN_",")=""
|
---|
148 | Q:$G(REGIEN)<0 REGIEN
|
---|
149 | Q:$D(LOCKLST)<10 1
|
---|
150 | I $G(MODE) D
|
---|
151 | . S RC=$$LOCK^RORLOCK(.LOCKLST,,,+$G(TO,3),$G(NAME))
|
---|
152 | E S RC=$$UNLOCK^RORLOCK(.LOCKLST)
|
---|
153 | Q $S('RC:1,RC<0:RC,1:0)
|
---|
154 | ;
|
---|
155 | ;***** RETURNS A PATIENT ID (ICN OR SSN)
|
---|
156 | ;
|
---|
157 | ; PTIEN Patient IEN
|
---|
158 | ;
|
---|
159 | ; Return Values:
|
---|
160 | ; <0 Error code
|
---|
161 | ; "" Neither ICN nor SSN has been assigned
|
---|
162 | ; >0 Patient ICN (or SSN if ICN is not available)
|
---|
163 | ;
|
---|
164 | PTID(PTIEN) ;
|
---|
165 | N L,PTID,RC,RORMSG
|
---|
166 | S PTID=$$GETICN^MPIF001(PTIEN)
|
---|
167 | I PTID>0 D Q PTID
|
---|
168 | . ;--- Validate the checksum (just in case ;-)
|
---|
169 | . S L=$L($P(PTID,"V",2)) Q:L'<6
|
---|
170 | . ;S RC=$$ERROR^RORERR(-59,,,PTIEN)
|
---|
171 | . S $P(PTID,"V",2)=$E("000000",1,6-L)_$P(PTID,"V",2)
|
---|
172 | ;--- Get SSN if ICN is not available
|
---|
173 | S PTID=$$GET1^DIQ(2,PTIEN_",",.09,,,"RORMSG")
|
---|
174 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,PTIEN,2)
|
---|
175 | Q PTID
|
---|
176 | ;
|
---|
177 | ;***** RETURNS IEN OF THE REGISTRY PARAMETERS
|
---|
178 | ;
|
---|
179 | ; REGNAME Name of the registry
|
---|
180 | ; [FIELDS] List of fields (separated by semicolons) to load
|
---|
181 | ; [.RORTRGT] Reference to a local variable where field values will
|
---|
182 | ; be stored by the FIND^DIC call
|
---|
183 | ;
|
---|
184 | ; Return Values:
|
---|
185 | ; <0 Error code
|
---|
186 | ; >0 Registry parameters IEN
|
---|
187 | ;
|
---|
188 | REGIEN(REGNAME,FIELDS,RORTRGT) ;
|
---|
189 | N RC,REGIEN,RORMSG K RORTRGT
|
---|
190 | D FIND^DIC(798.1,,"@;"_$G(FIELDS),"UX",REGNAME,2,"B",,,"RORTRGT","RORMSG")
|
---|
191 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1)
|
---|
192 | S RC=+$G(RORTRGT("DILIST",0))
|
---|
193 | Q $S(RC<1:-1,RC>1:-2,1:+RORTRGT("DILIST",2,1))
|
---|
194 | ;
|
---|
195 | ;***** RETURNS NUMBER OF RECORDS IN THE REGISTRY
|
---|
196 | ;
|
---|
197 | ; REGIEN Registry IEN
|
---|
198 | ; [.LOWIEN] The smallest IEN will be returned via this parameter
|
---|
199 | ; [.HIGHIEN] The biggest IEN will be returned via this parameter
|
---|
200 | ;
|
---|
201 | ; Return Values:
|
---|
202 | ; <0 Error code
|
---|
203 | ; 0 The registry is empty
|
---|
204 | ; >0 Number of records in the registry
|
---|
205 | ;
|
---|
206 | REGSIZE(REGIEN,LOWIEN,HIGHIEN) ;
|
---|
207 | N I,NODE,NRE,RC,RORFDA,RORMSG
|
---|
208 | S NODE=$NA(^RORDATA(798,"AC",REGIEN))
|
---|
209 | S LOWIEN=$O(@NODE@(""))
|
---|
210 | S HIGHIEN=$O(@NODE@(""),-1)
|
---|
211 | ;--- Get number of records from the parameters
|
---|
212 | S NRE=$$GET1^DIQ(798.1,REGIEN_",",19.1,,,"RORMSG")
|
---|
213 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.1,REGIEN)
|
---|
214 | Q:NRE>0 NRE
|
---|
215 | ;--- Count the records of the registry
|
---|
216 | S I="",NRE=0
|
---|
217 | F S I=$O(@NODE@(I)) Q:I="" S NRE=NRE+1
|
---|
218 | ;--- Store the value in the parameters
|
---|
219 | S RORFDA(798.1,REGIEN_",",19.1)=NRE
|
---|
220 | D FILE^DIE("K","RORFDA","RORMSG")
|
---|
221 | Q NRE
|
---|
222 | ;
|
---|
223 | ;***** CHECKS IF AN EMPLOYEE SHOULD BE SKIPPED
|
---|
224 | ;
|
---|
225 | ; PTIEN Patient IEN
|
---|
226 | ;
|
---|
227 | ; [.]REGIEN Registry IEN
|
---|
228 | ;
|
---|
229 | ; If you are going to call this function for several
|
---|
230 | ; patients in a row (in a cycle), you can pass the
|
---|
231 | ; second parameter by reference. This will eliminate
|
---|
232 | ; repetitive access to the registry parameters (the
|
---|
233 | ; REGIEN("SE") node will be used as a "cache" for the
|
---|
234 | ; value of the EXCLUDE EMPLOYEES field).
|
---|
235 | ;
|
---|
236 | ; Return Values:
|
---|
237 | ; 0 Patient can be added to the registry
|
---|
238 | ; 1 Patient should be skipped
|
---|
239 | ;
|
---|
240 | ; The function checks if the patient is an employee and if he/she
|
---|
241 | ; can be added to the registry (according to the value of the
|
---|
242 | ; EXCLUDE EMPLOYEES field of the ROR REGISTRY PARAMETERS file).
|
---|
243 | ;
|
---|
244 | SKIPEMPL(PTIEN,REGIEN) ;
|
---|
245 | Q:'$$EMPL^DGSEC4(PTIEN,"P") 0
|
---|
246 | S:'$D(REGIEN("SE")) REGIEN("SE")=+$P($G(^ROR(798.1,+REGIEN,0)),U,10)
|
---|
247 | Q +REGIEN("SE")
|
---|
248 | ;
|
---|
249 | ;***** RETURNS IEN OF THE SELECTION RULE
|
---|
250 | ;
|
---|
251 | ; RULENAME Name of the selection rule
|
---|
252 | ; [FIELDS] List of fields (separated by semicolons) to load
|
---|
253 | ; [.RORTRGT] Reference to a local variable where field values will
|
---|
254 | ; be stored by the FIND^DIC call.
|
---|
255 | ;
|
---|
256 | ; Return Values:
|
---|
257 | ; <0 Error code
|
---|
258 | ; >0 Selection rule IEN
|
---|
259 | ;
|
---|
260 | SRLIEN(RULENAME,FIELDS,RORTRGT) ;
|
---|
261 | N RC,RULEIEN,RORMSG K RORTRGT
|
---|
262 | D FIND^DIC(798.2,,"@;"_$G(FIELDS),"X",RULENAME,2,"B",,,"RORTRGT","RORMSG")
|
---|
263 | Q:$G(DIERR) $$DBS^RORERR("RORMSG",-9,,,798.2)
|
---|
264 | S RC=+$G(RORTRGT("DILIST",0))
|
---|
265 | Q $S(RC<1:-3,RC>1:-4,1:+RORTRGT("DILIST",2,1))
|
---|