2 // Copyright (C) 2005-2007 Rod Roark <rod@sunsetsystems.com>
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
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) {
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 " Totals for " . $docrow['docname'] . "\n";
49 echo " <td class='detotal' align='right'>\n";
50 echo " " . $docrow['encounters'] . " \n";
52 echo " <td class='detotal' align='right'>\n";
53 echo " "; bucks($docrow['charges']); echo " \n";
55 echo " <td class='detotal' align='right'>\n";
56 echo " "; bucks($docrow['copays']); echo " \n";
58 echo " <td class='detail' colspan='2'>\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.
80 "e.pc_eventDate, e.pc_startTime, " .
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 ";
93 $query .= "e.pc_eventDate >= '$form_date' AND e.pc_eventDate <= '$form_to_date' ";
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 != '?' " .
101 "e.pc_eventDate, e.pc_startTime, " .
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 ";
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' ";
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);
128 <link rel
=stylesheet href
="<?php echo $css_header;?>" type
="text/css">
129 <title
><?php
xl('Appointments and Encounters','e'); ?
></title
>
132 <body leftmargin
='0' topmargin
='0' marginwidth
='0' marginheight
='0'>
135 <form method
='post' action
='appt_encounter_report.php'>
137 <table border
='0' cellpadding
='5' cellspacing
='0' width
='98%'>
140 <td height
="1" colspan
="2">
144 <tr bgcolor
='#ddddff'>
146 <h2
><?php
xl('Appointments and Encounters','e'); ?
></h2
>
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' >
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' >
157 <input type
='checkbox' name
='form_details'
158 value
='1'<?
if ($_POST['form_details']) echo " checked"; ?
>><?php
xl('Details','e') ?
>
160 <input type
='submit' name
='form_search' value
='Search'>
165 <td height
="1" colspan
="2">
171 <table border
='0' cellpadding
='1' cellspacing
='2' width
='98%'>
173 <tr bgcolor
="#dddddd">
175  
;<?php
xl('Practitioner','e'); ?
>
178  
;<?php
xl('Time','e'); ?
>
181  
;<?php
xl('Patient','e'); ?
>
183 <td
class="dehead" align
="right">
184 <?php
xl('Chart','e'); ?
> 
;
186 <td
class="dehead" align
="right">
187 <?php
xl('Encounter','e'); ?
> 
;
189 <td
class="dehead" align
="right">
190 <?php
xl('Charges','e'); ?
> 
;
192 <td
class="dehead" align
="right">
193 <?php
xl('Copays','e'); ?
> 
;
195 <td
class="dehead" align
="center">
196 <?php
xl('Billed','e'); ?
>
199  
;<?php
xl('Error','e'); ?
>
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']) {
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";
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']) {
253  
;<?php
echo ($docname == $docrow['docname']) ?
"" : $docname ?
>
256  
;<?php
if ($form_to_date) echo $row['pc_eventDate'] . ' ';
257 echo substr($row['pc_startTime'], 0, 5) ?
>
260  
;<?php
echo $row['fname'] . " " . $row['lname'] ?
>
262 <td
class="detail" align
="right">
263 <?php
echo $row['pid'] ?
> 
;
265 <td
class="detail" align
="right">
266 <?php
echo $encounter ?
> 
;
268 <td
class="detail" align
="right">
269 <?php
bucks($charges) ?
> 
;
271 <td
class="detail" align
="right">
272 <?php
bucks($copays) ?
> 
;
274 <td
class="detail" align
="center">
275 <?php
echo $billed ?
>
277 <td
class="detail" align
="left">
278  
;<?php
echo $errmsg ?
>
282 } // end of details line
284 $docrow['docname'] = $docname;
289 echo " <tr bgcolor='#77ff77'>\n";
290 echo " <td class='detail' colspan='4'>\n";
291 echo " Grand Totals\n";
293 echo " <td class='detotal' align='right'>\n";
294 echo " " . $grand_total_encounters . " \n";
296 echo " <td class='detotal' align='right'>\n";
297 echo " "; bucks($grand_total_charges); echo " \n";
299 echo " <td class='detotal' align='right'>\n";
300 echo " "; bucks($grand_total_copays); echo " \n";
302 echo " <td class='detail' colspan='2'>\n";
317 echo " alert('$alertmsg');\n";