private static string Run(int scriptNum, Carrier carrier, Provider treatProv, Provider billingProv, DateTime reconciliationDate, out List <Etrans> etransAcks)
        {
            string        retVal            = "";
            Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
            Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);

            etransAcks = CanadianOutput.GetPaymentReconciliations(clearinghouseClin, carrier, treatProv, billingProv, reconciliationDate, 0);
            retVal    += "Payment Reconciliation#" + scriptNum.ToString() + " successful.\r\n";
            return(retVal);
        }
        private static string Run(int scriptNum, Carrier carrier, CanadianNetwork network, Provider prov, out Etrans etrans, DateTime reconciliationDate)
        {
            string        retVal            = "";
            Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
            Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);

            etrans  = CanadianOutput.GetSummaryReconciliation(clearinghouseClin, carrier, network, prov, reconciliationDate);
            retVal += "Summary Reconciliation#" + scriptNum.ToString() + " successful.\r\n";
            return(retVal);
        }
示例#3
0
        private static string Run(int scriptNum, bool version2, bool sendToItrans, Carrier carrier, out List <Etrans> etransRequests)
        {
            string        retVal            = "";
            Provider      prov              = Providers.GetProv(PrefC.GetLong(PrefName.PracticeDefaultProv));
            Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
            Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);

            etransRequests = CanadianOutput.GetOutstandingTransactions(clearinghouseClin, version2, sendToItrans, carrier, prov, false);
            retVal        += "Outstanding Transactions#" + scriptNum.ToString() + " successful.\r\n";
            return(retVal);
        }
示例#4
0
        ///<summary>Fills the missing data field on the queueItem that was passed in.  This contains all missing data on this claim.  Claim will not be allowed to be sent electronically unless this string comes back empty.</summary>
        public static void GetMissingData(ClaimSendQueueItem queueItem)         //, out string warnings){
        {
            queueItem.Warnings    = "";
            queueItem.MissingData = "";
            Clearinghouse clearhouse = ClearinghouseL.GetClearinghouse(queueItem.ClearinghouseNum, true);         //Suppress error message in case no default medical clearinghouse set.

            //this is usually just the default clearinghouse or the clearinghouse for the PayorID.
            if (clearhouse == null)
            {
                if (queueItem.MedType == EnumClaimMedType.Dental)
                {
                    queueItem.MissingData += "No default dental clearinghouse set.";
                }
                else
                {
                    queueItem.MissingData += "No default medical/institutional clearinghouse set.";
                }
                return;
            }
            if (clearhouse.Eformat == ElectronicClaimFormat.x837D_4010)
            {
                X837_4010.Validate(queueItem);                //,out warnings);
                //return;
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.x837D_5010_dental ||
                     clearhouse.Eformat == ElectronicClaimFormat.x837_5010_med_inst)
            {
                X837_5010.Validate(queueItem);                //,out warnings);
                //return;
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.Renaissance)
            {
                queueItem.MissingData = Renaissance.GetMissingData(queueItem);
                //return;
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.Canadian)
            {
                queueItem.MissingData = Canadian.GetMissingData(queueItem);
                //return;
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.Dutch)
            {
                Dutch.GetMissingData(queueItem);                //,out warnings);
                //return;
            }
            //return "";
        }
