removed gratuitous dash after event name
[openemr.git] / interface / reports / appt_encounter_report.php
blob2a43a77c0525f73853afbaaff7b99a9595c01c1a
1 <?php
2 // Copyright (C) 2005-2007 Rod Roark <rod@sunsetsystems.com>
3 //
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 2
7 // of the License, or (at your option) any later version.
9 // This report cross-references appointments with encounters.
10 // For a given date, show a line for each appointment with the
11 // matching encounter, and also for each encounter that has no
12 // matching appointment. This helps to catch these errors:
14 // * Appointments with no encounter
15 // * Encounters with no appointment
16 // * Codes not justified
17 // * Codes not authorized
18 // * Procedure codes without a fee
19 // * Fees assigned to diagnoses (instead of procedures)
20 // * Encounters not billed
22 // For decent performance the following indexes are highly recommended:
23 // openemr_postcalendar_events.pc_eventDate
24 // forms.encounter
25 // billing.pid_encounter
27 include_once("../globals.php");
28 include_once("../../library/patient.inc");
29 include_once("../../custom/code_types.inc.php");
31 $alertmsg = ''; // not used yet but maybe later
32 $grand_total_charges = 0;
33 $grand_total_copays = 0;
34 $grand_total_encounters = 0;
36 function bucks($amount) {
37 if ($amount)
38 printf("%.2f", $amount);
41 function endDoctor(&$docrow) {
42 global $grand_total_charges, $grand_total_copays, $grand_total_encounters;
43 if (!$docrow['docname']) return;
45 echo " <tr bgcolor='#ffff00'>\n";
46 echo " <td class='detail' colspan='4'>\n";
47 echo " &nbsp;Totals for " . $docrow['docname'] . "\n";
48 echo " </td>\n";
49 echo " <td class='detotal' align='right'>\n";
50 echo " &nbsp;" . $docrow['encounters'] . "&nbsp;\n";
51 echo " </td>\n";
52 echo " <td class='detotal' align='right'>\n";
53 echo " &nbsp;"; bucks($docrow['charges']); echo "&nbsp;\n";
54 echo " </td>\n";
55 echo " <td class='detotal' align='right'>\n";
56 echo " &nbsp;"; bucks($docrow['copays']); echo "&nbsp;\n";
57 echo " </td>\n";
58 echo " <td class='detail' colspan='2'>\n";
59 echo " &nbsp;\n";
60 echo " </td>\n";
61 echo " </tr>\n";
63 $grand_total_charges += $docrow['charges'];
64 $grand_total_copays += $docrow['copays'];
65 $grand_total_encounters += $docrow['encounters'];
67 $docrow['charges'] = 0;
68 $docrow['copays'] = 0;
69 $docrow['encounters'] = 0;
72 if ($_POST['form_search']) {
73 $form_date = fixDate($_POST['form_date'], date('Y-m-d'));
74 $form_to_date = fixDate($_POST['form_to_date'], "");
76 // MySQL doesn't grok full outer joins so we do it the hard way.
78 $query = "( " .
79 "SELECT " .
80 "e.pc_eventDate, e.pc_startTime, " .
81 "fe.encounter, " .
82 "f.authorized, " .
83 "p.fname, p.lname, p.pid, " .
84 "u.lname AS docname " .
85 "FROM openemr_postcalendar_events AS e " .
86 "LEFT OUTER JOIN form_encounter AS fe " .
87 "ON LEFT(fe.date, 10) = e.pc_eventDate AND fe.pid = e.pc_pid " .
88 "LEFT OUTER JOIN forms AS f ON f.encounter = fe.encounter AND f.formdir = 'newpatient' " .
89 "LEFT OUTER JOIN patient_data AS p ON p.pid = e.pc_pid " .
90 // "LEFT OUTER JOIN users AS u ON u.id = e.pc_aid WHERE ";
91 "LEFT OUTER JOIN users AS u ON u.username = f.user WHERE ";
92 if ($form_to_date) {
93 $query .= "e.pc_eventDate >= '$form_date' AND e.pc_eventDate <= '$form_to_date' ";
94 } else {
95 $query .= "e.pc_eventDate = '$form_date' ";
97 // $query .= "AND ( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " .
98 $query .= "AND e.pc_pid != '' AND e.pc_apptstatus != '?' " .
99 ") UNION ( " .
100 "SELECT " .
101 "e.pc_eventDate, e.pc_startTime, " .
102 "fe.encounter, " .
103 "f.authorized, " .
104 "p.fname, p.lname, p.pid, " .
105 "u.lname AS docname " .
106 "FROM form_encounter AS fe " .
107 "LEFT OUTER JOIN openemr_postcalendar_events AS e " .
108 "ON LEFT(fe.date, 10) = e.pc_eventDate AND fe.pid = e.pc_pid AND " .
109 // "( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " .
110 "e.pc_pid != '' AND e.pc_apptstatus != '?' " .
111 "LEFT OUTER JOIN forms AS f ON f.encounter = fe.encounter AND f.formdir = 'newpatient' " .
112 "LEFT OUTER JOIN patient_data AS p ON p.pid = fe.pid " .
113 "LEFT OUTER JOIN users AS u ON u.username = f.user WHERE ";
114 if ($form_to_date) {
115 // $query .= "LEFT(fe.date, 10) >= '$form_date' AND LEFT(fe.date, 10) <= '$form_to_date' ";
116 $query .= "fe.date >= '$form_date 00:00:00' AND fe.date <= '$form_to_date 23:59:59' ";
117 } else {
118 // $query .= "LEFT(fe.date, 10) = '$form_date' ";
119 $query .= "fe.date >= '$form_date 00:00:00' AND fe.date <= '$form_date 23:59:59' ";
121 $query .= ") ORDER BY docname, pc_eventDate, pc_startTime";
123 $res = sqlStatement($query);
126 <html>
127 <head>
128 <link rel=stylesheet href="<?php echo $css_header;?>" type="text/css">
129 <title><?php xl('Appointments and Encounters','e'); ?></title>
130 </head>
132 <body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0'>
133 <center>
135 <form method='post' action='appt_encounter_report.php'>
137 <table border='0' cellpadding='5' cellspacing='0' width='98%'>
139 <tr>
140 <td height="1" colspan="2">
141 </td>
142 </tr>
144 <tr bgcolor='#ddddff'>
145 <td align='left'>
146 <h2><?php xl('Appointments and Encounters','e'); ?></h2>
147 </td>
148 <td align='right'>
149 <?php xl('DOS','e'); ?>:
150 <input type='text' name='form_date' size='10' value='<?php echo $_POST['form_date']; ?>'
151 title='Date of appointments mm/dd/yyyy' >
152 &nbsp;
153 <?php xl('to','e'); ?>:
154 <input type='text' name='form_to_date' size='10' value='<?php echo $_POST['form_to_date']; ?>'
155 title='Optional end date mm/dd/yyyy' >
156 &nbsp;
157 <input type='checkbox' name='form_details'
158 value='1'<? if ($_POST['form_details']) echo " checked"; ?>><?php xl('Details','e') ?>
159 &nbsp;
160 <input type='submit' name='form_search' value='Search'>
161 </td>
162 </tr>
164 <tr>
165 <td height="1" colspan="2">
166 </td>
167 </tr>
169 </table>
171 <table border='0' cellpadding='1' cellspacing='2' width='98%'>
173 <tr bgcolor="#dddddd">
174 <td class="dehead">
175 &nbsp;<?php xl('Practitioner','e'); ?>
176 </td>
177 <td class="dehead">
178 &nbsp;<?php xl('Time','e'); ?>
179 </td>
180 <td class="dehead">
181 &nbsp;<?php xl('Patient','e'); ?>
182 </td>
183 <td class="dehead" align="right">
184 <?php xl('Chart','e'); ?>&nbsp;
185 </td>
186 <td class="dehead" align="right">
187 <?php xl('Encounter','e'); ?>&nbsp;
188 </td>
189 <td class="dehead" align="right">
190 <?php xl('Charges','e'); ?>&nbsp;
191 </td>
192 <td class="dehead" align="right">
193 <?php xl('Copays','e'); ?>&nbsp;
194 </td>
195 <td class="dehead" align="center">
196 <?php xl('Billed','e'); ?>
197 </td>
198 <td class="dehead">
199 &nbsp;<?php xl('Error','e'); ?>
200 </td>
201 </tr>
202 <?php
203 if ($res) {
204 $docrow = array('docname' => '', 'charges' => 0, 'copays' => 0, 'encounters' => 0);
206 while ($row = sqlFetchArray($res)) {
207 $patient_id = $row['pid'];
208 $encounter = $row['encounter'];
209 $docname = $row['docname'] ? $row['docname'] : 'Unknown';
211 if ($docname != $docrow['docname']) {
212 endDoctor($docrow);
215 $billed = "Y";
216 $errmsg = "";
217 $charges = 0;
218 $copays = 0;
220 // Scan the billing items for status and fee total.
222 $query = "SELECT code_type, authorized, billed, fee, justify " .
223 "FROM billing WHERE " .
224 "pid = '$patient_id' AND encounter = '$encounter' AND activity = 1";
225 $bres = sqlStatement($query);
227 while ($brow = sqlFetchArray($bres)) {
228 if (! $brow['billed']) $billed = "";
229 if (! $brow['authorized']) $errmsg = "Needs Auth";
230 if ($code_types[$brow['code_type']]['just']) {
231 if (! $brow['justify']) $errmsg = "Needs Justify";
233 if ($brow['code_type'] == 'COPAY') {
234 $copays -= $brow['fee'];
235 if ($brow['fee'] >= 0) $errmsg = "Copay not positive";
236 } else if ($code_types[$brow['code_type']]['fee']) {
237 $charges += $brow['fee'];
238 if ($brow['fee'] == 0 ) $errmsg = "Missing Fee";
239 } else {
240 if ($brow['fee'] != 0) $errmsg = "Misplaced Fee";
243 if (! $charges) $billed = "";
245 $docrow['charges'] += $charges;
246 $docrow['copays'] += $copays;
247 if ($encounter) ++$docrow['encounters'];
249 if ($_POST['form_details']) {
251 <tr>
252 <td class="detail">
253 &nbsp;<?php echo ($docname == $docrow['docname']) ? "" : $docname ?>
254 </td>
255 <td class="detail">
256 &nbsp;<?php if ($form_to_date) echo $row['pc_eventDate'] . ' ';
257 echo substr($row['pc_startTime'], 0, 5) ?>
258 </td>
259 <td class="detail">
260 &nbsp;<?php echo $row['fname'] . " " . $row['lname'] ?>
261 </td>
262 <td class="detail" align="right">
263 <?php echo $row['pid'] ?>&nbsp;
264 </td>
265 <td class="detail" align="right">
266 <?php echo $encounter ?>&nbsp;
267 </td>
268 <td class="detail" align="right">
269 <?php bucks($charges) ?>&nbsp;
270 </td>
271 <td class="detail" align="right">
272 <?php bucks($copays) ?>&nbsp;
273 </td>
274 <td class="detail" align="center">
275 <?php echo $billed ?>
276 </td>
277 <td class="detail" align="left">
278 &nbsp;<?php echo $errmsg ?>
279 </td>
280 </tr>
281 <?php
282 } // end of details line
284 $docrow['docname'] = $docname;
285 } // end of row
287 endDoctor($docrow);
289 echo " <tr bgcolor='#77ff77'>\n";
290 echo " <td class='detail' colspan='4'>\n";
291 echo " &nbsp;Grand Totals\n";
292 echo " </td>\n";
293 echo " <td class='detotal' align='right'>\n";
294 echo " &nbsp;" . $grand_total_encounters . "&nbsp;\n";
295 echo " </td>\n";
296 echo " <td class='detotal' align='right'>\n";
297 echo " &nbsp;"; bucks($grand_total_charges); echo "&nbsp;\n";
298 echo " </td>\n";
299 echo " <td class='detotal' align='right'>\n";
300 echo " &nbsp;"; bucks($grand_total_copays); echo "&nbsp;\n";
301 echo " </td>\n";
302 echo " <td class='detail' colspan='2'>\n";
303 echo " &nbsp;\n";
304 echo " </td>\n";
305 echo " </tr>\n";
310 </table>
312 </form>
313 </center>
314 <script>
315 <?php
316 if ($alertmsg) {
317 echo " alert('$alertmsg');\n";
320 </script>
321 </body>
322 </html>