if ($INTEGRATED_AR) { while ($row = sqlFetchArray($t_res)) { $balance = sprintf("%.2f", $row['charges'] + $row['copays'] - $row['payments'] - $row['adjustments']); if ($_POST['form_category'] != 'All' && $eracount == 0 && $balance == 0) { continue; } // $duncount was originally supposed to be the number of times that // the patient was sent a statement for this invoice. // $duncount = $row['stmt_count']; // But if we have not yet billed the patient, then compute $duncount as a // negative count of the number of insurance plans for which we have not // yet closed out insurance. // if (!$duncount) { for ($i = 1; $i <= 3 && arGetPayerID($row['pid'], $row['date'], $i); ++$i) { } $duncount = $row['last_level_closed'] + 1 - $i; } $isdueany = $balance > 0; // An invoice is now due from the patient if money is owed and we are // not waiting for insurance to pay. // $isduept = $duncount >= 0 && $isdueany ? " checked" : ""; // Skip invoices not in the desired "Due..." category. // if (substr($_POST['form_category'], 0, 3) == 'Due' && !$isdueany) { continue; } if ($_POST['form_category'] == 'Due Ins' && ($duncount >= 0 || !$isdueany)) { continue;
function ar_responsible_party($patient_id, $encounter_id) { $row = sqlQuery("SELECT date, last_level_billed, last_level_closed " . "FROM form_encounter WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}' " . "ORDER BY id DESC LIMIT 1"); if (empty($row)) { return -1; } $next_level = $row['last_level_closed'] + 1; if ($next_level <= $row['last_level_billed']) { return $next_level; } if (arGetPayerID($patient_id, substr($row['date'], 0, 10), $payer_type)) { return $next_level; } // There is no unclosed insurance, so see if there is an unpaid balance. // Currently hoping that form_encounter.balance_due can be discarded. $balance = 0; $codes = ar_get_invoice_summary($patient_id, $encounter_id); foreach ($codes as $cdata) { $balance += $cdata['bal']; } if ($balance > 0) { return 0; } return -1; }
function arSetupSecondary($patient_id, $encounter_id, $debug) { // Determine the next insurance level to be billed. $ferow = sqlQuery("SELECT date, last_level_billed " . "FROM form_encounter WHERE " . "pid = '{$patient_id}' AND encounter = '{$encounter_id}'"); $date_of_service = substr($ferow['date'], 0, 10); $new_payer_type = 0 + $ferow['last_level_billed']; if ($new_payer_type < 3 && !empty($ferow['last_level_billed']) || $new_payer_type == 0) { ++$new_payer_type; } $new_payer_id = arGetPayerID($patient_id, $date_of_service, $new_payer_type); if ($new_payer_id) { // Queue up the claim. if (!$debug) { updateClaim(true, $patient_id, $encounter_id, $new_payer_id, $new_payer_type, 1, 5, '', 'hcfa'); } } else { // Just reopen the claim. if (!$debug) { updateClaim(true, $patient_id, $encounter_id, -1, -1, 1, 0, ''); } } return xl("Encounter ") . $encounter . xl(" is ready for re-billing."); }
function era_callback(&$out) { global $encount, $debug, $claim_status_codes, $adjustment_reasons, $remark_codes; global $invoice_total, $last_code, $paydate, $INTEGRATED_AR; global $InsertionId; //last inserted ID of // Some heading information. $chk_123 = $out['check_number']; $chk_123 = str_replace(' ', '_', $chk_123); if (isset($_REQUEST['chk' . $chk_123])) { if ($encount == 0) { writeMessageLine('#ffffff', 'infdetail', "Payer: " . htmlspecialchars($out['payer_name'], ENT_QUOTES)); if ($debug) { writeMessageLine('#ffffff', 'infdetail', "WITHOUT UPDATE is selected; no changes will be applied."); } } $last_code = ''; $invoice_total = 0.0; $bgcolor = ++$encount & 1 ? "#ddddff" : "#ffdddd"; list($pid, $encounter, $invnumber) = slInvoiceNumber($out); // Get details, if we have them, for the invoice. $inverror = true; $codes = array(); if ($pid && $encounter) { // Get invoice data into $arrow or $ferow. if ($INTEGRATED_AR) { $ferow = sqlQuery("SELECT e.*, p.fname, p.mname, p.lname " . "FROM form_encounter AS e, patient_data AS p WHERE " . "e.pid = '{$pid}' AND e.encounter = '{$encounter}' AND " . "p.pid = e.pid"); if (empty($ferow)) { $pid = $encounter = 0; $invnumber = $out['our_claim_id']; } else { $inverror = false; $codes = ar_get_invoice_summary($pid, $encounter, true); // $svcdate = substr($ferow['date'], 0, 10); } } else { $arres = SLQuery("SELECT ar.id, ar.notes, ar.shipvia, customer.name " . "FROM ar, customer WHERE ar.invnumber = '{$invnumber}' AND " . "customer.id = ar.customer_id"); if ($sl_err) { die($sl_err); } $arrow = SLGetRow($arres, 0); if ($arrow) { $inverror = false; $codes = get_invoice_summary($arrow['id'], true); } else { // oops, no such invoice $pid = $encounter = 0; $invnumber = $out['our_claim_id']; } } // end not internal a/r } // Show the claim status. $csc = $out['claim_status_code']; $inslabel = 'Ins1'; if ($csc == '1' || $csc == '19') { $inslabel = 'Ins1'; } if ($csc == '2' || $csc == '20') { $inslabel = 'Ins2'; } if ($csc == '3' || $csc == '21') { $inslabel = 'Ins3'; } $primary = $inslabel == 'Ins1'; writeMessageLine($bgcolor, 'infdetail', "Claim status {$csc}: " . $claim_status_codes[$csc]); // Show an error message if the claim is missing or already posted. if ($inverror) { writeMessageLine($bgcolor, 'errdetail', "The following claim is not in our database"); } else { // Skip this test. Claims can get multiple CLPs from the same payer! // // $insdone = strtolower($arrow['shipvia']); // if (strpos($insdone, 'ins1') !== false) { // $inverror = true; // writeMessageLine($bgcolor, 'errdetail', // "Primary insurance EOB was already posted for the following claim"); // } } if ($csc == '4') { //Denial case, code is stored in the claims table for display in the billing manager screen with reason explained. $inverror = true; if (!$debug) { if ($pid && $encounter) { $code_value = ''; foreach ($out['svc'] as $svc) { foreach ($svc['adj'] as $adj) { //Per code and modifier the reason will be showed in the billing manager. $code_value .= $svc['code'] . '_' . $svc['mod'] . '_' . $adj['group_code'] . '_' . $adj['reason_code'] . ','; } } $code_value = substr($code_value, 0, -1); //We store the reason code to display it with description in the billing manager screen. //process_file is used as for the denial case file name will not be there, and extra field(to store reason) can be avoided. updateClaim(true, $pid, $encounter, $_REQUEST['InsId'], substr($inslabel, 3), 7, 0, $code_value); } } writeMessageLine($bgcolor, 'errdetail', "Not posting adjustments for denied claims, please follow up manually!"); } else { if ($csc == '22') { $inverror = true; writeMessageLine($bgcolor, 'errdetail', "Payment reversals are not automated, please enter manually!"); } } if ($out['warnings']) { writeMessageLine($bgcolor, 'infdetail', nl2br(rtrim($out['warnings']))); } // Simplify some claim attributes for cleaner code. $service_date = parse_date($out['dos']); $check_date = $paydate ? $paydate : parse_date($out['check_date']); $production_date = $paydate ? $paydate : parse_date($out['production_date']); if ($INTEGRATED_AR) { $insurance_id = arGetPayerID($pid, $service_date, substr($inslabel, 3)); if (empty($ferow['lname'])) { $patient_name = $out['patient_fname'] . ' ' . $out['patient_lname']; } else { $patient_name = $ferow['fname'] . ' ' . $ferow['lname']; } } else { $insurance_id = 0; foreach ($codes as $cdata) { if ($cdata['ins']) { $insurance_id = $cdata['ins']; break; } } $patient_name = $arrow['name'] ? $arrow['name'] : $out['patient_fname'] . ' ' . $out['patient_lname']; } $error = $inverror; // This loops once for each service item in this claim. foreach ($out['svc'] as $svc) { // Treat a modifier in the remit data as part of the procedure key. // This key will then make its way into SQL-Ledger. $codekey = $svc['code']; if ($svc['mod']) { $codekey .= ':' . $svc['mod']; } $prev = $codes[$codekey]; $codetype = ''; //will hold code type, if exists // This reports detail lines already on file for this service item. if ($prev) { $codetype = $codes[$codekey]['code_type']; //store code type writeOldDetail($prev, $patient_name, $invnumber, $service_date, $codekey, $bgcolor); // Check for sanity in amount charged. $prevchg = sprintf("%.2f", $prev['chg'] + $prev['adj']); if ($prevchg != abs($svc['chg'])) { writeMessageLine($bgcolor, 'errdetail', "EOB charge amount " . $svc['chg'] . " for this code does not match our invoice"); $error = true; } // Check for already-existing primary remittance activity. // Removed this check because it was not allowing for copays manually // entered into the invoice under a non-copay billing code. /**** if ((sprintf("%.2f",$prev['chg']) != sprintf("%.2f",$prev['bal']) || $prev['adj'] != 0) && $primary) { writeMessageLine($bgcolor, 'errdetail', "This service item already has primary payments and/or adjustments!"); $error = true; } ****/ unset($codes[$codekey]); } else { // This is not an error. If we are not in error mode and not debugging, // insert the service item into SL. Then display it (in green if it // was inserted, or in red if we are in error mode). $description = "CPT4:{$codekey} Added by {$inslabel} {$production_date}"; if (!$error && !$debug) { if ($INTEGRATED_AR) { arPostCharge($pid, $encounter, 0, $svc['chg'], 1, $service_date, $codekey, $description, $debug, '', $codetype); } else { slPostCharge($arrow['id'], $svc['chg'], 1, $service_date, $codekey, $insurance_id, $description, $debug); } $invoice_total += $svc['chg']; } $class = $error ? 'errdetail' : 'newdetail'; writeDetailLine($bgcolor, $class, $patient_name, $invnumber, $codekey, $production_date, $description, $svc['chg'], $error ? '' : $invoice_total); } $class = $error ? 'errdetail' : 'newdetail'; // Report Allowed Amount. if ($svc['allowed']) { // A problem here is that some payers will include an adjustment // reflecting the allowed amount, others not. So here we need to // check if the adjustment exists, and if not then create it. We // assume that any nonzero CO (Contractual Obligation) or PI // (Payer Initiated) adjustment is good enough. $contract_adj = sprintf("%.2f", $svc['chg'] - $svc['allowed']); foreach ($svc['adj'] as $adj) { if (($adj['group_code'] == 'CO' || $adj['group_code'] == 'PI') && $adj['amount'] != 0) { $contract_adj = 0; } } if ($contract_adj > 0) { $svc['adj'][] = array('group_code' => 'CO', 'reason_code' => 'A2', 'amount' => $contract_adj); } writeMessageLine($bgcolor, 'infdetail', 'Allowed amount is ' . sprintf("%.2f", $svc['allowed'])); } // Report miscellaneous remarks. if ($svc['remark']) { $rmk = $svc['remark']; writeMessageLine($bgcolor, 'infdetail', "{$rmk}: " . $remark_codes[$rmk]); } // Post and report the payment for this service item from the ERA. // By the way a 'Claim' level payment is probably going to be negative, // i.e. a payment reversal. if ($svc['paid']) { if (!$error && !$debug) { if ($INTEGRATED_AR) { arPostPayment($pid, $encounter, $InsertionId[$out['check_number']], $svc['paid'], $codekey, substr($inslabel, 3), $out['check_number'], $debug, '', $codetype); } else { slPostPayment($arrow['id'], $svc['paid'], $check_date, "{$inslabel}/" . $out['check_number'], $codekey, $insurance_id, $debug); } $invoice_total -= $svc['paid']; } $description = "{$inslabel}/" . $out['check_number'] . ' payment'; if ($svc['paid'] < 0) { $description .= ' reversal'; } writeDetailLine($bgcolor, $class, $patient_name, $invnumber, $codekey, $check_date, $description, 0 - $svc['paid'], $error ? '' : $invoice_total); } // Post and report adjustments from this ERA. Posted adjustment reasons // must be 25 characters or less in order to fit on patient statements. foreach ($svc['adj'] as $adj) { $description = $adj['reason_code'] . ': ' . $adjustment_reasons[$adj['reason_code']]; if ($adj['group_code'] == 'PR' || !$primary) { // Group code PR is Patient Responsibility. Enter these as zero // adjustments to retain the note without crediting the claim. if ($primary) { /**** $reason = 'Pt resp: '; // Reasons should be 25 chars or less. if ($adj['reason_code'] == '1') $reason = 'To deductible: '; else if ($adj['reason_code'] == '2') $reason = 'Coinsurance: '; else if ($adj['reason_code'] == '3') $reason = 'Co-pay: '; ****/ $reason = "{$inslabel} ptresp: "; // Reasons should be 25 chars or less. if ($adj['reason_code'] == '1') { $reason = "{$inslabel} dedbl: "; } else { if ($adj['reason_code'] == '2') { $reason = "{$inslabel} coins: "; } else { if ($adj['reason_code'] == '3') { $reason = "{$inslabel} copay: "; } } } } else { $reason = "{$inslabel} note " . $adj['reason_code'] . ': '; /**** $reason .= sprintf("%.2f", $adj['amount']); ****/ } $reason .= sprintf("%.2f", $adj['amount']); // Post a zero-dollar adjustment just to save it as a comment. if (!$error && !$debug) { if ($INTEGRATED_AR) { arPostAdjustment($pid, $encounter, $InsertionId[$out['check_number']], 0, $codekey, substr($inslabel, 3), $reason, $debug, '', $codetype); } else { slPostAdjustment($arrow['id'], 0, $production_date, $out['check_number'], $codekey, $insurance_id, $reason, $debug); } } writeMessageLine($bgcolor, $class, $description . ' ' . sprintf("%.2f", $adj['amount'])); } else { if (!$error && !$debug) { if ($INTEGRATED_AR) { arPostAdjustment($pid, $encounter, $InsertionId[$out['check_number']], $adj['amount'], $codekey, substr($inslabel, 3), "Adjust code " . $adj['reason_code'], $debug, '', $codetype); } else { slPostAdjustment($arrow['id'], $adj['amount'], $production_date, $out['check_number'], $codekey, $insurance_id, "{$inslabel} adjust code " . $adj['reason_code'], $debug); } $invoice_total -= $adj['amount']; } writeDetailLine($bgcolor, $class, $patient_name, $invnumber, $codekey, $production_date, $description, 0 - $adj['amount'], $error ? '' : $invoice_total); } } } // End of service item // Report any existing service items not mentioned in the ERA, and // determine if any of them are still missing an insurance response // (if so, then insurance is not yet done with the claim). $insurance_done = true; foreach ($codes as $code => $prev) { // writeOldDetail($prev, $arrow['name'], $invnumber, $service_date, $code, $bgcolor); writeOldDetail($prev, $patient_name, $invnumber, $service_date, $code, $bgcolor); $got_response = false; foreach ($prev['dtl'] as $ddata) { if ($ddata['pmt'] || $ddata['rsn']) { $got_response = true; } } if (!$got_response) { $insurance_done = false; } } // Cleanup: If all is well, mark Ins<x> done and check for secondary billing. if (!$error && !$debug && $insurance_done) { if ($INTEGRATED_AR) { $level_done = 0 + substr($inslabel, 3); if ($out['crossover'] == 1) { //Automatic forward case.So need not again bill from the billing manager screen. sqlStatement("UPDATE form_encounter " . "SET last_level_closed = {$level_done},last_level_billed=" . $level_done . " WHERE " . "pid = '{$pid}' AND encounter = '{$encounter}'"); writeMessageLine($bgcolor, 'infdetail', 'This claim is processed by Insurance ' . $level_done . ' and automatically forwarded to Insurance ' . ($level_done + 1) . ' for processing. '); } else { "UPDATE form_encounter " . "SET last_level_closed = {$level_done} WHERE " . "pid = '{$pid}' AND encounter = '{$encounter}'"; } // Check for secondary insurance. if ($primary && arGetPayerID($pid, $service_date, 2)) { arSetupSecondary($pid, $encounter, $debug, $out['crossover']); if ($out['crossover'] != 1) { writeMessageLine($bgcolor, 'infdetail', 'This claim is now re-queued for secondary paper billing'); } } } else { $shipvia = 'Done: Ins1'; if ($inslabel != 'Ins1') { $shipvia .= ',Ins2'; } if ($inslabel == 'Ins3') { $shipvia .= ',Ins3'; } $query = "UPDATE ar SET shipvia = '{$shipvia}' WHERE id = " . $arrow['id']; SLQuery($query); if ($sl_err) { die($sl_err); } // Check for secondary insurance. $insgot = strtolower($arrow['notes']); if ($primary && strpos($insgot, 'ins2') !== false) { slSetupSecondary($arrow['id'], $debug); if ($out['crossover'] != 1) { writeMessageLine($bgcolor, 'infdetail', 'This claim is now re-queued for secondary paper billing'); } } } } } }
<?php echo $svcdate; ?> </td> <td colspan="2"> <?php xl('Done with:', 'e', '', " "); ?> ; <?php // Write a checkbox for each insurance. It is to be checked when // we no longer expect any payments from that company for the claim. if ($INTEGRATED_AR) { $last_level_closed = 0 + $ferow['last_level_closed']; foreach (array(0 => 'None', 1 => 'Ins1', 2 => 'Ins2', 3 => 'Ins3') as $key => $value) { if ($key && !arGetPayerID($patient_id, $svcdate, $key)) { continue; } $checked = $last_level_closed == $key ? " checked" : ""; echo " <input type='radio' name='form_done' value='{$key}'{$checked} />{$value} \n"; } } else { // The information is stored in the 'shipvia' field of the invoice. $insgot = strtolower($arrow['notes']); $insdone = strtolower($arrow['shipvia']); foreach (array('Ins1', 'Ins2', 'Ins3') as $value) { $lcvalue = strtolower($value); $checked = strpos($insdone, $lcvalue) === false ? "" : " checked"; if (strpos($insgot, $lcvalue) !== false) { echo " <input type='checkbox' name='form_done_{$value}' value='1'{$checked} />{$value} \n"; }
function DistributionInsert($CountRow, $created_time, $user_id) { //Function inserts the distribution.Payment,Adjustment,Deductable,Takeback & Follow up reasons are inserted as seperate rows. //It automatically pushes to next insurance for billing. //In the screen a drop down of Ins1,Ins2,Ins3,Pat are given.The posting can be done for any level. $Affected = 'no'; if (isset($_POST["Payment{$CountRow}"]) && $_POST["Payment{$CountRow}"] * 1 > 0) { if (trim(formData('type_name')) == 'insurance') { if (trim(formData("HiddenIns{$CountRow}")) == 1) { $AccountCode = "IPP"; } if (trim(formData("HiddenIns{$CountRow}")) == 2) { $AccountCode = "ISP"; } if (trim(formData("HiddenIns{$CountRow}")) == 3) { $AccountCode = "ITP"; } } elseif (trim(formData('type_name')) == 'patient') { $AccountCode = "PP"; } sqlStatement("insert into ar_activity set " . "pid = '" . trim(formData('hidden_patient_code')) . "', encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "', code = '" . trim(formData("HiddenCode{$CountRow}")) . "', modifier = '" . trim(formData("HiddenModifier{$CountRow}")) . "', payer_type = '" . trim(formData("HiddenIns{$CountRow}")) . "', post_time = '" . trim($created_time) . "', post_user = '******', session_id = '" . trim(formData('payment_id')) . "', modified_time = '" . trim($created_time) . "', pay_amount = '" . trim(formData("Payment{$CountRow}")) . "', adj_amount = '" . 0 . "', account_code = '" . "{$AccountCode}" . "'"); $Affected = 'yes'; } if (isset($_POST["AdjAmount{$CountRow}"]) && $_POST["AdjAmount{$CountRow}"] * 1 != 0) { if (trim(formData('type_name')) == 'insurance') { $AdjustString = "Ins adjust Ins" . trim(formData("HiddenIns{$CountRow}")); $AccountCode = "IA"; } elseif (trim(formData('type_name')) == 'patient') { $AdjustString = "Pt adjust"; $AccountCode = "PA"; } idSqlStatement("insert into ar_activity set " . "pid = '" . trim(formData('hidden_patient_code')) . "', encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "', code = '" . trim(formData("HiddenCode{$CountRow}")) . "', modifier = '" . trim(formData("HiddenModifier{$CountRow}")) . "', payer_type = '" . trim(formData("HiddenIns{$CountRow}")) . "', post_time = '" . trim($created_time) . "', post_user = '******', session_id = '" . trim(formData('payment_id')) . "', modified_time = '" . trim($created_time) . "', pay_amount = '" . 0 . "', adj_amount = '" . trim(formData("AdjAmount{$CountRow}")) . "', memo = '" . "{$AdjustString}" . "', account_code = '" . "{$AccountCode}" . "'"); $Affected = 'yes'; } if (isset($_POST["Deductible{$CountRow}"]) && $_POST["Deductible{$CountRow}"] * 1 > 0) { idSqlStatement("insert into ar_activity set " . "pid = '" . trim(formData('hidden_patient_code')) . "', encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "', code = '" . trim(formData("HiddenCode{$CountRow}")) . "', modifier = '" . trim(formData("HiddenModifier{$CountRow}")) . "', payer_type = '" . trim(formData("HiddenIns{$CountRow}")) . "', post_time = '" . trim($created_time) . "', post_user = '******', session_id = '" . trim(formData('payment_id')) . "', modified_time = '" . trim($created_time) . "', pay_amount = '" . 0 . "', adj_amount = '" . 0 . "', memo = '" . "Deductable \$" . trim(formData("Deductible{$CountRow}")) . "', account_code = '" . "Deduct" . "'"); $Affected = 'yes'; } if (isset($_POST["Takeback{$CountRow}"]) && $_POST["Takeback{$CountRow}"] * 1 > 0) { idSqlStatement("insert into ar_activity set " . "pid = '" . trim(formData('hidden_patient_code')) . "', encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "', code = '" . trim(formData("HiddenCode{$CountRow}")) . "', modifier = '" . trim(formData("HiddenModifier{$CountRow}")) . "', payer_type = '" . trim(formData("HiddenIns{$CountRow}")) . "', post_time = '" . trim($created_time) . "', post_user = '******', session_id = '" . trim(formData('payment_id')) . "', modified_time = '" . trim($created_time) . "', pay_amount = '" . trim(formData("Takeback{$CountRow}")) * -1 . "', adj_amount = '" . 0 . "', account_code = '" . "Takeback" . "'"); $Affected = 'yes'; } if (isset($_POST["FollowUp{$CountRow}"]) && $_POST["FollowUp{$CountRow}"] == 'y') { idSqlStatement("insert into ar_activity set " . "pid = '" . trim(formData('hidden_patient_code')) . "', encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "', code = '" . trim(formData("HiddenCode{$CountRow}")) . "', modifier = '" . trim(formData("HiddenModifier{$CountRow}")) . "', payer_type = '" . trim(formData("HiddenIns{$CountRow}")) . "', post_time = '" . trim($created_time) . "', post_user = '******', session_id = '" . trim(formData('payment_id')) . "', modified_time = '" . trim($created_time) . "', pay_amount = '" . 0 . "', adj_amount = '" . 0 . "', follow_up = '" . "y" . "', follow_up_note = '" . trim(formData("FollowUpReason{$CountRow}")) . "'"); $Affected = 'yes'; } if ($Affected == 'yes') { if (trim(formData('type_name')) != 'patient') { $ferow = sqlQuery("select last_level_closed from form_encounter where \n\t\tpid ='" . trim(formData('hidden_patient_code')) . "' and encounter='" . trim(formData("HiddenEncounter{$CountRow}")) . "'"); //multiple charges can come. if ($ferow['last_level_closed'] < trim(formData("HiddenIns{$CountRow}"))) { sqlStatement("update form_encounter set last_level_closed='" . trim(formData("HiddenIns{$CountRow}")) . "' where \n\t\t\tpid ='" . trim(formData('hidden_patient_code')) . "' and encounter='" . trim(formData("HiddenEncounter{$CountRow}")) . "'"); //last_level_closed gets increased. //----------------------------------- // Determine the next insurance level to be billed. $ferow = sqlQuery("SELECT date, last_level_closed " . "FROM form_encounter WHERE " . "pid = '" . trim(formData('hidden_patient_code')) . "' AND encounter = '" . trim(formData("HiddenEncounter{$CountRow}")) . "'"); $date_of_service = substr($ferow['date'], 0, 10); $new_payer_type = 0 + $ferow['last_level_closed']; if ($new_payer_type <= 3 && !empty($ferow['last_level_closed']) || $new_payer_type == 0) { ++$new_payer_type; } $new_payer_id = arGetPayerID(trim(formData('hidden_patient_code')), $date_of_service, $new_payer_type); if ($new_payer_id > 0) { arSetupSecondary(trim(formData('hidden_patient_code')), trim(formData("HiddenEncounter{$CountRow}")), 0); } //----------------------------------- } } } }
?> </td> </tr> <?php do { $CountIndex++; $CountIndexBelow++; $Ins = 0; // Determine the next insurance level to be billed. $ferow = sqlQuery("SELECT date, last_level_closed " . "FROM form_encounter WHERE " . "pid = '{$hidden_patient_code}' AND encounter = '" . $RowSearch['encounter'] . "'"); $date_of_service = substr($ferow['date'], 0, 10); $new_payer_type = 0 + $ferow['last_level_closed']; if ($new_payer_type <= 3 && !empty($ferow['last_level_closed']) || $new_payer_type == 0) { ++$new_payer_type; } $new_payer_id = arGetPayerID($hidden_patient_code, $date_of_service, $new_payer_type); if ($new_payer_id == 0) { $Ins = 0; } elseif ($new_payer_id > 0) { $Ins = $new_payer_type; } $ServiceDateArray = explode(' ', $RowSearch['date']); $ServiceDate = oeFormatShortDate($ServiceDateArray[0]); $Codetype = $RowSearch['code_type']; $Code = $RowSearch['code']; $Modifier = $RowSearch['modifier']; if ($Modifier != '') { $ModifierString = ", {$Modifier}"; } else { $ModifierString = ""; }
$row['phone'] = $erow['phone_home']; $row['duncount'] = $duncount; $row['dos'] = $svcdate; $row['ss'] = $erow['ss']; $row['DOB'] = $erow['DOB']; $row['pubpid'] = $erow['pubpid']; $row['billnote'] = $erow['genericname2'] == 'Billing' ? $erow['genericval2'] : ''; $row['referrer'] = $erow['referrer']; $row['irnumber'] = $erow['invoice_refno']; // Also get the primary insurance company name whenever there is one. $row['ins1'] = ''; if ($insposition == 1) { $row['ins1'] = $insname; } else { if (empty($payerids)) { $tmp = arGetPayerID($patient_id, $svcdate, 1); if (!empty($tmp)) { $payerids[] = $tmp; } } if (!empty($payerids)) { $row['ins1'] = getInsName($payerids[0]); } } // This computes the invoice's total original charges and adjustments, // date of last activity, and determines if insurance has responded to // all billing items. $invlines = ar_get_invoice_summary($patient_id, $encounter_id, true); // if ($encounter_id == 185) { // debugging // echo "\n<!--\n"; // print_r($invlines);
function arSetupSecondary($patient_id, $encounter_id, $debug,$crossover=0) { if ($crossover==1) { //if claim forwarded setting a new status $status=6; } else { $status=1; } // Determine the next insurance level to be billed. $ferow = sqlQuery("SELECT date, last_level_billed " . "FROM form_encounter WHERE " . "pid = '$patient_id' AND encounter = '$encounter_id'"); $date_of_service = substr($ferow['date'], 0, 10); $new_payer_type = 0 + $ferow['last_level_billed']; if ($new_payer_type < 3 && !empty($ferow['last_level_billed']) || $new_payer_type == 0) ++$new_payer_type; $new_payer_id = arGetPayerID($patient_id, $date_of_service, $new_payer_type); if ($new_payer_id) { // Queue up the claim. if (!$debug) updateClaim(true, $patient_id, $encounter_id, $new_payer_id, $new_payer_type,$status, 5, '', 'hcfa','',$crossover); } else { // Just reopen the claim. if (!$debug) updateClaim(true, $patient_id, $encounter_id, -1, -1, $status, 0, '','','',$crossover); } return xl("Encounter ") . $encounter . xl(" is ready for re-billing."); }