示例#5
0
        ///<summary>Returns a string describing all missing data on this claim.  Claim will not be allowed to be sent electronically unless this string comes back empty.</summary>
        public static string GetMissingData(ClaimSendQueueItem queueItem)
        {
            Clearinghouse clearhouse = Clearinghouses.GetClearinghouse(queueItem.ClearinghouseNum);

            if (clearhouse.Eformat == ElectronicClaimFormat.X12)
            {
                return(X12.GetMissingData(queueItem));
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.Renaissance)
            {
                return(Renaissance.GetMissingData(queueItem));
            }
            else if (clearhouse.Eformat == ElectronicClaimFormat.Canadian)
            {
                return(Canadian.GetMissingData(queueItem));
            }
            return("");
        }
        private void butOK_Click(object sender, EventArgs e)
        {
            if (listCarriers.SelectedIndex < 0)
            {
                MsgBox.Show(this, "You must first choose a carrier.");
                return;
            }
            if (listBillingProvider.SelectedIndex < 0)
            {
                MsgBox.Show(this, "You must first choose a billing provider.");
                return;
            }
            if (listTreatingProvider.SelectedIndex < 0)
            {
                MsgBox.Show(this, "You must first choose a treating provider.");
                return;
            }
            DateTime reconciliationDate;

            try {
                reconciliationDate = DateTime.Parse(textDateReconciliation.Text).Date;
            }
            catch {
                MsgBox.Show(this, "Reconciliation date invalid.");
                return;
            }
            Cursor = Cursors.WaitCursor;
            try {
                Carrier       carrier           = carriers[listCarriers.SelectedIndex];
                Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
                Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                CanadianOutput.GetPaymentReconciliations(clearinghouseClin, carrier, _listProviders[listTreatingProvider.SelectedIndex],
                                                         _listProviders[listBillingProvider.SelectedIndex], reconciliationDate, Clinics.ClinicNum, false, FormCCDPrint.PrintCCD);
                Cursor = Cursors.Default;
                MsgBox.Show(this, "Done.");
            }
            catch (Exception ex) {
                Cursor = Cursors.Default;
                MessageBox.Show(Lan.g(this, "Request failed: ") + ex.Message);
            }
            DialogResult = DialogResult.OK;
        }
示例#7
0
        public static string Run(int scriptNum, string responseExpected, string responseTypeExpected, Claim claim, bool showForms, int pageNumber, int lastPageNumber, double firstExamFee, double diagnosticPhaseFee)
        {
            string             retVal            = "";
            ClaimSendQueueItem queueItem         = Claims.GetQueueList(claim.ClaimNum, claim.ClinicNum, 0)[0];
            Clearinghouse      clearinghouseHq   = ClearinghouseL.GetClearinghouseHq(queueItem.ClearinghouseNum);
            Clearinghouse      clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);

            Eclaims.GetMissingData(clearinghouseClin, queueItem);           //,out warnings);
            if (queueItem.MissingData != "")
            {
                return("Cannot send predetermination until missing data is fixed:\r\n" + queueItem.MissingData + "\r\n");
            }
#if DEBUG
            Canadian.testNumber = scriptNum;
            claim.PreAuthString = "" + pageNumber + "," + lastPageNumber + "," + firstExamFee + "," + diagnosticPhaseFee;
#endif
            long             etransNum    = Canadian.SendClaim(clearinghouseClin, queueItem, showForms);
            Etrans           etrans       = Etranss.GetEtrans(etransNum);
            string           message      = EtransMessageTexts.GetMessageText(etrans.EtransMessageTextNum);
            CCDFieldInputter formData     = new CCDFieldInputter(message);
            string           responseType = formData.GetValue("A04");
            if (responseType != responseTypeExpected)
            {
                return("Form type is '" + responseType + "' but should be '" + responseTypeExpected + "'\r\n");
            }
            string responseStatus = formData.GetValue("G05");
            if (responseStatus != responseExpected)
            {
                return("G05 is '" + responseStatus + "' but should be '" + responseExpected + "'\r\n");
            }
            if (responseExpected == "R" && responseTypeExpected == "11")
            {
                //so far, only for #6.  We need some other way to test if successful transaction
                string errorMsgCount = formData.GetValue("G06");
                if (errorMsgCount == "00")
                {
                    return("Wrong message count.\r\n");
                }
            }
            retVal += "Predetermination #" + scriptNum + " page " + pageNumber + " of " + lastPageNumber + " successful.\r\n";
            return(retVal);
        }
示例#8
0
        public static string Run(int scriptNum, string responseExpected, string responseTypeExpected, Claim claim, bool showForms)
        {
            string             retVal            = "";
            ClaimSendQueueItem queueItem         = Claims.GetQueueList(claim.ClaimNum, claim.ClinicNum, 0)[0];
            Clearinghouse      clearinghouseHq   = ClearinghouseL.GetClearinghouseHq(queueItem.ClearinghouseNum);
            Clearinghouse      clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);

            Eclaims.GetMissingData(clearinghouseClin, queueItem);           //,out warnings);
            if (queueItem.MissingData != "")
            {
                return("Cannot send claim until missing data is fixed:\r\n" + queueItem.MissingData + "\r\n");
            }
#if DEBUG
            Canadian.testNumber = scriptNum;
