From 2367b6557b93c5c0453e82d3417953bdee8c8665 Mon Sep 17 00:00:00 2001 From: sunsetsystems Date: Fri, 14 Aug 2009 21:43:36 +0000 Subject: [PATCH] fixed some bugs --- interface/reports/appt_encounter_report.php | 472 +++++++++++++++++++++------- 1 file changed, 363 insertions(+), 109 deletions(-) diff --git a/interface/reports/appt_encounter_report.php b/interface/reports/appt_encounter_report.php index b4372e238..92fb5ea35 100644 --- a/interface/reports/appt_encounter_report.php +++ b/interface/reports/appt_encounter_report.php @@ -1,5 +1,5 @@ - + // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -18,201 +18,455 @@ // * Procedure codes without a fee // * Fees assigned to diagnoses (instead of procedures) // * Encounters not billed + // + // For decent performance the following indexes are highly recommended: + // openemr_postcalendar_events.pc_eventDate + // forms.encounter + // billing.pid_encounter include_once("../globals.php"); include_once("../../library/patient.inc"); include_once("../../custom/code_types.inc.php"); $alertmsg = ''; // not used yet but maybe later + $grand_total_charges = 0; + $grand_total_copays = 0; + $grand_total_encounters = 0; function bucks($amount) { - if ($amount) - printf("%.2f", $amount); + if ($amount) printf("%.2f", $amount); + } + + function endDoctor(&$docrow) { + global $grand_total_charges, $grand_total_copays, $grand_total_encounters; + if (!$docrow['docname']) return; + + echo " \n"; + echo " \n"; + echo "  " . xl('Totals for','','',' ') . $docrow['docname'] . "\n"; + echo " \n"; + echo " \n"; + echo "  " . $docrow['encounters'] . " \n"; + echo " \n"; + echo " \n"; + echo "  "; bucks($docrow['charges']); echo " \n"; + echo " \n"; + echo " \n"; + echo "  "; bucks($docrow['copays']); echo " \n"; + echo " \n"; + echo " \n"; + echo "  \n"; + echo " \n"; + echo " \n"; + + $grand_total_charges += $docrow['charges']; + $grand_total_copays += $docrow['copays']; + $grand_total_encounters += $docrow['encounters']; + + $docrow['charges'] = 0; + $docrow['copays'] = 0; + $docrow['encounters'] = 0; } + $form_facility = isset($_POST['form_facility']) ? $_POST['form_facility'] : ''; + $form_from_date = fixDate($_POST['form_from_date'], date('Y-m-d')); + $form_to_date = fixDate($_POST['form_to_date'], date('Y-m-d')); if ($_POST['form_search']) { - $form_date = fixDate($_POST['form_date'], ""); + $form_from_date = fixDate($_POST['form_from_date'], date('Y-m-d')); + $form_to_date = fixDate($_POST['form_to_date'], ""); // MySQL doesn't grok full outer joins so we do it the hard way. // $query = "( " . "SELECT " . - "e.pc_startTime, " . - "fe.encounter, " . + "e.pc_eventDate, e.pc_startTime, " . + "fe.encounter, fe.date AS encdate, " . "f.authorized, " . - "p.fname, p.lname, p.pid, " . - "u.lname AS docname " . + "p.fname, p.lname, p.pid, p.pubpid, " . + "CONCAT( u.lname, ', ', u.fname ) AS docname " . "FROM openemr_postcalendar_events AS e " . "LEFT OUTER JOIN form_encounter AS fe " . "ON LEFT(fe.date, 10) = e.pc_eventDate AND fe.pid = e.pc_pid " . "LEFT OUTER JOIN forms AS f ON f.encounter = fe.encounter AND f.formdir = 'newpatient' " . "LEFT OUTER JOIN patient_data AS p ON p.pid = e.pc_pid " . - "LEFT OUTER JOIN users AS u ON u.id = e.pc_aid " . - "WHERE e.pc_eventDate = '$form_date' AND " . - "( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " . + // "LEFT OUTER JOIN users AS u ON BINARY u.username = BINARY f.user WHERE "; + "LEFT OUTER JOIN users AS u ON u.id = fe.provider_id WHERE "; + if ($form_to_date) { + $query .= "e.pc_eventDate >= '$form_from_date' AND e.pc_eventDate <= '$form_to_date' "; + } else { + $query .= "e.pc_eventDate = '$form_from_date' "; + } + if ($form_facility !== '') { + $query .= "AND e.pc_facility = '$form_facility' "; + } + // $query .= "AND ( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " . + $query .= "AND e.pc_pid != '' AND e.pc_apptstatus != '?' " . ") UNION ( " . "SELECT " . - "e.pc_startTime, " . - "fe.encounter, " . + "e.pc_eventDate, e.pc_startTime, " . + "fe.encounter, fe.date AS encdate, " . "f.authorized, " . - "p.fname, p.lname, p.pid, " . - "u.lname AS docname " . + "p.fname, p.lname, p.pid, p.pubpid, " . + "CONCAT( u.lname, ', ', u.fname ) AS docname " . "FROM form_encounter AS fe " . "LEFT OUTER JOIN openemr_postcalendar_events AS e " . "ON LEFT(fe.date, 10) = e.pc_eventDate AND fe.pid = e.pc_pid AND " . - "( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " . + // "( e.pc_catid = 5 OR e.pc_catid = 9 OR e.pc_catid = 10 ) " . + "e.pc_pid != '' AND e.pc_apptstatus != '?' " . "LEFT OUTER JOIN forms AS f ON f.encounter = fe.encounter AND f.formdir = 'newpatient' " . "LEFT OUTER JOIN patient_data AS p ON p.pid = fe.pid " . - "LEFT OUTER JOIN users AS u ON u.username = f.user " . - "WHERE LEFT(fe.date, 10) = '$form_date' " . - ") " . - "ORDER BY docname, pc_startTime"; + "LEFT OUTER JOIN users AS u ON u.id = fe.provider_id WHERE "; + if ($form_to_date) { + // $query .= "LEFT(fe.date, 10) >= '$form_from_date' AND LEFT(fe.date, 10) <= '$form_to_date' "; + $query .= "fe.date >= '$form_from_date 00:00:00' AND fe.date <= '$form_to_date 23:59:59' "; + } else { + // $query .= "LEFT(fe.date, 10) = '$form_from_date' "; + $query .= "fe.date >= '$form_from_date 00:00:00' AND fe.date <= '$form_from_date 23:59:59' "; + } + if ($form_facility !== '') { + $query .= "AND fe.facility_id = '$form_facility' "; + } + $query .= ") ORDER BY docname, pc_eventDate, pc_startTime"; $res = sqlStatement($query); } ?> - -Appointments and Encounters - + + + +<?php xl('Appointments and Encounters','e'); ?> + - - -

