Additional fixes, mostly due to changes in schema for procedure orders and results.
[openemr.git] / library / sql-ccr.inc
blob20677bd6df082a79288f7bdec9ff44d433363ee3
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() {
36 // Reserved for future use
37         
40 function getMedicationData() {
41         global $pid,$set,$start,$end;
42   if($set == "on"){
43     $sql = " 
44       SELECT prescriptions.date_added ,
45         prescriptions.patient_id,
46         prescriptions.start_date,
47         prescriptions.quantity,
48         prescriptions.interval,
49         prescriptions.note,
50         prescriptions.drug,
51         prescriptions.medication,
52         IF(prescriptions.active=1,'Active','Prior History No Longer Active') AS active,
53         prescriptions.provider_id,
54         prescriptions.size,
55         prescriptions.rxnorm_drugcode,
56         IFNULL(prescriptions.refills,0) AS refills,
57         lo2.title AS form,
58         lo.title
59       FROM prescriptions 
60       LEFT JOIN list_options AS lo
61       ON lo.list_id = 'drug_units' AND prescriptions.unit = lo.option_id
62       LEFT JOIN list_options AS lo2
63       ON lo2.list_id = 'drug_form' AND prescriptions.form = lo2.option_id
64       WHERE prescriptions.patient_id = ?
65       AND prescriptions.date_added BETWEEN ? AND ?
66       UNION
67       SELECT 
68         DATE(DATE) AS date_added,
69         pid AS patient_id,
70         begdate AS start_date,
71         '' AS quantity,
72         '' AS `interval`,
73         comments AS note,
74         title AS drug,
75         '' AS medication,
76         IF((isnull(enddate) OR enddate = '0000-00-00' OR enddate >= CURDATE()),'Active','Prior History No Longer Active') AS active,
77         '' AS provider_id,
78         '' AS size,
79 '' AS rxnorm_drugcode,
80         0 AS refills,
81         '' AS form,
82         '' AS title 
83       FROM
84         lists 
85       WHERE `type` = 'medication' 
86         AND pid = ?
87         AND `date` BETWEEN ? AND ?";
88     $result = sqlStatement($sql, array($pid,$start,$end,$pid,$start,$end) );
89   }else{
90     $sql = " 
91       SELECT prescriptions.date_added ,
92         prescriptions.patient_id,
93         prescriptions.start_date,
94         prescriptions.quantity,
95         prescriptions.interval,
96         prescriptions.note,
97         prescriptions.drug,
98         prescriptions.medication,
99         IF(prescriptions.active=1,'Active','Prior History No Longer Active') AS active,
100         prescriptions.provider_id,
101         prescriptions.size,
102         prescriptions.rxnorm_drugcode,
103         IFNULL(prescriptions.refills,0) AS refills,
104         lo2.title AS form,
105         lo.title
106       FROM prescriptions 
107       LEFT JOIN list_options AS lo
108       ON lo.list_id = 'drug_units' AND prescriptions.unit = lo.option_id
109       LEFT JOIN list_options AS lo2
110       ON lo2.list_id = 'drug_form' AND prescriptions.form = lo2.option_id
111       WHERE prescriptions.patient_id = ?
112       UNION
113       SELECT 
114         DATE(DATE) AS date_added,
115         pid AS patient_id,
116         begdate AS start_date,
117         '' AS quantity,
118         '' AS `interval`,
119         comments AS note,
120         title AS drug,
121         '' AS medication,
122         IF((isnull(enddate) OR enddate = '0000-00-00' OR enddate >= CURDATE()),'Active','Prior History No Longer Active') AS active,
123         '' AS provider_id,
124         '' AS size,
125         '' AS rxnorm_drugcode,
126         0 AS refills,
127         '' AS form,
128         '' AS title 
129       FROM
130         lists 
131       WHERE `type` = 'medication' 
132         AND pid = ?";
133     $result = sqlStatement($sql, array($pid,$pid) );
134   }
135         return $result;
138 function getImmunizationData() {
139         global $pid,$set,$start,$end;
140   if($set == "on"){
141     $sql = "SELECT
142       immunizations.administered_date,
143       immunizations.patient_id,
144       immunizations.vis_date,
145       immunizations.note,
146       immunizations.immunization_id,
147       immunizations.manufacturer,
148       codes.code_text AS title
149     FROM immunizations 
150     LEFT JOIN codes ON immunizations.cvx_code = codes.code
151     LEFT JOIN code_types ON codes.code_type = code_types.ct_id
152     WHERE immunizations.patient_id = ? AND code_types.ct_key = 'CVX'
153     AND create_date BETWEEN ? AND ?" ;
154     $result = sqlStatement($sql, array($pid,$start,$end) );
155   }else{
156     $sql = "SELECT
157       immunizations.administered_date,
158       immunizations.patient_id,
159       immunizations.vis_date,
160       immunizations.note,
161       immunizations.immunization_id,
162       immunizations.manufacturer,
163       codes.code_text AS title
164     FROM immunizations 
165     LEFT JOIN codes ON immunizations.cvx_code = codes.code
166     LEFT JOIN code_types ON codes.code_type = code_types.ct_id
167     WHERE immunizations.patient_id = ? AND code_types.ct_key = 'CVX'";
168     $result = sqlStatement($sql, array($pid) );
169   }
170         return $result;
174 function getProcedureData() {
176         global $pid,$set,$start,$end;
177   if($set == "on"){
178     $sql = " 
179     SELECT 
180       lists.title as proc_title,
181       lists.date as `date`,
182       list_options.title as outcome,
183       '' as laterality,
184       '' as body_site,
185       lists.type as `type`,
186       lists.diagnosis as `code`,
187       IF(SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1) = 'ICD9','ICD9-CM',SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1)) AS coding
188     FROM
189       lists 
190       LEFT JOIN issue_encounter 
191         ON issue_encounter.list_id = lists.id 
192       LEFT JOIN form_encounter 
193         ON form_encounter.encounter = issue_encounter.encounter 
194       LEFT JOIN facility 
195         ON form_encounter.facility_id = facility.id 
196       LEFT JOIN users 
197         ON form_encounter.provider_id = users.id 
198       LEFT JOIN list_options
199         ON lists.outcome = list_options.option_id
200         AND list_options.list_id = 'outcome'
201     WHERE lists.type = 'surgery' 
202       AND lists.pid = ?
203       AND lists.date BETWEEN ? AND ?
204     UNION
205     SELECT 
206       pt.name as proc_title,
207       prs.date as `date`,
208       '' as outcome,
209       ptt.laterality as laterality,
210       ptt.body_site as body_site,
211       'Lab Order' as `type`,
212       ptt.standard_code as `code`,
213       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
214     FROM
215       procedure_result AS prs 
216       LEFT JOIN procedure_report AS prp 
217         ON prs.procedure_report_id = prp.procedure_report_id 
218       LEFT JOIN procedure_order AS po 
219         ON prp.procedure_order_id = po.procedure_order_id 
220       LEFT JOIN procedure_order_code AS poc
221         ON poc.procedure_order_id = po.procedure_order_id
222         AND poc.procedure_order_seq = prp.procedure_order_seq
223       LEFT JOIN procedure_type AS pt 
224         ON pt.lab_id = po.lab_id
225         AND pt.procedure_code = prs.result_code
226         AND pt.procedure_type = 'res'
227       LEFT JOIN procedure_type AS ptt 
228         ON pt.parent = ptt.procedure_type_id 
229         AND ptt.procedure_type = 'ord' 
230       LEFT JOIN list_options AS lo 
231         ON lo.list_id = 'proc_unit' 
232         AND pt.units = lo.option_id 
233     WHERE po.patient_id = ?
234     AND prs.date BETWEEN ? AND ?";
235   
236     $result = sqlStatement($sql, array($pid,$start,$end,$pid,$start,$end) );
237   }else{
238     $sql = " 
239     SELECT 
240       lists.title as proc_title,
241       lists.date as `date`,
242       list_options.title as outcome,
243       '' as laterality,
244       '' as body_site,
245       lists.type as `type`,
246       lists.diagnosis as `code`,
247       IF(SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1) = 'ICD9','ICD9-CM',SUBSTRING(lists.diagnosis,1,LOCATE(':',lists.diagnosis)-1)) AS coding
248     FROM
249       lists 
250       LEFT JOIN issue_encounter 
251         ON issue_encounter.list_id = lists.id 
252       LEFT JOIN form_encounter 
253         ON form_encounter.encounter = issue_encounter.encounter 
254       LEFT JOIN facility 
255         ON form_encounter.facility_id = facility.id 
256       LEFT JOIN users 
257         ON form_encounter.provider_id = users.id 
258       LEFT JOIN list_options
259         ON lists.outcome = list_options.option_id
260         AND list_options.list_id = 'outcome'
261     WHERE lists.type = 'surgery' 
262       AND lists.pid = ? 
263     UNION
264     SELECT 
265       pt.name as proc_title,
266       prs.date as `date`,
267       '' as outcome,
268       ptt.laterality as laterality,
269       ptt.body_site as body_site,
270       'Lab Order' as `type`,
271       ptt.standard_code as `code`,
272       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
273     FROM
274       procedure_result AS prs 
275       LEFT JOIN procedure_report AS prp 
276         ON prs.procedure_report_id = prp.procedure_report_id 
277       LEFT JOIN procedure_order AS po 
278         ON prp.procedure_order_id = po.procedure_order_id
279       LEFT JOIN procedure_order_code AS poc
280         ON poc.procedure_order_id = po.procedure_order_id
281         AND poc.procedure_order_seq = prp.procedure_order_seq
282       LEFT JOIN procedure_type AS pt 
283         ON pt.lab_id = po.lab_id
284         AND pt.procedure_code = prs.result_code
285         AND pt.procedure_type = 'res'
286       LEFT JOIN procedure_type AS ptt 
287         ON pt.parent = ptt.procedure_type_id 
288         AND ptt.procedure_type = 'ord' 
289       LEFT JOIN list_options AS lo 
290         ON lo.list_id = 'proc_unit' 
291         AND pt.units = lo.option_id 
292     WHERE po.patient_id = ? ";
293   
294     $result = sqlStatement($sql, array($pid,$pid) );
295   }
296         return $result;
300 function getProblemData() {
302   # Note we are hard-coding (only allowing) problems that have been coded to ICD9. Would
303   #  be easy to upgrade this to other codesets in future (ICD10,SNOMED) by using already
304   #  existant flags in the code_types table.
305   # Additionally, only using problems that have one diagnosis code set in diagnosis field.
306   #  Note OpenEMR allows multiple codes set per problem, but will limit to showing only
307   #  problems with one diagnostic code set in order to maintain previous behavior
308   #  (this will likely need to be dealt with at some point; ie. support multiple dx codes per problem).
310         global $pid,$set,$start,$end;
311   if($set == "on"){
312     $sql = " 
313     SELECT fe.encounter, fe.reason, fe.provider_id, u.title, u.fname, u.lname, 
314       fe.facility_id, f.street, f.city, f.state, ie.list_id, l.pid, l.title AS prob_title, l.diagnosis, 
315       l.outcome, l.groupname, l.begdate, l.enddate, l.type, l.comments , l.date
316     FROM lists AS l 
317     LEFT JOIN issue_encounter AS ie ON ie.list_id = l.id
318     LEFT JOIN form_encounter AS fe ON fe.encounter = ie.encounter
319     LEFT JOIN facility AS f ON fe.facility_id = f.id
320     LEFT JOIN users AS u ON fe.provider_id = u.id
321     WHERE l.type = 'medical_problem' AND l.pid=? AND l.diagnosis LIKE 'ICD9:%'
322     AND l.diagnosis NOT LIKE '%;%'
323     AND l.date BETWEEN ? AND ?";
324     $result = sqlStatement($sql, array($pid,$start,$end) );
325   }else{
326     $sql = " 
327     SELECT fe.encounter, fe.reason, fe.provider_id, u.title, u.fname, u.lname, 
328       fe.facility_id, f.street, f.city, f.state, ie.list_id, l.pid, l.title AS prob_title, l.diagnosis, 
329       l.outcome, l.groupname, l.begdate, l.enddate, l.type, l.comments , l.date
330     FROM lists AS l 
331     LEFT JOIN issue_encounter AS ie ON ie.list_id = l.id
332     LEFT JOIN form_encounter AS fe ON fe.encounter = ie.encounter
333     LEFT JOIN facility AS f ON fe.facility_id = f.id
334     LEFT JOIN users AS u ON fe.provider_id = u.id
335     WHERE l.type = 'medical_problem' AND l.pid=? AND l.diagnosis LIKE 'ICD9:%'
336     AND l.diagnosis NOT LIKE '%;%'";
337     $result = sqlStatement($sql, array($pid) );
338   }
339         return $result;
343 function getAlertData() {
345         global $pid,$set,$start,$end;
346   if($set == "on"){
347         $sql = " 
348     select fe.reason, fe.provider_id, fe.facility_id, fe.encounter,
349       ie.list_id, l.pid, l.title as alert_title, l.outcome, 
350       l.groupname, l.begdate, l.enddate, l.type, l.diagnosis, l.date ,
351       l.reaction , l.comments ,
352         f.street, f.city, f.state, u.title, u.fname, u.lname, cd.code_text
353     from lists as l 
354     left join issue_encounter as ie
355     on ie.list_id = l.id
356     left join form_encounter as fe
357     on fe.encounter = ie.encounter
358     left join facility as f
359     on fe.facility_id = f.id
360     left join users as u
361     on fe.provider_id = u.id
362     left join codes as cd
363     on cd.code = SUBSTRING(l.diagnosis, LOCATE(':',l.diagnosis)+1)
364     where l.type = 'allergy' and l.pid=?
365     AND l.date BETWEEN ? AND ?";
366     
367     $result = sqlStatement($sql, array($pid,$start,$end) );
368   }else{
369     $sql = " 
370     select fe.reason, fe.provider_id, fe.facility_id, fe.encounter,
371       ie.list_id, l.pid, l.title as alert_title, l.outcome, 
372       l.groupname, l.begdate, l.enddate, l.type, l.diagnosis, l.date ,
373       l.reaction , l.comments ,
374         f.street, f.city, f.state, u.title, u.fname, u.lname, cd.code_text
375     from lists as l 
376     left join issue_encounter as ie
377     on ie.list_id = l.id
378     left join form_encounter as fe
379     on fe.encounter = ie.encounter
380     left join facility as f
381     on fe.facility_id = f.id
382     left join users as u
383     on fe.provider_id = u.id
384     left join codes as cd
385     on cd.code = SUBSTRING(l.diagnosis, LOCATE(':',l.diagnosis)+1)
386     where l.type = 'allergy' and l.pid=?";
387       
388     $result = sqlStatement($sql, array($pid) );
389   }
390         return $result;
394 function getResultData() {
396         global $pid,$set,$start,$end;
397   if($set == "on"){
398     $sql = "
399       SELECT 
400         prs.procedure_result_id as `pid`,
401         pt.name as `name`,
402         pt.procedure_type_id as `type`,
403         prs.date as `date`,
404         concat_ws(' ',prs.result,lo.title) as `result`,
405         prs.range as `range`,
406         prs.abnormal as `abnormal`,
407         prs.comments as `comments`,
408         ptt.lab_id AS `lab`
409       FROM
410         procedure_result AS prs 
411         LEFT JOIN procedure_report AS prp 
412           ON prs.procedure_report_id = prp.procedure_report_id 
413         LEFT JOIN procedure_order AS po 
414           ON prp.procedure_order_id = po.procedure_order_id
415         LEFT JOIN procedure_order_code AS poc
416           ON poc.procedure_order_id = po.procedure_order_id
417           AND poc.procedure_order_seq = prp.procedure_order_seq
418         LEFT JOIN procedure_type AS pt 
419           ON pt.lab_id = po.lab_id
420           AND pt.procedure_code = prs.result_code
421           AND pt.procedure_type = 'res'
422         LEFT JOIN procedure_type AS ptt 
423           ON pt.parent = ptt.procedure_type_id
424           AND ptt.procedure_type = 'ord'
425         LEFT JOIN list_options AS lo
426           ON lo.list_id = 'proc_unit' AND pt.units = lo.option_id
427       WHERE po.patient_id=?
428       AND prs.date BETWEEN ? AND ?";
429                 
430     $result = sqlStatement($sql, array($pid,$start,$end) );
431   }else{
432     $sql = "
433       SELECT 
434         prs.procedure_result_id as `pid`,
435         pt.name as `name`,
436         pt.procedure_type_id as `type`,
437         prs.date as `date`,
438         concat_ws(' ',prs.result,lo.title) as `result`,
439         prs.range as `range`,
440         prs.abnormal as `abnormal`,
441         prs.comments as `comments`,
442         ptt.lab_id AS `lab`
443       FROM
444         procedure_result AS prs 
445         LEFT JOIN procedure_report AS prp 
446           ON prs.procedure_report_id = prp.procedure_report_id 
447         LEFT JOIN procedure_order AS po 
448           ON prp.procedure_order_id = po.procedure_order_id
449         LEFT JOIN procedure_order_code AS poc
450           ON poc.procedure_order_id = po.procedure_order_id
451           AND poc.procedure_order_seq = prp.procedure_order_seq
452         LEFT JOIN procedure_type AS pt 
453           ON pt.lab_id = po.lab_id
454           AND pt.procedure_code = prs.result_code
455           AND pt.procedure_type = 'res'
456         LEFT JOIN procedure_type AS ptt 
457           ON pt.parent = ptt.procedure_type_id
458           AND ptt.procedure_type = 'ord'
459         LEFT JOIN list_options AS lo
460           ON lo.list_id = 'proc_unit' AND pt.units = lo.option_id
461       WHERE po.patient_id=?";
462                 
463     $result = sqlStatement($sql, array($pid) );
464   }
465         return $result;
469 function getActorData() {
470         global $pid;
472         $sql = " 
473         select fname, lname, DOB, sex, pid, street, city, state, postal_code, phone_contact
474         from patient_data
475         where pid=?";
476                 
477         $result[0] = sqlStatement($sql, array($pid) );
478   
479   $sql2 = " 
480         SELECT * FROM users AS u LEFT JOIN facility AS f ON u.facility_id = f.id WHERE u.id=?";
481                 
482         $result[1] = sqlStatement($sql2, array($_SESSION['authUserID']) );
483   
484   $sql3 = "
485   SELECT 
486     u.ppid AS id, u.name AS lname, '' AS fname, '' AS city, '' AS state, '' AS zip, '' AS phone
487   FROM
488     procedure_order AS po 
489     LEFT JOIN forms AS f
490       ON f.form_id = po.procedure_order_id 
491       AND f.formdir = 'procedure_order'
492     LEFT JOIN list_options AS lo 
493       ON lo.title = f.form_name
494     LEFT JOIN procedure_providers AS u
495       ON po.lab_id = u.ppid
496   WHERE f.pid = ? 
497     AND lo.list_id = 'proc_type' 
498     AND lo.option_id = 'ord'
499     GROUP BY u.ppid";
500                 
501         $result[2] = sqlStatement($sql3, array($pid) );
502   
503         return $result;
507 function getReportFilename() {
508   global $pid;
510   $sql = "
511     select fname, lname, pid
512     from patient_data
513     where pid=?";
515   $result = sqlQuery($sql, array($pid) );
516         $result_filename = $result['lname']."-".$result['fname']."-".$result['pid']."-".date("mdY",time());
518   return $result_filename;