private void CreateField(LineFieldsModel content, EnumFileFieldsType type, string name, string value = "")
        {
            switch (type)
            {
            case EnumFileFieldsType.Header:
                content.Fields.Add(name, new Field(ProcessType, Configuration.HeaderFields[name])
                {
                    Value = value.isNullOrEmpty()?Configuration.HeaderFields[name].DefaultValue:value
                });
                return;

            case EnumFileFieldsType.Body:
                content.Fields.Add(name, new Field(ProcessType, Configuration.BodyFields[name])
                {
                    Value = value.isNullOrEmpty() ? Configuration.BodyFields[name].DefaultValue : value
                });
                return;

            case EnumFileFieldsType.Footer:
                content.Fields.Add(name, new Field(ProcessType, Configuration.FooterFields[name])
                {
                    Value = value.isNullOrEmpty() ? Configuration.FooterFields[name].DefaultValue : value
                });
                return;

            default:
                throw new Exception("Tipo do registro não contemplado.");
            }
        }
        public static Dictionary <int?, string> PrepareSequenceFileFields(this LineFieldsModel model)
        {
            Dictionary <int?, string> dic = new Dictionary <int?, string>();

            foreach (var field in model.Fields.Values)
            {
                dic.Add(field.InitialPosition, field.Value);
            }

            return(dic.OrderBy(key => key.Key).ToDictionary(keyItem => keyItem.Key, valueItem => valueItem.Value));
        }
        private Dictionary <string, LineFieldsModel> ReadVehiclesInformation(string[] file)
        {
            if (Configuration.BodyVehicleInformation == null || !Configuration.BodyVehicleInformation.Any())
            {
                return(null);
            }

            var bodyVehiclesInformationLines = file.Select((text, index) => new { LineText = text, LineNumber = index + 1 })
                                               .Where(p =>
            {
                var initialPosition = Configuration.BodyVehicleInformation["TIPO_REGISTRO"].InitialPosition;
                var length          = Configuration.BodyVehicleInformation["TIPO_REGISTRO"].Length;
                return(length != null && (initialPosition != null &&
                                          p.LineText.Substrings(initialPosition.Value, length.Value) == Configuration.BusinessSettings.BodyVehicleInformationIdentification));
            }).ToList();

            if (!bodyVehiclesInformationLines.Any())
            {
                throw new Exception($"Não foi encontrado nenhum registro(s) do tipo:[{Configuration.BusinessSettings.BodyVehicleInformationIdentification}]");
            }

            var vehiclesInformation = new Dictionary <string, LineFieldsModel>();

            foreach (var vehiclesInformationLine in bodyVehiclesInformationLines)
            {
                var line = new LineFieldsModel()
                {
                    LineNumber = vehiclesInformationLine.LineNumber
                };
                foreach (var key in Configuration.BodyVehicleInformation.Keys)
                {
                    var fieldConfiguration = Configuration.BodyVehicleInformation[key];

                    var fileField = new Field(ProcessType, fieldConfiguration)
                    {
                        Value = vehiclesInformationLine.LineText.Substrings(fieldConfiguration.InitialPosition.Value, fieldConfiguration.Length.Value)
                    };
                    line.Fields.Add(key, fileField);
                }
                if (!vehiclesInformation.ContainsKey(line.Fields["DS_PROPOSTA"].Value))
                {
                    vehiclesInformation.Add(line.Fields["DS_PROPOSTA"].Value, line);
                }
            }

            if (!vehiclesInformation.Any())
            {
                throw new Exception($"Não foi possível converter nenhuma linha de informações de veiculo para o modelo.");
            }

            return(vehiclesInformation);
        }
        protected override FileBodyModel ReadBody(string[] file)
        {
            if (Configuration.BodyFields == null || !Configuration.BodyFields.Any())
            {
                return(null);
            }

            var bodyLines = file.Select((text, index) => new { LineText = text, LineNumber = index + 1 })
                            .Where(p =>
            {
                var initialPosition = Configuration.BodyFields["TIPO_REGISTRO"].InitialPosition;
                var length          = Configuration.BodyFields["TIPO_REGISTRO"].Length;
                return(length != null && (initialPosition != null && p.LineText.Substrings(initialPosition.Value, length.Value) == Configuration.BusinessSettings.BodyIdentification));
            })
                            .ToList();

            if (!bodyLines.Any())
            {
                throw new Exception($"Não foi encontrado nenhum registro(s) do tipo:[{Configuration.BusinessSettings.BodyIdentification}]");
            }



            var bodyModel = new FileBodyModel();

            foreach (var bodyLine in bodyLines)
            {
                var line = new LineFieldsModel()
                {
                    LineNumber = bodyLine.LineNumber
                };
                foreach (var key in Configuration.BodyFields.Keys)
                {
                    var fieldConfiguration = Configuration.BodyFields[key];

                    var fileField = new Field(ProcessType, fieldConfiguration)
                    {
                        Value = bodyLine.LineText.Substrings(fieldConfiguration.InitialPosition.Value, fieldConfiguration.Length.Value)
                    };
                    line.Fields.Add(key, fileField);
                }
                bodyModel.Content.Add(line);
            }

            if (!bodyModel.Content.Any() && bodyLines.Any())
            {
                throw new Exception($"Não foi possível converter nenhuma linha do body para o modelo.");
            }

            return(bodyModel);
        }
        internal bool ValidateIssuanceRules(LineFieldsModel issuance)
        {
            var dsProposal = issuance.Fields["DS_PROPOSTA"];

            if (dsProposal.Value.isNullOrEmpty())
            {
                Logs.Add($"A Linha:{issuance.LineNumber} não atende as regras para processamento como Emissão." +
                         $"O campo da posição inicial:{dsProposal.InitialPosition} até a Posição: {dsProposal.InitialPosition + dsProposal.Length} não pode estar vazio!");
                return(false);
            }


            if (!ValidateProposalLength(dsProposal.Value))
            {
                Logs.Add($"A Linha:{issuance.LineNumber} não atende as regras para processamento como Emissão." +
                         $"O campo da posição inicial:{dsProposal.InitialPosition} " +
                         $"até a Posição: {dsProposal.InitialPosition + dsProposal.Length} tem que conter no mínimo {HdiProcessConfigurations.ProposalMinimunValidLength} caracteres!");
                return(false);
            }

            return(true);
        }
 public FileHeaderModel()
 {
     Content = new LineFieldsModel();
 }
 public FileFooterModel()
 {
     Content = new LineFieldsModel();
 }
        private List <string> CreateBodyLines(List <CancelationModel> population)
        {
            var bodyModel  = new FileBodyModel();
            var lineNumber = 1;

            foreach (var data in population)
            {
                if (data.PolicyInsurerIdentifier.isNullOrEmpty())
                {
                    _logs.Add($"A apólice {data.PolicyIdentifier} foi listada pra cancelamento, porém não pode ser cancelada, pois não possui um número de apólice");
                    continue;
                }

                var line = new LineFieldsModel()
                {
                    LineNumber = lineNumber++
                };
                foreach (var key in Configuration.BusinessSettings.DefaultValues.Keys)
                {
                    if (Configuration.BodyFields.ContainsKey(key))
                    {
                        var fieldConfiguration = Configuration.BodyFields[key];
                        var fileField          = new Field(ProcessType, fieldConfiguration)
                        {
                            Value = Configuration.BusinessSettings.DefaultValues[key]
                        };

                        line.Fields.Add(key, fileField);
                    }
                }


                CreateField(line, EnumFileFieldsType.Body, "TIPO_REGISTRO", Configuration.BusinessSettings.BodyIdentification);
                CreateField(line, EnumFileFieldsType.Body, "REGISTRO_SEQUENCIAL", line.LineNumber.ToString());
                CreateField(line, EnumFileFieldsType.Body, "DOCUMENTO", data.PolicyInsurerIdentifier.RemoveHdiDocumentFormat());
                CreateField(line, EnumFileFieldsType.Body, "ENDOSSO");
                CreateField(line, EnumFileFieldsType.Body, "NUMERO_CONTROLE_ITURAN", data.PolicyIdentifier.ToString());
                CreateField(line, EnumFileFieldsType.Body, "CODIGO_EQUIPAMENTO");
                CreateField(line, EnumFileFieldsType.Body, "DATA_CANCELAMENTO", $"{data.CancelationDate:yyyyMMdd}");
                CreateField(line, EnumFileFieldsType.Body, "DATA_PROCESSAMENTO");
                CreateField(line, EnumFileFieldsType.Body, "STATUS_CANCELAMENTO");
                CreateField(line, EnumFileFieldsType.Body, "CODIGO_OBSERVACAO");
                CreateField(line, EnumFileFieldsType.Body, "OBSERVACAO");
                CreateField(line, EnumFileFieldsType.Body, "VALOR_PREMIO");

                if (!ValidateCustomerDocument(data))
                {
                    continue;
                }

                CreateField(line, EnumFileFieldsType.Body, "TIPO_DOCUMENTO", data.DocumentType == null
                                                ? BusinessExtensions.GetDocumentType(data.CustomerDocument)?.ToInt().ToString()
                                                : data.DocumentType?.ToInt().ToString());

                CreateField(line, EnumFileFieldsType.Body, "NR_CNPJ_CPF", data.CustomerDocument.RemoveDocumentSpecialCharacters());

                bodyModel.Content.Add(line);
            }

            var bodyContent = new List <string>();

            foreach (var line in bodyModel.Content)
            {
                var body = new StringBuilder();
                foreach (var bodyField in line.PrepareSequenceFileFields())
                {
                    body.Append(bodyField.Value);
                }

                bodyContent.Add(body.Append(Environment.NewLine).ToString());
            }

            return(bodyContent);
        }