#endif
            long             etransNum    = Canadian.SendClaim(clearinghouseClin, queueItem, showForms);
            Etrans           etrans       = Etranss.GetEtrans(etransNum);
            string           message      = EtransMessageTexts.GetMessageText(etrans.EtransMessageTextNum);
            CCDFieldInputter formData     = new CCDFieldInputter(message);
            string           responseType = formData.GetValue("A04");
            if (responseType != responseTypeExpected)
            {
                return("Form type should be " + responseTypeExpected + "\r\n");
            }
            string responseStatus = formData.GetValue("G05");
            if (responseStatus != responseExpected)
            {
                return("G05 should be " + responseExpected + "\r\n");
            }
            if (responseExpected == "R" && responseTypeExpected == "11")
            {
                //so far, only for #6.  We need some other way to test if successful transaction
                string errorMsgCount = formData.GetValue("G06");
                if (errorMsgCount == "00")
                {
                    return("Wrong message count.\r\n");
                }
            }
            retVal += "Claim #" + scriptNum.ToString() + " successful.\r\n";
            return(retVal);
        }
        // GET: Canadian
        public ActionResult Index()
        {
            using (CanadiansEntities3 db = new CanadiansEntities3())
            {
                var canadians    = db.Canadians;
                var allCanadians = new List <Canadian>();
                foreach (var canadian in canadians)
                {
                    var Canadian = new Canadian
                    {
                        NewID        = canadian.NewID,
                        first_name   = canadian.first_name,
                        last_name    = canadian.last_name,
                        company_name = canadian.company_name,
                        address      = canadian.address,
                        city         = canadian.city,
                        province     = canadian.province,
                        postal       = canadian.postal,
                        phone1       = canadian.phone1,
                        email        = canadian.email,
                        web          = canadian.web,
                    };
                    allCanadians.Add(Canadian);

                    //Random rand = new Random();
                    //int toSkip = rand.Next(0, db.Canadians.Count());
                    //toSkip = db.Canadians.OrderBy(x => Guid.NewGuid()).FirstOrDefault();
                    //db.Canadians.Skip(toSkip).Take(1).First();
                    //ViewBag.var = toSkip;
                }
                Random rand   = new Random();
                int    toSkip = rand.Next(0, db.Canadians.Count());
                //string rando = toSkip.ToString();
                return(View(allCanadians.Where(x => x.NewID == toSkip)));
            }
        }
        private void butOK_Click(object sender, EventArgs e)
        {
            if (!checkGetForAllCarriers.Checked)
            {
                if (listCarriers.SelectedIndex < 0 && listNetworks.SelectedIndex < 0)
                {
                    MsgBox.Show(this, "You must first choose one carrier or one network.");
                    return;
                }
            }
            if (listTreatingProvider.SelectedIndex < 0)
            {
                MsgBox.Show(this, "You must first choose a treating provider.");
                return;
            }
            DateTime reconciliationDate;

            try {
                reconciliationDate = DateTime.Parse(textDateReconciliation.Text).Date;
            }
            catch {
                MsgBox.Show(this, "Reconciliation date invalid.");
                return;
            }
            Cursor = Cursors.WaitCursor;
            try {
                if (checkGetForAllCarriers.Checked)
                {
                    Carrier carrier = new Carrier();
                    carrier.CDAnetVersion            = "04";
                    carrier.ElectID                  = "999999"; //The whole ITRANS network.
                    carrier.CanadianEncryptionMethod = 1;        //No encryption.
                    Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
                    Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                    CanadianOutput.GetSummaryReconciliation(clearinghouseClin, carrier, null,
                                                            _listProviders[listTreatingProvider.SelectedIndex], reconciliationDate, false, FormCCDPrint.PrintCCD);
                }
                else
                {
                    if (listCarriers.SelectedIndex >= 0)
                    {
                        Carrier       carrier           = carriers[listCarriers.SelectedIndex];
                        Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
                        Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                        CanadianOutput.GetSummaryReconciliation(clearinghouseClin, carrier, null,
                                                                _listProviders[listTreatingProvider.SelectedIndex], reconciliationDate, false, FormCCDPrint.PrintCCD);
                    }
                    else
                    {
                        Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(null);
                        Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                        CanadianOutput.GetSummaryReconciliation(clearinghouseClin, null, _listCanadianNetworks[listNetworks.SelectedIndex],
                                                                _listProviders[listTreatingProvider.SelectedIndex], reconciliationDate, false, FormCCDPrint.PrintCCD);
                    }
                }
                Cursor = Cursors.Default;
                MsgBox.Show(this, "Done.");
            }
            catch (Exception ex) {
                Cursor = Cursors.Default;
                MessageBox.Show(Lan.g(this, "Request failed: ") + ex.Message);
            }
            DialogResult = DialogResult.OK;
        }
