/**
 * Categorize and check uploaded files
 *
 * Files are typed and scanned, if they pass scan, then the file is moved
 * to the edi_history temp dir and an array ['type'] ['name'] is returned
 * If an error occurs, false is returned
 *
 * @uses edih_x12_file()
 * @uses csv_file_type()
 * @uses csv_edih_tmpdir()
 * @param array $param_ar -- the csv_parameters("ALL") array (so we don't have to keep creating it)
 * @param array $fidx -- individual file array from $files[$i] array
 * 
 * @return array|bool
 */
function edih_upload_match_file($param_ar, $fidx)
{
    //
    // =============
    $edih_upldir = csv_edih_tmpdir();
    // =============
    $ar_fn = array();
    $ftype = '';
    //
    if (is_array($fidx) && isset($fidx['name'])) {
        $fn = basename($fidx['name']);
        $ftmp = $fidx['tmp_name'];
    } else {
        csv_edihist_log('edih_upload_match_file: Error: invalid file argument');
        return false;
    }
    //csv_check_x12_obj($filepath, $type='') {
    $x12obj = new edih_x12_file($ftmp, false);
    //
    if ($x12obj->edih_hasGS()) {
        $ftype = csv_file_type($x12obj->edih_type());
    } elseif ($x12obj->edih_valid()) {
        if (is_array($param_ar) && count($param_ar)) {
            // csv_parameters("ALL");
            foreach ($param_ar as $ky => $par) {
                if (!isset($param_ar[$ky]['regex'])) {
                    continue;
                }
                if (preg_match($param_ar[$ky]['regex'], $fn)) {
                    $ftype = $ky;
                    break;
                }
            }
        } else {
            csv_edihist_log('edih_upload_match_file: invalid parameters');
            return false;
        }
    } else {
        // failed valdity test: unwanted characters or unmatched mime-type
        csv_edihist_log('edih_upload_match_file: invalid x12_file ' . strip_tags($x12obj->edih_message()));
        return false;
    }
    //
    if (!$ftype) {
        csv_edihist_log('edih_upload_match_file: unable to classify file ' . $fn);
        $ar_fn['reject'] = array('name' => $fn, 'comment' => 'unable to classify');
        return $ar_fn;
    }
    //
    $newname = $edih_upldir . DS . $fn;
    //
    if (rename($ftmp, $newname)) {
        if (chmod($newname, 0400)) {
            $ar_fn['type'] = $ftype;
            $ar_fn['name'] = $newname;
        } else {
            csv_edihist_log('edih_upload_match_file: failed to set permissions for ' . $fn);
            $ar_fn['reject'] = array('name' => $fn, 'comment' => 'failed to set permissions');
            unlink($newname);
            return false;
        }
    } else {
        csv_edihist_log("edih_upload_match_file: unable to move {$fn} to uploads directory");
        return false;
    }
    //
    return $ar_fn;
}
/** 
 * Create an html report on rejected files or transactions
 *
 * @uses edih_997_ta1_code()
 * @uses edih_997_code_text()
 * @uses edih_rsp_st_match()
 * 
 * @param object
 * @return array
 */
