$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) {
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> </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> </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') : ' '; ?> </b></td> <td align='right'><b><?php echo $details ? xlt('Qty') : ' '; ?> </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'> </td> </tr> <tr> <td><?php echo text(oeFormatShortDate($svcdispdate)); ?> </td> <td><b><?php echo xlt('Total Charges'); ?> </b></td> <td align='right'> </td> <td align='right'> </td> <td align='right'><?php echo text(oeFormatMoney($charges, true)); ?> </td> </tr> <tr> <td colspan='5'> </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'> </td> </tr> <tr> <td> </td> <td><b><?php echo xlt('Balance Due'); ?> </b></td> <td colspan='2'> </td> <td align='right'><?php echo text(oeFormatMoney($charges, true)); ?> </td> </tr> </table> </center> <div id='hideonprint'> <p> <a href='#' onclick='return printme();'><?php echo xlt('Print'); ?> </a> <?php if (acl_check('acct', 'disc')) { ?> <a href='#' onclick='return deleteme();'><?php echo xlt('Undo Checkout'); ?> </a> <?php } ?> <?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; }
$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"> <?php xl('Patient', 'e'); ?> </td>
$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;
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; ?> '>