static void FinishTheEdits(int _lastConflict, string _claimNo, Dictionary <string, ClaimLinesIndex> _claimLinesList, Dictionary <string, Findings> _dic, int errLine) { string startId = _claimNo + "|" + (_lastConflict + 1).ToString(); string endId = _claimNo + "|z"; foreach (var pair in _claimLinesList) { if (pair.Key.CompareTo(startId) >= 0 && pair.Key.CompareTo(endId) < 0) { ClaimLinesIndex _cli = pair.Value; if (_cli.hasDU) { Findings findings = new Findings(); findings.id = _claimNo; findings.claimIndex = _cli.claimIndex; findings.editType = "Review"; findings.mnemonic = "mMP"; findings.editConflit = "mMP"; findings.description = "PNS3 Multiple Procedure Reduction " + _cli.percentage; try { _dic.Add(String.Format("{0}{1}{2}", _claimNo, _cli.claimIndex, (++errLine).ToString()), findings); }catch (Exception mex) { log.LogError("In FinishTheEdits " + mex.Message); } } } } }
static bool IsCleanClaim(string _claimNo, Dictionary <string, ClaimLinesIndex> _claimLinesList) { bool findings = true; //string _claimNo = _findings.id; string startId = (_claimNo + "|0").ToString(); string endId = _claimNo + "|z"; int results = 0; if (_claimNo.Equals("20170309T33K00018")) { results = 0; } foreach (var pair in _claimLinesList) { if (pair.Key.CompareTo(_claimNo) >= 0 && pair.Key.CompareTo(endId) < 0) { ClaimLinesIndex _cli = pair.Value; // if (!_cli.claimIndex.Equals("0") ) // results++; if (_cli.hasDU) { findings = false; } } } if (results > 1) { findings = false; } return(findings); }
static void MergeFindings(Dictionary <string, Findings> _dic, Dictionary <string, ClaimLinesIndex> _claimLinesList, List <string> _thisRun) { string lastClaim = String.Empty; int errLine = 0; foreach (var pair in _claimLinesList) { ClaimLinesIndex _cli = pair.Value; if (!_thisRun.Contains(_cli.claim)) { continue; } if (_cli.claim.CompareTo(lastClaim) != 0) { errLine = 0; } if (_cli.percentage != null) { Findings findings = new Findings(); findings.id = _cli.claim; findings.claimIndex = _cli.claimIndex; findings.editType = "Review"; findings.mnemonic = "mMP"; findings.editConflit = "mMP"; findings.description = "PNS4 Multiple Procedure Reduction " + _cli.percentage; try { _dic.Add(String.Format("{0}{1}{2}", _cli.claim, _cli.claimIndex, (++errLine).ToString()), findings); }catch (Exception mex) { log.LogError("MergeFindings " + mex.Message); } } } }
static void SplitFiles(string _file, string _network, SqlConnection _con) { TextReader tr = File.OpenText(_file); string fileName = Path.GetFileName(_file); int fileCount = 1; log.LogInformation(String.Format("Spliting File {0}", _file)); string workingFile = String.Format(@"{0}\WORKING\{1}.{2}", _network, fileName, fileCount.ToString("000")); TextWriter tw = null; try { tw = File.CreateText(workingFile); } catch (Exception ex) { log.LogError(String.Format("SplitFiles Create File {0}", ex.Message)); } string line = ""; int lineNo = 0; int claimCount = 0; ClaimLinesIndex _cl; _cl = new ClaimLinesIndex(); _cl.claim = null; _cl.hasDU = false; string diagnosis = ""; string procedure = ""; string description = ""; int icdVersion = 9; log.LogInformation(String.Format("Working file {0}", workingFile)); int surgicalCount = 0; string surguryStarts = "123456"; string lastServiceDate = ""; try { while ((line = tr.ReadLine()) != null) { line = line.TrimStart(); if (line.StartsWith(@"<?xml") || line.StartsWith(@"<claims")) { tw.WriteLine(line); } else { if (line.StartsWith(@"<icd9v1></icd9v1>") || line.StartsWith(@"<modifier></modifier>") || line.StartsWith(@"<icd10cm></icd10cm")) { continue; } if (!line.StartsWith("<lineno")) { tw.WriteLine(line); } if (line.Contains(@"icd9v1") || line.Contains(@"icd10cm")) { if (line.Contains(@"icd10cm")) { icdVersion = 10; } else { icdVersion = 9; } //diagnosis = GetValue(line); } if (line.StartsWith("<service-begin-date>")) { if (lastServiceDate.CompareTo(GetValue(line)) != 0) { lastServiceDate = GetValue(line); if (surgicalCount > 0) { surgicalCount = 0; } } } if (line.StartsWith("<diagnostic-code>")) { diagnosis = GetValue(line); _cl.diag = diagnosis; } if (line.StartsWith(@"<procedure-code")) { procedure = GetValue(line); _cl.cpt = procedure; _cl.hasDU = false; // this is a surgery if (surguryStarts.IndexOf(procedure.Substring(0, 1)) >= 0) { if (!gCPTExclusions.Contains(procedure)) { surgicalCount++; if (surgicalCount > 1) { _cl.hasDU = true; _cl.percentage = ""; switch (surgicalCount) { case 1: /* doing nothing here to avoid default */ break; case 2: _cl.percentage = p2; break; case 3: _cl.percentage = p3; break; case 4: _cl.percentage = p4; break; case 5: _cl.percentage = p5; break; default: _cl.percentage = p6; break; } } } } } if (line.StartsWith(@"<claim id=")) { _cl = new ClaimLinesIndex(); _cl.claim = GetClaimID(line); if (_cl.claim.CompareTo("20170309T33K00018") == 0) { _cl.hasDU = false; } _cl.hasDU = false; _cl.percentage = null; lineNo = 0; claimCount++; surgicalCount = 0; lastServiceDate = ""; } if (line.StartsWith("<claim-line")) { diagnosis = ""; procedure = ""; description = ""; lineNo++; } if (line.StartsWith("<lineno")) { _cl.claimIndex = GetClaimIndex(line); _cl.lineNo = lineNo.ToString(); _cl.key = String.Format("{0}|{1}", _cl.claim, _cl.lineNo); _cl.hasDU = false; _cl.percentage = null; continue; } if (line.StartsWith(@"</claim-line")) { claimLinesList.Add(_cl.key, _cl); } if (claimCount == 100 && line.StartsWith(@"</claim>")) { tw.WriteLine(@"</claims>"); tw.Flush(); tw.Close(); workingFile = String.Format(@"{0}\WORKING\{1}.{2}", _network, fileName, (++fileCount).ToString("000")); tw = File.CreateText(workingFile); tw.WriteLine(@"<?xml version='1.0' encoding='UTF-8'?>"); tw.WriteLine(@"<claims>"); claimCount = 0; } } } } catch (Exception ex) { log.LogError(String.Format("Exception in SplitFiles {0}", ex.Message)); } tw.Close(); tr.Close(); }
static void SendFiles(string _fileName, string _dir) { TextWriter tw = null; var dic = new Dictionary <string, Findings>(); if (optumFindings == null) { optumFindings = new List <Findings>(); } else { optumFindings.Clear(); } List <string> thisRun = new List <string>(); int loop = 0; int lineCounter = 0; try { log.LogInformation(String.Format("In SendFiles {0} {1}", _fileName, _dir)); string user = "******"; string password = "******"; string claimsDotXml = _fileName; WebRequest req = WebRequest.Create("https://realtimeecontent.com/ws/claims5x"); req.Method = "POST"; req.ContentType = "application/xml"; req.Credentials = new NetworkCredential(user, password); FileStream fs = new FileStream(claimsDotXml, FileMode.Open); string outFile = String.Format(@"{0}\OUT\{1}.out", _dir, Path.GetFileName(_fileName)); string outFile2 = String.Format(@"{0}\OUT\{1}2.out", _dir, Path.GetFileName(_fileName)); if (File.Exists(outFile)) { File.Delete(outFile); } log.LogInformation(String.Format("Creating File {0} ", outFile)); tw = File.CreateText(outFile); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; using (Stream reqStream = req.GetRequestStream()) { byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0) { reqStream.Write(buffer, 0, bytesRead); } fs.Close(); } System.Net.HttpWebResponse resp = req.GetResponse() as System.Net.HttpWebResponse; if (resp.StatusCode == System.Net.HttpStatusCode.OK) { System.Xml.XPath.XPathDocument xmlDoc = new System.Xml.XPath.XPathDocument(resp.GetResponseStream()); System.Xml.XPath.XPathNavigator nav = xmlDoc.CreateNavigator(); //Console.WriteLine("Claim A5 had {0} Edits.", nav.Evaluate("count(/claim-responses/claim-response[@claim-id='43']/edit)")); //Console.WriteLine(nav.Evaluate("/claim-responses/claim-response/edit")); lineCounter++; loop = 1; XPathNodeIterator xPathIterator = nav.Select("/claim-responses//claim-response"); int errLine = 0; int lastConflictFound = 0, iClaimLine = 0; string lastClaim = ""; foreach (XPathNavigator claimResponse in xPathIterator) { XPathNavigator onav = claimResponse.SelectSingleNode("@claim-id"); string id = onav == null ? string.Empty : onav.Value; try { thisRun.Add(id); }catch (Exception mex) { log.LogError(mex.Message); } if (id.CompareTo("20170309T33K00018") == 0) { errLine = 0; } XPathNodeIterator ixPathIterator = claimResponse.Select("edit"); bool hasEdits = false; int noOfEdits = 0; foreach (XPathNavigator editLines in ixPathIterator) { hasEdits = true; noOfEdits++; onav = editLines.SelectSingleNode("@line"); string claimLine = onav == null ? string.Empty : onav.Value; string key = id.Trim() + "|" + claimLine.Trim(); ClaimLinesIndex _cli; try { iClaimLine = int.Parse(claimLine); } catch (Exception ex) { iClaimLine = 0; } if (iClaimLine > lastConflictFound) { string myId = ""; lastConflictFound = iClaimLine; } XPathNavigator inav = editLines.SelectSingleNode("description"); string description = editLines == null ? string.Empty : inav.Value; //if (description.Contains("[Pattern 10372]")) // hasEdits = false; //inav = editLines.SelectSingleNode("edit-conflict"); string editConflict = ""; // editLines == null ? string.Empty : inav.Value; inav = editLines.SelectSingleNode("edit-type"); string editType = editLines == null ? string.Empty : inav.Value; inav = editLines.SelectSingleNode("mnemonic"); string mnemonic = editLines == null ? string.Empty : inav.Value; Findings opFind = new Findings(); opFind.id = id; opFind.lineNo = claimLine; opFind.editType = editType; opFind.mnemonic = mnemonic; opFind.editConflit = editConflict; opFind.description = description; optumFindings.Add(opFind); if (!claimLinesList.ContainsKey(key)) { log.LogError(String.Format("The claim does not contain {0}", key)); _cli = new ClaimLinesIndex(); _cli.claim = id; _cli.hasDU = true; _cli.lineNo = "-99"; _cli.claimIndex = "-99"; } else { _cli = claimLinesList[key]; } if (!_cli.hasDU) { if (!description.Contains("50.0%")) // Ignore Optum { Findings findings = new Findings(); findings.id = id; findings.claimIndex = _cli.claimIndex; findings.editType = editType; findings.mnemonic = mnemonic; findings.editConflit = editConflict; findings.description = description; try { dic.Add(String.Format("{0}{1}{2}", id, _cli.claimIndex, (++errLine).ToString()), findings); }catch (Exception mex) { log.LogError(mex.Message); } } else { if (noOfEdits == 1) // this is the only edit for the claim and it's a wrong one mMP { hasEdits = false; } noOfEdits--; } } } if (hasEdits == false) { // claim does not have any edits //string percentage = ""; //ClaimLinesIndex _cli; //int found = 0; //if (found == 0) //{ if (IsCleanClaim(id, claimLinesList)) { Findings findings = new Findings(); findings.id = id; findings.claimIndex = "0"; findings.editType = ""; findings.mnemonic = ""; findings.editConflit = ""; findings.description = ""; try { dic.Add(String.Format("{0}{1}{2}", id, findings.claimIndex, (++errLine).ToString()), findings); }catch (Exception mex) { log.LogError(mex.Message); } } //tw.WriteLine("************ Claim {0} is clean ********", id); //} } } //FinishTheEdits(lastConflictFound - 1, lastClaim, claimLinesList, dic, errLine); } ReviewClaimLineList(tw); optumFindings.Clear(); dic.Clear(); dic = null; tw.Close(); } catch (Exception ex) { log.LogError(String.Format("Sending Files {0}", ex.Message)); } finally { //claimLinesList.Clear(); thisRun.Clear(); } }