예제 #1
0
        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>&nbsp;</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>
예제 #2
0
// 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'] != "") {
예제 #3
0
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;
}