private object SaveHierarchicalLoop(
            HierarchicalLoop loop,
            object interchangeId,
            object transactionSetId,
            string transactionSetCode,
            object parentLoopId)
        {
            var hlId        = _idProvider.NextId(_schema, "Loop");
            var containerId = _idProvider.NextId(_commonDb.Schema, "Container");

            var cmd = new SqlCommand(GetContainerIdSql("HL") + string.Format(@"
INSERT INTO [{0}].[Loop] (Id, ParentLoopId, InterchangeId, TransactionSetId, TransactionSetCode, SpecLoopId, LevelId, LevelCode, StartingSegmentId)
VALUES (@id, @parentLoopId, @interchangeId, @transactionSetId, @transactionSetCode, @specLoopId, @levelId, @levelCode, 'HL')
", _schema, _commonDb.Schema));

            cmd.Parameters.AddWithValue("@id", hlId);
            cmd.Parameters.AddWithValue("@containerId", containerId);
            cmd.Parameters.AddWithValue("@parentLoopId", parentLoopId != null && parentLoopId != _defaultIdentityTypeValue ? parentLoopId : DBNull.Value);
            cmd.Parameters.AddWithValue("@interchangeId", interchangeId);
            cmd.Parameters.AddWithValue("@transactionSetId", transactionSetId);
            cmd.Parameters.AddWithValue("@transactionSetCode", transactionSetCode);
            cmd.Parameters.AddWithValue("@specLoopId", loop.Specification.LoopId);
            cmd.Parameters.AddWithValue("@levelId", loop.Id);
            cmd.Parameters.AddWithValue("@levelCode", loop.LevelCode);

            ExecuteCmd(cmd);

            return(hlId);
        }
        public void ClaimCreationTest()
        {
            Interchange interchange = CreateSample1WithFunctionGroup();
            Transaction transaction = interchange.FunctionGroups.First().AddTransaction("837", "0034");
            Segment     bhtSegment  = transaction.AddSegment("BHT*0019*00*3920394930203*20070816*1615*CH");
            Segment     refSegment  = transaction.AddSegment("REF*87*004010X096A1");
            Loop        senderLoop  = transaction.AddLoop("NM1*41*2*HOWDEE HOSPITAL*****XX*0123456789");

            senderLoop.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111");
            Loop             receiverLoop = transaction.AddLoop("NM1*40*2*BLUE CROSS BLUE SHIELD OF NC*****46*987654321");
            HierarchicalLoop providerLoop = transaction.AddHLoop("1", "20", true);

            providerLoop.AddSegment("PRV*BI*ZZ*203BA0200N");
            var billingProvider = providerLoop.AddLoop("NM1*85*2*HOWDEE HOSPITAL*****XX*0123456789");

            billingProvider.AddSegment("N3*123 HOWDEE BOULEVARD");
            billingProvider.AddSegment("N4*DURHAM*NC*27701");
            billingProvider.AddSegment("REF*1J*654");
            billingProvider.AddSegment("PER*IC*BETTY RUBBLE*TE*9195551111*FX*6145551212");
            HierarchicalLoop subscriberLoop = providerLoop.AddHLoop("2", "22", false);

            subscriberLoop.AddSegment("SBR*P*18*XYZ1234567******BL");
            subscriberLoop.AddSegment("PAT*********Y");
            var subscriberNameLoop = subscriberLoop.AddLoop("NM1*IL*1*DOUGH*MARY****MI*12312312312");

            subscriberNameLoop.AddSegment("N3*BOX 12312");
            subscriberNameLoop.AddSegment("N4*DURHAM*NC*27715");
            subscriberNameLoop.AddSegment("DMG*D8*19670807*F");
            subscriberLoop.AddLoop("NM1*PR*2*BLUE CROSS BLUE SHIELD OF NC*****PI*987654321");
            var claimLoop = subscriberLoop.AddLoop("CLM*2235057*200***13:A:1*Y**Y*A*********N");

            claimLoop.AddSegment("DTP*434*RD8*20070730-20070730");
            claimLoop.AddSegment("CL1*1*9*01");
            claimLoop.AddSegment("AMT*C5*160");
            claimLoop.AddSegment("REF*F8*ASD0000123");
            claimLoop.AddSegment("HI*BK:25000");
            claimLoop.AddSegment("HI*BF:78901");
            claimLoop.AddSegment("HI*BR:4491:D8:20070730");
            claimLoop.AddSegment("HI*BH:41:D8:20070501*BH:27:D8:20070715*BH:33:D8:20070415*BH:C2:D8:20070410");
            claimLoop.AddSegment("HI*BE:30:::20");
            claimLoop.AddSegment("HI*BG:01");
            var physicianLoop = claimLoop.AddLoop("NM1*71*1*SMITH*ELIZABETH*AL***34*243898989");

            physicianLoop.AddSegment("REF*1G*P97777");
            var claimLineLoop = claimLoop.AddLoop("LX*1");

            claimLineLoop.AddSegment("SV2*0300*HC:81000*120*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");
            claimLineLoop = claimLoop.AddLoop("LX*2");
            claimLineLoop.AddSegment("SV2*0320*HC:76092*50*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");
            claimLineLoop = claimLoop.AddLoop("LX*3");
            claimLineLoop.AddSegment("SV2*0270*HC:J1120*30*UN*1");
            claimLineLoop.AddSegment("DTP*472*D8*20070730");

            Assert.AreEqual(new StreamReader(Extensions.GetEdi("INS._837I._4010.Example1.txt")).ReadToEnd(), interchange.SerializeToX12(true));
        }
        public void Read270Test()
        {
            var         parser      = new X12Parser();
            Interchange interchange = parser.ParseMultiple(new MemoryStream(Encoding.ASCII.GetBytes(this.inquiry))).First();

            Assert.AreEqual("9088877320000  ", interchange.InterchangeReceiverId);

            Transaction transaction = interchange.FunctionGroups.First().Transactions.First();
            Segment     bht         = transaction.Segments.First();

            Assert.AreEqual("10001234", bht.GetElement(3));

            HierarchicalLoop subscriberLoop     = transaction.FindHLoop("3");
            Loop             subscriberNameLoop = subscriberLoop.Loops.First();

            Assert.AreEqual("SMITH", subscriberNameLoop.GetElement(3), "Subscriber last name not expected.");
            Assert.AreEqual("11122333301", subscriberNameLoop.GetElement(9), "Subscriber member id not expected.");
        }
        private T SaveHierarchicalLoop(HierarchicalLoop loop, T interchangeId, T transactionSetId, string transactionSetCode, T?parentLoopId)
        {
            SqlCommand cmd = new SqlCommand(GetContainerIdSql("HL") + string.Format(@"
INSERT INTO [{0}].[Loop] (Id, ParentLoopId, InterchangeId, TransactionSetId, TransactionSetCode, SpecLoopId, LevelId, LevelCode, StartingSegmentId)
VALUES (@id, @parentLoopId, @interchangeId, @transactionSetId, @transactionSetCode, @specLoopId, @levelId, @levelCode, 'HL')

SELECT @id", _schema, _commonDb.Schema));

            cmd.Parameters.AddWithValue("@parentLoopId", (object)parentLoopId ?? DBNull.Value);
            cmd.Parameters.AddWithValue("@interchangeId", interchangeId);
            cmd.Parameters.AddWithValue("@transactionSetId", transactionSetId);
            cmd.Parameters.AddWithValue("@transactionSetCode", transactionSetCode);
            cmd.Parameters.AddWithValue("@specLoopId", loop.Specification.LoopId);
            cmd.Parameters.AddWithValue("@levelId", loop.Id);
            cmd.Parameters.AddWithValue("@levelCode", loop.LevelCode);

            return(ConvertT(ExecuteScalar(cmd)));
        }
Exemple #5
0
        private List <AsnHlOneShipment> ExtractHlOne(HierarchicalLoop hlOne)
        {
            ///////////////////////////////////////////////////////////////
            // Root of Hierarchical Loop
            ///////////////////////////////////////////////////////////////
            var hl = new AsnHlOneShipment()
            {
                HL01_IdNumber  = hlOne.Id,
                HL02_ParentId  = hlOne.ParentId,
                HL03_LevelCode = hlOne.LevelCode,
                HL04_ChildCode = hlOne.HierarchicalChildCode,
            };

            // TD1 segment
            if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD1") != null)
            {
                var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD1");
                hl.TD101_PackagingCode  = td.GetElement(1);
                hl.TD102_LadingQuantity = td.GetElement(2);
            }

            // TD5 segment
            if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD5") != null)
            {
                var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD5");
                hl.TD501_RoutingSequenceCode = td.GetElement(1);
                hl.TD502_IdCodeQualifier     = td.GetElement(2);
                hl.TD503_IdCode = td.GetElement(3);
                hl.TD504_TransportationMethodMode = td.GetElement(4);
            }

            // TD3 segment
            if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD3") != null)
            {
                var td = hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "TD3");
                hl.TD301_EquipmentDescriptionCode = td.GetElement(1);
                hl.TD302_EquipmentInitial         = td.GetElement(2);
                hl.TD303_EquipmentNumber          = td.GetElement(3);
            }

            // Possible multiple REF segments
            if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "REF") != null)
            {
                var asnref = hlOne.Segments.Where(x => x.SegmentId == "REF").ToList();

                var asnrefs = new List <AsnHlOneShipmentRef>();

                foreach (var seg in asnref)
                {
                    var r = new AsnHlOneShipmentRef()
                    {
                        REF01_ReferenceIdentificationQualifier = seg.GetElement(1),
                        REF02_ReferenceIdentification          = seg.GetElement(2),
                        REF03_Description = seg.GetElement(3)
                    };

                    asnrefs.Add(r);
                }

                hl.Refs = asnrefs;
            }

            // Possible multiple N1 loops
            if (hlOne.Segments.ToList().FirstOrDefault(x => x.SegmentId == "N1") != null)
            {
                var n1 = hlOne.Loops.Where(x => x.SegmentId == "N1").ToList();
                hl.Names = ExtractNames(n1);
            }

            // Start of chaining to fill out the guts of the hierarchy
            var hlTwos = ExtractHlTwo(hlOne.HLoops.ToList());

            hl.Orders = hlTwos;

            var hLoop = new List <AsnHlOneShipment>();

            hLoop.Add(hl);

            return(hLoop);
        }
Exemple #6
0
        /// <summary>
        /// Generates the health care claim837 professional.
        /// </summary>
        /// <returns>A _healthCareClaim837Professional message.</returns>
        public virtual HealthCareClaim837Professional GenerateHealthCareClaim837Professional( )
        {
            var healthCareClaim837ProfessionalFactory = IoC.CurrentContainer.Resolve <IHealthCareClaim837ProfessionalFactory> ();

            var currenDateTime = DateTime.Now;
            var autoIncrementedHierarchicalIDNumber = 1; // NOTE: The first HL01 within each ST-SE envelope must begin with "1".

            var interchangeCopntrolNumber = GetInterchangeControlNumber(Key);

            // Interchange.
            var message = new Interchange(
                currenDateTime,
                interchangeCopntrolNumber,
                false, // TODO: Use web.config to set InterchangeUsageIndicator.
                PayorType.HealthCareClaim837Setup.X12Delimiters.SegmentDelimiter,
                PayorType.HealthCareClaim837Setup.X12Delimiters.ElementDelimiter,
                PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter)
            {
                InterchangeSenderIdQualifier   = InterchangeIDQualifier.MutuallyDefined,
                InterchangeSenderId            = PayorType.HealthCareClaim837Setup.InterchangeSenderNumber,
                InterchangeReceiverIdQualifier = InterchangeIDQualifier.MutuallyDefined,
                InterchangeReceiverId          = PayorType.HealthCareClaim837Setup.InterchangeReceiverNumber,
            };

            message.SetElement(11, PayorType.HealthCareClaim837Setup.X12Delimiters.RepetitionDelimiter.ToString(CultureInfo.InvariantCulture));
            message.SetElement(12, InterchangeVersionControlNumber.ApprovedForPublicationByASCX12ProceduresReviewBoardThroughOctober2003);
            message.SetElement(14, AcknowledgmentRequested.InterchangeAcknowledgmentRequested);

            // Functional group.
            var group = message.AddFunctionGroup(FunctionalIdentifierCode.HealthCareClaim, currenDateTime, interchangeCopntrolNumber, ImplementationConventionReference.Version5010);

            group.ApplicationSendersCode   = PayorType.HealthCareClaim837Setup.InterchangeSenderNumber;
            group.ApplicationReceiversCode = PayorType.HealthCareClaim837Setup.InterchangeReceiverNumber;
            group.ResponsibleAgencyCode    = ResponsibleAgencyCode.AccreditedStandardsCommitteeX12;

            var interchangeControlNumberString = interchangeCopntrolNumber.ToString(CultureInfo.InvariantCulture);
            var transactionControlIdentifier   = interchangeControlNumberString.Length < 4
                                                   ? interchangeControlNumberString.PadLeft(4, '0')
                                                   : interchangeControlNumberString;

            // Transaction set.
            var transaction = group.AddTransaction(TransactionSetIdentifierCode.HealthCareClaim, transactionControlIdentifier);

            transaction.SetElement(3, ImplementationConventionReference.Version5010);

            // Beginning of hierarchical transaction.
            var bhtSegment = transaction.AddSegment(BeginningOfHierarchicalTransaction);

            bhtSegment.SetElement(1, HierarchicalStructureCode.InformationSourceOrSubscriberOrDependent);
            bhtSegment.SetElement(2, TransactionSetPurposeCode.Original);
            bhtSegment.SetElement(3, BatchControlNumber.ToString(CultureInfo.InvariantCulture));
            bhtSegment.SetElement(4, currenDateTime.Date.ToString("yyyyMMdd"));
            bhtSegment.SetElement(5, currenDateTime.ToString("HHmm"));
            bhtSegment.SetElement(6, TransactionTypeCode.Chargeable);

            // Submitter name.
            var submitterLoop = transaction.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Submitter));

            submitterLoop.NM102_EntityTypeQualifier        = EntityTypeQualifier.NonPersonEntity;
            submitterLoop.NM103_NameLastOrOrganizationName = PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName;
            submitterLoop.NM108_IdCodeQualifier            = IdentificationCodeQualifier.ElectronicTransmitterIdentificationNumber;
            submitterLoop.NM109_IdCode = PayorType.BillingOffice.ElectronicTransmitterIdentificationNumber;

            // Submitter EDI contact information.
            var perSegment = submitterLoop.AddSegment(new TypedSegmentPER());

            perSegment.PER01_ContactFunctionCode = ContactFunctionCode.InfromationContact;

            // NOTE: PER02_Name is situational. But, as we have provided a nonperson entity for submitter, this field is required.
            perSegment.PER02_Name = PayorType.BillingOffice.AdministratorStaff.StaffProfile.StaffName.Complete;

            perSegment.PER03_CommunicationNumberQualifier = CommunicationNumberQualifer.Telephone;

            var staffPhone =
                PayorType.BillingOffice.AdministratorStaff.PhoneNumbers.FirstOrDefault(
                    phoneNumber => phoneNumber.StaffPhoneType.WellKnownName == StaffPhoneType.Work);

            if (staffPhone == null || staffPhone.Phone == null)
            {
                throw new ArgumentException(
                          string.Format(
                              "Unable to find '{0}' staff work phone number",
                              PayorType.BillingOffice.AdministratorStaff.StaffProfile.StaffName.Complete));
            }

            perSegment.PER04_CommunicationNumber = staffPhone.Phone.PhoneNumber.RemoveNonAlphanumericChar();
            if (!string.IsNullOrEmpty(staffPhone.Phone.PhoneExtensionNumber))
            {
                perSegment.PER05_CommunicationNumberQualifier = CommunicationNumberQualifer.TelephoneExtension;
                perSegment.PER06_CommunicationNumber          = staffPhone.Phone.PhoneExtensionNumber;
            }

            // Receiver name.
            var receiverLoop = transaction.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Receiver));

            receiverLoop.NM102_EntityTypeQualifier        = EntityTypeQualifier.NonPersonEntity;
            receiverLoop.NM103_NameLastOrOrganizationName = PayorType.Name;
            receiverLoop.NM108_IdCodeQualifier            = IdentificationCodeQualifier.ElectronicTransmitterIdentificationNumber;
            receiverLoop.NM109_IdCode = PayorType.SubmitterIdentifier;

            // Billing provider hierarchical level. ***** HL1 *****
            var provider2000AHierachicalLoop = transaction.AddHLoop(
                autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture),
                HierarchicalLevelCode.InformationSource,
                HierarchicalChildCode.AdditionalSubordinateHLDataSegmentInThisHierarchicalStructure);

            // Billing provide specialty information.
            var prvSegment = provider2000AHierachicalLoop.AddSegment(new TypedSegmentPRV());

            prvSegment.PRV01_ProviderCode         = ProviderCode.Billing;
            prvSegment.PRV02_ReferenceIdQualifier = ReferenceIdentificationQualifier.HealthCareProviderTaxonomyCode;
            prvSegment.PRV03_ProviderTaxonomyCode = ProviderTaxonomyCode;

            // Billing provider Name
            var provider2010AaLoop = provider2000AHierachicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.BillingProvider));

            provider2010AaLoop.NM102_EntityTypeQualifier        = EntityTypeQualifier.NonPersonEntity;
            provider2010AaLoop.NM103_NameLastOrOrganizationName = PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName;
            provider2010AaLoop.NM108_IdCodeQualifier            = IdentificationCodeQualifier.CentersForMedicareAndMedicaidServicesNationalProviderIdentifier;

            var agencyNpi =
                PayorType.BillingOffice.Agency.AgencyIdentifiers.FirstOrDefault(
                    identifier => identifier.AgencyIdentifierType.WellKnownName == AgencyIdentifierType.Npi);

            if (agencyNpi == null || agencyNpi.IdentifierNumber == null)
            {
                throw new ArgumentException(
                          string.Format(
                              "Unable to find '{0}' agency NPI identifier number", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName));
            }

            provider2010AaLoop.NM109_IdCode = agencyNpi.IdentifierNumber;

            var agencyBillingAddressAndPhone =
                PayorType.BillingOffice.Agency.AddressesAndPhones.FirstOrDefault(
                    address => address.AgencyAddress.AgencyAddressType.WellKnownName == AgencyAddressType.Billing);

            if (agencyBillingAddressAndPhone == null || agencyBillingAddressAndPhone.AgencyAddress == null)
            {
                throw new ArgumentException(
                          string.Format(
                              "Unable to find '{0}' agency Billing address", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName));
            }

            // Billing provider address.
            var provider2010AaN3Segment = provider2010AaLoop.AddSegment(new TypedSegmentN3());

            provider2010AaN3Segment.N301_AddressInformation = agencyBillingAddressAndPhone.AgencyAddress.Address.FirstStreetAddress
                                                              +
                                                              (string.IsNullOrWhiteSpace(
                                                                   agencyBillingAddressAndPhone.AgencyAddress.Address.SecondStreetAddress)
                                                                    ? string.Empty
                                                                    : " "
                                                               + agencyBillingAddressAndPhone.AgencyAddress.Address.SecondStreetAddress);

            // Billing provider City,State,Zip code
            var provider2010AaN4Segment = provider2010AaLoop.AddSegment(new TypedSegmentN4());

            provider2010AaN4Segment.N401_CityName            = agencyBillingAddressAndPhone.AgencyAddress.Address.CityName;
            provider2010AaN4Segment.N402_StateOrProvinceCode = agencyBillingAddressAndPhone.AgencyAddress.Address.StateProvince.ShortName;
            provider2010AaN4Segment.N403_PostalCode          = agencyBillingAddressAndPhone.AgencyAddress.Address.PostalCode.Code;

            var agencyFederalTaxID =
                PayorType.BillingOffice.Agency.AgencyIdentifiers.FirstOrDefault(
                    identifier => identifier.AgencyIdentifierType.WellKnownName == AgencyIdentifierType.FederalTaxId);

            if (agencyFederalTaxID == null || agencyFederalTaxID.IdentifierNumber == null)
            {
                throw new ArgumentException(
                          string.Format(
                              "Unable to find '{0}' agency Federal Tax ID", PayorType.BillingOffice.Agency.AgencyProfile.AgencyName.LegalName));
            }

            // Billing provider - tax identification
            var provider2010AaRefSegment = provider2010AaLoop.AddSegment(new TypedSegmentREF());

            provider2010AaRefSegment.REF01_ReferenceIdQualifier = ReferenceIdentificationQualifier.EmployersIdentificationNumber;
            provider2010AaRefSegment.REF02_ReferenceId          = agencyFederalTaxID.IdentifierNumber;

            //If it is the same as Billing provider, no need.

            /*
             * var provider2010ABLoop = provider2000AHierachicalLoop.AddLoop ( new TypedLoopNM1 ( EntityIdentifierCode.PayToProvider ) );
             * provider2010ABLoop.NM102_EntityTypeQualifier = EntityTypeQualifier.NonPersonEntity;
             *
             * // NOTE: Pay-To address is same as Billing provider address ie., same N3 and N4 segments.
             * provider2010ABLoop.AddSegment ( provider2010AAN3Segment );
             * provider2010ABLoop.AddSegment ( provider2010AAN4Segment );
             */

            var claimDictionary = GroupClaimsByPrimaryPayorCoverage(Claims);

            //TODO: needs confirm if this loop pulling the correct data *** need bill every insurance or just the primary???
            foreach (var keyValuePair in claimDictionary)
            {
                var payorCoverage = keyValuePair.Key;
                var claimList     = keyValuePair.Value;

                var isPatientTheSubscriber =
                    payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.WellKnownName.Equals(PayorSubscriberRelationshipType.Self);

                autoIncrementedHierarchicalIDNumber++;

                // Subscriber hierarchical level. **** HL 2  ******
                var subscriber2000BHierarchicalLoop =
                    provider2000AHierachicalLoop.AddHLoop(
                        autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture),
                        HierarchicalLevelCode.Subscriber,
                        isPatientTheSubscriber
                            ? HierarchicalChildCode.NoSubordinateHLSegmentInThisHierarchicalStructure
                            : HierarchicalChildCode.AdditionalSubordinateHLDataSegmentInThisHierarchicalStructure);

                // Subscriber information.
                var sbrSegment = subscriber2000BHierarchicalLoop.AddSegment(new TypedSegmentSBR());

                sbrSegment.SBR01_PayerResponsibilitySequenceNumberCode = payorCoverage.PayorCoverageType.ShortName;

                if (isPatientTheSubscriber)
                {
                    sbrSegment.SBR02_IndividualRelationshipCode = payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.ShortName;
                }

                // Subscriber Name
                var subscriberName2010BaLoop =
                    subscriber2000BHierarchicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.InsuredOrSubscriber));
                subscriberName2010BaLoop.NM102_EntityTypeQualifier        = EntityTypeQualifier.Person;
                subscriberName2010BaLoop.NM104_NameFirst                  = payorCoverage.PayorSubscriber.Name.First;
                subscriberName2010BaLoop.NM103_NameLastOrOrganizationName = payorCoverage.PayorSubscriber.Name.Last;
                subscriberName2010BaLoop.NM108_IdCodeQualifier            = IdentificationCodeQualifier.MemberIdentificationNumber;
                subscriberName2010BaLoop.NM109_IdCode = payorCoverage.MemberNumber;

                if (isPatientTheSubscriber)
                {
                    // Subscriber address
                    var provider2010BaN3Segment = subscriberName2010BaLoop.AddSegment(new TypedSegmentN3());
                    provider2010BaN3Segment.N301_AddressInformation = payorCoverage.PayorSubscriber.Address.FirstStreetAddress +
                                                                      (string.IsNullOrWhiteSpace(
                                                                           payorCoverage.PayorSubscriber.Address.SecondStreetAddress)
                                                                            ? string.Empty
                                                                            : " "
                                                                       + payorCoverage.PayorSubscriber.Address.SecondStreetAddress);

                    // Subscriber city,state,postal code.
                    var provider2010BaN4Segment = subscriberName2010BaLoop.AddSegment(new TypedSegmentN4());
                    provider2010BaN4Segment.N401_CityName            = payorCoverage.PayorSubscriber.Address.CityName;
                    provider2010BaN4Segment.N402_StateOrProvinceCode = payorCoverage.PayorSubscriber.Address.StateProvince.ShortName;
                    provider2010BaN4Segment.N403_PostalCode          = payorCoverage.PayorSubscriber.Address.PostalCode.Code;

                    // Demographic information
                    var subscriberDmgSegment = subscriberName2010BaLoop.AddSegment(new TypedSegmentDMG());
                    subscriberDmgSegment.DMG01_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD;
                    subscriberDmgSegment.DMG02_DateOfBirth = payorCoverage.PayorSubscriber.BirthDate;
                    subscriberDmgSegment.DMG03_Gender      =
                        ConvertToGenderCodeFromAdministrativeGender(payorCoverage.PayorSubscriber.AdministrativeGender);
                }

                // Loop 2010BB - Payer Name.
                var subscriberName2010BbLoop = subscriber2000BHierarchicalLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Payer));
                subscriberName2010BbLoop.NM102_EntityTypeQualifier        = EntityTypeQualifier.NonPersonEntity;
                subscriberName2010BbLoop.NM103_NameLastOrOrganizationName = payorCoverage.Payor.Name;
                subscriberName2010BbLoop.NM108_IdCodeQualifier            = IdentificationCodeQualifier.PayorIdentification;
                subscriberName2010BbLoop.NM109_IdCode = payorCoverage.Payor.ElectronicTransmitterIdentificationNumber;

                // TODO: Kate needs to get back on this.
                HierarchicalLoop parentHierarchicalLoop = subscriber2000BHierarchicalLoop;
                if (!isPatientTheSubscriber)
                {
                    autoIncrementedHierarchicalIDNumber++;

                    // PATIENT HIERARCHICAL LEVEL Loop Repeat: >1  **** HL 3  ******
                    var patientDetailLoop2000CLoop =
                        subscriber2000BHierarchicalLoop.AddHLoop(
                            autoIncrementedHierarchicalIDNumber.ToString(CultureInfo.InvariantCulture),
                            HierarchicalLevelCode.Dependent,
                            HierarchicalChildCode.NoSubordinateHLSegmentInThisHierarchicalStructure);

                    parentHierarchicalLoop = patientDetailLoop2000CLoop;

                    var hl3PatSegment = patientDetailLoop2000CLoop.AddSegment(new TypedSegmentPAT());
                    hl3PatSegment.PAT01_IndividualRelationshipCode =
                        payorCoverage.PayorSubscriber.PayorSubscriberRelationshipType.ShortName;

                    var hl3Nm1Segment = patientDetailLoop2000CLoop.AddLoop(new TypedLoopNM1(EntityIdentifierCode.Patient));
                    hl3Nm1Segment.NM102_EntityTypeQualifier        = EntityTypeQualifier.Person;
                    hl3Nm1Segment.NM104_NameFirst                  = payorCoverage.PatientAccount.Name.First; //TODO: confirm it comes from primaryPayorCoverage.PatientAccount, not from Claim.PatientAccount, the later make more sense
                    hl3Nm1Segment.NM103_NameLastOrOrganizationName = payorCoverage.PatientAccount.Name.Last;

                    var hl3Nm1N3Segment = hl3Nm1Segment.AddSegment(new TypedSegmentN3());
                    hl3Nm1N3Segment.N301_AddressInformation = payorCoverage.PatientAccount.HomeAddress.FirstStreetAddress
                                                              +
                                                              (string.IsNullOrWhiteSpace(
                                                                   payorCoverage.PatientAccount.HomeAddress.SecondStreetAddress)
                                                                      ? string.Empty
                                                                      : " " + payorCoverage.PatientAccount.HomeAddress.SecondStreetAddress);

                    var hl3Nm1N4Segment = hl3Nm1Segment.AddSegment(new TypedSegmentN4());
                    hl3Nm1N4Segment.N401_CityName            = payorCoverage.PatientAccount.HomeAddress.CityName;
                    hl3Nm1N4Segment.N402_StateOrProvinceCode = payorCoverage.PatientAccount.HomeAddress.StateProvince.ShortName;
                    hl3Nm1N4Segment.N403_PostalCode          = payorCoverage.PatientAccount.HomeAddress.PostalCode.Code;

                    var hl3Nm1DmgSegment = hl3Nm1Segment.AddSegment(new TypedSegmentDMG());
                    hl3Nm1DmgSegment.DMG01_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD;
                    hl3Nm1DmgSegment.DMG02_DateOfBirth = payorCoverage.PatientAccount.BirthDate;
                    hl3Nm1DmgSegment.DMG03_Gender      =
                        ConvertToGenderCodeFromAdministrativeGender(payorCoverage.PatientAccount.AdministrativeGender);
                }

                // 2300 Claim Information loop repeat 100
                // LX loop repeat 50 => total 5000 claims in a HCC837 message or a Subscriber HL? ( seems the later  make more sense)
                // TODO: confirm it with Kate and how to handle it if exceed the max loop repeat
                foreach (var claim in claimList)
                {
                    var claim2300Loop = parentHierarchicalLoop.AddLoop(new TypedLoopCLM());     // Claim 2300 loop: repeat 100
                    claim2300Loop.CLM01_PatientControlNumber                   = claim.Key.ToString(CultureInfo.InvariantCulture);
                    claim2300Loop.CLM02_TotalClaimChargeAmount                 = decimal.Parse(X12Utility.ConvertToDecimalString(claim.ChargeAmount.Amount));
                    claim2300Loop.CLM05._1_FacilityCodeValue                   = PlaceOfServiceCode.Office;
                    claim2300Loop.CLM05._2_FacilityCodeQualifier               = FacilityCodeQualifier.PlaceOfServiceCodesForProfessionalOrDentalService;
                    claim2300Loop.CLM05._3_ClaimFrequencyTypeCode              = ClaimFrequencyTypeCode.Original;
                    claim2300Loop.CLM06_ProviderOrSupplierSignatureIndicator   = YesOrNoConditionResponseCode.YesIndicator;
                    claim2300Loop.CLM07_ProviderAcceptAssignmentCode           = ProviderAcceptAssignementCode.Assigned;
                    claim2300Loop.CLM08_BenefitsAssignmentCerficationIndicator = YesOrNoConditionResponseCode.Yes;
                    claim2300Loop.CLM09_ReleaseOfInformationCode               = ReleaseOfInformationCode.Yes;

                    // TODO: diagnosis code -- Diagnosis is associated with Claim Line Item
                    // List the principal Dx with BK and others with BF, like HI✽BK:8901✽BF:87200✽BF:5559~, up to 12 diagnosis
                    // assume the 1st Dx is the principal Dx

                    var hiSegment = claim2300Loop.AddSegment(new TypedSegmentHI());
                    var index     = 0;
                    foreach (var claimLineItem in claim.ClaimLineItems)
                    {
                        index++;
                        if (index == 1)
                        {
                            hiSegment.HI01_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMPrincipleDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 2)
                        {
                            hiSegment.HI02_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 3)
                        {
                            hiSegment.HI03_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 4)
                        {
                            hiSegment.HI04_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 5)
                        {
                            hiSegment.HI05_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 6)
                        {
                            hiSegment.HI06_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 7)
                        {
                            hiSegment.HI07_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 8)
                        {
                            hiSegment.HI08_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 9)
                        {
                            hiSegment.HI09_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 10)
                        {
                            hiSegment.HI10_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 11)
                        {
                            hiSegment.HI11_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                        else if (index == 12)
                        {
                            hiSegment.HI12_HealthCareCodeInformation =
                                X12Utility.BuildCompositeElement(
                                    PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                    CodeListQualifierCode.ICD9CMDiagnostics,
                                    claimLineItem.Diagnosis.CodedConceptCode);
                        }
                    }


                    var autoIncrementedServiceLineNumber = 0;
                    foreach (var claimLineItem in claim.ClaimLineItems)
                    {
                        autoIncrementedServiceLineNumber++;

                        var lxLoop = claim2300Loop.AddLoop(new TypedLoopLX(string.Empty));       // LX loop repeat: 50
                        lxLoop.LX01_AssignedNumber = autoIncrementedServiceLineNumber.ToString(CultureInfo.InvariantCulture);

                        var sv1Segment = lxLoop.AddSegment(new TypedSegmentSV1());
                        sv1Segment.SV101_CompositeMedicalProcedure =
                            X12Utility.BuildCompositeElement(
                                PayorType.HealthCareClaim837Setup.X12Delimiters.CompositeDelimiter,
                                ProductOrServiceIDQualifier.HCPCS, //TODO: Confirm with Kate if we can use HCPCS for all procedures.
                                claimLineItem.Procedure.CodedConceptCode);

                        sv1Segment.SV102_MonetaryAmount    = X12Utility.ConvertToDecimalString(claimLineItem.ChargeAmount.Amount);
                        sv1Segment.SV103_UnitBasisMeasCode = UnitsOrBasisOfMeasurementCode.Unit;
                        sv1Segment.SV104_Quantity          = claimLineItem.BillingUnitCount.Count.ToString(CultureInfo.InvariantCulture);
                        sv1Segment.SV107_CompDiagCodePoint = DiagnosisCodePointer;

                        var dtpSegment = lxLoop.AddSegment(new TypedSegmentDTP());
                        dtpSegment.DTP01_DateTimeQualifier             = DateTimeQualifier.Service;
                        dtpSegment.DTP02_DateTimePeriodFormatQualifier = DateTimePeriodFormatQualifier.DateExpressedAsCCYYMMDD;
                        dtpSegment.DTP03_Date = claim.ServiceDate;
                    }
                }
            }

            var healthCareClaim837ProfessionalX12Message = message.SerializeToX12(true);    //TODO: Configure the whitespace option.
            var healthCareClaim837Professional           = healthCareClaim837ProfessionalFactory.CreateHealthCareClaim837Professional(this, Encoding.ASCII.GetBytes(healthCareClaim837ProfessionalX12Message));

            var lookupValueRepository = IoC.CurrentContainer.Resolve <ILookupValueRepository>();

            ReviseClaimBatchStatus(lookupValueRepository.GetLookupByWellKnownName <ClaimBatchStatus>(WellKnownNames.ClaimModule.ClaimBatchStatus.Hcc837PGenerated));

            return(healthCareClaim837Professional);
        }