Appointments and Encounters

- - - Booking Date: - ' - title='Date of appointments mm/dd/yyyy'> -   - - - + +
+ +

+
+ +
+
+
+ - -
+ + : +\n"; + echo "
+
- +
+
- - - - - - - - - - - + + + + + + + + + + + + + '', 'charges' => 0, 'copays' => 0, 'encounters' => 0); + while ($row = sqlFetchArray($res)) { $patient_id = $row['pid']; $encounter = $row['encounter']; - $docname = $row['docname']; + $docname = $row['docname'] ? $row['docname'] : 'Unknown'; + + if ($docname != $docrow['docname']) { + endDoctor($docrow); + } $billed = "Y"; $errmsg = ""; $charges = 0; + $copays = 0; + $gcac_related_visit = false; // Scan the billing items for status and fee total. // - $query = "SELECT code_type, authorized, billed, fee, justify " . + $query = "SELECT code_type, code, modifier, authorized, billed, fee, justify " . "FROM billing WHERE " . "pid = '$patient_id' AND encounter = '$encounter' AND activity = 1"; $bres = sqlStatement($query); // while ($brow = sqlFetchArray($bres)) { - if (! $brow['billed']) $billed = ""; - if (! $brow['authorized']) $errmsg = "Needs Auth"; - if ($code_types[$brow['code_type']]['just']) { + $code_type = $brow['code_type']; + if ($code_types[$code_type]['fee'] && !$brow['billed']) + $billed = ""; + if (!$GLOBALS['simplified_demographics'] && !$brow['authorized']) + $errmsg = "Needs Auth"; + if ($code_types[$code_type]['just']) { if (! $brow['justify']) $errmsg = "Needs Justify"; } - if ($code_types[$brow['code_type']]['fee']) { + if ($code_type == 'COPAY') { + $copays -= $brow['fee']; + if ($brow['fee'] >= 0) $errmsg = "Copay not positive"; + } else if ($code_types[$code_type]['fee']) { $charges += $brow['fee']; - if ($brow['fee'] == 0 ) $errmsg = "Missing Fee"; + if ($brow['fee'] == 0 && !$GLOBALS['ippf_specific']) $errmsg = "Missing Fee"; } else { - if ($brow['fee'] != 0) $errmsg = "Misplaced Fee"; + if ($brow['fee'] != 0) $errmsg = "Fee is not allowed"; + } + + // Custom logic for IPPF to determine if a GCAC issue applies. + if ($GLOBALS['ippf_specific']) { + if (!empty($code_types[$code_type]['fee'])) { + $query = "SELECT related_code FROM codes WHERE code_type = '" . + $code_types[$code_type]['id'] . "' AND " . + "code = '" . $brow['code'] . "' AND "; + if ($brow['modifier']) { + $query .= "modifier = '" . $brow['modifier'] . "'"; + } else { + $query .= "(modifier IS NULL OR modifier = '')"; + } + $query .= " LIMIT 1"; + $tmp = sqlQuery($query); + $relcodes = explode(';', $tmp['related_code']); + foreach ($relcodes as $codestring) { + if ($codestring === '') continue; + list($codetype, $code) = explode(':', $codestring); + if ($codetype !== 'IPPF') continue; + if (preg_match('/^25222/', $code)) $gcac_related_visit = true; + } + } + } // End IPPF stuff + + } // end while + + // More custom code for IPPF. Generates an error message if a + // GCAC issue is required but is not linked to this visit. + if (!$errmsg && $gcac_related_visit) { + $grow = sqlQuery("SELECT l.id, l.title, l.begdate, ie.pid " . + "FROM lists AS l " . + "LEFT JOIN issue_encounter AS ie ON ie.pid = l.pid AND " . + "ie.encounter = '$encounter' AND ie.list_id = l.id " . + "WHERE l.pid = '$patient_id' AND " . + "l.activity = 1 AND l.type = 'ippf_gcac' " . + "ORDER BY ie.pid DESC, l.begdate DESC LIMIT 1"); + // Note that reverse-ordering by ie.pid is a trick for sorting + // issues linked to the encounter (non-null values) first. + if (empty($grow['pid'])) { // if there is no linked GCAC issue + if (empty($grow)) { // no GCAC issue exists + $errmsg = "GCAC issue does not exist"; + } + else { // there is one but none is linked + $errmsg = "GCAC issue is not linked"; + } } } + + if (!$errmsg) { + if (!$billed) $errmsg = $GLOBALS['simplified_demographics'] ? + "Not checked out" : "Not billed"; + if (!$encounter) $errmsg = "No visit"; + } + if (! $charges) $billed = ""; + + $docrow['charges'] += $charges; + $docrow['copays'] += $copays; + if ($encounter) ++$docrow['encounters']; + + if ($_POST['form_details']) { ?> - - + + + - - - - - - - -\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + } ?> - +
-  Practitioner - -  Time - -  Patient - - Chart  - - Encounter  - - Charge  - - Billed - -  Error -
                 
-   +
+   + +   + +   -   + +   -   + +   -   + +   -   + +   -   + +   - + + -   + +  
\n"; + echo "  " . xl('Grand Totals') . "\n"; + echo " \n"; + echo "  " . $grand_total_encounters . " \n"; + echo " \n"; + echo "  "; bucks($grand_total_charges); echo " \n"; + echo " \n"; + echo "  "; bucks($grand_total_copays); echo " \n"; + echo " \n"; + echo "  \n"; + echo "
+
+ + + + + + + + -- 2.11.4.GIT