$query .= " order by ar.invnumber";
 // echo "<!-- $query -->\n"; // debugging
 $t_res = SLQuery($query);
 if ($sl_err) {
     die($sl_err);
 }
 $docname = "";
 $docnameleft = "";
 $main_docid = 0;
 $doctotal1 = 0;
 $grandtotal1 = 0;
 $doctotal2 = 0;
 $grandtotal2 = 0;
 $last_trans_id = 0;
 $skipping = false;
 for ($irow = 0; $irow < SLRowCount($t_res); ++$irow) {
     $row = SLGetRow($t_res, $irow);
     list($patient_id, $encounter_id) = explode(".", $row['invnumber']);
     // Under some conditions we may skip invoices that matched the SQL query.
     //
     if ($row['trans_id'] == $last_trans_id) {
         if ($skipping) {
             continue;
         }
         // same invoice and not skipping, do nothing.
     } else {
         // new invoice
         $skipping = false;
         // If a diagnosis code was given then skip any invoices without
         // that diagnosis.
         if ($form_icdcode) {
Exemple #2
0
function generate_receipt($patient_id, $encounter = 0)
{
    global $sl_err, $sl_cash_acc, $css_header, $details, $INTEGRATED_AR;
    // Get details for what we guess is the primary facility.
    $frow = sqlQuery("SELECT * FROM facility " . "ORDER BY billing_location DESC, accepts_assignment DESC, id LIMIT 1");
    $patdata = getPatientData($patient_id, 'fname,mname,lname,pubpid,street,city,state,postal_code,providerID');
    // Get the most recent invoice data or that for the specified encounter.
    //
    // Adding a provider check so that their info can be displayed on receipts
    if ($INTEGRATED_AR) {
        if ($encounter) {
            $ferow = sqlQuery("SELECT id, date, encounter, provider_id FROM form_encounter " . "WHERE pid = ? AND encounter = ?", array($patient_id, $encounter));
        } else {
            $ferow = sqlQuery("SELECT id, date, encounter, provider_id FROM form_encounter " . "WHERE pid = ? " . "ORDER BY id DESC LIMIT 1", array($patient_id));
        }
        if (empty($ferow)) {
            die(xlt("This patient has no activity."));
        }
        $trans_id = $ferow['id'];
        $encounter = $ferow['encounter'];
        $svcdate = substr($ferow['date'], 0, 10);
        if ($GLOBALS['receipts_by_provider']) {
            if (isset($ferow['provider_id'])) {
                $encprovider = $ferow['provider_id'];
            } else {
                if (isset($patdata['providerID'])) {
                    $encprovider = $patdata['providerID'];
                } else {
                    $encprovider = -1;
                }
            }
        }
        if ($encprovider) {
            $providerrow = sqlQuery("SELECT fname, mname, lname, title, street, streetb, " . "city, state, zip, phone, fax FROM users WHERE id = ?", array($encprovider));
        }
    } else {
        SLConnect();
        //
        $arres = SLQuery("SELECT * FROM ar WHERE " . "invnumber LIKE '{$patient_id}.%' " . "ORDER BY id DESC LIMIT 1");
        if ($sl_err) {
            die(text($sl_err));
        }
        if (!SLRowCount($arres)) {
            die(xlt("This patient has no activity."));
        }
        $arrow = SLGetRow($arres, 0);
        //
        $trans_id = $arrow['id'];
        //
        // Determine the date of service.  An 8-digit encounter number is
        // presumed to be a date of service imported during conversion or
        // associated with prescriptions only.  Otherwise look it up in the
        // form_encounter table.
        //
        $svcdate = "";
        list($trash, $encounter) = explode(".", $arrow['invnumber']);
        if (strlen($encounter) >= 8) {
            $svcdate = substr($encounter, 0, 4) . "-" . substr($encounter, 4, 2) . "-" . substr($encounter, 6, 2);
        } else {
            if ($encounter) {
                $tmp = sqlQuery("SELECT date FROM form_encounter WHERE " . "encounter = ?", array($encounter));
                $svcdate = substr($tmp['date'], 0, 10);
            }
        }
    }
    // end not $INTEGRATED_AR
    // Get invoice reference number.
    $encrow = sqlQuery("SELECT invoice_refno FROM form_encounter WHERE " . "pid = ? AND encounter = ? LIMIT 1", array($patient_id, $encounter));
    $invoice_refno = $encrow['invoice_refno'];
    ?>
<html>
<head>
<?php 
    html_header_show();
    ?>
<link rel='stylesheet' href='<?php 
    echo $css_header;
    ?>
' type='text/css'>
<title><?php 
    echo xlt('Receipt for Payment');
    ?>
</title>
<script type="text/javascript" src="../../library/dialog.js"></script>
<script language="JavaScript">

<?php 
    require $GLOBALS['srcdir'] . "/restoreSession.php";
    ?>

 // Process click on Print button.
 function printme() {
  var divstyle = document.getElementById('hideonprint').style;
  divstyle.display = 'none';
  window.print();
  return false;
 }

 // Process click on Delete button.
 function deleteme() {
  dlgopen('deleter.php?billing=<?php 
    echo attr("{$patient_id}.{$encounter}");
    ?>
', '_blank', 500, 450);
  return false;
 }

 // Called by the deleteme.php window on a successful delete.
 function imdeleted() {
  window.close();
 }

</script>
</head>
<body class="body_top">
<center>
<?php 
    if ($GLOBALS['receipts_by_provider'] && !empty($providerrow)) {
        printProviderHeader($providerrow);
    } else {
        printFacilityHeader($frow);
    }
    echo xlt("Receipt Generated") . ":" . text(date(' F j, Y'));
    if ($invoice_refno) {
        echo " " . xlt("Invoice Number") . ": " . text($invoice_refno) . " " . xlt("Service Date") . ": " . text($svcdate);
    }
    ?>
<br>&nbsp;
</b></p>
</center>
<p>
<?php 
    echo text($patdata['fname']) . ' ' . text($patdata['mname']) . ' ' . text($patdata['lname']);
    ?>
<br><?php 
    echo text($patdata['street']);
    ?>
<br><?php 
    echo text($patdata['city']) . ', ' . text($patdata['state']) . ' ' . text($patdata['postal_code']);
    ?>
<br>&nbsp;
</p>
<center>
<table cellpadding='5'>
 <tr>
  <td><b><?php 
    echo xlt('Date');
    ?>
</b></td>
  <td><b><?php 
    echo xlt('Description');
    ?>
</b></td>
  <td align='right'><b><?php 
    echo $details ? xlt('Price') : '&nbsp;';
    ?>
</b></td>
  <td align='right'><b><?php 
    echo $details ? xlt('Qty') : '&nbsp;';
    ?>
</b></td>
  <td align='right'><b><?php 
    echo xlt('Total');
    ?>
</b></td>
 </tr>

<?php 
    $charges = 0.0;
    if ($INTEGRATED_AR) {
        // Product sales
        $inres = sqlStatement("SELECT s.sale_id, s.sale_date, s.fee, " . "s.quantity, s.drug_id, d.name " . "FROM drug_sales AS s LEFT JOIN drugs AS d ON d.drug_id = s.drug_id " . "WHERE s.pid = ? AND s.encounter = ? " . "ORDER BY s.sale_id", array($patient_id, $encounter));
        while ($inrow = sqlFetchArray($inres)) {
            $charges += sprintf('%01.2f', $inrow['fee']);
            receiptDetailLine($inrow['sale_date'], $inrow['name'], $inrow['fee'], $inrow['quantity']);
        }
        // Service and tax items
        $inres = sqlStatement("SELECT * FROM billing WHERE " . "pid = ? AND encounter = ? AND " . "code_type != 'COPAY' AND activity = 1 " . "ORDER BY id", array($patient_id, $encounter));
        while ($inrow = sqlFetchArray($inres)) {
            $charges += sprintf('%01.2f', $inrow['fee']);
            receiptDetailLine($svcdate, $inrow['code_text'], $inrow['fee'], $inrow['units']);
        }
        // Adjustments.
        $inres = sqlStatement("SELECT " . "a.code, a.modifier, a.memo, a.payer_type, a.adj_amount, a.pay_amount, " . "s.payer_id, s.reference, s.check_date, s.deposit_date " . "FROM ar_activity AS a " . "LEFT JOIN ar_session AS s ON s.session_id = a.session_id WHERE " . "a.pid = ? AND a.encounter = ? AND " . "a.adj_amount != 0 " . "ORDER BY s.check_date, a.sequence_no", array($patient_id, $encounter));
        while ($inrow = sqlFetchArray($inres)) {
            $charges -= sprintf('%01.2f', $inrow['adj_amount']);
            $payer = empty($inrow['payer_type']) ? 'Pt' : 'Ins' . $inrow['payer_type'];
            receiptDetailLine($svcdate, $payer . ' ' . $inrow['memo'], 0 - $inrow['adj_amount'], 1);
        }
    } else {
        // Request all line items with money belonging to the invoice.
        $inres = SLQuery("SELECT * FROM invoice WHERE " . "trans_id = {$trans_id} AND sellprice != 0 ORDER BY id");
        if ($sl_err) {
            die($sl_err);
        }
        for ($irow = 0; $irow < SLRowCount($inres); ++$irow) {
            $row = SLGetRow($inres, $irow);
            $amount = sprintf('%01.2f', $row['sellprice'] * $row['qty']);
            $charges += $amount;
            $desc = preg_replace('/^.{1,6}:/', '', $row['description']);
            receiptDetailLine($svcdate, $desc, $amount, $row['qty']);
        }
    }
    // end not $INTEGRATED_AR
    ?>

 <tr>
  <td colspan='5'>&nbsp;</td>
 </tr>
 <tr>
  <td><?php 
    echo text(oeFormatShortDate($svcdispdate));
    ?>
</td>
  <td><b><?php 
    echo xlt('Total Charges');
    ?>
</b></td>
  <td align='right'>&nbsp;</td>
  <td align='right'>&nbsp;</td>
  <td align='right'><?php 
    echo text(oeFormatMoney($charges, true));
    ?>
</td>
 </tr>
 <tr>
  <td colspan='5'>&nbsp;</td>
 </tr>

<?php 
    if ($INTEGRATED_AR) {
        // Get co-pays.
        $inres = sqlStatement("SELECT fee, code_text FROM billing WHERE " . "pid = ? AND encounter = ?  AND " . "code_type = 'COPAY' AND activity = 1 AND fee != 0 " . "ORDER BY id", array($patient_id, $encounter));
        while ($inrow = sqlFetchArray($inres)) {
            $charges += sprintf('%01.2f', $inrow['fee']);
            receiptPaymentLine($svcdate, 0 - $inrow['fee'], $inrow['code_text']);
        }
        // Get other payments.
        $inres = sqlStatement("SELECT " . "a.code, a.modifier, a.memo, a.payer_type, a.adj_amount, a.pay_amount, " . "s.payer_id, s.reference, s.check_date, s.deposit_date " . "FROM ar_activity AS a " . "LEFT JOIN ar_session AS s ON s.session_id = a.session_id WHERE " . "a.pid = ? AND a.encounter = ? AND " . "a.pay_amount != 0 " . "ORDER BY s.check_date, a.sequence_no", array($patient_id, $encounter));
        $payer = empty($inrow['payer_type']) ? 'Pt' : 'Ins' . $inrow['payer_type'];
        while ($inrow = sqlFetchArray($inres)) {
            $charges -= sprintf('%01.2f', $inrow['pay_amount']);
            receiptPaymentLine($svcdate, $inrow['pay_amount'], $payer . ' ' . $inrow['reference']);
        }
    } else {
        $chart_id_cash = SLQueryValue("select id from chart where accno = '{$sl_cash_acc}'");
        if ($sl_err) {
            die($sl_err);
        }
        if (!$chart_id_cash) {
            die("There is no COA entry for cash account '{$sl_cash_acc}'");
        }
        //
        // Request all cash entries belonging to the invoice.
        $atres = SLQuery("SELECT * FROM acc_trans WHERE " . "trans_id = {$trans_id} AND chart_id = {$chart_id_cash} ORDER BY transdate");
        if ($sl_err) {
            die($sl_err);
        }
        //
        for ($irow = 0; $irow < SLRowCount($atres); ++$irow) {
            $row = SLGetRow($atres, $irow);
            $amount = sprintf('%01.2f', $row['amount']);
            // negative
            $charges += $amount;
            $rowsource = $row['source'];
            if (strtolower($rowsource) == 'co-pay') {
                $rowsource = '';
            }
            receiptPaymentLine($row['transdate'], 0 - $amount, $rowsource);
        }
    }
    // end not $INTEGRATED_AR
    ?>
 <tr>
  <td colspan='5'>&nbsp;</td>
 </tr>
 <tr>
  <td>&nbsp;</td>
  <td><b><?php 
    echo xlt('Balance Due');
    ?>
</b></td>
  <td colspan='2'>&nbsp;</td>
  <td align='right'><?php 
    echo text(oeFormatMoney($charges, true));
    ?>
</td>
 </tr>
</table>
</center>
<div id='hideonprint'>
<p>
&nbsp;
<a href='#' onclick='return printme();'><?php 
    echo xlt('Print');
    ?>
</a>
<?php 
    if (acl_check('acct', 'disc')) {
        ?>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href='#' onclick='return deleteme();'><?php 
        echo xlt('Undo Checkout');
        ?>
</a>
<?php 
    }
    ?>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<?php 
    if ($details) {
        ?>
<a href='pos_checkout.php?details=0&ptid=<?php 
        echo attr($patient_id);
        ?>
&enc=<?php 
        echo attr($encounter);
        ?>
'><?php 
        echo xlt('Hide Details');
        ?>
</a>
<?php 
    } else {
        ?>
<a href='pos_checkout.php?details=1&ptid=<?php 
        echo attr($patient_id);
        ?>
&enc=<?php 
        echo attr($encounter);
        ?>
'><?php 
        echo xlt('Show Details');
        ?>
</a>
<?php 
    }
    ?>
</p>
</div>
</body>
</html>
<?php 
    if (!$INTEGRATED_AR) {
        SLClose();
    }
}
function get_invoice_summary($trans_id, $with_detail = false)
{
    global $sl_err, $sl_cash_acc;
    $codes = array();
    $chart_id_cash = SLQueryValue("select id from chart where accno = '{$sl_cash_acc}'");
    if ($sl_err) {
        die($sl_err);
    }
    if (!$chart_id_cash) {
        die("There is no COA entry for cash account '{$sl_cash_acc}'");
    }
    // Request all cash entries belonging to the invoice.
    $atres = SLQuery("select * from acc_trans where trans_id = {$trans_id} and chart_id = {$chart_id_cash}");
    if ($sl_err) {
        die($sl_err);
    }
    // Deduct payments for each procedure code from the respective balance owed.
    $keysuffix = 5000;
    for ($irow = 0; $irow < SLRowCount($atres); ++$irow) {
        $row = SLGetRow($atres, $irow);
        $code = strtoupper($row['memo']);
        $ins_id = $row['project_id'];
        if (!$code) {
            $code = "Unknown";
        }
        $amount = $row['amount'];
        $codes[$code]['bal'] += $amount;
        // amount is negative for a payment
        if ($ins_id) {
            $codes[$code]['ins'] = $ins_id;
        }
        // Add the details if they want 'em.
        if ($with_detail) {
            if (!$codes[$code]['dtl']) {
                $codes[$code]['dtl'] = array();
            }
            $tmpkey = $row['transdate'] . $keysuffix++;
            $tmp = array();
            $tmp['pmt'] = 0 - $amount;
            $tmp['src'] = $row['source'];
            if ($ins_id) {
                $tmp['ins'] = $ins_id;
            }
            $codes[$code]['dtl'][$tmpkey] = $tmp;
        }
    }
    // Request all line items with money or adjustment reasons belonging
    // to the invoice.
    $inres = SLQuery("SELECT * FROM invoice WHERE trans_id = {$trans_id} AND " . "( sellprice != 0 OR description LIKE 'Adjustment%' OR serialnumber = 'Claim' )");
    if ($sl_err) {
        die($sl_err);
    }
    // Add charges and adjustments for each procedure code into its total and balance.
    $keysuffix = 1000;
    for ($irow = 0; $irow < SLRowCount($inres); ++$irow) {
        $row = SLGetRow($inres, $irow);
        // $amount = $row['sellprice'];
        $amount = sprintf('%01.2f', $row['sellprice'] * $row['qty']);
        $ins_id = $row['project_id'];
        $code = "Unknown";
        if ($row['serialnumber'] == 'Claim') {
            $code = 'Claim';
        } else {
            if (preg_match("/([A-Za-z0-9]\\d\\d\\S*)/", $row['serialnumber'], $matches)) {
                $code = strtoupper($matches[1]);
            } else {
                if (preg_match("/([A-Za-z0-9]\\d\\d\\S*)/", $row['description'], $matches)) {
                    $code = strtoupper($matches[1]);
                } else {
                    if (preg_match("/^TAX:/", $row['description'])) {
                        $code = 'TAX';
                    }
                }
            }
        }
        $codes[$code]['chg'] += $amount;
        $codes[$code]['bal'] += $amount;
        if ($amount < 0) {
            $codes[$code]['adj'] -= $amount;
        }
        if ($ins_id) {
            $codes[$code]['ins'] = $ins_id;
        }
        // Add the details if they want 'em.
        if ($with_detail) {
            if (!$codes[$code]['dtl']) {
                $codes[$code]['dtl'] = array();
            }
            if (preg_match("/^Adjustment\\s*(\\S*)\\s*(.*)/", $row['description'], $matches)) {
                $tmpkey = str_pad($matches[1], 10) . $keysuffix++;
                $tmp = array();
                $tmp['chg'] = $amount;
                $tmp['rsn'] = $matches[2];
                if ($ins_id) {
                    $tmp['ins'] = $ins_id;
                }
                $codes[$code]['dtl'][$tmpkey] = $tmp;
            } else {
                $tmpkey = "          " . $keysuffix++;
                $tmp = array();
                $tmp['chg'] = $amount;
                if ($code == 'TAX') {
                    $tmp['dsc'] = substr($row['description'], 4);
                }
                $codes[$code]['dtl'][$tmpkey] = $tmp;
            }
        }
    }
    return $codes;
}
Exemple #4
0
            $query .= "substring(trim(both from customer.name) from '% #\"%#\"' for '#') AS lname, " . "substring(trim(both from customer.name) from '#\"%#\" %' for '#') AS fname, ";
        }
        $query .= "(SELECT SUM(invoice.sellprice * invoice.qty) FROM invoice WHERE " . "invoice.trans_id = ar.id AND invoice.sellprice > 0) AS charges, " . "(SELECT SUM(invoice.sellprice * invoice.qty) FROM invoice WHERE " . "invoice.trans_id = ar.id AND invoice.sellprice < 0) AS adjustments " . "FROM ar, customer WHERE ( {$where} ) AND customer.id = ar.customer_id ";
        if ($_POST['form_category'] != 'All' && !$eracount) {
            $query .= "AND ar.amount != ar.paid ";
            // if ($_POST['form_category'] == 'Due') {
            //   $query .= "AND ar.duedate <= CURRENT_DATE ";
            // }
        }
        $query .= "ORDER BY lname, fname, ar.invnumber";
        // echo "<!-- $query -->\n"; // debugging
        $t_res = SLQuery($query);
        if ($sl_err) {
            die($sl_err);
        }
        $num_invoices = SLRowCount($t_res);
        if ($eracount && $num_invoices != $eracount) {
            $alertmsg .= "Of {$eracount} remittances, there are {$num_invoices} " . "matching claims in OpenEMR. ";
        }
    }
    // end not $INTEGRATED_AR
    ?>

<table border='0' cellpadding='1' cellspacing='2' width='98%'>

 <tr bgcolor="#dddddd">
  <td class="dehead">
   &nbsp;<?php 
    xl('Patient', 'e');
    ?>
  </td>
Exemple #5
0
         $srow = sqlQuery("SELECT SUM(fee) AS amount FROM drug_sales WHERE " . "pid = ? and encounter = ? ", array($pid, $enc));
         $drow = sqlQuery("SELECT SUM(pay_amount) AS payments, " . "SUM(adj_amount) AS adjustments FROM ar_activity WHERE " . "pid = ? and encounter = ? ", array($pid, $enc));
         $duept = $brow['amount'] + $srow['amount'] - $drow['payments'] - $drow['adjustments'];
     }
     echoLine("form_upay[{$enc}]", $dispdate, $value['charges'], $dpayment_pat, $dpayment + $dadjustment, $duept, $enc, $inscopay, $patcopay);
 }
 // Now list previously billed visits.
 if ($INTEGRATED_AR) {
 } else {
     // Query for all open invoices.
     $query = "SELECT ar.id, ar.invnumber, ar.amount, ar.paid, " . "ar.intnotes, ar.notes, ar.shipvia, " . "(SELECT SUM(invoice.sellprice * invoice.qty) FROM invoice WHERE " . "invoice.trans_id = ar.id AND invoice.sellprice > 0) AS charges, " . "(SELECT SUM(invoice.sellprice * invoice.qty) FROM invoice WHERE " . "invoice.trans_id = ar.id AND invoice.sellprice < 0) AS adjustments, " . "(SELECT SUM(acc_trans.amount) FROM acc_trans WHERE " . "acc_trans.trans_id = ar.id AND acc_trans.chart_id = ? " . "AND acc_trans.source NOT LIKE 'Ins%') AS ptpayments " . "FROM ar WHERE ar.invnumber LIKE ? AND " . "ar.amount != ar.paid " . "ORDER BY ar.invnumber";
     $ires = SLQuery($query, array($chart_id_cash, $pid . "%"));
     if ($sl_err) {
         die($sl_err);
     }
     $num_invoices = SLRowCount($ires);
     for ($ix = 0; $ix < $num_invoices; ++$ix) {
         $irow = SLGetRow($ires, $ix);
         // Get encounter ID and date of service.
         list($patient_id, $enc) = explode(".", $irow['invnumber']);
         $tmp = sqlQuery("SELECT LEFT(date, 10) AS encdate FROM form_encounter " . "WHERE encounter = ?", array($enc));
         $svcdate = $tmp['encdate'];
         // Compute $duncount as in sl_eob_search.php to determine if
         // this invoice is at patient responsibility.
         $duncount = substr_count(strtolower($irow['intnotes']), "statement sent");
         if (!$duncount) {
             $insgot = strtolower($irow['notes']);
             $inseobs = strtolower($irow['shipvia']);
             foreach (array('ins1', 'ins2', 'ins3') as $value) {
                 if (strpos($insgot, $value) !== false && strpos($inseobs, $value) === false) {
                     --$duncount;
Exemple #6
0
function slSetupSecondary($invid, $debug)
{
    global $sl_err, $GLOBALS;
    if ($GLOBALS['oer_config']['ws_accounting']['enabled'] === 2) {
        die("Internal error calling slSetupSecondary()");
    }
    $info_msg = '';
    // Get some needed items from the SQL-Ledger invoice.
    $arres = SLQuery("select invnumber, transdate, customer_id, employee_id, " . "shipvia from ar where ar.id = {$invid}");
    if ($sl_err) {
        die($sl_err);
    }
    $arrow = SLGetRow($arres, 0);
    if (!$arrow) {
        die(xl('There is no match for invoice id') . ' = ' . "{$trans_id}.");
    }
    $customer_id = $arrow['customer_id'];
    $date_of_service = $arrow['transdate'];
    list($trash, $encounter) = explode(".", $arrow['invnumber']);
    // Get the OpenEMR PID corresponding to the customer.
    $pdrow = sqlQuery("SELECT patient_data.pid " . "FROM integration_mapping, patient_data WHERE " . "integration_mapping.foreign_id = {$customer_id} AND " . "integration_mapping.foreign_table = 'customer' AND " . "patient_data.id = integration_mapping.local_id");
    $pid = $pdrow['pid'];
    if (!$pid) {
        die(xl("Cannot find patient from SQL-Ledger customer id") . " = {$customer_id}.");
    }
    // Determine the ID of the next insurance company (if any) to be billed.
    $new_payer_id = -1;
    $new_payer_type = -1;
    $insdone = strtolower($arrow['shipvia']);
    foreach (array('ins1' => 'primary', 'ins2' => 'secondary', 'ins3' => 'tertiary') as $key => $value) {
        if (strpos($insdone, $key) === false) {
            $nprow = sqlQuery("SELECT provider FROM insurance_data WHERE " . "pid = '{$pid}' AND type = '{$value}' AND date <= '{$date_of_service}' " . "ORDER BY date DESC LIMIT 1");
            if (!empty($nprow['provider'])) {
                $new_payer_id = $nprow['provider'];
                $new_payer_type = substr($key, 3);
            }
            break;
        }
    }
    // Find out if the encounter exists.
    $ferow = sqlQuery("SELECT pid FROM form_encounter WHERE " . "encounter = {$encounter}");
    $encounter_pid = $ferow['pid'];
    // If it exists, just update the billing items.
    if ($encounter_pid) {
        if ($encounter_pid != $pid) {
            die(xl("Expected form_encounter.pid to be ") . $pid . ', ' . xl(' but was ') . $encounter_pid);
        }
        // If there's a payer ID queue it up, otherwise just reopen it.
        if ($new_payer_id > 0) {
            // TBD: implement a default bill_process and target in config.php,
            // it should not really be hard-coded here.
            if (!$debug) {
                updateClaim(true, $pid, $encounter, $new_payer_id, $new_payer_type, 1, 5, '', 'hcfa');
            }
        } else {
            if (!$debug) {
                updateClaim(true, $pid, $encounter, -1, -1, 1, 0, '');
            }
        }
        $info_msg = xl("Encounter ") . $encounter . xl(" is ready for re-billing.");
        return;
    }
    // If we get here then the encounter does not already exist.  This should
    // only happen if A/R was converted from an earlier system.  In this case
    // the encounter ID should be the date of service, and we will create the
    // encounter.
    // If it does not exist then it better be (or start with) a date.
    if (!preg_match("/^20\\d\\d\\d\\d\\d\\d/", $encounter)) {
        die(xl("Internal error: encounter '") . $encounter . xl("' should exist but does not."));
    }
    $employee_id = $arrow['employee_id'];
    // Get the OpenEMR provider info corresponding to the SQL-Ledger salesman.
    $drrow = sqlQuery("SELECT users.id, users.username, users.facility_id " . "FROM integration_mapping, users WHERE " . "integration_mapping.foreign_id = {$employee_id} AND " . "integration_mapping.foreign_table = 'salesman' AND " . "users.id = integration_mapping.local_id");
    $provider_id = $drrow['id'];
    if (!$provider_id) {
        die(xl("Cannot find provider from SQL-Ledger employee = ") . $employee_id);
    }
    if (!$date_of_service) {
        die(xl("Invoice has no date!"));
    }
    // Generate a new encounter number.
    $conn = $GLOBALS['adodb']['db'];
    $new_encounter = $conn->GenID("sequences");
    // Create the "new encounter".
    $encounter_id = 0;
    $query = "INSERT INTO form_encounter ( " . "date, reason, facility_id, pid, encounter, onset_date, provider_id " . ") VALUES ( " . "'{$date_of_service}', " . "'" . xl('Imported from Accounting') . "', " . "'" . addslashes($drrow['facility_id']) . "', " . "{$pid}, " . "{$new_encounter}, " . "'{$date_of_service}', " . "'{$provider_id}' " . ")";
    if ($debug) {
        echo $query . "<br>\n";
        echo xl("Call to addForm() goes here.<br>") . "\n";
    } else {
        $encounter_id = idSqlStatement($query);
        if (!$encounter_id) {
            die(xl("Insert failed: ") . $query);
        }
        addForm($new_encounter, xl("New Patient Encounter"), $encounter_id, "newpatient", $pid, 1, $date_of_service);
        $info_msg = xl("Encounter ") . $new_encounter . xl(" has been created. ");
    }
    // For each invoice line item with a billing code we will insert
    // a billing row with payer_id set to -1.  Order the line items
    // chronologically so that each procedure code will be followed by
    // its associated icd9 code.
    $inres = SLQuery("SELECT * FROM invoice WHERE trans_id = {$invid} " . "ORDER BY id");
    if ($sl_err) {
        die($sl_err);
    }
    // When nonzero, this will be the ID of a billing row that needs to
    // have its justify field set.
    $proc_ins_id = 0;
    for ($irow = 0; $irow < SLRowCount($inres); ++$irow) {
        $row = SLGetRow($inres, $irow);
        $amount = sprintf('%01.2f', $row['sellprice'] * $row['qty']);
        // Extract the billing code.
        $code = xl("Unknown");
        if (preg_match("/([A-Za-z0-9]\\d\\d\\S*)/", $row['serialnumber'], $matches)) {
            $code = strtoupper($matches[1]);
        } else {
            if (preg_match("/([A-Za-z0-9]\\d\\d\\S*)/", $row['description'], $matches)) {
                $code = strtoupper($matches[1]);
            }
        }
        list($code, $modifier) = explode("-", $code);
        // Set the billing code type and description.
        $code_type = "";
        $code_text = "";
        foreach ($code_types as $key => $value) {
            if (preg_match("/{$key}/", $row['serialnumber'])) {
                $code_type = $key;
                if ($value['fee']) {
                    $code_text = xl("Procedure") . " {$code}";
                } else {
                    $code_text = xl("Diagnosis") . " {$code}";
                    if ($proc_ins_id) {
                        $query = "UPDATE billing SET justify = '{$code}' WHERE id = {$proc_ins_id}";
                        if ($debug) {
                            echo $query . "<br>\n";
                        } else {
                            sqlQuery($query);
                        }
                        $proc_ins_id = 0;
                    }
                }
                break;
            }
        }
        // Skip adjustments.
        if (!$code_type) {
            continue;
        }
        // Insert the billing item.  If this for a procedure code then save
        // the row ID so that we can update the "justify" field with the ICD9
        // code, which should come next in the loop.
        //
        $query = "INSERT INTO billing ( " . "date, code_type, code, pid, provider_id, user, groupname, authorized, " . "encounter, code_text, activity, payer_id, billed, bill_process, " . "bill_date, modifier, units, fee, justify, target " . ") VALUES ( " . "NOW(), " . "'{$code_type}', " . "'{$code}', " . "{$pid}, " . "0, " . "'" . $_SESSION['authId'] . "', " . "'" . $_SESSION['authProvider'] . "', " . "1, " . "{$new_encounter}, " . "'{$code_text}', " . "1, " . "{$new_payer_id}, " . ($new_payer_id > 0 ? "1, " : "0, ") . ($new_payer_id > 0 ? "5, " : "0, ") . ($new_payer_id > 0 ? "NOW(), " : "NULL, ") . "'{$modifier}', " . "0, " . "{$amount}, " . "'', " . ($new_payer_id > 0 ? "'hcfa' " : "NULL ") . ")";
        if ($debug) {
            echo $query . "<br>\n";
        } else {
            $proc_ins_id = idSqlStatement($query);
            if ($code_type != "CPT4" && $code_type != "HCPCS") {
                $proc_ins_id = 0;
            }
        }
    }
    // Finally, change this invoice number to contain the new encounter number.
    //
    $new_invnumber = "{$pid}.{$new_encounter}";
    $query = "UPDATE ar SET invnumber = '{$new_invnumber}' WHERE id = {$invid}";
    if ($debug) {
        echo $query . "<br>\n";
    } else {
        SLQuery($query);
        if ($sl_err) {
            die($sl_err);
        }
        $info_msg .= xl("This invoice number has been changed to ") . $new_invnumber;
    }
    return $info_msg;
}
            $inv_duedate = '';
            $arow = sqlQuery("SELECT SUM(fee) AS amount FROM drug_sales WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}'");
            $inv_amount = $arow['amount'];
            $arow = sqlQuery("SELECT SUM(fee) AS amount FROM billing WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}' AND " . "activity = 1 AND code_type != 'COPAY'");
            $inv_amount += $arow['amount'];
            $arow = sqlQuery("SELECT SUM(fee) AS amount FROM billing WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}' AND " . "activity = 1 AND code_type = 'COPAY'");
            $inv_paid = 0 - $arow['amount'];
            $arow = sqlQuery("SELECT SUM(pay_amount) AS pay, " . "sum(adj_amount) AS adj FROM ar_activity WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}'");
            $inv_paid += $arow['pay'];
            $inv_amount -= $arow['adj'];
        } else {
            $ares = SLQuery("SELECT duedate, amount, paid FROM ar WHERE " . "ar.invnumber = '{$invnumber}'");
            if ($sl_err) {
                die($sl_err);
            }
            if (SLRowCount($ares) == 0) {
                continue;
            }
            $arow = SLGetRow($ares, 0);
            $inv_amount = $arow['amount'];
            $inv_paid = $arow['paid'];
            $inv_duedate = $arow['duedate'];
        }
        $total_amount += bucks($inv_amount);
        $total_paid += bucks($inv_paid);
        $bgcolor = $irow & 1 ? "#ffdddd" : "#ddddff";
        ?>
 <tr bgcolor='<?php 
        echo $bgcolor;
        ?>
'>