示例#11
0
 ///<summary>Fills the missing data field on the queueItem that was passed in.  This contains all missing data on this claim.  Claim will not be allowed to be sent electronically unless this string comes back empty.</summary>
 public static ClaimSendQueueItem GetMissingData(Clearinghouse clearinghouseClin, ClaimSendQueueItem queueItem)
 {
     if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
     {
         return(Meth.GetObject <ClaimSendQueueItem>(MethodBase.GetCurrentMethod(), clearinghouseClin, queueItem));
     }
     queueItem.Warnings    = "";
     queueItem.MissingData = "";
     //this is usually just the default clearinghouse or the clearinghouse for the PayorID.
     if (clearinghouseClin == null)
     {
         if (queueItem.MedType == EnumClaimMedType.Dental)
         {
             queueItem.MissingData += "No default dental clearinghouse set.";
         }
         else
         {
             queueItem.MissingData += "No default medical/institutional clearinghouse set.";
         }
         return(queueItem);
     }
     #region Data Sanity Checking (for Replication)
     //Example: We had one replication customer who was able to delete an insurance plan for which was attached to a claim.
     //Imagine two replication servers, server A and server B.  An insplan is created which is not associated to any claims.
     //Both databases have a copy of the insplan.  The internet connection is lost.  On server A, a user deletes the insurance
     //plan (which is allowed because no claims are attached).  On server B, a user creates a claim with the insurance plan.
     //When the internet connection returns, the delete insplan statement is run on server B, which then creates a claim with
     //an invalid InsPlanNum on server B.  Without the checking below, the send claims window would crash for this one scenario.
     Claim   claim   = Claims.GetClaim(queueItem.ClaimNum); //This should always exist, because we just did a select to get the queue item.
     InsPlan insPlan = InsPlans.RefreshOne(claim.PlanNum);
     if (insPlan == null)                                   //Check for missing PlanNums
     {
         queueItem.MissingData = Lans.g("Eclaims", "Claim insurance plan record missing.  Please recreate claim.");
         return(queueItem);
     }
     if (claim.InsSubNum2 != 0)
     {
         InsPlan insPlan2 = InsPlans.RefreshOne(claim.PlanNum2);
         if (insPlan2 == null)               //Check for missing PlanNums
         {
             queueItem.MissingData = Lans.g("Eclaims", "Claim other insurance plan record missing.  Please recreate claim.");
             return(queueItem);                   //This will let the office send other claims that passed validation without throwing an exception.
         }
     }
     #endregion Data Sanity Checking (for Replication)
     if (clearinghouseClin.Eformat == ElectronicClaimFormat.x837D_4010)
     {
         X837_4010.Validate(clearinghouseClin, queueItem);               //,out warnings);
         //return;
     }
     else if (clearinghouseClin.Eformat == ElectronicClaimFormat.x837D_5010_dental ||
              clearinghouseClin.Eformat == ElectronicClaimFormat.x837_5010_med_inst)
     {
         X837_5010.Validate(clearinghouseClin, queueItem);               //,out warnings);
         //return;
     }
     else if (clearinghouseClin.Eformat == ElectronicClaimFormat.Renaissance)
     {
         queueItem.MissingData = Renaissance.GetMissingData(queueItem);
         //return;
     }
     else if (clearinghouseClin.Eformat == ElectronicClaimFormat.Canadian)
     {
         queueItem.MissingData = Canadian.GetMissingData(queueItem);
         //return;
     }
     else if (clearinghouseClin.Eformat == ElectronicClaimFormat.Dutch)
     {
         Dutch.GetMissingData(queueItem);                //,out warnings);
         //return;
     }
     else if (clearinghouseClin.Eformat == ElectronicClaimFormat.Ramq)
     {
         Ramq.GetMissingData(queueItem);
     }
     return(queueItem);
 }
        private void butOK_Click(object sender, EventArgs e)
        {
            if (radioVersion4ToCarrier.Checked)
            {
                if (listCarriers.SelectedIndex < 0)
                {
                    MsgBox.Show(this, "You must first select a carrier to use.");
                    return;
                }
            }
            if (listOfficeNumbers.SelectedIndex < 0)
            {
                MsgBox.Show(this, "You must first select an Office Number to use.");
                return;
            }
            Cursor = Cursors.WaitCursor;
            Provider prov = null;

            for (int i = 0; i < _listProviders.Count; i++)
            {
                if (_listProviders[i].CanadianOfficeNum == listOfficeNumbers.Items[listOfficeNumbers.SelectedIndex].ToString() &&
                    _listProviders[i].NationalProvID != "" && _listProviders[i].IsCDAnet)
                {
                    prov = _listProviders[i];
                    break;
                }
            }
            try {
                if (radioVersion2.Checked)
                {
                    Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(null);
                    Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                    CanadianOutput.GetOutstandingTransactions(clearinghouseClin, true, false, null, prov, false, FormClaimPrint.PrintCdaClaimForm,
                                                              FormCCDPrint.PrintCCD);
                }
                else if (radioVersion4Itrans.Checked)
                {
                    Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(null);
                    Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                    CanadianOutput.GetOutstandingTransactions(clearinghouseClin, false, true, null, prov, false, FormClaimPrint.PrintCdaClaimForm,
                                                              FormCCDPrint.PrintCCD);
                }
                else if (radioVersion4ToCarrier.Checked)
                {
                    Carrier       carrier           = carriers[listCarriers.SelectedIndex];
                    Clearinghouse clearinghouseHq   = Canadian.GetCanadianClearinghouseHq(carrier);
                    Clearinghouse clearinghouseClin = Clearinghouses.OverrideFields(clearinghouseHq, Clinics.ClinicNum);
                    CanadianOutput.GetOutstandingTransactions(clearinghouseClin, false, false, carrier, prov, false, FormClaimPrint.PrintCdaClaimForm,
                                                              FormCCDPrint.PrintCCD);
                }
                Cursor = Cursors.Default;
                MsgBox.Show(this, "Done.");
            }
            catch (ApplicationException aex) {
                Cursor = Cursors.Default;
                MessageBox.Show(Lan.g(this, "Request failed: ") + aex.Message);
            }
            catch (Exception ex) {
                Cursor = Cursors.Default;
                MessageBox.Show(Lan.g(this, "Request failed: ") + ex.ToString());
            }
            DialogResult = DialogResult.OK;
        }
