public FormEtrans835Print(X835 x835) { InitializeComponent(); Lan.F(this); _x835=x835; }
private void FormEtrans835Edit_Load(object sender,EventArgs e) { MessageText=EtransMessageTexts.GetMessageText(EtransCur.EtransMessageTextNum); x835=new X835(MessageText); FillAll(); }
private void FormEtrans835Edit_Load(object sender,EventArgs e) { _x835=new X835(MessageText835,TranSetId835); FillAll(); }
///<summary>The insplan that's passed in need not be properly updated to the database first.</summary> public static void RequestBenefits(Clearinghouse clearhouse,InsPlan plan,long patNum,Carrier carrier,List<Benefit> benList,long patPlanNum,InsSub insSub) { Patient pat=Patients.GetPat(patNum); Patient subsc=Patients.GetPat(insSub.Subscriber); Clinic clinic=Clinics.GetClinic(pat.ClinicNum); Provider billProv=Providers.GetProv(Providers.GetBillingProvNum(pat.PriProv,pat.ClinicNum)); //validation. Throw exception if missing info---------------------------------------- string validationResult=X270.Validate(clearhouse,carrier,billProv,clinic,plan,subsc,insSub); if(validationResult != "") { throw new Exception(Lan.g("FormInsPlan","Please fix the following errors first:")+"\r\n"+validationResult); } //create a 270 message--------------------------------------------------------------- string x12message=X270.GenerateMessageText(clearhouse,carrier,billProv,clinic,plan,subsc,insSub); EtransMessageText etransMessageText=new EtransMessageText(); etransMessageText.MessageText=x12message; EtransMessageTexts.Insert(etransMessageText); //attach it to an etrans------------------------------------------------------------- Etrans etrans=new Etrans(); etrans.DateTimeTrans=DateTime.Now; etrans.ClearingHouseNum=clearhouse.ClearinghouseNum; etrans.Etype=EtransType.BenefitInquiry270; etrans.PlanNum=plan.PlanNum; etrans.InsSubNum=insSub.InsSubNum; etrans.EtransMessageTextNum=etransMessageText.EtransMessageTextNum; Etranss.Insert(etrans); //send the 270---------------------------------------------------------------------- string x12response=""; //a connection error here needs to bubble up try { if(clearhouse.CommBridge==EclaimsCommBridge.ClaimConnect) { x12response=ClaimConnect.Benefits270(clearhouse,x12message); } if(clearhouse.CommBridge==EclaimsCommBridge.EDS) { x12response=EDS.Benefits270(clearhouse,x12message); } } catch(Exception ex) { EtransMessageTexts.Delete(etrans.EtransMessageTextNum); Etranss.Delete(etrans.EtransNum); throw new ApplicationException(Lan.g("FormInsPlan","Connection Error:")+"\r\n"+ex.GetType().Name+"\r\n"+ex.Message); } //start to process the 271---------------------------------------------------------- X271 x271=null; if(X12object.IsX12(x12response)) { X12object x12obj=new X12object(x12response); if(x12obj.Is271()) { x271=new X271(x12response); } } else {//not a 997, 999, 277 or 271 EtransMessageTexts.Delete(etrans.EtransMessageTextNum); Etranss.Delete(etrans.EtransNum); throw new ApplicationException(Lan.g("FormInsPlan","Error:")+"\r\n"+x12response); } /* //In realtime mode, X12 limits the request to one patient. //We will always use the subscriber. //So all EB segments are for the subscriber. List<EB271> listEB=new List<EB271>(); EB271 eb; if(x271 != null) { for(int i=0;i<x271.Segments.Count;i++) { if(x271.Segments[i].SegmentID != "EB") { continue; } eb=new EB271(x271.Segments[i]); listEB.Add(eb); } }*/ //create an etrans for the 271------------------------------------------------------ etransMessageText=new EtransMessageText(); etransMessageText.MessageText=x12response; EtransMessageTexts.Insert(etransMessageText); Etrans etrans271=new Etrans(); etrans271.DateTimeTrans=DateTime.Now; etrans271.ClearingHouseNum=clearhouse.ClearinghouseNum; etrans271.Etype=EtransType.TextReport; if(X12object.IsX12(x12response)) {//this shouldn't need to be tested because it was tested above. if(x271==null){ X12object Xobj=new X12object(x12response); if(Xobj.Is997()) { etrans271.Etype=EtransType.Acknowledge_997; } else if(Xobj.Is999()) { etrans271.Etype=EtransType.Acknowledge_999; } else if(X277.Is277(Xobj)) { etrans271.Etype=EtransType.StatusNotify_277; } else if(X835.Is835(Xobj)) { etrans271.Etype=EtransType.ERA_835; } } else{ etrans271.Etype=EtransType.BenefitResponse271; } } etrans271.PlanNum=plan.PlanNum; etrans271.InsSubNum=insSub.InsSubNum; etrans271.EtransMessageTextNum=etransMessageText.EtransMessageTextNum; Etranss.Insert(etrans271); etrans.AckEtransNum=etrans271.EtransNum; if(etrans271.Etype==EtransType.Acknowledge_997) { X997 x997=new X997(x12response); string error997=x997.GetHumanReadable(); etrans.Note="Error: "+error997;//"Malformed document sent. 997 error returned."; Etranss.Update(etrans); MessageBox.Show(etrans.Note); //CodeBase.MsgBoxCopyPaste msgbox=new CodeBase.MsgBoxCopyPaste(etrans.Note); //msgbox.ShowDialog(); //don't show the 270 interface. return; } else if(etrans271.Etype==EtransType.Acknowledge_999) { X999 x999=new X999(x12response); string error999=x999.GetHumanReadable(); etrans.Note="Error: "+error999;//"Malformed document sent. 999 error returned."; Etranss.Update(etrans); MessageBox.Show(etrans.Note); //CodeBase.MsgBoxCopyPaste msgbox=new CodeBase.MsgBoxCopyPaste(etrans.Note); //msgbox.ShowDialog(); //don't show the 270 interface. return; } else if(etrans271.Etype==EtransType.StatusNotify_277) { X277 x277=new X277(x12response); string error277=x277.GetHumanReadable(); etrans.Note="Error: "+error277;//"Malformed document sent. 277 error returned."; Etranss.Update(etrans); MessageBox.Show(etrans.Note); //CodeBase.MsgBoxCopyPaste msgbox=new CodeBase.MsgBoxCopyPaste(etrans.Note); //msgbox.ShowDialog(); //don't show the 277 interface. return; } else if(etrans271.Etype==EtransType.ERA_835) { X835 x835=new X835(x12response,""); string error835=x835.GetHumanReadable(); etrans.Note="Error: "+error835;//"Malformed document sent. 835 error returned."; Etranss.Update(etrans); MessageBox.Show(etrans.Note); //CodeBase.MsgBoxCopyPaste msgbox=new CodeBase.MsgBoxCopyPaste(etrans.Note); //msgbox.ShowDialog(); //don't show the 835 interface. return; } else { //271 string processingerror=x271.GetProcessingError(); if(processingerror != "") { etrans.Note=processingerror; Etranss.Update(etrans); MessageBox.Show(etrans.Note); //CodeBase.MsgBoxCopyPaste msgbox=new CodeBase.MsgBoxCopyPaste(etrans.Note); //msgbox.ShowDialog(); //don't show the 270 interface. return; } else { etrans.Note="Normal 271 response.";//change this later to be explanatory of content. } } Etranss.Update(etrans); //show the user a list of benefits to pick from for import-------------------------- FormEtrans270Edit formE=new FormEtrans270Edit(patPlanNum,plan.PlanNum,insSub.InsSubNum); formE.EtransCur=etrans; formE.IsInitialResponse=true; formE.benList=benList; formE.ShowDialog(); }
///<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); } }