echo " <td class='bold' colspan='2'>" . xlt("Grand Total") . "</td>\n"; echo " <td class='bold' style='text-align: right;'>" . text($total_units) . "</td>\n"; echo " <td class='bold' style='text-align: right;'>" . text(oeFormatMoney($total_chg)) . "</td>\n"; echo " <td class='bold' style='text-align: right;'>" . text(oeFormatMoney($total_pmt)) . "</td>\n"; echo " <td class='bold' style='text-align: right;'>" . text(oeFormatMoney($total_adj)) . "</td>\n"; echo " <td class='bold' style='text-align: right;'>" . text(oeFormatMoney($total_bal)) . "</td>\n"; echo " </tr>\n"; ?> </table> <tr><td> </td></tr><br><br> <?php if ($GLOBALS['print_next_appointment_on_ledger'] == 1) { $next_day = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); # add one day to date so it will not get todays appointment $current_date2 = date('Y-m-d', $next_day); $events = fetchNextXAppts($current_date2, $form_pid); $next_appoint_date = oeFormatShortDate($events[0]['pc_eventDate']); $next_appoint_time = substr($events[0]['pc_startTime'], 0, 5); if (strlen(umname) != 0) { $next_appoint_provider = $events[0]['ufname'] . ' ' . $events[0]['umname'] . ' ' . $events[0]['ulname']; } else { $next_appoint_provider = $events[0]['ufname'] . ' ' . $events[0]['ulname']; } if (strlen($next_appoint_time) != 0) { ?> <tr> <td class="title" ><?php echo xlt('Next Appointment Date') . ': ' . text($next_appoint_date) . ' ' . xlt('Time') . ' ' . text($next_appoint_time) . ' ' . xlt('Provider') . ' ' . text($next_appoint_provider); ?> </td> </tr>
// as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // Modified to support recurring appointments by Ian Jardine 2016. require_once "verify_session.php"; /////// require_once dirname(__FILE__) . "/../library/appointments.inc.php"; $current_date2 = date('Y-m-d'); $events = array(); $apptNum = (int) $GLOBALS['patient_portal_appt_display_num']; if ($apptNum != 0) { $apptNum2 = abs($apptNum); } else { $apptNum2 = 20; } $events = fetchNextXAppts($current_date2, $pid, $apptNum2); /////// $count = 0; foreach ($events as $row) { $count++; $dayname = xl(date("l", strtotime($row['pc_eventDate']))); $dispampm = "am"; $disphour = substr($row['pc_startTime'], 0, 2) + 0; $dispmin = substr($row['pc_startTime'], 3, 2); if ($disphour >= 12) { $dispampm = "pm"; if ($disphour > 12) { $disphour -= 12; } } if ($row['pc_hometext'] != "") {
function create_statement($stmt) { if (! $stmt['pid']) return ""; // get out if no data #minimum_amount_to _print if ($stmt[amount] <= ($GLOBALS['minimum_amount_to_print']) && $GLOBALS['use_statement_print_exclusion']) return ""; // These are your clinics return address, contact etc. Edit them. // TBD: read this from the facility table // Facility (service location) $atres = sqlStatement("select f.name,f.street,f.city,f.state,f.postal_code from facility f " . " left join users u on f.id=u.facility_id " . " left join billing b on b.provider_id=u.id and b.pid = '".$stmt['pid']."' " . " where service_location=1"); $row = sqlFetchArray($atres); // Facility (service location) $clinic_name = "{$row['name']}"; $clinic_addr = "{$row['street']}"; $clinic_csz = "{$row['city']}, {$row['state']}, {$row['postal_code']}"; // Billing location $remit_name = $clinic_name; $remit_addr = $clinic_addr; $remit_csz = $clinic_csz; // Contacts $atres = sqlStatement("select f.attn,f.phone from facility f " . " left join users u on f.id=u.facility_id " . " left join billing b on b.provider_id=u.id and b.pid = '".$stmt['pid']."' " . " where billing_location=1"); $row = sqlFetchArray($atres); $billing_contact = "{$row['attn']}"; $billing_phone = "{$row['phone']}"; // dunning message setup // insurance has paid something // $stmt['age'] how old is the invoice // $stmt['dun_count'] number of statements run // $stmt['level_closed'] <= 3 insurance 4 = patient if ($GLOBALS['use_dunning_message']) { if ($stmt['ins_paid'] != 0 || $stmt['level_closed'] == 4) { // do collection messages switch ($stmt{'age'}) { case $stmt{'age'} <= $GLOBALS['first_dun_msg_set']: $dun_message = $GLOBALS['first_dun_msg_text']; break; case $stmt{'age'} <= $GLOBALS['second_dun_msg_set']: $dun_message = $GLOBALS['second_dun_msg_text']; break; case $stmt{'age'} <= $GLOBALS['third_dun_msg_set']: $dun_message = $GLOBALS['third_dun_msg_text']; break; case $stmt{'age'} <= $GLOBALS['fourth_dun_msg_set']: $dun_message = $GLOBALS['fourth_dun_msg_text']; break; case $stmt{'age'} >= $GLOBALS['fifth_dun_msg_set']: $dun_message = $GLOBALS['fifth_dun_msg_text']; break; } } } // Text only labels $label_addressee = xl('ADDRESSEE'); $label_remitto = xl('REMIT TO'); $label_chartnum = xl('Chart Number'); $label_insinfo = xl('Insurance information on file'); $label_totaldue = xl('Total amount due'); $label_payby = xl('If paying by'); $label_cards = xl('VISA/MC/Discovery/HSA'); $label_cardnum = xl('Card'); $label_expiry = xl('Exp'); $label_sign = xl('Signature'); $label_retpay = xl('Return above part with your payment'); $label_pgbrk = xl('STATEMENT SUMMARY'); $label_visit = xl('Visit Date'); $label_desc = xl('Description'); $label_amt = xl('Amount'); // This is the text for the top part of the page, up to but not // including the detail lines. Some examples of variable fields are: // %s = string with no minimum width // %9s = right-justified string of 9 characters padded with spaces // %-25s = left-justified string of 25 characters padded with spaces // Note that "\n" is a line feed (new line) character. // reformatted to handle i8n by tony $out = "\n\n"; $providerNAME = getProviderName($stmt['providerID']); $out .= sprintf("%-30s %s %-s\n",$clinic_name,$stmt['patient'],$stmt['today']); $out .= sprintf("%-30s %s: %-s\n",$providerNAME,$label_chartnum,$stmt['pid']); $out .= sprintf("%-30s %s\n",$clinic_addr,$label_insinfo); $out .= sprintf("%-30s %-s: %-s\n",$clinic_csz,$label_totaldue,$stmt['amount']); $out .= "\n"; $out .= sprintf(" %-30s %-s\n",$label_addressee,$label_remitto); $out .= sprintf(" %-30s %s\n",$stmt['to'][0],$remit_name); $out .= sprintf(" %-30s %s\n",$stmt['to'][1],$remit_addr); $out .= sprintf(" %-30s %s\n",$stmt['to'][2],$remit_csz); if($stmt['to'][3]!='')//to avoid double blank lines the if condition is put. $out .= sprintf(" %-32s\n",$stmt['to'][3]); $out .= sprintf("_________________________________________________________________\n"); $out .= "\n"; $out .= sprintf("%-32s\n",$label_payby.' '.$label_cards); $out .= "\n"; $out .= sprintf("%s_____________________ %s______ %s___________________%s\n\n", $label_cardnum,$label_expiry,$label_sign); $out .= sprintf("-----------------------------------------------------------------\n"); $out .= sprintf("%-20s %s\n",null,$label_retpay); $out .= "\n"; $out .= sprintf("_______________________ %s _______________________\n",$label_pgbrk); $out .= "\n"; $out .= sprintf("%-11s %-46s %s\n",$label_visit,$label_desc,$label_amt); $out .= "\n"; // This must be set to the number of lines generated above. // $count = 25; $num_ages = 4; $aging = array(); for ($age_index = 0; $age_index < $num_ages; ++$age_index) { $aging[$age_index] = 0.00; } $todays_time = strtotime(date('Y-m-d')); // This generates the detail lines. Again, note that the values must // be specified in the order used. // foreach ($stmt['lines'] as $line) { if ($GLOBALS['use_custom_statement']) { $description = substr($line['desc'],0,30); } else { $description = $line['desc']; } $tmp = substr($description, 0, 14); if ($tmp == 'Procedure 9920' || $tmp == 'Procedure 9921' || $tmp == 'Procedure 9200' || $tmp == 'Procedure 9201') $description = str_replace("Procedure",xl('Office Visit').":",$description); //92002-14 are Eye Office Visit Codes $dos = $line['dos']; ksort($line['detail']); # Compute the aging bucket index and accumulate into that bucket. # $age_in_days = (int) (($todays_time - strtotime($dos)) / (60 * 60 * 24)); $age_index = (int) (($age_in_days - 1) / 30); $age_index = max(0, min($num_ages - 1, $age_index)); $aging[$age_index] += $line['amount'] - $line['paid']; foreach ($line['detail'] as $dkey => $ddata) { $ddate = substr($dkey, 0, 10); if (preg_match('/^(\d\d\d\d)(\d\d)(\d\d)\s*$/', $ddate, $matches)) { $ddate = $matches[1] . '-' . $matches[2] . '-' . $matches[3]; } $amount = ''; if ($ddata['pmt']) { $amount = sprintf("%.2f", 0 - $ddata['pmt']); $desc = xl('Paid') .' '. oeFormatShortDate($ddate) .': '. $ddata['src'].' '. $ddata['pmt_method'].' '. $ddata['insurance_company']; } else if ($ddata['rsn']) { if ($ddata['chg']) { $amount = sprintf("%.2f", $ddata['chg']); $desc = xl('Adj') .' '. oeFormatShortDate($ddate) .': ' . $ddata['rsn'].' '.$ddata['pmt_method'].' '. $ddata['insurance_company']; } else { $desc = xl('Note') .' '. oeFormatShortDate($ddate) .': '. $ddata['rsn'].' '.$ddata['pmt_method'].' '. $ddata['insurance_company']; } } else if ($ddata['chg'] < 0) { $amount = sprintf("%.2f", $ddata['chg']); $desc = xl('Patient Payment'); } else { $amount = sprintf("%.2f", $ddata['chg']); $desc = $description; } $out .= sprintf("%-10s %-45s%8s\n", oeFormatShortDate($dos), $desc, $amount); $dos = ''; ++$count; } } // This generates blank lines until we are at line 42. // while ($count++ < 42) $out .= "\n"; # Generate the string of aging text. This will look like: # Current xxx.xx / 31-60 x.xx / 61-90 x.xx / Over-90 xxx.xx # ....+....1....+....2....+....3....+....4....+....5....+....6....+ # $ageline = xl('Current') .' ' . sprintf("%.2f", $aging[0]); for ($age_index = 1; $age_index < ($num_ages - 1); ++$age_index) { $ageline .= ' / ' . ($age_index * 30 + 1) . '-' . ($age_index * 30 + 30) . sprintf(" %.2f", $aging[$age_index]); } // Fixed text labels $label_ptname = xl('Name'); $label_today = xl('Date'); $label_due = xl('Amount Due'); $label_thanks = xl('Thank you for choosing'); $label_call = xl('Please call if any of the above information is incorrect.'); $label_prompt = xl('We appreciate prompt payment of balances due.'); $label_dept = xl('Billing Department'); $label_bill_phone = (!empty($GLOBALS['billing_phone_number']) ? $GLOBALS['billing_phone_number'] : $billing_phone ); $label_appointments = xl('Future Appointments').':'; // This is the bottom portion of the page. $out .= "\n"; if(strlen($stmt['bill_note']) !=0 && $GLOBALS['statement_bill_note_print']) { $out .= sprintf("%-46s\n",$stmt['bill_note']); } if ($GLOBALS['use_dunning_message']) { $out .= sprintf("%-46s\n",$dun_message); } $out .= "\n"; $out .= sprintf("%-s: %-25s %-s: %-14s %-s: %8s\n",$label_ptname,$stmt['patient'], $label_today,oeFormatShortDate($stmt['today']),$label_due,$stmt['amount']); $out .= sprintf("__________________________________________________________________\n"); $out .= "\n"; $out .= sprintf("%-s\n",$label_call); $out .= sprintf("%-s\n",$label_prompt); $out .= "\n"; $out .= sprintf("%-s\n",$billing_contact); $out .= sprintf(" %-s %-25s\n",$label_dept,$label_bill_phone); if($GLOBALS['statement_message_to_patient']) { $out .= "\n"; $statement_message = $GLOBALS['statement_msg_text']; $out .= sprintf("%-40s\n",$statement_message); } if($GLOBALS['show_aging_on_custom_statement']) { # code for ageing $ageline .= ' / ' . xl('Over') . '-' . ($age_index * 30) . sprintf(" %.2f", $aging[$age_index]); $out .= "\n" . $ageline . "\n\n"; } if($GLOBALS['number_appointments_on_statement']!=0) { $out .= "\n"; $num_appts = $GLOBALS['number_appointments_on_statement']; $next_day = mktime(0,0,0,date('m'),date('d')+1,date('Y')); # add one day to date so it will not get todays appointment $current_date2 = date('Y-m-d', $next_day); $events = fetchNextXAppts($current_date2,$stmt['pid'],$num_appts); $j=0; $out .= sprintf("%-s\n",$label_appointments); #loop to add the appointments for ($x = 1; $x <= $num_appts; $x++) { $next_appoint_date = oeFormatShortDate($events[$j]['pc_eventDate']); $next_appoint_time = substr($events[$j]['pc_startTime'],0,5); if(strlen(umname) != 0 ) { $next_appoint_provider = $events[$j]['ufname'] . ' ' . $events[$j]['umname'] . ' ' . $events[$j]['ulname']; } else { $next_appoint_provider = $events[$j]['ufname'] . ' ' . $events[$j]['ulname']; } if(strlen($next_appoint_time) != 0) { $label_plsnote[$j] = xlt('Date') . ': ' . text($next_appoint_date) . ' ' . xlt('Time') . ' ' . text($next_appoint_time) . ' ' . xlt('Provider') . ' ' . text($next_appoint_provider); $out .= sprintf("%-s\n",$label_plsnote[$j]); } $j++; } } $out .= "\014"; // this is a form feed return $out; }