示例#13
0
        ///<summary>Supply an arrayList of type ClaimSendQueueItem. Called from FormClaimSend.  Can send to multiple clearinghouses simultaneously.</summary>
        public static void SendBatches(ArrayList queueItems)
        {
            //claimsByCHouse is of type ClaimSendQueueItem
            ArrayList[] claimsByCHouse = new ArrayList[Clearinghouses.List.Length];
            for (int i = 0; i < claimsByCHouse.Length; i++)
            {
                claimsByCHouse[i] = new ArrayList();
            }
            //divide the items by clearinghouse:
            for (int i = 0; i < queueItems.Count; i++)
            {
                claimsByCHouse[Clearinghouses.GetIndex(((ClaimSendQueueItem)queueItems[i]).ClearinghouseNum)]
                .Add(queueItems[i]);
            }
            //for any clearinghouses with claims, send them:
            int  batchNum;
            bool result = true;

            for (int i = 0; i < claimsByCHouse.Length; i++)
            {
                if (claimsByCHouse[i].Count == 0)
                {
                    continue;
                }
                //get next batch number for this clearinghouse
                batchNum = Clearinghouses.GetNextBatchNumber(Clearinghouses.List[i]);
                //---------------------------------------------------------------------------------------
                //Create the claim file(s) for this clearinghouse
                if (Clearinghouses.List[i].Eformat == ElectronicClaimFormat.X12)
                {
                    result = X12.SendBatch(claimsByCHouse[i], batchNum);
                }
                else if (Clearinghouses.List[i].Eformat == ElectronicClaimFormat.Renaissance)
                {
                    result = Renaissance.SendBatch(claimsByCHouse[i], batchNum);
                }
                else if (Clearinghouses.List[i].Eformat == ElectronicClaimFormat.Canadian)
                {
                    //Canadian is a little different because we need the sequence numbers.
                    //So all programs are launched and statuses changed from within Canadian.SendBatch()
                    //We don't care what the result is.
                    Canadian.SendBatch(claimsByCHouse[i], batchNum);
                    continue;
                }
                else
                {
                    result = false;         //(ElectronicClaimFormat.None does not get sent)
                }
                if (!result)                //if failed to create claim file properly,
                {
                    continue;               //don't launch program or change claim status
                }
                //----------------------------------------------------------------------------------------
                //Launch Client Program for this clearinghouse if applicable
                if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.None)
                {
                    AttemptLaunch(Clearinghouses.List[i], batchNum);
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.WebMD)
                {
                    if (!WebMD.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show(Lan.g("Eclaims", "Error sending."));
                        continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.BCBSGA)
                {
                    if (!BCBSGA.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show(Lan.g("Eclaims", "Error sending."));
                        continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.Renaissance)
                {
                    AttemptLaunch(Clearinghouses.List[i], batchNum);
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.ClaimConnect)
                {
                    if (!WebClaim.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show(Lan.g("Eclaims", "Error sending."));
                        continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.RECS)
                {
                    if (!RECS.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show("Claim file created, but could not launch RECS client.");
                        //continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.Inmediata)
                {
                    if (!Inmediata.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show("Claim file created, but could not launch Inmediata client.");
                        //continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.AOS)               // added by SPK 7/13/05
                {
                    if (!AOS.Launch(Clearinghouses.List[i], batchNum))
                    {
                        MessageBox.Show("Claim file created, but could not launch AOS Communicator.");
                        //continue;
                    }
                }
                else if (Clearinghouses.List[i].CommBridge == EclaimsCommBridge.PostnTrack)
                {
                    AttemptLaunch(Clearinghouses.List[i], batchNum);
                    //if(!PostnTrack.Launch(Clearinghouses.List[i],batchNum)){
                    //	MessageBox.Show("Claim file created, but could not launch AOS Communicator.");
                    //continue;
                    //}
                }
                //----------------------------------------------------------------------------------------
                //finally, mark the claims sent. (only if not Canadian)
                EtransType etype = EtransType.ClaimSent;
                if (Clearinghouses.List[i].Eformat == ElectronicClaimFormat.Renaissance)
                {
                    etype = EtransType.Claim_Ren;
                }
                if (Clearinghouses.List[i].Eformat != ElectronicClaimFormat.Canadian)
                {
                    for (int j = 0; j < claimsByCHouse[i].Count; j++)
                    {
                        Etranss.SetClaimSentOrPrinted(((ClaimSendQueueItem)claimsByCHouse[i][j]).ClaimNum,
                                                      ((ClaimSendQueueItem)claimsByCHouse[i][j]).PatNum,
                                                      Clearinghouses.List[i].ClearinghouseNum, etype);
                    }
                }
            }            //for(int i=0;i<claimsByCHouse.Length;i++){
        }
示例#14
0
        ///<summary>The result is a string which can be dropped into the insplan.BenefitNotes.  Or it might throw an exception if invalid data.  This class is also responsible for saving the returned message to the etrans table and printing out the required form.</summary>
        public static string SendElegibility(string electID, int patNum, string groupNumber, string divisionNo,
                                             string subscriberID, string patID, Relat patRelat, int subscNum, string dentaideCardSequence)
        {
            //Note: This might be the only class of this kind that returns a string.  It's a special situation.
            //We are simply not going to bother with language translation here.
            //determine carrier.
            Carrier carrier = Carriers.GetCanadian(electID);          //this also happens to validate missing or short value

            if (carrier == null)
            {
                throw new ApplicationException("Invalid carrier EDI code.");
            }
            Clearinghouse clearhouse = Canadian.GetClearinghouse();

            if (clearhouse == null)
            {
                throw new ApplicationException("Canadian clearinghouse not found.");
            }
            string saveFolder = clearhouse.ExportPath;

            if (!Directory.Exists(saveFolder))
            {
                throw new ApplicationException(saveFolder + " not found.");
            }
            //Initialize objects-----------------------------------------------------------------------------------------------
            Patient  patient    = Patients.GetPat(patNum);
            Patient  subscriber = Patients.GetPat(subscNum);
            Provider treatProv  = Providers.GetProv(Patients.GetProvNum(patient));
            Provider billProv   = Providers.GetProv(Providers.GetBillingProvNum(treatProv.ProvNum));
            //I had to use a dialog box to get the eligibility code.

            //validate any missing info----------------------------------------------------------------------------------
            string error = "";

            if (carrier.CanadianNetworkNum == 0)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Carrier does not have network specified";
            }
            if (!Regex.IsMatch(carrier.ElectID, @"^[0-9]{6}$"))           //not necessary, but nice
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "CarrierId 6 digits";
            }
            if (treatProv.NationalProvID.Length != 9)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "TreatingProv CDA num 9 digits";
            }
            if (treatProv.CanadianOfficeNum.Length != 4)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "TreatingProv office num 4 char";
            }
            if (billProv.NationalProvID.Length != 9)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "BillingProv CDA num 9 digits";
            }
            if (groupNumber.Length == 0 || groupNumber.Length > 12 || groupNumber.Contains(" "))
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Plan Number";
            }
            if (subscriberID == "")
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "SubscriberID";
            }
            if (patNum != subscNum && patRelat == Relat.Self)           //if patient is not subscriber, and relat is self
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Relationship cannot be self";
            }
            if (patient.Gender == PatientGender.Unknown)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Patient gender";
            }
            if (patient.Birthdate.Year < 1880 || patient.Birthdate > DateTime.Today)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Patient birthdate";
            }
            if (patient.LName == "")
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Patient lastname";
            }
            if (patient.FName == "")
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Patient firstname";
            }
            if (subscriber.Birthdate.Year < 1880 || subscriber.Birthdate > DateTime.Today)
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Subscriber birthdate";
            }
            if (subscriber.LName == "")
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Subscriber lastname";
            }
            if (subscriber.FName == "")
            {
                if (error != "")
                {
                    error += ", ";
                }
                error += "Subscriber firstname";
            }
            if (error != "")
            {
                throw new ApplicationException(error);
            }
            FormCanadianEligibility FormElig = new FormCanadianEligibility();

            FormElig.ShowDialog();
            if (FormElig.DialogResult != DialogResult.OK)
            {
                throw new ApplicationException("Eligibility Code or Date missing.");
            }
            //eligiblity code guaranteed to not be 0 at this point.  Also date will be between 1980 and 10 years from now.
            Etrans etrans = Etranss.CreateCanadianOutput(patNum, carrier.CarrierNum, carrier.CanadianNetworkNum,
                                                         clearhouse.ClearinghouseNum, EtransType.Eligibility_CA);
            string txt = "";

            //create message----------------------------------------------------------------------------------------------
            //A01 transaction prefix 12 AN