function edih_997_err_report($err_array)
{
    //
    if (!is_array($err_array) || !count($err_array)) {
        $str_html = "Error: invalid argument for error report";
        csv_edihist_log('edih_997_err_report: invalid function argument');
        return $str_html;
    }
    //
    $str_html = "";
    $batchfile = "";
    //
    if (isset($err_array['summary'])) {
        extract($err_array['summary'], EXTR_OVERWRITE);
        //
        $str_html .= "<p class='rpt997'>" . PHP_EOL;
        $str_html .= isset($sub_icn) ? "<em>Submitted ICN</em> {$sub_icn}" : "Submitted file unknown";
        $str_html .= isset($subdate) ? " <em>Date</em> " . edih_format_date($subdate) : "";
        $str_html .= isset($subtime) ? " <em>Time</em> {$subtime}<br />" : "<br />";
        $str_html .= isset($ackcode) ? " TA1 {$ackcode} : " . edih_997_ta1_code($ackcode) . " <br />" : "";
        $str_html .= isset($acknote) ? " TA1 {$acknote} : " . edih_997_ta1_code($acknote) . " <br />" . PHP_EOL : "<br />" . PHP_EOL;
        if (isset($fg_type)) {
            $fgtp = csv_file_type($fg_type);
            $str_html .= " <em>Functional Group Type</em> {$fg_type} ({$fgtp})";
            $str_html .= isset($fg_id) ? " <em>GS06</em> {$fg_id} <br />" . PHP_EOL : "<br />" . PHP_EOL;
        }
        //
        //$str_html .= "</p>".PHP_EOL;
        //
        $str_html .= isset($ak901) ? "999/997 {$ak901} " . edih_997_code_text('ak501', $ak901) . "<br />" : "";
        $str_html .= isset($ak902) ? " Transactions: submitted {$ak902}" : " ";
        $str_html .= isset($ak903) ? " received {$ak903}" : "";
        $str_html .= isset($ak904) ? " accepted {$ak904}" : "";
        $str_html .= isset($ak905) && $ak905 ? "<br />{$ak905} " . edih_997_code_text('ak502', $ak905) . "<br />" : "";
        $str_html .= isset($ak906) && $ak906 ? $ak906 . " " . edih_997_code_text('ak502', $ak906) . "<br />" : "";
        $str_html .= isset($ak907) && $ak907 ? $ak907 . " " . edih_997_code_text('ak502', $ak907) . "<br />" : "";
        $str_html .= isset($ak908) && $ak908 ? $ak908 . " " . edih_997_code_text('ak502', $ak908) . "<br />" : "";
        $str_html .= isset($ak909) && $ak909 ? $ak909 . " " . edih_997_code_text('ak502', $ak909) . "<br />" : "";
        //
        $str_html .= "</p>" . PHP_EOL;
    }
    //
    foreach ($err_array['err'] as $k => $v) {
        //
        $ct = $k + 1;
        $icn = isset($sub_icn) ? $sub_icn : '';
        $stn = isset($v['substn']) ? $v['substn'] : '';
        $rtp = isset($v['subtype']) ? $v['subtype'] : '';
        //
        $str_html .= "<p class='err997'>" . PHP_EOL;
        $str_html .= "Error {$ct} ";
        $str_html .= $stn ? "<em>ST</em> {$stn} <br />" : "<br />";
        //
        if ($icn && $stn && $rtp) {
            $trc = sprintf("%s%04d", $icn, $stn);
            $srch = array('s_val' => $trc, 's_col' => 4, 'r_cols' => 'All');
            // array('s_val'=>'0024', 's_col'=>9, 'r_cols'=>array(1, 2, 7)),
            $trn_ar = csv_search_record($rtp, 'claim', $srch);
            if (is_array($trn_ar) && count($trn_ar)) {
                //'f837':array('PtName', 'SvcDate', 'CLM01', 'InsLevel', 'BHT03', 'FileName', 'Fee', 'PtPaid', 'Provider' );
                //'f276':array('PtName', 'SvcDate', 'CLM01', 'ClaimID', 'BHT03', 'FileName', 'Payer', 'Trace'); break;
                //'f270':array('PtName', 'ReqDate', 'Trace', 'InsBnft', 'BHT03', 'FileName', 'Payer'); break;
                $pt_name = $trn_ar[0][0];
                // $trn_ar['PtName'];
                $clm01 = $rtp == 'f837' ? $trn_ar[0][2] : $trn_ar[0][4];
                // $trn_ar['CLM01'] : $trn_ar['BHT03'];
                $svcdate = $trn_ar[0][1];
                // ($rtp == 'f270') ? $trn_ar['ReqDate'] : $trn_ar['SvcDate'];
                $btfn = $trn_ar[0][5];
                // $trn_ar['FileName'];
                $str_html .= "{$pt_name} {$svcdate} <em>Trace</em> <a class='rpt' href='edih_main.php?gtbl=claim&fname={$btfn}&ftype={$rtp}&pid={$clm01}&fmt=seg'>{$clm01}</a> <br />" . PHP_EOL;
            } else {
                $str_html .= "Unable to locate transaction  <em>Trace</em> {$trc} <br />" . PHP_EOL;
            }
        } else {
            $str_html .= "Unable to trace, did not get all of icn, type, and st number <br />" . PHP_EOL;
        }
        //
        $str_html .= isset($v['ctxacct']) ? "<em>Transaction ID</em> " . $v['ctxacct'] : "";
        $str_html .= isset($v['ik3segid']) ? " Segment <em>ID</em> " . $v['ik3segid'] : "";
        $str_html .= isset($v['ik3segpos']) ? " <em>Position</em> " . $v['ik3segpos'] : "";
        $str_html .= isset($v['ik3loop']) ? " <em>Loop</em> " . $v['ik3loop'] : "";
        $str_html .= isset($v['ik3code']) ? "<br /> <em>Code</em> " . $v['ik3code'] . " " . edih_997_code_text('ak304', $v['ik3code']) . "<br />" : "<br />";
        //
        $str_html .= isset($v['ctxid']) ? "Situational " . PHP_EOL . "<em>Segment</em> " . $v['ctxid'] : "";
        $str_html .= isset($v['ctxpos']) ? " <em>Position</em> " . $v['ctxpos'] : "";
        $str_html .= isset($v['ctxloop']) ? " <em>Position</em> " . $v['ctxloop'] : "";
        $str_html .= isset($v['ctxelem']) ? " <em>Element</em> " . $v['ctxelem'] . "<br />" . PHP_EOL : PHP_EOL;
        //
        $str_html .= isset($v['ik401']) ? "Data Element <em>element</em> " . $v['ik401'] : "";
        $str_html .= isset($v['ik402']) ? " <em>ref</em> " . $v['ik402'] : "";
        $str_html .= isset($v['ik404']) ? " <em>data</em> " . $v['ik404'] : "";
        $str_html .= isset($v['ik403']) ? "<br /> <em>code</em> " . $v['ik403'] . " " . edih_997_code_text('ak403', $v['ik403']) . "<br />" : "<br />";
        //
        $str_html .= isset($v['ik501']) && $v['ik501'] ? "<em>Status</em> " . $v['ik501'] . " " . edih_997_code_text('ak501', $v['ik501']) . "<br />" : "";
        $str_html .= isset($v['ik502']) && $v['ik502'] ? " <em>code</em> " . $v['ik502'] . " " . edih_997_code_text('ak502', $v['ik502']) . "<br />" : "";
        $str_html .= isset($v['ik503']) && $v['ik503'] ? " <em>code</em> " . $v['ik503'] . " " . edih_997_code_text('ak502', $v['ik503']) . "<br />" : "";
        $str_html .= isset($v['ik504']) && $v['ik504'] ? " <em>code</em> " . $v['ik504'] . " " . edih_997_code_text('ak502', $v['ik504']) . "<br />" : "";
        $str_html .= isset($v['ik505']) && $v['ik505'] ? " <em>code</em> " . $v['ik505'] . " " . edih_997_code_text('ak502', $v['ik505']) . "<br />" : "";
        //
        $str_html .= "</p>" . PHP_EOL;
    }
    return $str_html;
}
/**
 * Render one of our csv record files as an html table
 *
 * This function determines the actual csv file from the file_type and the
 * csv_type.  Tthe date field of each row is checked against the optional
 * lookback period or date parameters.
 * 
 * @uses csv_file_type()
 * @uses csv_parameters()
 * @uses csv_thead_html()
 * 
 * @param string      $file_type -- see function csv_file_type()
 * @param string      $csv_type -- either "file" or "claim"
 * @param string      $period -- lookback 2 weeks, 1 month, ALL, etc
 * @param string      $datestart -- from date  CCYY-MM-DD
 * @param string      $dateend -- to date  CCYY-MM-DD
 * 
 * @return string
 */
