コード例 #1
0
        private IEnumerable <EntregaFixaProcessada> GeraTodasRecorrenciasDeUmaRegra(IEnumerable <Competencia> competencias = null, ParametrosDeRegraDeRemuneracao regraFixa = null)
        {
            PeriodoSimples periodo = competencias.ObtemPeriodoQueCompreendeTodasAsCompetencias();
            DateTime       inicio  = periodo.Inicio;
            DateTime       fim     = periodo.Fim;


            dynamic idMoeda = regraFixa.ParametrosExtras.Dinheiro["Moeda"]["Id"];
            decimal valor   = decimal.Parse(regraFixa.ParametrosExtras.Dinheiro["Valor"].ToString());

            Moeda moeda = Moeda.Obtem(idMoeda.ToString());

            Dinheiro valorRegra = new Dinheiro(valor, moeda);

            JsonSerializerSettings settingsSerializer = new JsonSerializerSettings()
            {
                ContractResolver = new JsonContractResolverDeModelosBase()
            };
            //Dinheiro valorRegra = JsonConvert.DeserializeObject<Dinheiro>(regraFixa.ParametrosExtras.Dinheiro.ToString(), settingsSerializer);
            Recorrencia <DateTime> rec = JsonConvert.DeserializeObject <Recorrencia <DateTime> >(regraFixa.ParametrosExtras.Recorrencia.ToString(), settingsSerializer);


            rec.Atual = regraFixa.Vigencia.Inicio;

            DateTime dataReferencia = rec.Atual;

            Dictionary <int, DateTime> datasDoPeriodo = new Dictionary <int, DateTime>();

            Recorrencia <DateTime> atual = rec;

            while (dataReferencia <= fim)
            {
                datasDoPeriodo.Add(atual.Serie, dataReferencia);
                atual          = atual.ProximoNaRecorrencia;
                dataReferencia = atual.Atual;
            }

            atual          = rec.AnteriorNaRecorrencia;
            dataReferencia = atual.Atual;


            List <EntregaFixaProcessada> entregas = new List <EntregaFixaProcessada>();

            foreach (KeyValuePair <int, DateTime> data in datasDoPeriodo)
            {
                foreach (Competencia comp in competencias)
                {
                    if (comp.Contem(data.Value))
                    {
                        EntregaFixaProcessada ent = new EntregaFixaProcessada(data.Value, comp);
                        ent.Serie   = data.Key;
                        ent.IdRegra = regraFixa.Id;
                        entregas.Add(ent);
                        break;
                    }
                }
            }

            return(entregas);
        }