//todo
            txt += "123456789012";          //To be later provided by the individual network.
            //A02 office sequence number 6 N
            txt += Canadian.TidyN(etrans.OfficeSequenceNumber, 6);
            //A03 format version number 2 N
            txt += "04";
            //A04 transaction code 2 N
            txt += "08";            //eligibility
            //A05 carrier id number 6 N
            txt += carrier.ElectID; //already validated as 6 digit number.
            //A06 software system id 3 AN  The third character is for version of OD.
//todo
            txt += "OD1";          //To be later supplied by CDAnet staff to uniquely identify OD.
            //A10 encryption method 1 N
//todo
            txt += "1";
            //A07 message length 5 N
            int len = 214;

//todo does not account for C19. Possibly 30 more.
            //if(C19 is used, Plan Record){
            //len+=30;
            //}
            txt += Canadian.TidyN(len, 5);
            //A09 carrier transaction counter 5 N
            txt += Canadian.TidyN(etrans.CarrierTransCounter, 5);
            //B01 CDA provider number 9 AN
            txt += Canadian.TidyAN(treatProv.NationalProvID, 9);         //already validated
            //B02 (treating) provider office number 4 AN
            txt += Canadian.TidyAN(treatProv.CanadianOfficeNum, 4);      //already validated
            //B03 billing provider number 9 AN