function edih_csv_to_html($file_type, $csv_type, $period = '', $datestart = '', $dateend = '')
{
    //
    $csv_html = "";
    $modstr = '';
    $csv_d = array();
    // debug
    csv_edihist_log("edih_csv_to_html: period {$period} datestart {$datestart} dateend {$dateend}");
    //
    $is_date = false;
    $is_period = false;
    //
    if ($file_type && $csv_type) {
        $csv_ar = csv_assoc_array($file_type, $csv_type);
        if (is_array($csv_ar) && count($csv_ar)) {
            $rwct = count($csv_ar);
        } else {
            csv_edihist_log("edih_csv_to_html: error opening csv file {$file_type} {$csv_type}");
            $csv_html .= "error opening csv file {$file_type} {$csv_type}<br>";
            return false;
        }
    } else {
        $csv_html .= "invalid arguments for opening csv table<br>";
        return false;
    }
    $tp = csv_file_type($file_type);
    if ($tp) {
        $params = csv_parameters($tp);
    } else {
        csv_edihist_log("csv_to_html error: incorrect file type {$file_type}");
        $csv_html .= "csv_to_html error: incorrect file type {$file_type} <br />" . PHP_EOL;
        return false;
    }
    // csv tables date is in col 0 for file, col 5 for claim
    // file name is under FileName for all tables
    $dtcol = strpos($csv_type, "aim") ? $params['claimdate'] : $params['filedate'];
    $tp_lbl = strpos($csv_type, "aim") ? 'Claims' : 'Files';
    //
    // given dates shold be in CCYY-MM-DD or CCYY/MM/DD format
    // edih_view.php is supposed to use CCYY-MM-DD
    $dts = $dt4 = $dte = '';
    if (preg_match('/(19|20)\\d{2}\\D[01][0-9]\\D[0-3][0-9]/', $datestart)) {
        $dts = implode('', preg_split("/\\D/", $datestart));
        if ($dateend && preg_match('/(19|20)\\d{2}\\D[01][0-9]\\D[0-3][0-9]/', $dateend)) {
            $dte = implode('', preg_split("/\\D/", $dateend));
        } else {
            $dt4 = date_create(date('Y-m-d'));
            $dte = date_format($dt4, 'Ymd');
        }
        // php DateTime is poorly documented
        $is_date = $dts && $dte;
        // debug
        csv_edihist_log("edih_csv_to_html: dts {$dts} dte {$dte} isdate " . strval($is_date));
        //
        //
    } elseif ($period) {
        $dtstr1 = '';
        $is_period = preg_match('/\\d{1,2}(?=w|m|y)/', $period, $matches);
        if (count($matches)) {
            $pd = $matches[0];
            $gtdt = getdate();
            $mon = (string) $gtdt['mon'];
            $day = (string) ($gtdt['mday'] - $gtdt['wday'] + 1);
            $yr = (string) $gtdt['year'];
            if (strtoupper($period) == 'ALL') {
                $is_period = false;
                $modstr = '';
            } elseif (strpos($period, 'w')) {
                // take the first character of 'period'
                $modstr = '-' . $pd . ' week';
                $dtstr1 = $mon . '/' . $day . '/' . $yr;
            } elseif (strpos($period, 'm')) {
                $modstr = '-' . $pd . ' month';
                $dtstr1 = $mon . '/01/' . $yr;
            } elseif (strpos($period, 'y')) {
                $modstr = '-' . $pd . ' year';
                $dtstr1 = $mon . '/01/' . $yr;
            } else {
                csv_edihist_log("csv_to_html error: incorrect date period {$period}");
                return false;
            }
        }
        //
        // debug
        csv_edihist_log("edih_csv_to_html: period {$period} modstr {$modstr} dtstr1 {$dtstr1}");
        //
        if ($is_period && $modstr) {
            $dtpd1 = date_create($dtstr1);
            $dtm = date_modify($dtpd1, $modstr);
            $dtpd2 = $dtm->format('Ymd');
            $dtpdlbl = $dtm->format('Y-m-d');
        } else {
            $dtpd2 = '';
            $dtpdlbl = 'All Dates';
        }
    }
    //
    if ($is_date) {
        $isok = false;
        $idx = 0;
        foreach ($csv_ar as $data) {
            $isok = strcmp($data[$dtcol], $dts) >= 0 ? true : false;
            $isok = strcmp($data[$dtcol], $dte) > 0 ? false : $isok;
            //
            if ($isok) {
                $csv_d[] = $data;
            }
        }
    } elseif ($is_period) {
        foreach ($csv_ar as $data) {
            if (strcmp($data[$dtcol], $dtpd2) > 0) {
                $csv_d[] = $data;
            }
        }
    } else {
        $csv_d =& $csv_ar;
    }
    //
    $ln_ct = count($csv_d);
    //
    if ($is_date) {
        //$csv_html .= "<div id='dttl'>".PHP_EOL;
        $csv_html .= "<h4>Table: {$tp_lbl} &nbsp;{$tp} &nbsp; Start: {$datestart} &nbsp; End: {$dateend} &nbsp;Rows: {$rwct} &nbsp;Shown: {$ln_ct}</h4>" . PHP_EOL;
        //$csv_html .= "</div>".PHP_EOL;
    } elseif ($is_period) {
        //div id='dttl'></div>
        $csv_html .= "<h4>Table: {$tp_lbl} &nbsp;{$tp} &nbsp;From Date: {$dtpdlbl} &nbsp;Rows: {$rwct} &nbsp;Shown: {$ln_ct}</h4>" . PHP_EOL;
    } else {
        //<div id='dttl'></div>
        $csv_html .= "<h4>Table: {$tp_lbl} &nbsp;{$tp} &nbsp;All Dates Rows: {$rwct} &nbsp; Shown: {$ln_ct}</h4>" . PHP_EOL;
    }
    //
    //$csv_html .= "<table id='csvTable' class='csvDisplay'>".PHP_EOL;  class='display'max-width: fit-content
    $csv_html .= "<table id='csvTable' style='width: fit-content; float: left'>" . PHP_EOL;
    $csv_html .= csv_thead_html($tp, $csv_type);
    $csv_html .= "<tbody>" . PHP_EOL;
    //
    // now create the body of the table
    //
    $cls = strpos('|f837|f270|f276|f278', $tp) ? 'sub' : 'rsp';
    //
    $idx = 0;
    if ($csv_type == 'file') {
        //
        if ($tp == 'f835') {
            //array('Date', 'FileName', 'Control', 'Trace', 'Claim_ct', 'Denied', 'Payer')
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                foreach ($val as $k => $v) {
                    if ($k == 'Date') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $fn = $v;
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=htm'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Control') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&icn={$v}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Trace') {
                        $trc = $v;
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&trace={$v}&ftype={$tp}&rsptype={$tp}&fmt=htm'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Claim_ct') {
                        $csv_html .= "<td>{$v} <a class='sub' href='edih_main.php?tracecheck={$trc}&ckprocessed=yes'><em>P?</em></a></td>" . PHP_EOL;
                    } elseif ($k == 'Denied') {
                        if ((int) $v > 0) {
                            $csv_html .= "<td><a class='sub' href='edih_main.php?chkdenied=yes&fname={$fn}&ftype={$tp}&trace={$trc}'>{$v}</a></td>" . PHP_EOL;
                        } else {
                            $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                        }
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f997') {
            //array('Date', 'FileName', 'Control', 'Trace', 'RspType', 'RejCt')
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                //
                $rsp = $val['RspType'];
                foreach ($val as $k => $v) {
                    if ($k == 'Date') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $fn = $v;
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Trace') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&trace={$v}&ftype={$tp}&rsptype={$rsp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'RejCt') {
                        if ((int) $v > 0) {
                            $csv_html .= "<td><a class='rpt' href='edih_main.php?chkdenied=yes&fname={$fn}&ftype={$tp}'>{$v}</a></td>" . PHP_EOL;
                        } else {
                            $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                        }
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
            //
        } else {
            // the generic case -- for 'file' type tables
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                foreach ($val as $k => $v) {
                    if ($k == 'Date') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=htm'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Control') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&icn={$v}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Reject') {
                        if ((int) $v > 0) {
                            $csv_html .= "<td><a class='sub' href='edih_main.php?&chkdenied=yes&fname={$val['FileName']}&ftype={$tp}'>{$v}</a></td>" . PHP_EOL;
                        } else {
                            $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                        }
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        }
    } elseif ($csv_type == 'claim') {
        //
        if ($tp == 'f837') {
            // array('PtName', 'SvcDate', 'CLM01', 'InsLevel', 'Control', 'FileName', 'Fee', 'PtPaid', 'Provider' );
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                foreach ($val as $k => $v) {
                    if ($k == 'CLM01') {
                        $csv_html .= "<td><a class='sub' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&pid={$v}'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'SvcDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f835') {
            // array('PtName', 'SvcDate', 'CLM01', 'Status', 'Trace', 'FileName', 'ClaimID', 'Pmt', 'PtResp', 'Payer')
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $pid = $val['CLM01'];
                foreach ($val as $k => $v) {
                    if ($k == 'SvcDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'CLM01') {
                        $csv_html .= "<td>{$v} <a class='{$cls}' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&pid={$pid}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='seg' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&pid={$pid}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } elseif ($k == 'Trace') {
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&trace={$v}&ftype={$tp}&fmt=htm'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td title='{$v}'>File <a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f277') {
            // array('PtName', 'SvcDate', 'CLM01', 'Status', 'BHT03', 'FileName', 'Payer', 'Ins_ID', 'Trace');
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $bht03 = $val['BHT03'];
                $trc = $val['CLM01'];
                foreach ($val as $k => $v) {
                    if ($k == 'SvcDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'CLM01') {
                        $csv_html .= "<td><a class='sub' href='edih_main.php?gtbl=claim&trace={$v}&ftype={$tp}&rsptype=f837&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'BHT03') {
                        $csv_html .= "<td>{$v} <a class='rsp' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='seg' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td title='{$v}'>File <a class='rsp' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='seg' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f276') {
            // array('PtName', 'ReqDate', 'CLM01', 'InsBnft', 'BHT03', 'FileName', 'Payer', 'Trace');
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $bht03 = $val['BHT03'];
                $trc = $val['CLM01'];
                foreach ($val as $k => $v) {
                    if ($k == 'ReqDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'CLM01') {
                        $csv_html .= "<td><a class='sub' href='edih_main.php?gtbl=claim&trace={$v}&ftype={$tp}&rsptype=f837&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'BHT03') {
                        $csv_html .= "<td>{$v} <a class='{$cls}' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='seg' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f270') {
            // array('PtName', 'ReqDate', 'Trace', 'InsBnft', 'BHT03', 'FileName', 'Payer');
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $bht03 = $val['BHT03'];
                foreach ($val as $k => $v) {
                    if ($k == 'ReqDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'BHT03') {
                        $csv_html .= "<td> <a class='{$cls}' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f271') {
            // array('PtName', 'RspDate', 'Trace', 'Status', 'BHT03', 'FileName', 'Payer');
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $bht03 = $val['BHT03'];
                foreach ($val as $k => $v) {
                    if ($k == 'RspDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'BHT03') {
                        $csv_html .= "<td>{$v} <a class='{$cls}' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=htm'>H</a>&nbsp;" . PHP_EOL;
                        $csv_html .= "&nbsp;<a class='seg' target='_blank' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td title='{$v}'> File <a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='{$cls}' href='edih_main.php?gtbl=file&fname={$fn}&ftype={$tp}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f278') {
            // array('PtName', 'FileDate', 'Trace', 'Status', 'BHT03', 'FileName', 'Auth', 'Payer')
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $bht03 = $val['BHT03'];
                foreach ($val as $k => $v) {
                    if ($k == 'FileDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'BHT03') {
                        $csv_html .= "<td>{$v} <a class='{$cls}' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=htm'>H</a>&nbsp;" . PHP_EOL;
                        $csv_html .= "&nbsp;<a class='seg' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&bht03={$v}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td title='{$v}'> File <a class='{$cls}' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=htm'>H</a>&nbsp;";
                        $csv_html .= "&nbsp;<a class='{$cls}' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=seg'>T</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } elseif ($tp == 'f997') {
            // array('PtName', 'RspDate', 'Trace', 'Status', 'Control', 'FileName', 'RspType', 'err_seg');
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                // needed values for links
                $fn = $val['FileName'];
                $rsp = $val['RspType'];
                $err = $val['err_seg'];
                foreach ($val as $k => $v) {
                    if ($k == 'RspDate') {
                        $csv_html .= "<td>" . substr($v, 0, 4) . '-' . substr($v, 4, 2) . '-' . substr($v, 6, 2) . "</td>" . PHP_EOL;
                    } elseif ($k == 'FileName') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'Trace') {
                        $csv_html .= "<td><a class='seg' href='edih_main.php?gtbl=claim&fname={$fn}&ftype={$tp}&trace={$v}&rsptype={$rsp}&err={$err}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } elseif ($k == 'err_seg') {
                        $csv_html .= "<td title='{$v}'>" . substr($v, 0, 8) . "...</td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        } else {
            // all types in the tables are covered in an elseif, so this is unexpected
            foreach ($csv_d as $val) {
                $bgc = $idx % 2 == 1 ? 'odd' : 'even';
                $csv_html .= "<tr class='{$bgc}'>" . PHP_EOL;
                foreach ($val as $k => $v) {
                    if ($k == 'FileName') {
                        $csv_html .= "<td><a class='{$cls}' href='edih_main.php?gtbl=file&fname={$v}&ftype={$tp}&fmt=seg'>{$v}</a></td>" . PHP_EOL;
                    } else {
                        $csv_html .= "<td>{$v}</td>" . PHP_EOL;
                    }
                }
                $csv_html .= "</tr>" . PHP_EOL;
                $idx++;
            }
        }
    }
    // end body of the table
    //$csv_html .= "</tbody>".PHP_EOL."</table>".PHP_EOL."</div>".PHP_EOL;
    $csv_html .= "</tbody>" . PHP_EOL . "</table>" . PHP_EOL;
    //
    return $csv_html;
}
/**
 * list claim records with Denied or Reject status in  given file
 *
 * @param string
 * @param string
 *
 * @return array
 */
function csv_denied_by_file($filetype, $filename, $trace = '')
{
    //
    $ret_ar = array();
    $ft = csv_file_type($filetype);
    if (strpos('|f997|f271|f277|f835', $ft)) {
        $param = csv_parameters($ft);
        $csv_file = $param['claims_csv'];
    } else {
        csv_edihist_log("csv_errors_by_file: incorrect file type {$filetype}");
        return $ret_ar;
    }
    //
    csv_edihist_log("csv_errors_by_file: {$ft} searching {$filename} with trace {$trace}");
    //
    if (($fh1 = fopen($csv_file, "r")) !== false) {
        if ($ft == 'f835') {
            while (($data = fgetcsv($fh1, 1024, ",")) !== false) {
                // check filename, then status
                if ($trace) {
                    if ($data[4] == $trace) {
                        if (!in_array($data[3], array('1', '2', '3', '19', '20', '21'))) {
                            $ret_ar[] = $data;
                        }
                    }
                } elseif ($data[5] == $filename) {
                    if (!in_array($data[3], array('1', '2', '3', '19', '20', '21'))) {
                        $ret_ar[] = $data;
                    }
                }
            }
        } elseif ($ft == 'f277') {
            while (($data = fgetcsv($fh1, 1024, ",")) !== false) {
                if ($data[5] == $filename) {
                    if (!strpos('|A1|A2|A5', substr($data[3], 0, 2))) {
                        $ret_ar[] = $data;
                    }
                }
            }
        } elseif (strpos('|f997|f999|f271', $ft)) {
            while (($data = fgetcsv($fh1, 1024, ",")) !== false) {
                if ($data[5] == $filename) {
                    if ($data[3] !== 'A') {
                        $ret_ar[] = $data;
                    }
                }
            }
        } else {
            csv_edihist_log("csv_errors_by_file: file type did not match {$filetype}");
        }
        fclose($fh1);
    }
    //
    return $ret_ar;
}
/**
 * Display of x12 edi transaction listing or all segments in the files.
 * When using $err_info, you must use the filepath of the submitted file
 * 
 * @param string   $filepath path to desired file
 * @param string   $filetype used when filepath is just filename
 * @param string   optional $claimid CLM01, or BHT03 to identify a transaction or a trace value 
 * @param bool     false: $claimid is pt transaction, true: $claimid is trace from 835 or 999 
 * @param string   optional $err_info  the prepared error info from a 997/999 response
 * @return string  html for display of file segments
 */
function edih_display_text($filepath, $filetype = '', $claimid = '', $trace = false, $err_info = '')
{
    //
    $str_html = '';
    $de = '';
    $segments = '';
    $stsegkey = '';
    $ft = $filetype ? $filetype : '';
    $errs = strlen($err_info) ? $err_info : '';
    $bht03 = '';
    //
    // verify x12 file
    $x12obj = csv_check_x12_obj($filepath, $ft);
    //
    if ($x12obj && 'edih_x12_file' == get_class($x12obj)) {
        $ftype = $x12obj->edih_type();
        $ft = csv_file_type($ftype);
        $delims = $x12obj->edih_delimiters();
        $de = $delims['e'];
        $fn = $x12obj->edih_filename();
        $segs_ar = $x12obj->edih_segments();
        $env_ar = $x12obj->edih_envelopes();
        if (!$de || strlen($de) != 1) {
            // error in object
            // debug
            $str_html = 'edih_display_text(): error in delimiters<br />' . PHP_EOL;
            $str_html .= $x12obj->edih_message() . PHP_EOL;
            return $str_html;
        }
        if (!is_array($segs_ar) || !count($segs_ar)) {
            // unknown error
            $str_html = "<p>unknown error retrieving segments for {$fn}</p>" . PHP_EOL;
            $str_html .= $x12obj->edih_message() . PHP_EOL;
            return $str_html;
        }
    } else {
        //debug
        csv_edihist_log('edih_transaction_text(): invalid path ' . $filepath);
        $str_html = 'edih_display_text(): error accessing file<br />' . PHP_EOL;
        return $str_html;
    }
    //
    if ($claimid) {
        // claimid can be for transaction, payment, or error response
        if ($trace && array_key_exists($claimid, $env_ar['ISA'])) {
            $arg_ar = array('ISA13' => $claimid, 'keys' => true);
            $segments = $x12obj->edih_x12_slice($arg_ar);
        } else {
            // claimid alone can be clm01 or bht03, if trace=true, expect trn02 for claimid
            foreach ($env_ar['ST'] as $st) {
                if ($trace && $claimid == $st['trace']) {
                    $arg_ar = array('ISA13' => $st['icn'], 'GS06' => $st['gsn'], 'trace' => $claimid, 'keys' => true);
                    $segments = $x12obj->edih_x12_slice($arg_ar);
                    break;
                } elseif (in_array($claimid, $st['acct'])) {
                    if ($errs) {
                        $arg_ar = array('ST02' => $st['stn'], 'ISA13' => $st['icn'], 'GS06' => $st['gsn'], 'keys' => true);
                        $segments = $x12obj->edih_x12_slice($arg_ar);
                    } else {
                        // request for individual transaction segments
                        $segments = $x12obj->edih_x12_transaction($claimid);
                    }
                    break;
                } elseif (in_array($claimid, $st['bht03'])) {
                    // also possible that bht03 number is given for claimid
                    // this will likely be a 27x
                    if ($errs) {
                        $arg_ar = array('ST02' => $st['stn'], 'ISA13' => $st['icn'], 'GS06' => $st['gsn'], 'keys' => true);
                        $segments = $x12obj->edih_x12_slice($arg_ar);
                    } else {
                        $segments = $x12obj->edih_x12_transaction($claimid);
                    }
                    $bht03 = $claimid;
                    break;
                }
            }
        }
    } else {
        $segments = $segs_ar;
    }
    //
    // now check if we have segments
    if (empty($segments) || !count($segments)) {
        if ($claimid) {
            $str_html = "<p>error: transaction {$claimid} not found in {$fn}</p>" . PHP_EOL;
            $str_html .= $x12obj->edih_message() . PHP_EOL;
            return $str_html;
        } else {
            // unknown error
            $str_html = "<p>unknown error retrieving segments for {$fn}</p>" . PHP_EOL;
            $str_html .= $x12obj->edih_message() . PHP_EOL;
            return $str_html;
        }
    }
    // if the segments are from a slice or transaction
    // a multidimensional array  segs[i][j] must be flattened
    $ar_sngl = csv_singlerecord_test($segments);
    // false when segments are a transaction or trace only
    if (!$ar_sngl) {
        //
        // append segments to single array
        // keys should not duplicate since all segments
        // are from the same x12 file
        $trnsegs = array();
        for ($i = 0; $i < count($segments); $i++) {
            $trnsegs = array_merge($trnsegs, $segments[$i]);
        }
        $segments = $trnsegs;
        unset($trnsegs);
    }
    //
    $capstr = '';
    $tbl_id = $claimid ? $claimid : $fn;
    //
    //'HB'=>'271', 'HS'=>'270', 'HR'=>'276', 'HI'=>'278','HN'=>'277', 'HP'=>'835', 'FA'=>'999', 'HC'=>'837');
    switch ((string) $ftype) {
        case 'HC':
            $capstr = "Claim ";
            //$cls = "txt837";
            $trn_html = edih_837_text($segments, $de, $errs);
            break;
        case 'HP':
            $capstr = "Payment ";
            //$cls = "txt835";
            $trn_html = edih_835_text($segments, $de);
            break;
        case 'HR':
            $capstr = "Status Query ";
            //$cls = "txt276";
            $trn_html = edih_277_text($segments, $de, $errs);
            break;
        case 'HN':
            $capstr = "Claim Status ";
            //$cls = "txt277";
            $trn_html = edih_277_text($segments, $de, $stsegkey);
            break;
        case 'HS':
            $capstr = "Eligibility Query ";
            //$cls = "txt270";
            $trn_html = edih_271_text($segments, $de, $errs);
            break;
        case 'HB':
            $capstr = "Eligibility Report ";
            //$cls = "txt271";
            $trn_html = edih_271_text($segments, $de);
            break;
        case 'HI':
            $capstr = "Authorization ";
            //$cls = "txt278";
            $trn_html = edih_278_text($segments, $de, $errs);
            break;
        case 'FA':
            $capstr = "Batch Acknowledgment ";
            //$cls = "txt997";
            $trn_html = edih_997_text($segments, $de);
            break;
        default:
            $capstr = "x12 {$ftype} ";
            //$cls = "txt_x12";
            $trn_html = edih_segments_text($segments, $de);
            break;
    }
    //
    $capstr .= $claimid ? " <em>ID:</em> {$claimid}" : "";
    //
    $str_html .= "<table id={$tbl_id} cols=3 class='segtxt'><caption>{$capstr}</caption>" . PHP_EOL;
    $str_html .= "<thead>" . PHP_EOL;
    $str_html .= "<tr><th class='btloop'>Loop</th><th class='btloop'>Num</th>";
    $str_html .= "<th class='segtxt'>Segment (<em>File:</em> {$fn})</th></tr>" . PHP_EOL;
    $str_html .= "</thead>" . PHP_EOL . "<tbody>" . PHP_EOL;
    //
    $str_html .= $trn_html;
    //
    $str_html .= "</tbody></table>" . PHP_EOL;
    //
    return $str_html;
}
/**
 * parse an x12 270/271 file into data rows for csv tables
 * 
 * @param object   x12_file_object
 * @return array
 */
function edih_271_csv_data($obj270)
{
    //'f270 claim = array('PtName', 'ReqDate', 'PtAcct', 'InsLevel', 'BHT03', 'FileName', 'Payer');
    //'f270 file = array('Date', 'FileName', 'Control', 'Claim_ct', 'x12_partner');
    //'f271 file = array('Date', 'FileName', 'Control', 'Claim_ct', 'Denied', 'Payer');
    //'f271 claim = array('PtName', 'RspDate', 'Trace', 'Status', 'BHT03', 'FileName', 'Payer');
    //
    $ret_ar = array();
    //
    $de = $obj270->edih_delimiters()['e'];
    $ds = $obj270->edih_delimiters()['s'];
    $fn = $obj270->edih_filename();
    $seg_ar = $obj270->edih_segments();
    $env_ar = $obj270->edih_envelopes();
    $ft = csv_file_type($obj270->edih_type());
    //
    // $rsptype = array('HS'=>'270', 'HB'=>'271', 'HC'=>'837', 'HR'=>'276', 'HI'=>'278');
    if (!isset($env_ar['ST'])) {
        csv_edihist_log('edih_271_csv_data: envelope error ' . $fn);
        return $ret_ar;
    }
    //
    if (!isset($env_ar['GS'])) {
        csv_edihist_log('edih_271_csv_data: envelope error');
        return $ret_ar;
    }
    //
    foreach ($env_ar['ISA'] as $icn => $isa) {
        // array('Date', 'FileName', 'Control', 'ta1ctrl', 'RejCt');
        $ret_ar[$icn]['type'] = $ft;
        $ret_ar[$icn]['claim'] = array();
        $ret_ar[$icn]['file'] = array();
        $rspdate = $isa['date'];
        $x12ptnr = $isa['receiver'];
        //
        foreach ($env_ar['GS'] as $gs) {
            if ($gs['icn'] == $icn) {
                $gsdate = $gs['date'];
                break;
            }
        }
        foreach ($env_ar['ST'] as $st) {
            //
            if ($st['icn'] != $icn) {
                continue;
            }
            //
            $stsegs = array_slice($seg_ar, $st['start'], $st['count']);
            $loopid = '0';
            $hl = 0;
            //
            $isaicn = $st['icn'];
            $stn = $st['stn'];
            $has_le = false;
            //
            // for "claim" array
            // 'f270' array('PtName', 'ReqDate', 'Trace', 'InsBnft', 'BHT03', 'FileName', 'Payer'); break;
            // 'f271'array('PtName', 'RspDate', 'Trace', 'Status', 'BHT03', 'FileName', 'Payer'); break;
            //
            foreach ($stsegs as $seg) {
                //
                if (strncmp($seg, 'BHT' . $de, 4) === 0) {
                    // new transaction
                    $cdx = isset($ret_ar[$icn]['claim']) ? count($ret_ar[$icn]['claim']) : 0;
                    //
                    $sar = explode($de, $seg);
                    //
                    $isrqst = isset($sar[2]) && $sar[2] == '13' ? true : false;
                    $isrsp = isset($sar[2]) && $sar[2] == '11' ? true : false;
                    $loopid = 0;
                    $bnfteq = '';
                    $rej_ct = 0;
                    //
                    $dtkey = $ft == 'f271' ? 'RspDate' : 'ReqDate';
                    //
                    $ret_ar[$icn]['claim'][$cdx]['PtName'] = '';
                    $ret_ar[$icn]['claim'][$cdx][$dtkey] = $gsdate;
                    $ret_ar[$icn]['claim'][$cdx]['Trace'] = '';
                    if ($isrsp || $ft == 'f271') {
                        $ret_ar[$icn]['claim'][$cdx]['Status'] = 'A';
                        // 271
                        $ret_ar[$icn]['claim'][$cdx]['BHT03'] = isset($sar[3]) ? $sar[3] : '';
                        //bht03 = $sar[3];
                    } else {
                        $ret_ar[$icn]['claim'][$cdx]['InsBnft'] = '';
                        // 270
                        $ret_ar[$icn]['claim'][$cdx]['BHT03'] = sprintf("%s%04d", $isaicn, $stn);
                    }
                    $ret_ar[$icn]['claim'][$cdx]['FileName'] = $fn;
                    $ret_ar[$icn]['claim'][$cdx]['Payer'] = '';
                    //
                    continue;
                }
                //
                if (strncmp($seg, 'HL' . $de, 3) === 0) {
                    $sar = explode($de, $seg);
                    $hl = $sar[1];
                    $hlpc = $sar[2];
                    // parent code
                    $hllc = $sar[3];
                    $hlcc = isset($sar[4]) ? $sar[4] : '';
                    // child code
                    if ($sar[3] == '20') {
                        // level code
                        $loopid = '2000A';
                        // info source (payer)
                    } elseif ($sar[3] == '21') {
                        $loopid = '2000B';
                        // info receiver (clinic)
                    } elseif ($sar[3] == '22') {
                        $loopid = '2000C';
                        // subscriber
                    } elseif ($sar[3] == '23') {
                        $loopid = '2000D';
                        // dependent
                    } else {
                        //debug
                        csv_edihist_log('HL has no level ' . $seg . ' in ' . $fn);
                    }
                    continue;
                }
                //
                if (strncmp($seg, 'NM1' . $de, 4) === 0) {
                    $sar = explode($de, $seg);
                    $nm1 = $sar[3];
                    $nm1 = $sar[4] ? $nm1 . ', ' . $sar[4] : $nm1;
                    $nm1 = $sar[5] ? $nm1 . ' ' . $sar[5] : $nm1;
                    if ($loopid == '2000A') {
                        $ret_ar[$icn]['claim'][$cdx]['Payer'] = $nm1;
                        //
                        $payer_name = $nm1;
                    } elseif ($loopid == '2000C' || $loopid == '2000D') {
                        $ret_ar[$icn]['claim'][$cdx]['PtName'] = $nm1;
                        //$ptname = $nm1;
                    }
                    continue;
                }
                // for 271 eligibility response (invalid data in 270 request)
                if (strncmp($seg, 'AAA' . $de, 4) === 0) {
                    $sar = explode($de, $seg);
                    $status = 'R';
                    $rej_ct++;
                    $aaa_code = $sar[3];
                    $rsp_code = $sar[4];
                    if ($loopid == '2000A') {
                        $status = $status . ' Src ' . $aaa_code;
                    } elseif ($loopid == '2000B') {
                        $status = $status . ' Rcv ' . $aaa_code;
                    } elseif ($loopid == '2000C') {
                        $status = $status . ' Sbr ' . $aaa_code;
                    } elseif ($loopid == '2000D') {
                        $status = $status . ' Dep ' . $aaa_code;
                    }
                    //
                    $ret_ar[$icn]['claim'][$cdx]['Status'] = $status;
                    //
                    continue;
                }
                //
                // for 270 eligibility request
                if (strncmp($seg, 'EQ' . $de, 3) === 0) {
                    if (strlen((string) $sar[1])) {
                        $bnfteq .= $bnfteq ? '|' . $sar[1] : $sar[1];
                    } elseif (strlen((string) $sar[2])) {
                        $bnfteq .= $bnfteq ? '|' . $sar[2] : $sar[2];
                    } else {
                        csv_edihist_log('Invalid EQ segment, missing benefit type in ' . $fn);
                        continue;
                    }
                    $ret_ar[$icn]['claim'][$cdx]['InsBnft'] = $bnfteq;
                    continue;
                }
                //  overridden by REF*EJ*  (not)
                if (strncmp($seg, 'TRN' . $de, 4) === 0) {
                    if ($loopid = '2000C' || $loopid == '2000D') {
                        $sar = explode($de, $seg);
                        $ret_ar[$icn]['claim'][$cdx]['Trace'] = $sar[2];
                        //$ptacct = $sar[2];
                    }
                    //
                    continue;
                }
                // for 271 eligibility response
                if (strncmp($seg, 'EB' . $de, 3) === 0) {
                    $status = isset($status) ? $status : '';
                    //
                    if (strpos($ret_ar[$icn]['claim'][$cdx]['Status'], 'tive')) {
                        continue;
                    }
                    //
                    $sar = explode($de, $seg);
                    //
                    if (isset($sar[2])) {
                        if ($sar[2] == '6' || $sar[2] == '7' || $sar[2] == '8') {
                            $status = 'Inactive';
                        } elseif ($sar[2] == 'I') {
                            $status = 'Non-Covered';
                            $rej_ct++;
                        } elseif ($sar[2] == 'E') {
                            $status = 'Exclusions';
                            $rej_ct++;
                        } elseif ($sar[2] == 'N') {
                            $status = 'Restricted';
                            $rej_ct++;
                        } elseif ($sar[2] == 'V') {
                            $status = 'Unknown';
                            $rej_ct++;
                        } elseif ($sar[2] == 'T') {
                            $status = 'Card Lost';
                            $rej_ct++;
                        } elseif ($sar[2] == 'U') {
                            $status = 'Contact';
                            $rej_ct++;
                        } elseif ($sar[2] == '1') {
                            $status = 'Active';
                        } elseif ($sar[2] == '2' || $sar[2] == '3' || $sar[2] == '4') {
                            $status = 'Active Cap';
                        }
                    }
                    //
                    $ret_ar[$icn]['claim'][$cdx]['Status'] = $status;
                    //
                    continue;
                }
                //
                if (strncmp($seg, 'DTP' . $de, 4) === 0) {
                    $sar = explode($de, $seg);
                    $dtp03 = isset($sar[2]) && $sar[2] == 'D8' ? $sar[3] : substr($sar[3], 0, 8);
                    if ($isrsp) {
                        if ($loopid == '2100C' || $loopid == '2110C') {
                            $ret_ar[$icn]['claim'][$cdx]['RspDate'] = $dtp03;
                        } elseif ($loopid == '2100D' || $loopid == '2110D') {
                            $ret_ar[$icn]['claim'][$cdx]['RspDate'] = $dtp03;
                        }
                    } else {
                        if ($loopid == '2100C' || $loopid == '2110C') {
                            $ret_ar[$icn]['claim'][$cdx]['ReqDate'] = $dtp03;
                        } elseif ($loopid == '2100D' || $loopid == '2110D') {
                            $ret_ar[$icn]['claim'][$cdx]['ReqDate'] = $dtp03;
                        }
                    }
                    //
                    continue;
                }
                //
                /*
                if (strncmp($seg, 'REF'.$de.'EJ'.$de, 7) === 0 ) {
                	// patient account -- replaces or replaced by TRN02 
                	$sar = explode($de, $seg);
                	$ret_ar[$icn]['claim'][$cdx]['PtAcct'] =  $sar[2];   //$ptacct =  $sar[2];
                	//
                	continue;
                }
                */
                //
            }
            // end foreach($stsegs as $seg)
            //
        }
        // endforeach($env_ar['ST'] as $st
        // file: 'f271': array('Date', 'FileName', 'Control', 'Claim_ct', 'Reject', 'Payer')
        $fdx = count($ret_ar[$icn]['file']);
        //'f270': $hdr = array('Date', 'FileName', 'Control', 'Claim_ct', 'x12Partner');
        $ret_ar[$icn]['file'][$fdx]['Date'] = $gsdate;
        $ret_ar[$icn]['file'][$fdx]['FileName'] = $fn;
        // for 270 type, could use GSO6 if it were unique
        $ret_ar[$icn]['file'][$fdx]['Control'] = $icn;
        $ret_ar[$icn]['file'][$fdx]['Claim_ct'] = $cdx;
        if ($isrsp || $ft == 'f271') {
            $ret_ar[$icn]['file'][$fdx]['Reject'] = $rej_ct;
            $ret_ar[$icn]['file'][$fdx]['Payer'] = $payer_name;
        } else {
            $ret_ar[$icn]['file'][$fdx]['x12Partner'] = $x12ptnr;
        }
        //
    }
    // endforeach($env_ar['ISA'] as $icn=>$isa)
    //
    return $ret_ar;
}
Exemple #7
0
/**
 * display the contents of an x12_edi transaction selected from
 * a csv table or processed files table
 * 
 * @uses csv_file_by_enctr()
 * @uses csv_file_by_controlnum()
 * @uses ibr_batch_get_st_block()
 * @return string
 */
function edih_disp_x12trans()
{
    //
    // query source ['gtbl']  file claim hist
    //
    // file: FileName  fname=$fn1&ftype=$ft&fmt=htm'                  filename x12type format
    // file: Control   fname=$fn1&ftype=$ft&icn=$ctl&fmt=seg         filename x12type isa13 format
    // file: Trace     trace=$tr&ftype=$typ&fmt=htm                  trace x12type format
    //
    // claim: FileName fname=$fn1&ftype=$ft&fmt=htm                      filename x12type format:html
    // claim: Control  fname=$fn1&ftype=$ft&icn=$ctl&fmt=seg             filename x12type icn  format:segment text
    // claim: CLM01    fname=$fn1&ftype=$ft&pid=$pid                     filename x12type pid-enctr
    // claim: Status   fname=fname=$fn1&ftype=$ft&pid=$pid&summary=yes    filename x12type pid-enctr summary
    // claim: Status   fname=$fn1&ftype=$ft&pid=$pid&summary=no'          filename x12type pid-enctr detail
    // claim: Trace  (835)  fname=$fn1&ftype=$ft&trace=$trc               trace filename x12type
    // claim: Trace  (999)  trace=$trc&rsptype=$typ&ftype=$ft             trace(bht03syn) response-type x12type
    // claim: Trace  (277)  trace=$v&ftype=$tp&rsptype=f837&fmt=seg'    trace(clm01) response-type {837) x12type
    // claim: BHT03  (27x)  fname=$fn1&ftype=$ft&bht03=$bht03&fmt=htm          filename x12type bht03
    // claim: err_seg  fname=$fn1&ftype=$ft&trace=$trc&rsptype=$typ&err=$err   filename x12type trace(bht03syn) response_type error_segment
    //
    // use files (1) x12 display of file segments (2) 835 html RA or Payment Trace (3) trace from 997 or 271/277/278
    //					$fn or $icn	& $ft						$fn $icn  $trace & $ft    $trace & $rsptype
    //    claims (1) html of transaction (2) segments of transaction (3) trace to precedent transaction
    //					$fn	& $ft $ pid										$trace & $rsptype
    //
    $str_htm = '';
    if (isset($_GET['gtbl'])) {
        $qs = filter_input(INPUT_GET, 'gtbl', FILTER_SANITIZE_STRING);
    }
    if (!$qs) {
        $str_htm .= '<p>edih_disp_x12 error: missing parameter</p>';
        csv_edihist_log("edih_io_disp_x12: missing parameter, no 'gtbl' value");
        return $str_htm;
    }
    //
    $fmt = isset($_GET['fmt']) ? filter_input(INPUT_GET, 'fmt', FILTER_SANITIZE_STRING) : '';
    //
    $fn = isset($_GET['fname']) ? filter_input(INPUT_GET, 'fname', FILTER_SANITIZE_STRING) : '';
    $ft = isset($_GET['ftype']) ? filter_input(INPUT_GET, 'ftype', FILTER_SANITIZE_STRING) : '';
    $icn = isset($_GET['icn']) ? filter_input(INPUT_GET, 'icn', FILTER_SANITIZE_STRING) : '';
    $rsptype = isset($_GET['rsptype']) ? filter_input(INPUT_GET, 'rsptype', FILTER_SANITIZE_STRING) : '';
    //
    $clm01 = isset($_GET['pid']) ? filter_input(INPUT_GET, 'pid', FILTER_SANITIZE_STRING) : '';
    $trace = isset($_GET['trace']) ? filter_input(INPUT_GET, 'trace', FILTER_SANITIZE_STRING) : '';
    $bht03 = isset($_GET['bht03']) ? filter_input(INPUT_GET, 'bht03', FILTER_SANITIZE_STRING) : '';
    $err = isset($_GET['err']) ? filter_input(INPUT_GET, 'err', FILTER_SANITIZE_STRING) : '';
    $summary = isset($_GET['summary']) ? filter_input(INPUT_GET, 'summary', FILTER_SANITIZE_STRING) : false;
    //
    // debug
    //$str_htm .= "<p>edih_disp_x12trans values: <br>".PHP_EOL;
    //$str_htm .= "qs $qs fmt $fmt fn $fn ft $ft icn $icn rsptype $rsptype clm01 $clm01 trace $trace bht03 $bht03 err $err summary $summary</p>".PHP_EOL;
    //
    if ($ft) {
        $ft = csv_file_type($ft);
    }
    //
    if ($qs == 'claim') {
        if ($ft == 'f997') {
            if ($trace && $rsptype) {
                $fname = csv_file_by_trace($trace, $ft, $rsptype);
                if ($fname) {
                    $str_htm .= edih_display_text($fname, $rsptype, $trace, $err);
                } else {
                    $str_htm .= "<p>Did not find {$trace} in the {$rsptype} claims table.</p>";
                }
                //$fnar = csv_file_by_enctr($trace, $rsptype, $srchtype='ptidn' );
                //if (is_array($fnar) && count($fnar)) {
                //foreach($fnar as $fa) {
                //$fname = $fa['FileName'];
                //$str_htm .= edih_display_text($fname, $rsptype, $trace, $err);
                //}
                //} else {
                //$str_htm .= "<p>Did not find $trace in the $rsptype claims table.</p>";
                //}
            }
        } elseif ($ft == 'f837') {
            // either transaction or file
            $str_htm .= edih_display_text($fn, $ft, $clm01);
        } elseif ($ft == 'f835') {
            if ($fmt == 'seg') {
                // either transaction or file
                $str_htm .= edih_display_text($fn, $ft, $clm01);
            } elseif ($trace) {
                // the check trace
                $str_htm .= edih_835_html($fn, $trace);
            } elseif ($clm01) {
                // this claim payment
                $str_htm .= edih_835_html($fn, '', $clm01, $summary);
            }
        } elseif (strpos('|f270|f271|f276|f277|f278', $ft)) {
            if ($fmt == 'seg') {
                if ($trace && $rsptype) {
                    // 270|276|278|837 claim or request segments
                    // here the 'trace' is from trace or clm01
                    //$fnar = csv_file_by_enctr($trace, $rsptype, $srchtype='ptidn' );
                    //if (is_array($fnar) && count($fnar)) {
                    //foreach($fnar as $fa) {
                    //$fname = $fa['FileName'];
                    //$str_htm .= edih_display_text($fname, $rsptype, $trace);
                    //}
                    $fname = csv_file_by_trace($trace, $ft, $rsptype);
                    if ($fname) {
                        $str_htm .= edih_display_text($fname, $rsptype, $trace);
                    } else {
                        $str_htm .= "<p>Did not find {$trace} in type {$rsptype} csv_claims table</p>" . PHP_EOL;
                        csv_edihist_log("edih_disp_x12trans: Did not find {$trace} in type {$rsptype} csv_claims table");
                    }
                } else {
                    // entire file or transaction if bht03 has a value
                    $str_htm .= edih_display_text($fn, $ft, $bht03);
                }
            } else {
                // html format
                if ($ft == 'f277') {
                    $str_htm .= edih_277_html($fn, $bht03);
                } elseif ($ft == 'f271') {
                    $str_htm .= edih_271_html($fn, $bht03);
                } elseif ($ft == 'f278') {
                    $str_htm .= edih_278_html($fn, $bht03);
                } else {
                    // html display not available, use segments
                    $str_htm .= edih_display_text($fn, $ft, $bht03);
                }
            }
        }
    } elseif ($qs == 'hist') {
        if ($fn && $ft == 'f837') {
            if ($clm01) {
                $str_htm .= edih_display_text($fn, $ft, $clm01);
            } else {
                $str_htm .= edih_display_text($fn, $ft);
            }
        } elseif ($fn && $ft == 'f997') {
            if ($trace && $rsptype && $err) {
                $str_htm .= edih_display_text($fn, $rsptype, $trace, true, $err);
            } elseif ($trace && $rsptype) {
                $str_htm .= edih_display_text($fn, $rsptype);
            } else {
                $str_htm .= edih_display_text($fn, $ft);
            }
        } elseif ($fn && $ft == 'f277') {
            if ($trace && $rsptype) {
                $fname = csv_file_by_trace($trace, $ft, $rsptype);
                if ($fname) {
                    $str_htm .= edih_display_text($fname, $rsptype, $trace);
                } else {
                    $str_htm .= "<p>Did not find {$trace} in type {$rsptype} csv_claims table</p>" . PHP_EOL;
                    csv_edihist_log("edih_disp_x12trans: Did not find {$trace} in type {$rsptype} csv_claims table");
                }
            } elseif ($clm01) {
                $str_htm .= edih_277_html($fn, $clm01);
            } elseif ($bht03) {
                $str_htm .= edih_277_html($fn, $bht03);
            } else {
                $str_htm .= edih_display_text($fn, $ft);
            }
        } elseif ($fn && $ft == 'f835') {
            if ($clm01) {
                if ($summary == 'yes') {
                    $str_htm .= edih_835_html($fn, '', $clm01, true);
                } else {
                    $str_htm .= edih_835_html($fn, '', $clm01);
                }
            } elseif ($trace) {
                $str_htm .= edih_835_html($fn, $trace);
            }
        }
    } else {
        $str_htm .= 'error: could not process request.';
    }
    return $str_htm;
}