Added access controls for encounter categories
[openemr.git] / library / sql-ccr.inc
blob93f69bd19310e81fa18a3b9fcd1d799a8a7a1ce7
1 <?php
2 /**
3  * Functions for CCR.
4  *
5  * Copyright (C) 2010 Garden State Health Systems <http://www.gshsys.com/>
6  *
7  * LICENSE: This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 3
10  * of the License, or (at your option) any later version.
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://opensource.org/licenses/gpl-license.php>;.
17  *
18  * @package OpenEMR
19  * @author  Garden State Health Systems <http://www.gshsys.com/>
20  * @link    http://www.open-emr.org
21  */
24 if($_POST['ccrAction'] == 'generate'){
25     if(isset($_POST['show_date'])){
26         $set = "on";
27         $start = $_POST['Start'];
28         $start = $start." 00:00:00";
29         $end = $_POST['End'];
30         $end = $end." 23:59:59";
31     }
34 function getHeaderData()
37 // Reserved for future use
38     
41 function getMedicationData()
43     global $pid,$set,$start,$end;
44     if($set == "on"){
45         $sql = " 
46       SELECT prescriptions.date_added ,
47         prescriptions.patient_id,
48         prescriptions.start_date,
49         prescriptions.quantity,
50         prescriptions.interval,
51         prescriptions.note,
52         prescriptions.drug,
53         prescriptions.medication,
54         IF(prescriptions.active=1,'Active','Prior History No Longer Active') AS active,
55         prescriptions.provider_id,
56         prescriptions.size,
57         prescriptions.rxnorm_drugcode,
58         IFNULL(prescriptions.refills,0) AS refills,
59         lo2.title AS form,
60         lo.title
61       FROM prescriptions 
62       LEFT JOIN list_options AS lo
63       ON lo.list_id = 'drug_units' AND prescriptions.unit = lo.option_id AND lo.activity = 1
64       LEFT JOIN list_options AS lo2
65       ON lo2.list_id = 'drug_form' AND prescriptions.form = lo2.option_id AND lo2.activity = 1
66       WHERE prescriptions.patient_id = ?
67       AND prescriptions.date_added BETWEEN ? AND ?
68       UNION
69       SELECT 
70         DATE(DATE) AS date_added,
71         pid AS patient_id,
72         begdate AS start_date,
73         '' AS quantity,
74         '' AS `interval`,
75         comments AS note,
76         title AS drug,
77         '' AS medication,
78         IF((isnull(enddate) OR enddate = '0000-00-00' OR enddate >= CURDATE()),'Active','Prior History No Longer Active') AS active,
79         '' AS provider_id,
80         '' AS size,
81 '' AS rxnorm_drugcode,
82         0 AS refills,
83         '' AS form,
84         '' AS title 
85       FROM
86         lists 
87       WHERE `type` = 'medication' 
88         AND pid = ?
89         AND `date` BETWEEN ? AND ?";
90         $result = sqlStatement($sql, array($pid,$start,$end,$pid,$start,$end) );
91     }else{
92         $sql = " 
93       SELECT prescriptions.date_added ,
94         prescriptions.patient_id,
95         prescriptions.start_date,
96         prescriptions.quantity,
97         prescriptions.interval,
98         prescriptions.note,
99         prescriptions.drug,
100         prescriptions.medication,
101         IF(prescriptions.active=1,'Active','Prior History No Longer Active') AS active,
102         prescriptions.provider_id,
103         prescriptions.size,
104         prescriptions.rxnorm_drugcode,
105         IFNULL(prescriptions.refills,0) AS refills,
106         lo2.title AS form,
107         lo.title
108       FROM prescriptions 
109       LEFT JOIN list_options AS lo
110       ON lo.list_id = 'drug_units' AND prescriptions.unit = lo.option_id AND lo.activity = 1
111       LEFT JOIN list_options AS lo2
112       ON lo2.list_id = 'drug_form' AND prescriptions.form = lo2.option_id AND lo2.activity = 1
113       WHERE prescriptions.patient_id = ?
114       UNION
115       SELECT 
116         DATE(DATE) AS date_added,
117         pid AS patient_id,
118         begdate AS start_date,
119         '' AS quantity,
120         '' AS `interval`,
121         comments AS note,
122         title AS drug,
123         '' AS medication,
124         IF((isnull(enddate) OR enddate = '0000-00-00' OR enddate >= CURDATE()),'Active','Prior History No Longer Active') AS active,
125         '' AS provider_id,
126         '' AS size,
127         '' AS rxnorm_drugcode,
128         0 AS refills,
129         '' AS form,
130         '' AS title 
131       FROM
132         lists 
133       WHERE `type` = 'medication' 
134         AND pid = ?";
135         $result = sqlStatement($sql, array($pid,$pid) );
136     }
137     return $result;
140 function getImmunizationData()
142     global $pid,$set,$start,$end;
143     if($set == "on"){
144         $sql = "SELECT
145       immunizations.administered_date,
146       immunizations.patient_id,
147       immunizations.vis_date,
148       immunizations.note,
149       immunizations.immunization_id,
150       immunizations.manufacturer,
151       codes.code_text AS title
152     FROM immunizations 
153     LEFT JOIN codes ON immunizations.cvx_code = codes.code
154     LEFT JOIN code_types ON codes.code_type = code_types.ct_id
155     WHERE immunizations.patient_id = ? AND code_types.ct_key = 'CVX' AND immunizations.added_erroneously = 0
156     AND create_date BETWEEN ? AND ?" ;
157         $result = sqlStatement($sql, array($pid,$start,$end) );
158     }else{
159         $sql = "SELECT
160       immunizations.administered_date,
161       immunizations.patient_id,
162       immunizations.vis_date,
163       immunizations.note,
164       immunizations.immunization_id,
165       immunizations.manufacturer,
166       codes.code_text AS title
167     FROM immunizations 
168     LEFT JOIN codes ON immunizations.cvx_code = codes.code
169     LEFT JOIN code_types ON codes.code_type = code_types.ct_id
170     WHERE immunizations.patient_id = ? AND immunizations.added_erroneously = 0 AND code_types.ct_key = 'CVX'";
171         $result = sqlStatement($sql, array($pid) );
172     }
173     return $result;
177 function getProcedureData()
180     global $pid,$set,$start,$end;
181     if($set == "on"){
182         $sql = " 
183     SELECT 
184       lists.title as proc_title,
185       lists.date as `date`,
186       list_options.title as outcome,
187       '' as laterality,
188       '' as body_site,
189       lists.type as `type`,
190       lists.diagnosis as `code`,
191       IF(SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1) = 'ICD9','ICD9-CM',SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1)) AS coding
192     FROM
193       lists 
194       LEFT JOIN issue_encounter 
195         ON issue_encounter.list_id = lists.id 
196       LEFT JOIN form_encounter 
197         ON form_encounter.encounter = issue_encounter.encounter 
198       LEFT JOIN facility 
199         ON form_encounter.facility_id = facility.id 
200       LEFT JOIN users 
201         ON form_encounter.provider_id = users.id 
202       LEFT JOIN list_options
203         ON lists.outcome = list_options.option_id
204         AND list_options.list_id = 'outcome' AND list_options.activity = 1
205     WHERE lists.type = 'surgery' 
206       AND lists.pid = ?
207       AND lists.date BETWEEN ? AND ?
208     UNION
209     SELECT 
210       pt.name as proc_title,
211       prs.date as `date`,
212       '' as outcome,
213       ptt.laterality as laterality,
214       ptt.body_site as body_site,
215       'Lab Order' as `type`,
216       ptt.standard_code as `code`,
217       IF(SUBSTRING(ptt.standard_code,1,LOCATE(':',ptt.standard_code)-1) = 'ICD9','ICD9-CM',SUBSTRING(ptt.standard_code,1,LOCATE(':',ptt.standard_code)-1)) AS coding
218     FROM
219       procedure_result AS prs 
220       LEFT JOIN procedure_report AS prp 
221         ON prs.procedure_report_id = prp.procedure_report_id 
222       LEFT JOIN procedure_order AS po 
223         ON prp.procedure_order_id = po.procedure_order_id 
224       LEFT JOIN procedure_order_code AS poc
225         ON poc.procedure_order_id = po.procedure_order_id
226         AND poc.procedure_order_seq = prp.procedure_order_seq
227       LEFT JOIN procedure_type AS pt 
228         ON pt.lab_id = po.lab_id
229         AND pt.procedure_code = prs.result_code
230         AND pt.procedure_type = 'res'
231       LEFT JOIN procedure_type AS ptt 
232         ON pt.parent = ptt.procedure_type_id 
233         AND ptt.procedure_type = 'ord' 
234       LEFT JOIN list_options AS lo 
235         ON lo.list_id = 'proc_unit' 
236         AND pt.units = lo.option_id AND lo.activity = 1
237     WHERE po.patient_id = ?
238     AND prs.date BETWEEN ? AND ?";
239   
240         $result = sqlStatement($sql, array($pid,$start,$end,$pid,$start,$end) );
241     }else{
242         $sql = " 
243     SELECT 
244       lists.title as proc_title,
245       lists.date as `date`,
246       list_options.title as outcome,
247       '' as laterality,
248       '' as body_site,
249       lists.type as `type`,
250       lists.diagnosis as `code`,
251       IF(SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1) = 'ICD9','ICD9-CM',SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1)) AS coding
252     FROM
253       lists 
254       LEFT JOIN issue_encounter 
255         ON issue_encounter.list_id = lists.id 
256       LEFT JOIN form_encounter 
257         ON form_encounter.encounter = issue_encounter.encounter 
258       LEFT JOIN facility 
259         ON form_encounter.facility_id = facility.id 
260       LEFT JOIN users 
261         ON form_encounter.provider_id = users.id 
262       LEFT JOIN list_options
263         ON lists.outcome = list_options.option_id
264         AND list_options.list_id = 'outcome' AND list_options.activity = 1
265     WHERE lists.type = 'surgery' 
266       AND lists.pid = ? 
267     UNION
268     SELECT 
269       pt.name as proc_title,
270       prs.date as `date`,
271       '' as outcome,
272       ptt.laterality as laterality,
273       ptt.body_site as body_site,
274       'Lab Order' as `type`,
275       ptt.standard_code as `code`,
276       IF(SUBSTRING(ptt.standard_code,1,LOCATE(':',ptt.standard_code)-1) = 'ICD9','ICD9-CM',SUBSTRING(ptt.standard_code,1,LOCATE(':',ptt.standard_code)-1)) AS coding
277     FROM
278       procedure_result AS prs 
279       LEFT JOIN procedure_report AS prp 
280         ON prs.procedure_report_id = prp.procedure_report_id 
281       LEFT JOIN procedure_order AS po 
282         ON prp.procedure_order_id = po.procedure_order_id
283       LEFT JOIN procedure_order_code AS poc
284         ON poc.procedure_order_id = po.procedure_order_id
285         AND poc.procedure_order_seq = prp.procedure_order_seq
286       LEFT JOIN procedure_type AS pt 
287         ON pt.lab_id = po.lab_id
288         AND pt.procedure_code = prs.result_code
289         AND pt.procedure_type = 'res'
290       LEFT JOIN procedure_type AS ptt 
291         ON pt.parent = ptt.procedure_type_id 
292         AND ptt.procedure_type = 'ord' 
293       LEFT JOIN list_options AS lo 
294         ON lo.list_id = 'proc_unit' 
295         AND pt.units = lo.option_id AND lo.activity = 1
296     WHERE po.patient_id = ? ";
297   
298         $result = sqlStatement($sql, array($pid,$pid) );
299     }
300     return $result;
304 function getProblemData()
307   # Note we are hard-coding (only allowing) problems that have been coded to ICD9. Would
308   #  be easy to upgrade this to other codesets in future (ICD10,SNOMED) by using already
309   #  existant flags in the code_types table.
310   # Additionally, only using problems that have one diagnosis code set in diagnosis field.
311   #  Note OpenEMR allows multiple codes set per problem, but will limit to showing only
312   #  problems with one diagnostic code set in order to maintain previous behavior
313   #  (this will likely need to be dealt with at some point; ie. support multiple dx codes per problem).
315     global $pid,$set,$start,$end;
316     if($set == "on"){
317         $sql = " 
318     SELECT fe.encounter, fe.reason, fe.provider_id, u.title, u.fname, u.lname, 
319       fe.facility_id, f.street, f.city, f.state, ie.list_id, l.pid, l.title AS prob_title, l.diagnosis, 
320       l.outcome, l.groupname, l.begdate, l.enddate, l.type, l.comments , l.date
321     FROM lists AS l 
322     LEFT JOIN issue_encounter AS ie ON ie.list_id = l.id
323     LEFT JOIN form_encounter AS fe ON fe.encounter = ie.encounter
324     LEFT JOIN facility AS f ON fe.facility_id = f.id
325     LEFT JOIN users AS u ON fe.provider_id = u.id
326     WHERE l.type = 'medical_problem' AND l.pid=? AND l.diagnosis LIKE 'ICD9:%'
327     AND l.diagnosis NOT LIKE '%;%'
328     AND l.date BETWEEN ? AND ?";
329         $result = sqlStatement($sql, array($pid,$start,$end) );
330     }else{
331         $sql = " 
332     SELECT fe.encounter, fe.reason, fe.provider_id, u.title, u.fname, u.lname, 
333       fe.facility_id, f.street, f.city, f.state, ie.list_id, l.pid, l.title AS prob_title, l.diagnosis, 
334       l.outcome, l.groupname, l.begdate, l.enddate, l.type, l.comments , l.date
335     FROM lists AS l 
336     LEFT JOIN issue_encounter AS ie ON ie.list_id = l.id
337     LEFT JOIN form_encounter AS fe ON fe.encounter = ie.encounter
338     LEFT JOIN facility AS f ON fe.facility_id = f.id
339     LEFT JOIN users AS u ON fe.provider_id = u.id
340     WHERE l.type = 'medical_problem' AND l.pid=? AND l.diagnosis LIKE 'ICD9:%'
341     AND l.diagnosis NOT LIKE '%;%'";
342         $result = sqlStatement($sql, array($pid) );
343     }
344     return $result;
348 function getAlertData()
351     global $pid,$set,$start,$end;
352     if($set == "on"){
353         $sql = " 
354     select fe.reason, fe.provider_id, fe.facility_id, fe.encounter,
355       ie.list_id, l.pid, l.title as alert_title, l.outcome, 
356       l.groupname, l.begdate, l.enddate, l.type, l.diagnosis, l.date ,
357       l.reaction , l.comments ,
358         f.street, f.city, f.state, u.title, u.fname, u.lname, cd.code_text
359     from lists as l 
360     left join issue_encounter as ie
361     on ie.list_id = l.id
362     left join form_encounter as fe
363     on fe.encounter = ie.encounter
364     left join facility as f
365     on fe.facility_id = f.id
366     left join users as u
367     on fe.provider_id = u.id
368     left join codes as cd
369     on cd.code = SUBSTRING(l.diagnosis, LOCATE(':',l.diagnosis)+1)
370     where l.type = 'allergy' and l.pid=?
371     AND l.date BETWEEN ? AND ?";
372     
373         $result = sqlStatement($sql, array($pid,$start,$end) );
374     }else{
375         $sql = " 
376     select fe.reason, fe.provider_id, fe.facility_id, fe.encounter,
377       ie.list_id, l.pid, l.title as alert_title, l.outcome, 
378       l.groupname, l.begdate, l.enddate, l.type, l.diagnosis, l.date ,
379       l.reaction , l.comments ,
380         f.street, f.city, f.state, u.title, u.fname, u.lname, cd.code_text
381     from lists as l 
382     left join issue_encounter as ie
383     on ie.list_id = l.id
384     left join form_encounter as fe
385     on fe.encounter = ie.encounter
386     left join facility as f
387     on fe.facility_id = f.id
388     left join users as u
389     on fe.provider_id = u.id
390     left join codes as cd
391     on cd.code = SUBSTRING(l.diagnosis, LOCATE(':',l.diagnosis)+1)
392     where l.type = 'allergy' and l.pid=?";
393       
394         $result = sqlStatement($sql, array($pid) );
395     }
396     return $result;
400 function getResultData()
403     global $pid,$set,$start,$end;
404     if($set == "on"){
405         $sql = "
406       SELECT 
407         prs.procedure_result_id as `pid`,
408         pt.name as `name`,
409         pt.procedure_type_id as `type`,
410         prs.date as `date`,
411         concat_ws(' ',prs.result,lo.title) as `result`,
412         prs.range as `range`,
413         prs.abnormal as `abnormal`,
414         prs.comments as `comments`,
415         ptt.lab_id AS `lab`
416       FROM
417         procedure_result AS prs 
418         LEFT JOIN procedure_report AS prp 
419           ON prs.procedure_report_id = prp.procedure_report_id 
420         LEFT JOIN procedure_order AS po 
421           ON prp.procedure_order_id = po.procedure_order_id
422         LEFT JOIN procedure_order_code AS poc
423           ON poc.procedure_order_id = po.procedure_order_id
424           AND poc.procedure_order_seq = prp.procedure_order_seq
425         LEFT JOIN procedure_type AS pt 
426           ON pt.lab_id = po.lab_id
427           AND pt.procedure_code = prs.result_code
428           AND pt.procedure_type = 'res'
429         LEFT JOIN procedure_type AS ptt 
430           ON pt.parent = ptt.procedure_type_id
431           AND ptt.procedure_type = 'ord'
432         LEFT JOIN list_options AS lo
433           ON lo.list_id = 'proc_unit' AND pt.units = lo.option_id AND lo.activity = 1
434       WHERE po.patient_id=?
435       AND prs.date BETWEEN ? AND ?";
436         
437         $result = sqlStatement($sql, array($pid,$start,$end) );
438     }else{
439         $sql = "
440       SELECT 
441         prs.procedure_result_id as `pid`,
442         pt.name as `name`,
443         pt.procedure_type_id as `type`,
444         prs.date as `date`,
445         concat_ws(' ',prs.result,lo.title) as `result`,
446         prs.range as `range`,
447         prs.abnormal as `abnormal`,
448         prs.comments as `comments`,
449         ptt.lab_id AS `lab`
450       FROM
451         procedure_result AS prs 
452         LEFT JOIN procedure_report AS prp 
453           ON prs.procedure_report_id = prp.procedure_report_id 
454         LEFT JOIN procedure_order AS po 
455           ON prp.procedure_order_id = po.procedure_order_id
456         LEFT JOIN procedure_order_code AS poc
457           ON poc.procedure_order_id = po.procedure_order_id
458           AND poc.procedure_order_seq = prp.procedure_order_seq
459         LEFT JOIN procedure_type AS pt 
460           ON pt.lab_id = po.lab_id
461           AND pt.procedure_code = prs.result_code
462           AND pt.procedure_type = 'res'
463         LEFT JOIN procedure_type AS ptt 
464           ON pt.parent = ptt.procedure_type_id
465           AND ptt.procedure_type = 'ord'
466         LEFT JOIN list_options AS lo
467           ON lo.list_id = 'proc_unit' AND pt.units = lo.option_id AND lo.activity = 1
468       WHERE po.patient_id=?";
469         
470         $result = sqlStatement($sql, array($pid) );
471     }
472     return $result;
476 function getActorData()
478     global $pid;
480     $sql = " 
481         select fname, lname, DOB, sex, pid, street, city, state, postal_code, phone_contact
482         from patient_data
483         where pid=?";
484         
485     $result[0] = sqlStatement($sql, array($pid) );
486   
487     $sql2 = " 
488         SELECT * FROM users AS u LEFT JOIN facility AS f ON u.facility_id = f.id WHERE u.id=?";
489         
490     $result[1] = sqlStatement($sql2, array($_SESSION['authUserID']) );
491   
492     $sql3 = "
493   SELECT 
494     u.ppid AS id, u.name AS lname, '' AS fname, '' AS city, '' AS state, '' AS zip, '' AS phone
495   FROM
496     procedure_order AS po 
497     LEFT JOIN forms AS f
498       ON f.form_id = po.procedure_order_id 
499       AND f.formdir = 'procedure_order'
500     LEFT JOIN list_options AS lo 
501       ON lo.title = f.form_name AND lo.activity = 1
502     LEFT JOIN procedure_providers AS u
503       ON po.lab_id = u.ppid
504   WHERE f.pid = ? 
505     AND lo.list_id = 'proc_type' 
506     AND lo.option_id = 'ord'
507     GROUP BY u.ppid";
508         
509     $result[2] = sqlStatement($sql3, array($pid) );
510   
511     return $result;
515 function getReportFilename()
517     global $pid;
519     $sql = "
520     select fname, lname, pid
521     from patient_data
522     where pid=?";
524     $result = sqlQuery($sql, array($pid) );
525     $result_filename = $result['lname']."-".$result['fname']."-".$result['pid']."-".date("mdY",time());
527     return $result_filename;