//todo, need to account for possible 5 digit prov id assigned by carrier
            txt += Canadian.TidyAN(billProv.NationalProvID, 9);         //already validated
            //C01 primary policy/plan number 12 AN (group number)
            //only validated to ensure that it's not blank and is less than 12. Also that no spaces.
            txt += Canadian.TidyAN(groupNumber, 12);
            //C11 primary division/section number 10 AN
            txt += Canadian.TidyAN(divisionNo, 10);
            //C02 subscriber id number 12 AN
            txt += Canadian.TidyAN(subscriberID.Replace("-", ""), 12);        //validated
            //C17 primary dependant code 2 N. Optional
            txt += Canadian.TidyN(patID, 2);
            //C03 relationship code 1 N
            //User interface does not only show Canadian options, but all options are handled.
            txt += Canadian.GetRelationshipCode(patRelat);
            //C04 patient's sex 1 A
            //validated to not include "unknown"
            if (patient.Gender == PatientGender.Male)
            {
                txt += "M";
            }
            else
            {
                txt += "F";
            }
            //C05 patient birthday 8 N
            txt += patient.Birthdate.ToString("yyyyMMdd");          //validated
            //C06 patient last name 25 AE
            txt += Canadian.TidyAE(patient.LName, 25, true);        //validated
            //C07 patient first name 15 AE
            txt += Canadian.TidyAE(patient.FName, 15, true);        //validated
            //C08 patient middle initial 1 AE
            txt += Canadian.TidyAE(patient.MiddleI, 1);
            //C09 eligibility exception code 1 N
            txt += Canadian.TidyN(FormElig.EligibilityCode, 1);         //validated
            //C12 plan flag 1 A
