remove phpmyadmin tar.gz package from codebase (I added this by mistake in the past)
[openemr.git] / library / sl_eob.inc.php
blobc56fd314d1380e61816a10b5306b644023e7114a
1 <?php
2 // Copyright (C) 2005-2009 Rod Roark <rod@sunsetsystems.com>
3 //
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 2
7 // of the License, or (at your option) any later version.
9 include_once("patient.inc");
10 include_once("billing.inc");
11 include_once("invoice_summary.inc.php");
13 $chart_id_cash = 0;
14 $chart_id_ar = 0;
15 $chart_id_income = 0;
16 $services_id = 0;
19 // Try to figure out our invoice number (pid.encounter) from the
20 // claim ID and other stuff in the ERA. This should be straightforward
21 // except that some payers mangle the claim ID that we give them.
23 function slInvoiceNumber(&$out) {
24 $invnumber = $out['our_claim_id'];
25 $atmp = preg_split('/[ -]/', $invnumber);
26 $acount = count($atmp);
28 $pid = 0;
29 $encounter = 0;
30 if ($acount == 2) {
31 $pid = $atmp[0];
32 $encounter = $atmp[1];
34 else if ($acount == 3) {
35 $pid = $atmp[0];
36 $brow = sqlQuery("SELECT encounter FROM billing WHERE " .
37 "pid = '$pid' AND encounter = '" . $atmp[1] . "' AND activity = 1");
39 $encounter = $brow['encounter'];
41 else if ($acount == 1) {
42 $pres = sqlStatement("SELECT pid FROM patient_data WHERE " .
43 "lname LIKE '" . addslashes($out['patient_lname']) . "' AND " .
44 "fname LIKE '" . addslashes($out['patient_fname']) . "' " .
45 "ORDER BY pid DESC");
46 while ($prow = sqlFetchArray($pres)) {
47 if (strpos($invnumber, $prow['pid']) === 0) {
48 $pid = $prow['pid'];
49 $encounter = substr($invnumber, strlen($pid));
50 break;
55 if ($pid && $encounter) $invnumber = "$pid.$encounter";
56 return array($pid, $encounter, $invnumber);
59 // This gets a posting session ID. If the payer ID is not 0 and a matching
60 // session already exists, then its ID is returned. Otherwise a new session
61 // is created.
63 function arGetSession($payer_id, $reference, $check_date, $deposit_date='', $pay_total=0) {
64 if (empty($deposit_date)) $deposit_date = $check_date;
65 if ($payer_id) {
66 $row = sqlQuery("SELECT session_id FROM ar_session WHERE " .
67 "payer_id = '$payer_id' AND reference = '$reference' AND " .
68 "check_date = '$check_date' AND deposit_date = '$deposit_date' " .
69 "ORDER BY session_id DESC LIMIT 1");
70 if (!empty($row['session_id'])) return $row['session_id'];
72 return sqlInsert("INSERT INTO ar_session ( " .
73 "payer_id, user_id, reference, check_date, deposit_date, pay_total " .
74 ") VALUES ( " .
75 "'$payer_id', " .
76 "'" . $_SESSION['authUserID'] . "', " .
77 "'$reference', " .
78 "'$check_date', " .
79 "'$deposit_date', " .
80 "'$pay_total' " .
81 ")");
83 //writing the check details to Session Table on ERA proxcessing
84 function arPostSession($payer_id,$check_number,$check_date,$pay_total,$post_to_date,$deposit_date,$debug) {
85 $query = "INSERT INTO ar_session( " .
86 "payer_id,user_id,closed,reference,check_date,pay_total,post_to_date,deposit_date,patient_id,payment_type,adjustment_code,payment_method " .
87 ") VALUES ( " .
88 "'$payer_id'," .
89 $_SESSION['authUserID']."," .
90 "0," .
91 "'ePay - $check_number'," .
92 "'$check_date', " .
93 "$pay_total, " .
94 "'$post_to_date','$deposit_date', " .
95 "0,'insurance','insurance_payment','electronic'" .
96 ")";
97 if ($debug) {
98 echo $query . "<br>\n";
99 } else {
100 $sessionId=sqlInsert($query);
101 return $sessionId;
105 // Post a payment, new style.
107 function arPostPayment($patient_id, $encounter_id, $session_id, $amount, $code, $payer_type, $memo, $debug, $time='', $codetype='') {
108 $codeonly = $code;
109 $modifier = '';
110 $tmp = strpos($code, ':');
111 if ($tmp) {
112 $codeonly = substr($code, 0, $tmp);
113 $modifier = substr($code, $tmp+1);
115 if (empty($time)) $time = date('Y-m-d H:i:s');
116 $query = "INSERT INTO ar_activity ( " .
117 "pid, encounter, code_type, code, modifier, payer_type, post_time, post_user, " .
118 "session_id, memo, pay_amount " .
119 ") VALUES ( " .
120 "'$patient_id', " .
121 "'$encounter_id', " .
122 "'$codetype', " .
123 "'$codeonly', " .
124 "'$modifier', " .
125 "'$payer_type', " .
126 "'$time', " .
127 "'" . $_SESSION['authUserID'] . "', " .
128 "'$session_id', " .
129 "'$memo', " .
130 "'$amount' " .
131 ")";
132 sqlStatement($query);
133 return;
136 // Post a charge. This is called only from sl_eob_process.php where
137 // automated remittance processing can create a new service item.
138 // Here we add it as an unauthorized item to the billing table.
140 function arPostCharge($patient_id, $encounter_id, $session_id, $amount, $units, $thisdate, $code, $description, $debug, $codetype='') {
141 /*****************************************************************
142 // Select an existing billing item as a template.
143 $row= sqlQuery("SELECT * FROM billing WHERE " .
144 "pid = '$patient_id' AND encounter = '$encounter_id' AND " .
145 "code_type = 'CPT4' AND activity = 1 " .
146 "ORDER BY id DESC LIMIT 1");
147 $this_authorized = 0;
148 $this_provider = 0;
149 if (!empty($row)) {
150 $this_authorized = $row['authorized'];
151 $this_provider = $row['provider_id'];
153 *****************************************************************/
155 if (empty($codetype)) {
156 // default to CPT4 if empty, which is consistent with previous functionality.
157 $codetype="CPT4";
159 $codeonly = $code;
160 $modifier = '';
161 $tmp = strpos($code, ':');
162 if ($tmp) {
163 $codeonly = substr($code, 0, $tmp);
164 $modifier = substr($code, $tmp+1);
167 addBilling($encounter_id,
168 $codetype,
169 $codeonly,
170 $description,
171 $patient_id,
174 $modifier,
175 $units,
176 $amount,
178 '');
181 // Post an adjustment, new style.
183 function arPostAdjustment($patient_id, $encounter_id, $session_id, $amount, $code, $payer_type, $reason, $debug, $time='', $codetype='') {
184 $codeonly = $code;
185 $modifier = '';
186 $tmp = strpos($code, ':');
187 if ($tmp) {
188 $codeonly = substr($code, 0, $tmp);
189 $modifier = substr($code, $tmp+1);
191 if (empty($time)) $time = date('Y-m-d H:i:s');
192 $query = "INSERT INTO ar_activity ( " .
193 "pid, encounter, code_type, code, modifier, payer_type, post_user, post_time, " .
194 "session_id, memo, adj_amount " .
195 ") VALUES ( " .
196 "'$patient_id', " .
197 "'$encounter_id', " .
198 "'$codetype', " .
199 "'$codeonly', " .
200 "'$modifier', " .
201 "'$payer_type', " .
202 "'" . $_SESSION['authUserID'] . "', " .
203 "'$time', " .
204 "'$session_id', " .
205 "'$reason', " .
206 "'$amount' " .
207 ")";
208 sqlStatement($query);
209 return;
212 function arGetPayerID($patient_id, $date_of_service, $payer_type) {
213 if ($payer_type < 1 || $payer_type > 3) return 0;
214 $tmp = array(1 => 'primary', 2 => 'secondary', 3 => 'tertiary');
215 $value = $tmp[$payer_type];
216 $query = "SELECT provider FROM insurance_data WHERE " .
217 "pid = ? AND type = ? AND date <= ? " .
218 "ORDER BY date DESC LIMIT 1";
219 $nprow = sqlQuery($query, array($patient_id,$value,$date_of_service) );
220 if (empty($nprow)) return 0;
221 return $nprow['provider'];
224 // Make this invoice re-billable, new style.
226 function arSetupSecondary($patient_id, $encounter_id, $debug,$crossover=0) {
227 if ($crossover==1) {
228 //if claim forwarded setting a new status
229 $status=6;
231 } else {
233 $status=1;
236 // Determine the next insurance level to be billed.
237 $ferow = sqlQuery("SELECT date, last_level_billed " .
238 "FROM form_encounter WHERE " .
239 "pid = '$patient_id' AND encounter = '$encounter_id'");
240 $date_of_service = substr($ferow['date'], 0, 10);
241 $new_payer_type = 0 + $ferow['last_level_billed'];
242 if ($new_payer_type < 3 && !empty($ferow['last_level_billed']) || $new_payer_type == 0)
243 ++$new_payer_type;
245 $new_payer_id = arGetPayerID($patient_id, $date_of_service, $new_payer_type);
247 if ($new_payer_id) {
248 // Queue up the claim.
249 if (!$debug)
250 updateClaim(true, $patient_id, $encounter_id, $new_payer_id, $new_payer_type,$status, 5, '', 'hcfa','',$crossover);
252 else {
253 // Just reopen the claim.
254 if (!$debug)
255 updateClaim(true, $patient_id, $encounter_id, -1, -1, $status, 0, '','','',$crossover);
258 return xl("Encounter ") . $encounter . xl(" is ready for re-billing.");