5 * Copyright 2016 Kevin McCormick Longview, Texas
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; version 3 or later. You should have
16 * received a copy of the GNU General Public License along with this program;
17 * if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 * <http://opensource.org/licenses/gpl-license.php>
22 * @author Kevin McCormick
23 * @link: https://www.open-emr.org
25 * @subpackage ediHistory
28 use OpenEMR\Common\Csrf\CsrfUtils
;
30 // codes used in 997/999 files;
31 //require_once './codes/edih_997_codes.php';
34 * Look up file name by control number
41 function edih_997_sbmtfile($icn, $filetype)
44 if (strlen($icn) == 13) {
45 $bticn = substr($icn, 0, 9);
46 $stn = substr($icn, -4);
51 if (is_numeric($filetype)) {
58 $btfn = csv_file_by_controlnum($ftp, $bticn);
59 $bfullpath = ($btfn) ?
csv_check_filepath($btfn, $ftp) : '';
65 * Extract information on rejected files or transactions
70 function edih_997_errdata($obj997)
73 $segments = $obj997->edih_segments();
74 $delims = $obj997->edih_delimiters();
82 $diag['err'] = array();
87 foreach ($segments as $seg) {
89 if (strncmp($seg, 'TA1'.$de, 4) == 0) {
90 $sar = explode($de, $seg);
92 $sub_icn = (isset($sar[1]) && $sar[1]) ?
$sar[1] : '';
93 $subdate = (isset($sar[2]) && $sar[2]) ?
$sar[2] : '';
94 $subtime = (isset($sar[3]) && $sar[3]) ?
$sar[3] : '';
95 $ackcode = (isset($sar[4]) && $sar[4]) ?
$sar[4] : '';
96 $acknote = (isset($sar[5]) && $sar[5]) ?
$sar[5] : '';
102 if (strncmp($seg, 'AK1'.$de, 4) == 0) {
103 $sar = explode($de, $seg);
105 $fg_type = (isset($sar[1]) && $sar[1]) ?
$sar[1] : '';
106 $fg_id = (isset($sar[2]) && $sar[2]) ?
$sar[2] : '';
111 if (strncmp($seg, 'AK2'.$de, 4) == 0 ||
strncmp($seg, 'IK2'.$de, 4) == 0) {
112 $sar = explode($de, $seg);
116 $subtype = (isset($sar[1]) && $sar[1]) ?
$sar[1] : '';
117 $substn = (isset($sar[2]) && $sar[2]) ?
$sar[2] : '';
122 if (strncmp($seg, 'AK3'.$de, 4) == 0 ||
strncmp($seg, 'IK3'.$de, 4) == 0) {
123 $sar = explode($de, $seg);
124 //$idx = count($diag);
128 $diag['err'][$idx]['subtype'] = 'f'.$subtype;
129 $diag['err'][$idx]['substn'] = $substn;
131 $diag['err'][$idx]['ik3segid'] = (isset($sar[1])) ?
$sar[1] : '';
132 $diag['err'][$idx]['ik3segpos'] = (isset($sar[2])) ?
$sar[2] : '';
133 $diag['err'][$idx]['ik3loop'] = (isset($sar[3])) ?
$sar[3] : '';
134 $diag['err'][$idx]['ik3code'] = (isset($sar[4])) ?
$sar[4] : '';
139 if (strncmp($seg, 'CTX'.$de, 4) == 0) {
140 $sar = explode($de, $seg);
141 if (isset($sar[1]) && strpos($sar[1], 'TRIG')) {
142 // CTX*SITUATIONAL TRIGGER*
143 $diag['err'][$idx]['ctxid'] = (isset($sar[2])) ?
$sar[2] : '';
144 $diag['err'][$idx]['ctxpos'] = (isset($sar[3])) ?
$sar[3] : '';
145 $diag['err'][$idx]['ctxloop'] = (isset($sar[4])) ?
$sar[4] : '';
146 $diag['err'][$idx]['ctxelem'] = (isset($sar[5])) ?
$sar[5] : '';
147 // $sar[6] Reference in Segment
148 // Data Element Reference Number : Data Element Reference Number Composite
150 // business unit identifier
151 $diag['err'][$idx]['ctxacct'] = (isset($sar[2])) ?
$sar[2] : '';
158 if (strncmp($seg, 'AK4'.$de, 4) == 0 ||
strncmp($seg, 'IK4'.$de, 4) == 0) {
159 $sar = explode($de, $seg);
160 $diag['err'][$idx]['ik401'] = (isset($sar[1])) ?
$sar[1] : '';
161 $diag['err'][$idx]['ik402'] = (isset($sar[2])) ?
$sar[2] : '';
162 $diag['err'][$idx]['ik403'] = (isset($sar[3])) ?
$sar[3] : '';
163 $diag['err'][$idx]['ik404'] = (isset($sar[4])) ?
$sar[4] : '';
168 if (strncmp($seg, 'AK5'.$de, 4) == 0 ||
strncmp($seg, 'IK5'.$de, 4) == 0) {
170 $sar = explode($de, $seg);
171 $diag['err'][$idx]['ik501'] = (isset($sar[1])) ?
$sar[1] : '';
172 $diag['err'][$idx]['ik502'] = (isset($sar[2])) ?
$sar[2] : '';
173 $diag['err'][$idx]['ik503'] = (isset($sar[3])) ?
$sar[3] : '';
174 $diag['err'][$idx]['ik504'] = (isset($sar[4])) ?
$sar[4] : '';
175 $diag['err'][$idx]['ik505'] = (isset($sar[5])) ?
$sar[5] : '';
184 if (strncmp($seg, 'AK9'.$de, 4) == 0) {
185 $diag['summary']['sub_icn'] = $sub_icn;
186 $diag['summary']['subtype'] = $subtype;
187 $diag['summary']['subdate'] = $subdate;
188 $diag['summary']['subtime'] = $subtime;
189 $diag['summary']['ackcode'] = $ackcode;
190 $diag['summary']['acknote'] = $acknote;
191 $diag['summary']['fg_type'] = $fg_type;
192 $diag['summary']['fg_id'] = $fg_id;
194 $sar = explode($de, $seg);
195 $diag['summary']['ak901'] = (isset($sar[1])) ?
$sar[1] : ''; // AK901 A=Accepted R=Rejected.
196 $diag['summary']['ak902'] = (isset($sar[2])) ?
$sar[2] : ''; // AK902 number of transaction sets
197 $diag['summary']['ak903'] = (isset($sar[3])) ?
$sar[3] : ''; // AK903 number of transaction sets received by the translator.
198 $diag['summary']['ak904'] = (isset($sar[4])) ?
$sar[4] : ''; // AK904 number of transaction sets accepted by the translator.
199 $diag['summary']['ak905'] = (isset($sar[5])) ?
$sar[5] : ''; // codes
200 $diag['summary']['ak906'] = (isset($sar[6])) ?
$sar[6] : '';
201 $diag['summary']['ak907'] = (isset($sar[7])) ?
$sar[7] : '';
202 $diag['summary']['ak908'] = (isset($sar[8])) ?
$sar[8] : '';
203 $diag['summary']['ak909'] = (isset($sar[9])) ?
$sar[9] : '';
214 * Create an html report on rejected files or transactions
216 * @uses edih_997_ta1_code()
217 * @uses edih_997_code_text()
218 * @uses edih_rsp_st_match()
223 function edih_997_err_report($err_array)
226 if (!is_array($err_array) ||
!count($err_array)) {
227 $str_html = "Error: invalid argument for error report";
228 csv_edihist_log('edih_997_err_report: invalid function argument');
236 if (isset($err_array['summary'])) {
237 extract($err_array['summary'], EXTR_OVERWRITE
);
239 $str_html .= "<p class='rpt997'>".PHP_EOL
;
240 $str_html .= (isset($sub_icn)) ?
"<em>Submitted ICN</em>" . text($sub_icn) : "Submitted file unknown";
241 $str_html .= (isset($subdate)) ?
" <em>Date</em> " . text(edih_format_date($subdate)) : "";
242 $str_html .= (isset($subtime)) ?
" <em>Time</em> " . text($subtime) . "<br />" : "<br />";
243 $str_html .= (isset($ackcode)) ?
" TA1 $ackcode : " . text(edih_997_ta1_code($ackcode)) . " <br />" : "";
244 $str_html .= (isset($acknote)) ?
" TA1 $acknote : " . text(edih_997_ta1_code($acknote)) . " <br />".PHP_EOL
: "<br />".PHP_EOL
;
245 if (isset($fg_type)) {
246 $fgtp = csv_file_type($fg_type);
247 $str_html .= " <em>Functional Group Type</em> " . text($fg_type) . " (" . text($fgtp) . ")";
248 $str_html .= (isset($fg_id)) ?
" <em>GS06</em> " . text($fg_id) . " <br />".PHP_EOL
: "<br />".PHP_EOL
;
252 //$str_html .= "</p>".PHP_EOL;
254 $str_html .= (isset($ak901)) ?
"999/997 $ak901 " . text(edih_997_code_text('ak501', $ak901)) . "<br />" : "";
255 $str_html .= (isset($ak902)) ?
" Transactions: submitted $ak902" : " ";
256 $str_html .= (isset($ak903)) ?
" received $ak903" : "";
257 $str_html .= (isset($ak904)) ?
" accepted $ak904" : "";
258 $str_html .= (isset($ak905) && $ak905) ?
"<br />$ak905 " . text(edih_997_code_text('ak502', $ak905)) . "<br />" : "";
259 $str_html .= (isset($ak906) && $ak906) ?
$ak906." " . text(edih_997_code_text('ak502', $ak906)) . "<br />" : "";
260 $str_html .= (isset($ak907) && $ak907) ?
$ak907." " . text(edih_997_code_text('ak502', $ak907)) . "<br />" : "";
261 $str_html .= (isset($ak908) && $ak908) ?
$ak908." " . text(edih_997_code_text('ak502', $ak908)) . "<br />" : "";
262 $str_html .= (isset($ak909) && $ak909) ?
$ak909." " . text(edih_997_code_text('ak502', $ak909)) . "<br />" : "";
264 $str_html .= "</p>".PHP_EOL
;
268 foreach ($err_array['err'] as $k => $v) {
271 $icn = (isset($sub_icn)) ?
$sub_icn : '';
272 $stn = (isset($v['substn'])) ?
$v['substn'] : '';
273 $rtp = (isset($v['subtype'])) ?
$v['subtype'] : '';
275 $str_html .= "<p class='err997'>".PHP_EOL
;
276 $str_html .= "Error " . text($ct) . " ";
277 $str_html .= ($stn) ?
"<em>ST</em> " . text($stn) . " <br />" : "<br />";
279 if ($icn && $stn && $rtp) {
280 $trc = sprintf("%s%04d", $icn, $stn);
281 $srch = array('s_val'=>$trc, 's_col'=>4,'r_cols'=>'All');
282 // array('s_val'=>'0024', 's_col'=>9, 'r_cols'=>array(1, 2, 7)),
283 $trn_ar = csv_search_record($rtp, 'claim', $srch);
284 if (is_array($trn_ar) && count($trn_ar)) {
285 //'f837':array('PtName', 'SvcDate', 'CLM01', 'InsLevel', 'BHT03', 'FileName', 'Fee', 'PtPaid', 'Provider' );
286 //'f276':array('PtName', 'SvcDate', 'CLM01', 'ClaimID', 'BHT03', 'FileName', 'Payer', 'Trace'); break;
287 //'f270':array('PtName', 'ReqDate', 'Trace', 'InsBnft', 'BHT03', 'FileName', 'Payer'); break;
288 $pt_name = $trn_ar[0][0]; // $trn_ar['PtName'];
289 $clm01 = ($rtp == 'f837') ?
$trn_ar[0][2] : $trn_ar[0][4]; // $trn_ar['CLM01'] : $trn_ar['BHT03'];
290 $svcdate = $trn_ar[0][1]; // ($rtp == 'f270') ? $trn_ar['ReqDate'] : $trn_ar['SvcDate'];
291 $btfn = $trn_ar[0][5]; // $trn_ar['FileName'];
292 $str_html .= text($pt_name) . " " . text($svcdate) . " <em>Trace</em> <a class='rpt' href='edih_main.php?gtbl=claim&fname=" . attr_url($btfn) . "&ftype=" . attr_url($rtp) . "&pid=" . attr_url($clm01) . "&fmt=seg&csrf_token_form=" .attr_url(CsrfUtils
::collectCsrfToken()) . "'>" . text($clm01) . "</a> <br />".PHP_EOL
;
294 $str_html .= "Unable to locate transaction <em>Trace</em> " . text($trc) . " <br />".PHP_EOL
;
297 $str_html .= "Unable to trace, did not get all of icn, type, and st number <br />".PHP_EOL
;
301 $str_html .= (isset($v['ctxacct'])) ?
"<em>Transaction ID</em> " . text($v['ctxacct']) : "";
302 $str_html .= (isset($v['ik3segid'])) ?
" Segment <em>ID</em> " . text($v['ik3segid']) : "";
303 $str_html .= (isset($v['ik3segpos'])) ?
" <em>Position</em> " . text($v['ik3segpos']) : "";
304 $str_html .= (isset($v['ik3loop'])) ?
" <em>Loop</em> " . text($v['ik3loop']) : "";
305 $str_html .= (isset($v['ik3code'])) ?
"<br /> <em>Code</em> " . text($v['ik3code']) ." " . text(edih_997_code_text('ak304', $v['ik3code'])) . "<br />" : "<br />";
307 $str_html .= (isset($v['ctxid'])) ?
"Situational ".PHP_EOL
."<em>Segment</em> " . text($v['ctxid']) : "";
308 $str_html .= (isset($v['ctxpos'])) ?
" <em>Position</em> " . text($v['ctxpos']) : "";
309 $str_html .= (isset($v['ctxloop'])) ?
" <em>Position</em> " . text($v['ctxloop']) : "";
310 $str_html .= (isset($v['ctxelem'])) ?
" <em>Element</em> " . text($v['ctxelem']) . "<br />".PHP_EOL
: PHP_EOL
;
312 $str_html .= (isset($v['ik401'])) ?
"Data Element <em>element</em> " . text($v['ik401']) : "";
313 $str_html .= (isset($v['ik402'])) ?
" <em>ref</em> " . text($v['ik402']) : "";
314 $str_html .= (isset($v['ik404'])) ?
" <em>data</em> " . text($v['ik404']) : "";
315 $str_html .= (isset($v['ik403'])) ?
"<br /> <em>code</em> " . text($v['ik403']) . " " . text(edih_997_code_text('ak403', $v['ik403'])) . "<br />" : "<br />";
317 $str_html .= (isset($v['ik501']) && $v['ik501']) ?
"<em>Status</em> " . text($v['ik501']) . " " . text(edih_997_code_text('ak501', $v['ik501'])) . "<br />" : "";
318 $str_html .= (isset($v['ik502']) && $v['ik502']) ?
" <em>code</em> " . text($v['ik502']) . " " . text(edih_997_code_text('ak502', $v['ik502'])) . "<br />" : "";
319 $str_html .= (isset($v['ik503']) && $v['ik503']) ?
" <em>code</em> " . text($v['ik503']) . " " . text(edih_997_code_text('ak502', $v['ik503'])) . "<br />" : "";
320 $str_html .= (isset($v['ik504']) && $v['ik504']) ?
" <em>code</em> " . text($v['ik504']) . " " . text(edih_997_code_text('ak502', $v['ik504'])) . "<br />" : "";
321 $str_html .= (isset($v['ik505']) && $v['ik505']) ?
" <em>code</em> " . text($v['ik505']) . " " . text(edih_997_code_text('ak502', $v['ik505'])) . "<br />" : "";
323 $str_html .= "</p>".PHP_EOL
;
330 * Main function in this script
332 * @uses csv_check_x12_obj()
333 * @uses edih_997_errdata()
334 * @uses edih_997_err_report()
339 function edih_997_error($filepath)
344 $obj997 = csv_check_x12_obj($filepath, 'f997');
345 if ($obj997 && ('edih_x12_file' == get_class($obj997))) {
346 $data = edih_997_errdata($obj997);
347 $html_str .= edih_997_err_report($data);
349 $html_str .= "<p>Error: invalid file path</p>".PHP_EOL
;
350 csv_edihist_log("edih_997_error: invalid file path $filepath");