コード例 #2
0
        public async Task <IActionResult> CalculaRemuneracoes(DateTime inicio, DateTime fim, int pag = 1)
        {
            IEnumerable <IRemuneracao> remuneracoes;

            try
            {
                DateTime       dataFimAjustada            = new DateTime(fim.Date.Ticks).AddDays(1).AddSeconds(-1);
                PeriodoSimples periodoDoPagamentoDasHoras = new PeriodoSimples(inicio.Date, dataFimAjustada);
                remuneracoes = await _gerenciadorDeRemuneracao.CalcularRemuneracoesNoPeriodoAsync(periodoDoPagamentoDasHoras);


                //TODO reimplementar a paginação do backend (preferencialmente salvando a requisicao antes
                //var remuneracoesPorFavorecido = remuneracoes.GroupBy(rem => rem.IdFavorecido).OrderBy(g => g.Key);

                //const int pagesize = 10;
                //IEnumerable<IRemuneracao> pagina = remuneracoesPorFavorecido.Skip(pagesize * (pag - 1)).Take(pagesize).SelectMany(gr => gr).ToArray();
                //return base.Ok(pagina);


                //filtro para exibir apenas remuneracoes do periodo selecionado. (O calculo gera as remuneracoes fixas recorrentes{baseado na vigencia da regra Fixa})
                remuneracoes = remuneracoes.Where(x => periodoDoPagamentoDasHoras.Contem(x.DataDaEntrega)).OrderBy(x => x.IdFavorecido);

                return(base.Ok(remuneracoes));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
        }
コード例 #3
0
        public async Task <IEnumerable <ITabelaDePreco <int> > > ObtemTabelasDePrecoAsync(IEnumerable <int> idsTabelas, TipoDeTabelaDePreco tipo, PeriodoSimples periodo = null)
        {
            PeriodoSimples periodoRequisicao = periodo;

            string apiPath = new Uri(new Uri(_endpoint), Constantes.URL_TABELA_DE_PRECO).AbsoluteUri;
            RequisicaoSemConteudo <IEnumerable <ITabelaDePreco <int> > > requisicao = new RequisicaoSemConteudo <IEnumerable <ITabelaDePreco <int> > >(apiPath, _context);

            if (periodoRequisicao != null)
            {
                requisicao.Parameters.Add(new ParametrosDaRequisicao("inicio", periodoRequisicao.Inicio.ToString("yyyy-MM-ddTHH:mm:ss")));
                requisicao.Parameters.Add(new ParametrosDaRequisicao("fim", periodoRequisicao.Fim.ToString("yyyy-MM-ddTHH:mm:ss")));
            }

            if (tipo != null)
            {
                requisicao.Parameters.Add(new ParametrosDaRequisicao("Tipo", tipo.Id.ToString()));
            }

            if (idsTabelas?.Count() > 0)
            {
                requisicao.Parameters.Add(new ParametrosDaRequisicao("ids", String.Join(",", idsTabelas)));
            }

            System.Threading.CancellationToken cancellationToken = new System.Threading.CancellationToken();
            string tabelasSerializadas = await requisicao.ObtemAsync(cancellationToken);

            IEnumerable <ITabelaDePreco <int> > tabelas = DeserializarTabelas(tabelasSerializadas);

            return(tabelas);
        }
コード例 #4
0
        private async Task VerificaSeTipoLimiteJaExiste(ParametrosDeLimites limite)
        {
            using (var context = _fabricaDeContextos.CriaContextoDe <RemuneracaoContext>(TipoDeConexao.Remuneracao))
            {
                ParametrosDeLimitesBD limiteBD = new ParametrosDeLimitesBD(limite);

                //TODO: Talvez tenha que mudar maneira de pegar idsDosContextosDeAplicacao quando tiver mais de um contexto.

                PeriodoSimples periodoLimite = new PeriodoSimples(limite.DataInicio, limite.DataFim.Value.Date.AddDays(1));

                IEnumerable <int> idsVinculos = await context.VinculosLimites.Where(x => x.IdVinculo == limite.IdsDosContextosDeAplicacao.First()).Select(l => l.IdLimite).ToListAsync();

                IEnumerable <ParametrosDeLimitesBD> limiteEncontrado = await context.Limites.Where(
                    l => l.TipoDeLimite == limiteBD.TipoDeLimite &&
                    l.Deleted == false &&
                    new PeriodoSimples(l.DataInicio, l.DataFim.Value.AddDays(1)).Intersecta(periodoLimite) &&
                    idsVinculos.Contains(l.Id) &&
                    l.Id != limite.Id).ToListAsync();

                if (limiteEncontrado.Count() > 0)
                {
                    throw new UserException("Não foi possível inserir o limite. Esta regra já possui um " + limite.Tipo.Name + " nesta vigência.");
                }
            }
        }
コード例 #5
0
 public ContratoDeRemuneracao(PeriodoSimples vigencia)
 {
     Vigencia = vigencia;
     if (Vigencia == null)
     {
         Vigencia = new PeriodoSimples();
     }
 }
        public RegraDeRemuneracaoBD(TipoDeRegraBD tipo, IRegraDeRemuneracao regra) : this()
        {
            Vigencia = new PeriodoSimples(regra.Vigencia.Inicio.Date, regra.Vigencia.Fim.Date);

            Id         = regra.Id;
            IdContrato = regra.Parametros.IdContrato;
            Nome       = regra.NomePrincipal;
            this.tipo  = tipo.Id;
        }
コード例 #7
0
        public ContratoDeRemuneracao(int id, string nome, PeriodoSimples vigencia, IFavorecimento favorecimentoDoContrato, IEnumerable <IRegraDeRemuneracao> regras) : this(vigencia)
        {
            _regras = regras;

            _favorecimento = favorecimentoDoContrato;

            Id            = id;
            NomePrincipal = nome;
        }
コード例 #8
0
        public void Periodo_Vazio_Nao_Deve_Conter_Nenhuma_Data()
        {
            //Arrange
            PeriodoSimples vazio = PeriodoSimples.Vazio;
            DateTime       data  = DateTime.Now.AddDays(new Random().Next(30));

            //Act & Assert
            Assert.False(vazio.Contem(data));
        }
コード例 #9
0
        private bool DataEstaNoPeriodo(PeriodoSimples periodo, DateTime inicio, DateTime fim)
        {
            if (periodo.Contem(inicio) || periodo.Contem(fim) || (inicio < periodo.Inicio && fim >= periodo.Fim))
            {
                return(true);
            }

            return(false);
        }
コード例 #10
0
        private DateTime PegaDataAleatoria(PeriodoSimples periodo)
        {
            TimeSpan tamanhoPeriodo = periodo.Fim.Subtract(periodo.Inicio);

            int diasASubtrair = new Random().Next(tamanhoPeriodo.Days);

            TimeSpan pontoDoPeriodo = tamanhoPeriodo.Subtract(new TimeSpan(diasASubtrair, 0, 0, 0));

            return(periodo.Inicio.Add(pontoDoPeriodo));
        }
 public RegraDeRemuneracaoBD(TipoDeRegraBD tipo, ParametrosDeRegraDeRemuneracao parametros) : this()
 {
     Vigencia                = new PeriodoSimples(parametros.Vigencia.Inicio.Date, parametros.Vigencia.Fim.Date);
     Id                      = parametros.Id;
     IdContrato              = parametros.IdContrato;
     Nome                    = parametros.NomePrincipal;
     this.tipo               = tipo.Id;
     this.Percentual         = parametros.PercentualARemunerar;
     this.PercentualDesconto = parametros.PercentualDesconto;
 }
コード例 #12
0
        private async Task VerificaSeLimiteEstaNaVigenciaDaRegra(ParametrosDeLimites limite)
        {
            ParametrosDeRegraDeRemuneracao regraDoLimite = (await _repositorioDeRegras.ObterAsync(limite.IdsDosContextosDeAplicacao)).First();

            PeriodoSimples vigenciaDaRegraDoLimite = new PeriodoSimples(regraDoLimite.Vigencia.Inicio.Date, regraDoLimite.Vigencia.Fim.Date.AddDays(1));

            if (!vigenciaDaRegraDoLimite.Contem(limite.DataInicio.Value.Date) || !vigenciaDaRegraDoLimite.Contem(limite.DataFim.Value.Date))
            {
                throw new UserException("A vigência do Limite deve estar dentro da vigência da regra");
            }
        }
        public async Task <IEnumerable <IEntrega> > ListaVigentesNoPeriodoPorTipo(PeriodoSimples periodo, TipoDeProcedimento[] tipos)
        {
            DateTime inicio = periodo.Inicio;
            DateTime fim    = periodo.Fim;

            EntregaDeHorasRecebidasBD[] entregasBD = await ObtemEntregasDoPeriodoPorTipo(inicio, fim, tipos);

            IEnumerable <IEntrega> entregas = entregasBD.Select(ent => ent.ConverteParaEntrega()).ToArray();

            return(entregas);
        }
コード例 #14
0
        public void Deve_Retornar_Vazio_Ao_Fazer_Interseccao_Entre_Dois_Periodos_Distantes()
        {
            //Arrange
            PeriodoSimples periodoA = new PeriodoSimples(new DateTime(2017, 01, 01), new DateTime(2017, 02, 01));
            PeriodoSimples periodoB = new PeriodoSimples(new DateTime(2017, 03, 01), new DateTime(2017, 04, 01));

            //Act
            PeriodoSimples interseccao = periodoA.Interseccionar(periodoB);

            //Assert
            Assert.AreEqual(PeriodoSimples.Vazio, interseccao);
        }
コード例 #15
0
        private async Task VerificaSeRegraEstaNaVigenciaDoContrato(RegraDeRemuneracaoBD regra)
        {
            IContratoDeRemuneracao contratoDaRegra = (await _repositorioDeContratos.ObterAsync(new int[] { regra.IdContrato })).First();

            PeriodoSimples vigenciaDoContrato = new PeriodoSimples(contratoDaRegra.Vigencia.Inicio.Date, contratoDaRegra.Vigencia.Fim.Date.AddDays(1));
            PeriodoSimples vigenciaDaRegra    = new PeriodoSimples(regra.Vigencia.Inicio.Date, regra.Vigencia.Fim.Date);

            if (!vigenciaDoContrato.Contem(vigenciaDaRegra))
            {
                throw new UserException("A vigência da regra deve estar dentro da vigência do contrato");
            }
        }
 public ContratoDeRemuneracaoBD(TipoDeContratoDeRemuneracaoBancoDeDados tipo, PeriodoSimples periodo = null)
 {
     TipoId = tipo.Id;
     if (periodo == null)
     {
         Vigencia = new PeriodoSimples();
     }
     else
     {
         Vigencia = new PeriodoSimples(periodo.Inicio.Date, periodo.Fim.Date);
     }
 }
コード例 #17
0
 private void ConfigurarCompetencias()
 {
     _periodo_inicial_das_competencias = new PeriodoSimples(DateTime.Now, DateTime.Now.AddMonths(1));
     _competencia_inicial       = new CompetenciaMensal(_periodo_inicial_das_competencias.Inicio);
     _segunda_competencia       = _competencia_inicial.ProximaCompetencia;
     _ultima_competencia        = _segunda_competencia.ProximaCompetencia;
     _competencias_todas        = new Competencia[] { _competencia_inicial, _segunda_competencia, _ultima_competencia };
     _competencias_sem_a_ultima = new Competencia[] { _competencia_inicial, _segunda_competencia };
     _competencias_a_ultima     = new Competencia[] { _ultima_competencia };
     _competencias_a_segunda    = new Competencia[] { _segunda_competencia };
     _competencias_a_primeira   = new Competencia[] { _competencia_inicial };
 }
        public async Task <IEnumerable <IEntrega> > ListaVigentesNaCompetenciaPorTipo(IEnumerable <Competencia> competencias, TipoDeProcedimento[] tipos)
        {
            PeriodoSimples periodo = competencias.ObtemPeriodoQueCompreendeTodasAsCompetencias();
            DateTime       inicio  = periodo.Inicio;
            DateTime       fim     = periodo.Fim;

            EntregaDeHorasRecebidasBD[] entregasBD = await ObtemEntregasDoPeriodoPorTipo(inicio, fim, tipos);

            IEnumerable <IEntrega> entregas = entregasBD.Select(ent => ent.ConverteParaEntrega()).ToArray();

            return(entregas);
        }
 public ContratoDeRemuneracaoBD(int id, List <RegraDeRemuneracaoBD> regras, PeriodoSimples periodo = null)
 {
     Id     = id;
     Regras = regras;
     if (periodo == null)
     {
         Vigencia = new PeriodoSimples();
     }
     else
     {
         Vigencia = new PeriodoSimples(periodo.Inicio.Date, periodo.Fim.Date);
     }
 }
        private Mock <IRepositorioDeContratoDeRemuneracao> ConfigurarRepositorioContratos(IEnumerable <IContratoDeRemuneracao> contratos)
        {
            Mock <IRepositorioDeContratoDeRemuneracao> mock = new Mock <IRepositorioDeContratoDeRemuneracao>();
            DateTime       inicio           = new DateTime(2018, 01, 01);
            DateTime       fim              = new DateTime(2018, 02, 01);
            PeriodoSimples intervaloJaneiro = new PeriodoSimples(inicio, fim);

            mock.Setup(m => m.ListarVigentesEm(It.Is <Competencia[]>(comps => comps.Where(comp => comp.Periodo.Intersecta(intervaloJaneiro)).Count() > 0))).Returns(Task.FromResult(contratos));
            mock.Setup(m => m.ObterAsync(It.IsAny <int[]>())).Returns(Task.FromResult(new[] { contratos?.First() }));
            mock.Setup(m => m.ListarAsync()).Returns(Task.FromResult(contratos));

            return(mock);
        }
 public ContratoDeRemuneracaoBD(int id, PeriodoSimples periodo = null)
 {
     Id       = id;
     Vigencia = periodo;
     if (periodo == null)
     {
         Vigencia = new PeriodoSimples();
     }
     else
     {
         Vigencia = new PeriodoSimples(periodo.Inicio.Date, periodo.Fim.Date);
     }
 }
コード例 #22
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var            jsonObject   = JObject.Load(reader);
            var            jobjTipo     = jsonObject[nameof(IRegraDeRemuneracao.Tipo)];
            var            jobjVigencia = jsonObject[nameof(IRegraDeRemuneracao.Vigencia)];
            string         idTipo       = jobjTipo.Value <string>();
            PeriodoSimples vigencia     = (PeriodoSimples)serializer.ContractResolver.ResolveContract(typeof(PeriodoSimples)).Converter.ReadJson(jobjVigencia.CreateReader(), typeof(PeriodoSimples), null, serializer);


            ParametrosDeRegraDeRemuneracao parametrosDeRegraDeRemuneracao = new ParametrosDeRegraDeRemuneracao();

            parametrosDeRegraDeRemuneracao.Tipo = TipoDeRegra.Hora;
            JsonConvert.PopulateObject(jsonObject.ToString(), parametrosDeRegraDeRemuneracao);
            return(parametrosDeRegraDeRemuneracao);
        }
