private Int32 GenerateAutomaticDebitFileHeader(StringBuilder strBuilderHeader, Company company, Account account,
                                                       Int32 sequentialNumber)
        {
            /* Função responsavel pela configuração do documento de débito automatico.Modelo definido pela FEBRABAN
            * 
            * O modelo/Código é dividido por blocos definidos por letras
            * 
            * Os campos alfanuméricos são representados por letras A e os numéricos por 0
            * Sendo que os campos default estão preenchidos com seus valores corretos
            * 
            * 
            * O modelo de comentário é: Tamanho do campo - descrição do campo
            *
            */

            /// A - Header

            Int32 totalRows = 0;

            String A_registerCode = "A"; //1 - Default
            String A_deliveryCode = "1"; //1 - Default
            String A_conveneCode = "00000000000000000000"; //20 -Definido pelo banco
            String A_companyName = company.LegalEntityProfile.CompanyName.PadRight(20, ' ').Substring(0, 20); //20-
            String A_bankCode = account.Bank.BankNumber.PadLeft(3, '0').Substring(0, 3);
            //3-Código do banco na câmara de compensação
            String A_BankName = account.Bank.ShortName.PadRight(20, ' ');
            String A_createdDate = DateTime.Now.ToShortDateString(); //8
            String A_SequentialNumber = sequentialNumber.ToString().PadLeft(6, '0'); //6-
            String A_layoutVersion = "04"; //2
            String A_serviceIdentification = "DÉBITO AUTOMÁTICO"; //17
            String A_reservedSpace = String.Empty.PadLeft(52, ' '); //52

            strBuilderHeader.Append(A_registerCode).Append(A_deliveryCode).Append(A_conveneCode).Append(A_companyName);
            strBuilderHeader.Append(A_BankName).Append(A_createdDate).Append(A_SequentialNumber).Append(A_layoutVersion)
                .Append(A_serviceIdentification).Append(A_reservedSpace);
            strBuilderHeader.AppendLine();
            totalRows++;

            return totalRows;
        }
        private Int32 GenerateAutomaticDebitFileContent(StringBuilder strBuilderContent, Company company,
                                                        Account account, List<Parcel> parcels)
        {
            /* Função responsavel pela configuração do documento de débito automatico.Modelo definido pela FEBRABAN
             * 
             * O modelo/Código é dividido por blocos definidos por letras
             * 
             * Os campos alfanuméricos são representados por letras A e os numéricos por 0
             * Sendo que os campos default estão preenchidos com seus valores corretos
             * 
             * 
             * O modelo de comentário é: Tamanho do campo - descrição do campo
             *
             */


            Int32 totalRows = 0;
            foreach (Parcel parcel in parcels)
            {
                if (!parcel.InvoiceId.HasValue || !parcel.Invoice.CustomerId.HasValue)
                    continue;
                /// B
                {
                    String B_registerCode = "B"; //1

                    String B_customerIdentificationAtCompany = parcel.Invoice.Customer.LegalEntityProfile != null
                                                                   ? parcel.Invoice.Customer.LegalEntityProfile.
                                                                         CompanyName
                                                                   : parcel.Invoice.Customer.Profile.Name;
                    //25 - Identificação única do cliente
                    B_customerIdentificationAtCompany.PadRight(20, ' ').Substring(0, 20);

                    if (parcel.Invoice.Customer.Agency == null) parcel.Invoice.Customer.Agency = String.Empty;
                    String B_debitAgency = parcel.Invoice.Customer.Agency.PadRight(4, ' ').Substring(0, 4); //4

                    if (parcel.Invoice.Customer.AccountNumber == null)
                        parcel.Invoice.Customer.AccountNumber = String.Empty;
                    String B_customerIdentificationAtBank =
                        parcel.Invoice.Customer.AccountNumber.PadRight(14, ' ').Substring(0, 14);
                    //14 -Identificação única utilizada pelo banco

                    String B_optionDate = DateTime.Now.ToShortDateString(); //8
                    String B_reservedSpace = String.Empty.PadLeft(97, ' '); //97
                    String B_operationCode = "1"; //1

                    strBuilderContent.Append(B_registerCode).Append(B_customerIdentificationAtCompany).Append(
                        B_debitAgency);
                    strBuilderContent.Append(B_customerIdentificationAtCompany).Append(B_optionDate).Append(
                        B_reservedSpace).Append(B_operationCode);

                    strBuilderContent.AppendLine();
                    totalRows++;
                }

                /// C
                {
                    String C_registerCode = "C"; //1
                    String C_customerIdentificationAtCompany =
                        parcel.Invoice.Customer.CustomerId.ToString().PadRight(25, ' ').Substring(0, 25); //25
                    String C_debitAgency = parcel.Invoice.Customer.Agency.PadRight(4, ' ').Substring(0, 4); //4
                    String C_customerIdentificationAtBank =
                        parcel.Invoice.Customer.AccountNumber.PadRight(14, ' ').Substring(0, 14);
                    //14 -Identificação única utilizada pelo banco
                    String C_firstOcurrence = String.Empty.PadLeft(40, ' '); //40
                    String C_secondOcurrence = String.Empty.PadLeft(40, ' '); //40
                    String C_reservedSpace = String.Empty.PadLeft(40, ' '); //40
                    String C_operationCode = "2"; //1

                    strBuilderContent.Append(C_registerCode).Append(C_customerIdentificationAtBank).Append(C_debitAgency)
                        .Append(C_customerIdentificationAtBank);
                    strBuilderContent.Append(C_firstOcurrence).Append(C_secondOcurrence).Append(C_reservedSpace).Append(
                        C_operationCode);
                    strBuilderContent.AppendLine();
                    totalRows++;
                }

                ///D
                {
                    String D_registerCode = "C"; //1
                    String D_customerIdentificationAtOriginalCompany = String.Empty.PadLeft(25, ' ');
                    //25 - Identificação do cliente na empresa antiga
                    String D_debitAgency = String.Empty.PadLeft(4, ' '); //4
                    String D_customerIdentificationAtBank = String.Empty.PadLeft(14, ' ');
                    //14 -Identificação única utilizada pelo banco
                    String D_customerIdentificationAtNewCompany = String.Empty.PadLeft(25, ' ');
                    //25 - Identificação do cliente na empresa nova
                    String D_Ocurrence = String.Empty.PadLeft(60, ' '); //60
                    String D_reservedSpace = String.Empty.PadLeft(20, ' '); //20
                    String D_operationCode = "0"; //1

                    strBuilderContent.Append(D_registerCode).Append(D_customerIdentificationAtOriginalCompany).Append(
                        D_debitAgency);
                    strBuilderContent.Append(D_customerIdentificationAtBank).Append(D_customerIdentificationAtNewCompany)
                        .Append(D_Ocurrence);
                    strBuilderContent.Append(D_reservedSpace).Append(D_operationCode);

                    strBuilderContent.AppendLine();
                    totalRows++;
                }

                ///E
                {
                    String E_registerCode = "E"; //1
                    String E_customerIdentificationAtCompany =
                        parcel.Invoice.Customer.CustomerId.ToString().PadRight(25, ' ').Substring(0, 25); //25
                    String E_debitAgency = String.Empty.PadLeft(4, ' '); //4
                    String E_customerIdentificationAtBank =
                        parcel.Invoice.Customer.AccountNumber.PadRight(14, ' ').Substring(0, 14);
                    //14 -Identificação única utilizada pelo banco
                    String E_dueDate = parcel.DueDate.ToShortDateString(); //8
                    String E_debitValue = "000000000000000".PadLeft(15, '0'); //15
                    String E_currencyCode = "03"; //2
                    String E_spaceForCompanyUse = String.Empty.PadLeft(60, ' '); //60
                    String E_reservedSpace = String.Empty.PadLeft(20, ' '); //20
                    String E_operationCode = "0"; //1

                    strBuilderContent.Append(E_registerCode).Append(E_customerIdentificationAtCompany).Append(
                        E_debitAgency);
                    strBuilderContent.Append(E_customerIdentificationAtCompany).Append(E_dueDate).Append(E_debitValue).
                        Append(E_currencyCode);
                    strBuilderContent.Append(E_spaceForCompanyUse).Append(E_reservedSpace).Append(E_operationCode);


                    strBuilderContent.AppendLine();
                    totalRows++;
                }
            }


            return totalRows;
        }
        public String GenerateAutomaticDebitFile(Company company, Account account, List<Parcel> parcels,
                                                 Int32 sequentialNumber)
        {
            var strBuilderAutomaticDebitFile = new StringBuilder();
            Int32 totalRows = 0;
            totalRows = GenerateAutomaticDebitFileHeader(strBuilderAutomaticDebitFile, company, account,
                                                         sequentialNumber);
            totalRows += GenerateAutomaticDebitFileContent(strBuilderAutomaticDebitFile, company, account, parcels);
            GenerateAutomaticDebitFileTrailler(strBuilderAutomaticDebitFile, parcels, totalRows);

            return strBuilderAutomaticDebitFile.ToString(0, strBuilderAutomaticDebitFile.Length);
        }