///<summary>Etrans type will be figured out by this class. Either TextReport, Acknowledge_997, Acknowledge_999, or StatusNotify_277.</summary> public static void ProcessIncomingReport(DateTime dateTimeTrans, long clearinghouseNum, string messageText) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(), dateTimeTrans, clearinghouseNum, messageText); return; } Etrans etrans = new Etrans(); etrans.DateTimeTrans = dateTimeTrans; etrans.ClearingHouseNum = clearinghouseNum; EtransMessageText etransMessageText = new EtransMessageText(); etransMessageText.MessageText = messageText; EtransMessageTexts.Insert(etransMessageText); etrans.EtransMessageTextNum = etransMessageText.EtransMessageTextNum; string command; if (X12object.IsX12(messageText)) { X12object Xobj = new X12object(messageText); if (Xobj.IsAckInterchange()) { etrans.Etype = EtransType.Ack_Interchange; Etranss.Insert(etrans); //At some point in the future, we should use TA101 to match to batch number and TA104 to get the ack code, //then update historic etrans entries like we do for 997s, 999s and 277s. } else if (Xobj.Is997()) { X997 x997 = new X997(messageText); etrans.Etype = EtransType.Acknowledge_997; etrans.BatchNumber = x997.GetBatchNumber(); Etranss.Insert(etrans); string batchack = x997.GetBatchAckCode(); if (batchack == "A" || batchack == "R") //accepted or rejected { command = "UPDATE etrans SET AckCode='" + batchack + "', " + "AckEtransNum=" + POut.Long(etrans.EtransNum) + " WHERE BatchNumber=" + POut.Long(etrans.BatchNumber) + " AND ClearinghouseNum=" + POut.Long(clearinghouseNum) + " AND DateTimeTrans > " + POut.DateT(dateTimeTrans.AddDays(-14)) + " AND DateTimeTrans < " + POut.DateT(dateTimeTrans.AddDays(1)) + " AND AckEtransNum=0"; Db.NonQ(command); } else //partially accepted { List <int> transNums = x997.GetTransNums(); string ack; for (int i = 0; i < transNums.Count; i++) { ack = x997.GetAckForTrans(transNums[i]); if (ack == "A" || ack == "R") //accepted or rejected { command = "UPDATE etrans SET AckCode='" + ack + "', " + "AckEtransNum=" + POut.Long(etrans.EtransNum) + " WHERE BatchNumber=" + POut.Long(etrans.BatchNumber) + " AND TransSetNum=" + POut.Long(transNums[i]) + " AND ClearinghouseNum=" + POut.Long(clearinghouseNum) + " AND DateTimeTrans > " + POut.DateT(dateTimeTrans.AddDays(-14)) + " AND DateTimeTrans < " + POut.DateT(dateTimeTrans.AddDays(1)) + " AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if (Xobj.Is999()) { X999 x999 = new X999(messageText); etrans.Etype = EtransType.Acknowledge_999; etrans.BatchNumber = x999.GetBatchNumber(); Etranss.Insert(etrans); string batchack = x999.GetBatchAckCode(); if (batchack == "A" || batchack == "R") //accepted or rejected { command = "UPDATE etrans SET AckCode='" + batchack + "', " + "AckEtransNum=" + POut.Long(etrans.EtransNum) + " WHERE BatchNumber=" + POut.Long(etrans.BatchNumber) + " AND ClearinghouseNum=" + POut.Long(clearinghouseNum) + " AND DateTimeTrans > " + POut.DateT(dateTimeTrans.AddDays(-14)) + " AND DateTimeTrans < " + POut.DateT(dateTimeTrans.AddDays(1)) + " AND AckEtransNum=0"; Db.NonQ(command); } else //partially accepted { List <int> transNums = x999.GetTransNums(); string ack; for (int i = 0; i < transNums.Count; i++) { ack = x999.GetAckForTrans(transNums[i]); if (ack == "A" || ack == "R") //accepted or rejected { command = "UPDATE etrans SET AckCode='" + ack + "', " + "AckEtransNum=" + POut.Long(etrans.EtransNum) + " WHERE BatchNumber=" + POut.Long(etrans.BatchNumber) + " AND TransSetNum=" + POut.Long(transNums[i]) + " AND ClearinghouseNum=" + POut.Long(clearinghouseNum) + " AND DateTimeTrans > " + POut.DateT(dateTimeTrans.AddDays(-14)) + " AND DateTimeTrans < " + POut.DateT(dateTimeTrans.AddDays(1)) + " AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if (X277.Is277(Xobj)) { X277 x277 = new X277(messageText); etrans.Etype = EtransType.StatusNotify_277; Etranss.Insert(etrans); List <string> claimTrackingNumbers = x277.GetClaimTrackingNumbers(); for (int i = 0; i < claimTrackingNumbers.Count; i++) { string ack = x277.GetClaimInfo(claimTrackingNumbers[i])[3]; long claimNum = Claims.GetClaimNumForIdentifier(claimTrackingNumbers[i]); //Locate the latest etrans entries for the claim based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s and older 277s. command = "UPDATE etrans SET AckCode='" + ack + "', " + "AckEtransNum=" + POut.Long(etrans.EtransNum) + " WHERE EType IN (0,3) " //ClaimSent and Claim_Ren + " AND ClaimNum=" + POut.Long(claimNum) + " AND ClearinghouseNum=" + POut.Long(clearinghouseNum) + " AND DateTimeTrans > " + POut.DateT(dateTimeTrans.AddDays(-14)) + " AND DateTimeTrans < " + POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } ////none of the other fields make sense, because this ack could refer to many claims. } else //unknown type of X12 report. { etrans.Etype = EtransType.TextReport; Etranss.Insert(etrans); } } else //not X12 { etrans.Etype = EtransType.TextReport; Etranss.Insert(etrans); } }
///<summary>Etrans type will be figured out by this class. Either TextReport, Acknowledge_997, Acknowledge_999, or StatusNotify_277.</summary> public static void ProcessIncomingReport(DateTime dateTimeTrans,long clearinghouseNum,string messageText) { if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(),dateTimeTrans,clearinghouseNum,messageText); return; } Etrans etrans=new Etrans(); etrans.DateTimeTrans=dateTimeTrans; etrans.ClearingHouseNum=clearinghouseNum; EtransMessageText etransMessageText=new EtransMessageText(); etransMessageText.MessageText=messageText; EtransMessageTexts.Insert(etransMessageText); etrans.EtransMessageTextNum=etransMessageText.EtransMessageTextNum; string command; if(X12object.IsX12(messageText)) { X12object Xobj=new X12object(messageText); if(Xobj.IsAckInterchange()) { etrans.Etype=EtransType.Ack_Interchange; Etranss.Insert(etrans); //At some point in the future, we should use TA101 to match to batch number and TA104 to get the ack code, //then update historic etrans entries like we do for 997s, 999s and 277s. } else if(Xobj.Is997()) { X997 x997=new X997(messageText); etrans.Etype=EtransType.Acknowledge_997; etrans.BatchNumber=x997.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x997.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x997.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x997.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(Xobj.Is999()) { X999 x999=new X999(messageText); etrans.Etype=EtransType.Acknowledge_999; etrans.BatchNumber=x999.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x999.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x999.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x999.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(X277.Is277(Xobj)) { X277 x277=new X277(messageText); etrans.Etype=EtransType.StatusNotify_277; Etranss.Insert(etrans); List<string> claimTrackingNumbers=x277.GetClaimTrackingNumbers(); for(int i=0;i<claimTrackingNumbers.Count;i++) { string ack=x277.GetClaimInfo(claimTrackingNumbers[i])[3]; long claimNum=Claims.GetClaimNumForIdentifier(claimTrackingNumbers[i]); //Locate the latest etrans entries for the claim based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s and older 277s. command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE EType IN (0,3) "//ClaimSent and Claim_Ren +" AND ClaimNum="+POut.Long(claimNum) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } ////none of the other fields make sense, because this ack could refer to many claims. } else {//unknown type of X12 report. etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } } else {//not X12 etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } }
///<summary>Etrans type will be figured out by this class. Either TextReport, Acknowledge_997, Acknowledge_999, or StatusNotify_277.</summary> public static void ProcessIncomingReport(DateTime dateTimeTrans,long hqClearinghouseNum,string messageText,long userNum) { if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(),dateTimeTrans,hqClearinghouseNum,messageText,userNum); return; } Etrans etrans=CreateEtrans(dateTimeTrans,hqClearinghouseNum,messageText,userNum); string command; X12object Xobj=X12object.ToX12object(messageText); if(Xobj!=null) {//Is a correctly formatted X12 message. if(Xobj.IsAckInterchange()) { etrans.Etype=EtransType.Ack_Interchange; Etranss.Insert(etrans); //At some point in the future, we should use TA101 to match to batch number and TA104 to get the ack code, //then update historic etrans entries like we do for 997s, 999s and 277s. } else if(Xobj.Is997()) { X997 x997=new X997(messageText); etrans.Etype=EtransType.Acknowledge_997; etrans.BatchNumber=x997.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x997.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x997.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x997.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(Xobj.Is999()) { X999 x999=new X999(messageText); etrans.Etype=EtransType.Acknowledge_999; etrans.BatchNumber=x999.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x999.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x999.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x999.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(X277.Is277(Xobj)) { X277 x277=new X277(messageText); etrans.Etype=EtransType.StatusNotify_277; Etranss.Insert(etrans); List<string> listClaimIdentifiers=x277.GetClaimTrackingNumbers(); //Dictionary to run one update command per ack code for many claims. Dictionary <string,List<X12ClaimMatch>> dictClaimMatchesByAck=new Dictionary<string,List<X12ClaimMatch>>(); for(int i=0;i<listClaimIdentifiers.Count;i++) { X12ClaimMatch claimMatch=new X12ClaimMatch(); claimMatch.ClaimIdentifier=listClaimIdentifiers[i]; string[] arrayClaimInfo=x277.GetClaimInfo(claimMatch.ClaimIdentifier); claimMatch.PatFname=PIn.String(arrayClaimInfo[0]); claimMatch.PatLname=PIn.String(arrayClaimInfo[1]); claimMatch.DateServiceStart=PIn.DateT(arrayClaimInfo[6]); claimMatch.DateServiceEnd=PIn.DateT(arrayClaimInfo[7]); claimMatch.ClaimFee=PIn.Double(arrayClaimInfo[9]); claimMatch.SubscriberId=PIn.String(arrayClaimInfo[10]); claimMatch.EtransNum=etrans.EtransNum; string ack=arrayClaimInfo[3]; if(!dictClaimMatchesByAck.ContainsKey(ack)) { dictClaimMatchesByAck.Add(ack,new List<X12ClaimMatch>()); } dictClaimMatchesByAck[ack].Add(claimMatch); } foreach(string ack in dictClaimMatchesByAck.Keys) { List <long> listClaimNums=Claims.GetClaimFromX12(dictClaimMatchesByAck[ack]); if(listClaimNums!=null) { listClaimNums=listClaimNums.Where(x => x!=0).ToList(); if(listClaimNums.Count > 0) { //Locate the latest etrans entries for the claims based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s and older 277s. command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE EType IN ("+POut.Int((int)EtransType.ClaimSent)+","+POut.Int((int)EtransType.Claim_Ren)+") " +" AND ClaimNum IN("+String.Join(",",listClaimNums.Select(x => POut.Long(x)))+")" +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } } //none of the other fields make sense, because this ack could refer to many claims. } } else if(X835.Is835(Xobj)) { etrans.Etype=EtransType.ERA_835; List <string> listTranSetIds=Xobj.GetTranSetIds(); List <Etrans> listEtrans=new List<Etrans>(); List <X835> list835s=new List<X835>(); //We pull in the 835 data in two loops so that we can ensure the 835 is fully parsed before we create any etrans entries. for(int i=0;i<listTranSetIds.Count;i++) { etrans.TranSetId835=listTranSetIds[i]; if(i>0) { etrans.EtransNum=0;//To get a new record to insert. } X835 x835=new X835(etrans,messageText,etrans.TranSetId835);//parse. If parsing fails, then no etrans entries will be inserted. etrans.CarrierNameRaw=x835.PayerName; List<string> listUniquePatientNames=new List<string>(); for(int j=0;j<x835.ListClaimsPaid.Count;j++) { string patName=x835.ListClaimsPaid[j].PatientName.ToString(false); if(!listUniquePatientNames.Contains(patName)) { listUniquePatientNames.Add(patName); } } if(listUniquePatientNames.Count==1) { etrans.PatientNameRaw=listUniquePatientNames[0]; } else { etrans.PatientNameRaw="("+listUniquePatientNames.Count+" "+Lans.g("Etranss","patients")+")"; } listEtrans.Add(etrans.Copy()); list835s.Add(x835); } //The 835 was completely parsed. Create etrans entries. for(int i=0;i<listEtrans.Count;i++) { etrans=listEtrans[i]; X835 x835=list835s[i]; Etranss.Insert(etrans);//insert List<long> listClaimNums=x835.ListClaimsPaid.Select(x => x.ClaimNum).Where(x => x!=0).ToList(); if(listClaimNums.Count > 0) { //Locate the latest etrans entries for the claim based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s, and 277s. command="UPDATE etrans SET AckCode='A', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE EType IN (0,3) "//ClaimSent and Claim_Ren +" AND ClaimNum IN("+String.Join(",",listClaimNums.Select(x => POut.Long(x)))+")" +" AND ClearinghouseNum="+POut.Long(hqClearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } //none of the other fields make sense, because this ack could refer to many claims. } } else {//unknown type of X12 report. etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } } else {//not X12 etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } }
///<summary>Etrans type will be figured out by this class. Either TextReport, Acknowledge_997, Acknowledge_999, or StatusNotify_277.</summary> public static void ProcessIncomingReport(DateTime dateTimeTrans,long clearinghouseNum,string messageText) { if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(),dateTimeTrans,clearinghouseNum,messageText); return; } Etrans etrans=new Etrans(); etrans.DateTimeTrans=dateTimeTrans; etrans.ClearingHouseNum=clearinghouseNum; EtransMessageText etransMessageText=new EtransMessageText(); etransMessageText.MessageText=messageText; EtransMessageTexts.Insert(etransMessageText); etrans.EtransMessageTextNum=etransMessageText.EtransMessageTextNum; string command; if(X12object.IsX12(messageText)) { X12object Xobj=new X12object(messageText); if(Xobj.IsAckInterchange()) { etrans.Etype=EtransType.Ack_Interchange; Etranss.Insert(etrans); //At some point in the future, we should use TA101 to match to batch number and TA104 to get the ack code, //then update historic etrans entries like we do for 997s, 999s and 277s. } else if(Xobj.Is997()) { X997 x997=new X997(messageText); etrans.Etype=EtransType.Acknowledge_997; etrans.BatchNumber=x997.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x997.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x997.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x997.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(Xobj.Is999()) { X999 x999=new X999(messageText); etrans.Etype=EtransType.Acknowledge_999; etrans.BatchNumber=x999.GetBatchNumber(); Etranss.Insert(etrans); string batchack=x999.GetBatchAckCode(); if(batchack=="A"||batchack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+batchack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } else {//partially accepted List<int> transNums=x999.GetTransNums(); string ack; for(int i=0;i<transNums.Count;i++) { ack=x999.GetAckForTrans(transNums[i]); if(ack=="A"||ack=="R") {//accepted or rejected command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE BatchNumber="+POut.Long(etrans.BatchNumber) +" AND TransSetNum="+POut.Long(transNums[i]) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)) +" AND AckEtransNum=0"; Db.NonQ(command); } } } //none of the other fields make sense, because this ack could refer to many claims. } else if(X277.Is277(Xobj)) { X277 x277=new X277(messageText); etrans.Etype=EtransType.StatusNotify_277; Etranss.Insert(etrans); List<string> listClaimIdentifiers=x277.GetClaimTrackingNumbers(); for(int i=0;i<listClaimIdentifiers.Count;i++) { string claimIdentifier=listClaimIdentifiers[i]; string[] arrayClaimInfo=x277.GetClaimInfo(claimIdentifier); string patFname=PIn.String(arrayClaimInfo[0]); string patLname=PIn.String(arrayClaimInfo[1]); DateTime dateServiceStart=PIn.DateT(arrayClaimInfo[6]); DateTime dateServiceEnd=PIn.DateT(arrayClaimInfo[7]); double claimFee=PIn.Double(arrayClaimInfo[9]); string subscriberId=PIn.String(arrayClaimInfo[10]); Claim claim=Claims.GetClaimFromX12(claimIdentifier,claimFee,dateServiceStart,dateServiceEnd,patFname,patLname,subscriberId); if(claim==null) { continue; } string ack=arrayClaimInfo[3]; //Locate the latest etrans entries for the claim based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s and older 277s. command="UPDATE etrans SET AckCode='"+ack+"', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE EType IN (0,3) "//ClaimSent and Claim_Ren +" AND ClaimNum="+POut.Long(claim.ClaimNum) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } //none of the other fields make sense, because this ack could refer to many claims. } else if(X835.Is835(Xobj)) { etrans.Etype=EtransType.ERA_835; List <string> listTranSetIds=Xobj.GetTranSetIds(); for(int i=0;i<listTranSetIds.Count;i++) { etrans.TranSetId835=listTranSetIds[i]; if(i>0) { etrans.EtransNum=0;//To get a new record to insert. } Etranss.Insert(etrans); X835 x835=new X835(messageText,etrans.TranSetId835); List<Hx835_Claim> listClaimEOBs=x835.ListClaimsPaid; for(int j=0;j<listClaimEOBs.Count;j++) { long claimNum=listClaimEOBs[j].ClaimNum; //Locate the latest etrans entries for the claim based on DateTimeTrans with EType of ClaimSent or Claim_Ren and update the AckCode and AckEtransNum. //We overwrite existing acks from 997s, 999s, and 277s. command="UPDATE etrans SET AckCode='A', " +"AckEtransNum="+POut.Long(etrans.EtransNum) +" WHERE EType IN (0,3) "//ClaimSent and Claim_Ren +" AND ClaimNum="+POut.Long(claimNum) +" AND ClearinghouseNum="+POut.Long(clearinghouseNum) +" AND DateTimeTrans > "+POut.DateT(dateTimeTrans.AddDays(-14)) +" AND DateTimeTrans < "+POut.DateT(dateTimeTrans.AddDays(1)); Db.NonQ(command); } //none of the other fields make sense, because this ack could refer to many claims. } } else {//unknown type of X12 report. etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } } else {//not X12 etrans.Etype=EtransType.TextReport; Etranss.Insert(etrans); } }