コード例 #23
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JsonConverter aux = new ConversorDePeriodo();
            string        nomePropriedadePeriodo = nameof(Competencia.Periodo).ToLower();


            var    jsonObject  = JObject.Load(reader);
            JToken jObjPeriodo = jsonObject.GetValue(nomePropriedadePeriodo, StringComparison.CurrentCultureIgnoreCase);

            PeriodoSimples periodo = (PeriodoSimples)aux.ReadJson(jObjPeriodo.CreateReader(), typeof(PeriodoSimples), null, serializer);
            //TODO melhorar conversao de competencia
            Competencia competencia = new CompetenciaMensal(periodo.Inicio);

            return(competencia);
        }
コード例 #24
0
        public async Task VerificaSeExisteRegraForaDaNovaVigenciaDoContrato(IContratoDeRemuneracao contrato, int id)
        {
            IEnumerable <ParametrosDeRegraDeRemuneracao> regras = await ListaRegras(id);

            PeriodoSimples vigenciaDoContrato = new PeriodoSimples(contrato.Vigencia.Inicio.Date, contrato.Vigencia.Fim.Date.AddDays(1));

            foreach (ParametrosDeRegraDeRemuneracao regra in regras)
            {
                PeriodoSimples vigenciaDaRegra = new PeriodoSimples(regra.Vigencia.Inicio.Date, regra.Vigencia.Fim.Date);
                if (!vigenciaDoContrato.Contem(vigenciaDaRegra))
                {
                    throw new UserException("Existem regras com vigência fora da nova vigência do contrato, favor alterá-las antes de alterar o contrato");
                }
            }
        }
        public ParametrosDeFavorecimento ConverteDe(FavorecimentoBD favorecimentoBD)
        {
            PeriodoSimples periodoDeFavorecimento = favorecimentoBD.Vigencia;

            int[] idsCategorias = ConverteParametrosPorVersao(favorecimentoBD.ParametrosEspecificos).idsCategorias;

            ParametrosDeFavorecimento parametros = new ParametrosDeFavorecimento()
            {
                Id = favorecimentoBD.Id,
                IdsDasEntidadesFavorecidas = idsCategorias,
                idsDasEntidadesDeExcecao   = null,
                TipoDeFavorecimento        = TipoDeFavorecimento.Get(favorecimentoBD.tipo)
            };

            return(parametros);
        }