//todo
            //might not be carrier.IsPMP.  Might have to do with plan, not carrier. See F17.
            txt += " ";
            //C18 plan record count 1 N
//todo
            txt += "0";
            //C16 Eligibility date. 8 N.
            txt += FormElig.AsOfDate.ToString("yyyyMMdd");          //validated
            //D01 subscriber birthday 8 N
            txt += subscriber.Birthdate.ToString("yyyyMMdd");       //validated
            //D02 subscriber last name 25 AE
            txt += Canadian.TidyAE(subscriber.LName, 25, true);     //validated
            //D03 subscriber first name 15 AE
            txt += Canadian.TidyAE(subscriber.FName, 15, true);     //validated
            //D04 subscriber middle initial 1 AE
            txt += Canadian.TidyAE(subscriber.MiddleI, 1);
            //D10 language of insured 1 A
            if (subscriber.Language == "fr")
            {
                txt += "F";
            }
            else
            {
                txt += "E";
            }
            //D11 card sequence/version number 2 N
//todo: Not validated against type of carrier yet.  Need to check if Dentaide.
            txt += Canadian.TidyN(dentaideCardSequence, 2);
//todo If C18=1, then the following field would appear
            //C19 plan record 30 AN
            string result = "";

            try {
                result = Canadian.PassToCCD(txt, carrier.CanadianNetworkNum, clearhouse);
            }
            catch (ApplicationException ex) {
                Etranss.Delete(etrans.EtransNum);
                throw new ApplicationException(ex.Message);
            }
            Etranss.SetMessage(etrans.EtransNum, txt);
            etrans.MessageText = txt;
            FormCCDPrint FormP = new FormCCDPrint(etrans);          //Print the form.

            FormP.ShowDialog();
            //Now we will process the 'result' here to extract the important data.  Basically Yes or No on the eligibility.
            //We might not do this for any other trans type besides eligibility.
            string           retVal        = "Eligibility check on " + DateTime.Today.ToShortDateString() + "\r\n";
            CCDFieldInputter fieldInputter = new CCDFieldInputter(result);
            CCDField         field         = fieldInputter.GetFieldById("G05");//response status

            //CCDFieldInputter could really use a GetValue(string fieldId) method so I don't have to use a field object.
            switch (field.valuestr)
            {
            case "E":
                retVal += "Patient is eligible.";
                break;

            case "R":
                retVal += "Patient not eligible, or error in data.";
                break;

            case "M":
                retVal += "Manual claimform should be submitted for employer certified plan.";
                break;
            }
            CCDField[] fields = fieldInputter.GetFieldsById("G08");          //Error Codes
            for (int i = 0; i < fields.Length; i++)
            {
                retVal += "\r\n";
                retVal += fields[i].valuestr;              //todo: need to turn this into a readable string.
            }
            fields = fieldInputter.GetFieldsById("G32");   //Display messages
            for (int i = 0; i < fields.Length; i++)
            {
                retVal += "\r\n";
                retVal += fields[i].valuestr;
            }
            return(retVal);
        }