function slInitialize() { if ($GLOBALS['oer_config']['ws_accounting']['enabled'] === 2) { return; } global $chart_id_cash, $chart_id_ar, $chart_id_income, $services_id; global $sl_cash_acc, $sl_ar_acc, $sl_income_acc, $sl_services_id; SLConnect(); $chart_id_cash = SLQueryValue("select id from chart where accno = '{$sl_cash_acc}'"); if ($sl_err) { die($sl_err); } if (!$chart_id_cash) { die(xl("There is no COA entry for cash account ") . "'{$sl_cash_acc}'"); } $chart_id_ar = SLQueryValue("select id from chart where accno = '{$sl_ar_acc}'"); if ($sl_err) { die($sl_err); } if (!$chart_id_ar) { die(xl("There is no COA entry for AR account ") . "'{$sl_ar_acc}'"); } $chart_id_income = SLQueryValue("select id from chart where accno = '{$sl_income_acc}'"); if ($sl_err) { die($sl_err); } if (!$chart_id_income) { die(xl("There is no COA entry for income account ") . "'{$sl_income_acc}'"); } $services_id = SLQueryValue("select id from parts where partnumber = '{$sl_services_id}'"); if ($sl_err) { die($sl_err); } if (!$services_id) { die(xl("There is no parts entry for services ID ") . "'{$sl_services_id}'"); } }
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(); } }
$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) { if (!SLQueryValue("SELECT count(*) FROM invoice WHERE " . "invoice.trans_id = '" . $row['trans_id'] . "' AND " . "( invoice.description ILIKE 'ICD9:{$form_icdcode} %' OR " . "invoice.serialnumber ILIKE 'ICD9:{$form_icdcode}' )")) { $skipping = true; continue; } } // If a facility was specified then skip invoices whose encounters // do not indicate that facility. if ($form_facility) { $tmp = sqlQuery("SELECT count(*) AS count FROM form_encounter WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}' AND " . "facility_id = '{$form_facility}'"); if (empty($tmp['count'])) { $skipping = true; continue; } } // Find out who the practitioner is. /***********************************************************
if ($thisauth && $auth_sensitivity) { $binfo = array('', '', '', '', ''); if ($subresult2 = getBillingByEncounter($pid, $result4['encounter'], "code_type, code, modifier, code_text, fee")) { // Get A/R info, if available, for this encounter. $arinvoice = array(); $arlinkbeg = ""; $arlinkend = ""; if ($billing_view && $accounting_enabled) { if ($INTEGRATED_AR) { $tmp = sqlQuery("SELECT id FROM form_encounter WHERE " . "pid = ? AND encounter = ?", array($pid, $result4['encounter'])); $arid = 0 + $tmp['id']; if ($arid) { $arinvoice = ar_get_invoice_summary($pid, $result4['encounter'], true); } } else { $arid = SLQueryValue("SELECT id FROM ar WHERE invnumber = " . "'{$pid}.{$result4['encounter']}'"); if ($arid) { $arinvoice = get_invoice_summary($arid, true); } } if ($arid) { $arlinkbeg = "<a href='../../billing/sl_eob_invoice.php?id=" . htmlspecialchars($arid, ENT_QUOTES) . "'" . " target='_blank' class='text' style='color:#00cc00'>"; $arlinkend = "</a>"; } } // Throw in product sales. $query = "SELECT s.drug_id, s.fee, 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"; $sres = sqlStatement($query, array($pid, $result4['encounter'])); while ($srow = sqlFetchArray($sres)) { $subresult2[] = array('code_type' => 'PROD', 'code' => 'PROD:' . $srow['drug_id'], 'modifier' => '', 'code_text' => $srow['name'], 'fee' => $srow['fee']); }
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; }
exec("{$STMT_PRINT_CMD} {$STMT_TEMP_FILE}"); if ($_POST['form_without']) { $alertmsg = xl('Now printing') . ' ' . $stmt_count . ' ' . xl('statements; invoices will not be updated.'); } else { $alertmsg = xl('Now printing') . ' ' . $stmt_count . ' ' . xl('statements and updating invoices.'); } } // end not debug } // end not form_download } // end statements requested } else { SLConnect(); // This will be true starting with SQL-Ledger 2.8.x: $got_address_table = SLQueryValue("SELECT count(*) FROM pg_tables WHERE " . "schemaname = 'public' AND tablename = 'address'"); // Print or download statements if requested. // if (($_POST['form_print'] || $_POST['form_download'] || $_POST['form_pdf']) && $_POST['form_cb']) { $fhprint = fopen($STMT_TEMP_FILE, 'w'); $where = ""; foreach ($_POST['form_cb'] as $key => $value) { $where .= " OR ar.id = {$key}"; } $where = substr($where, 4); // Sort by patient so that multiple invoices can be // represented on a single statement. if ($got_address_table) { $res = SLQuery("SELECT ar.*, customer.name, " . "address.address1, address.address2, " . "address.city, address.state, address.zipcode, " . "substring(trim(both from customer.name) from '% #\"%#\"' for '#') AS fname, " . "substring(trim(both from customer.name) from '#\"%#\" %' for '#') AS lname " . "FROM ar, customer, address WHERE ( {$where} ) AND " . "customer.id = ar.customer_id AND " . "address.trans_id = ar.customer_id " . "ORDER BY lname, fname, ar.customer_id, ar.transdate"); } else { $res = SLQuery("SELECT ar.*, customer.name, " . "customer.address1, customer.address2, " . "customer.city, customer.state, customer.zipcode, " . "substring(trim(both from customer.name) from '% #\"%#\"' for '#') AS lname, " . "substring(trim(both from customer.name) from '#\"%#\" %' for '#') AS fname " . "FROM ar, customer WHERE ( {$where} ) AND " . "customer.id = ar.customer_id " . "ORDER BY lname, fname, ar.customer_id, ar.transdate");
xl('Adjustments', 'e'); ?> </th> <th align="right"> <?php xl('Payments', 'e'); ?> </th> </thead> <?php if (!$INTEGRATED_AR) { $chart_id_cash = SLQueryValue("select id from chart where accno = '{$sl_cash_acc}'"); if ($sl_err) { die($sl_err); } $chart_id_income = SLQueryValue("select id from chart where accno = '{$sl_income_acc}'"); if ($sl_err) { die($sl_err); } } if ($_POST['form_refresh']) { $from_date = $form_from_date; $to_date = $form_to_date; $paymethod = ""; $paymethodleft = ""; $methodpaytotal = 0; $grandpaytotal = 0; $methodadjtotal = 0; $grandadjtotal = 0; if ($INTEGRATED_AR) { // Get co-pays using the encounter date as the pay date. These will
row_delete("payments", "id = '" . $payrow['id'] . "'"); } } else { if ($billing) { if (!acl_check('acct', 'disc')) { die("Not authorized!"); } list($patient_id, $encounter_id) = explode(".", $billing); if ($GLOBALS['oer_config']['ws_accounting']['enabled'] === 2) { sqlStatement("DELETE FROM ar_activity WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}'"); sqlStatement("DELETE ar_session FROM ar_session LEFT JOIN " . "ar_activity ON ar_session.session_id = ar_activity.session_id " . "WHERE ar_activity.session_id IS NULL"); row_modify("billing", "activity = 0", "pid = '{$patient_id}' AND " . "encounter = '{$encounter_id}' AND " . "code_type = 'COPAY' AND " . "activity = 1"); sqlStatement("UPDATE form_encounter SET last_level_billed = 0, " . "last_level_closed = 0, stmt_count = 0, last_stmt_date = NULL " . "WHERE pid = '{$patient_id}' AND encounter = '{$encounter_id}'"); } else { slInitialize(); $trans_id = SLQueryValue("SELECT id FROM ar WHERE ar.invnumber = '{$billing}' LIMIT 1"); if ($trans_id) { newEvent("delete", $_SESSION['authUser'], $_SESSION['authProvider'], 1, "Invoice {$billing} from SQL-Ledger"); SLQuery("DELETE FROM acc_trans WHERE trans_id = '{$trans_id}'"); if ($sl_err) { die($sl_err); } SLQuery("DELETE FROM invoice WHERE trans_id = '{$trans_id}'"); if ($sl_err) { die($sl_err); } SLQuery("DELETE FROM ar WHERE id = '{$trans_id}'"); if ($sl_err) { die($sl_err); } } else {
if ($form_source) { $thissrc .= " {$form_source}"; } } $session_id = 0; // Is this OK? arPostPayment($form_pid, $enc, $session_id, $amount, '', 0, $thissrc, 0); } else { $thissrc = 'Pt/'; if ($form_method) { $thissrc .= $form_method; if ($form_source) { $thissrc .= " {$form_source}"; } } $trans_id = SLQueryValue("SELECT id FROM ar WHERE " . "ar.invnumber = '{$form_pid}.{$enc}' LIMIT 1"); if (!$trans_id) { die("Cannot find invoice '{$form_pid}.{$enc}'!"); } slPostPayment($trans_id, $amount, date('Y-m-d'), $thissrc, '', 0, 0); } frontPayment($form_pid, $enc, $form_method, $form_source, 0, $amount); } } } } ?> <?php if ($_POST['form_save'] || $_REQUEST['receipt']) { if ($_REQUEST['receipt']) {