コード例 #26
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jsonObject = JObject.Load(reader);

            var                    mee          = nameof(IContratoDeRemuneracao.Tipo);
            var                    bii          = nameof(IContratoDeRemuneracao.Vigencia);
            var                    jobjTipo     = jsonObject[mee];
            var                    jobjVigencia = jsonObject[nameof(IContratoDeRemuneracao.Vigencia)];
            string                 idTipo       = jobjTipo.Value <string>();
            PeriodoSimples         vigencia     = (PeriodoSimples)serializer.ContractResolver.ResolveContract(typeof(PeriodoSimples)).Converter.ReadJson(jobjVigencia.CreateReader(), typeof(PeriodoSimples), null, serializer);
            IContratoDeRemuneracao contrato     = TipoDeContrato.Get <TipoDeContrato>(idTipo).CriarContrato(vigencia);

            serializer.Populate(jsonObject.CreateReader(), contrato);

            return(contrato);
        }
コード例 #27
0
        public ParametrosDeRegraDeRemuneracao(int id, string nome, int idContrato, decimal percentual, decimal desconto, TipoDeRegra tipo, dynamic parametros = null, PeriodoSimples vigencia = null)
        {
            PercentualARemunerar = percentual;
            PercentualDesconto   = desconto;
            Id            = id;
            IdContrato    = idContrato;
            NomePrincipal = nome;

            Vigencia         = vigencia;
            ParametrosExtras = parametros;
            Tipo             = tipo;

            if (vigencia == null)
            {
                Vigencia = new PeriodoSimples(DateTime.MinValue, DateTime.MaxValue);
            }
        }
コード例 #28
0
        public static IServicoProfissional ConfiguraServicoProfissionais(IEnumerable <Profissional> funcionarios, PeriodoSimples periodoFavorecimento = null)
        {
            if (periodoFavorecimento == null)
            {
                periodoFavorecimento = new PeriodoSimples();
            }

            Mock <IServicoProfissional> mock = new Mock <IServicoProfissional>();

            int[] idsProfissionais = funcionarios.Select(func => func.Id).ToArray();

            mock.Setup(rep => rep.ObterProfissionaisAsync(It.IsAny <int[]>(), It.IsAny <PeriodoSimples>(), It.IsAny <bool>())).Returns(Task.FromResult(funcionarios));
            mock.Setup(rep => rep.ObtemProfissionaisDasCategoriasNoPeriodo(It.IsAny <int[]>(), It.IsAny <PeriodoSimples>()))
            .Returns((int[] x, PeriodoSimples p) => ObtemProfissionaisDasCategorias(funcionarios, x, p));

            return(mock.Object);
        }
コード例 #29
0
        public static IRepositorioDeFavorecimentos ConfiguraRepositorioFavorecidos(Profissional[] funcionarios, PeriodoSimples periodoFavorecimento = null)
        {
            if (periodoFavorecimento == null)
            {
                periodoFavorecimento = new PeriodoSimples();
            }

            Mock <IRepositorioDeFavorecimentos> mock = new Mock <IRepositorioDeFavorecimentos>();

            int[]        idsFuncionarios = funcionarios.Select(func => func.Id).ToArray();
            Favorecido[] favorecidos     = funcionarios.Select(func => ConfiguraMockFavorecido(func, periodoFavorecimento)).ToArray();

            //mock.Setup(rep => rep.ObterAsync(It.Is<int[]>(ids => ids.Intersect(idsFuncionarios).Count() >= idsFuncionarios.Count()))).Returns(Task.FromResult(favorecidos));
            //mock.Setup(rep => rep.ListarVigentesEm(It.Is<Periodo[]>(per => per.Where(p => p.Intersecta(periodoFavorecimento)).Count() >= 0))).Returns(Task.FromResult((IEnumerable<Favorecido>)favorecidos));
            //mock.Setup(rep => rep.ListarVigentesEm(It.Is<Competencia[]>(per => per.Where(p => p.Periodo.Intersecta(periodoFavorecimento)).Count() >= 0))).Returns(Task.FromResult((IEnumerable<Favorecido>)favorecidos));

            return(mock.Object);
        }
コード例 #30
0
        public async Task <IEnumerable <IEntrega> > ListaVigentesNoPeriodoPorTipo(PeriodoSimples periodo, TipoDeProcedimento[] tipos)
        {
            ConcurrentQueue <Task <IEnumerable <IEntrega> > > tasksRepositorios = new ConcurrentQueue <Task <IEnumerable <IEntrega> > >();

            Parallel.ForEach(_repositoriosEspecificos, rep =>
            {
                Task <IEnumerable <IEntrega> > currentTask = rep.Value.ListaVigentesNoPeriodoPorTipo(periodo, tipos);
                if (currentTask != null)
                {
                    tasksRepositorios.Enqueue(currentTask);
                }
            });
            var entregasSeparadas = await Task.WhenAll(tasksRepositorios);

            IEnumerable <IEntrega> entregas = entregasSeparadas.SelectMany(ent => ent);

            return(entregas);
        }