private async Task <EntregaFixaProcessada> TransformaEntregaBancoEmFixaPreProcessada(IEntrega ent)
        {
            if (ent is IEntregaFixa)
            {
                EntregaFixa entFixa = (EntregaFixa)ent;

                string YYYY = entFixa.DataDaEfetivacao.Year.ToString();
                while (YYYY.Length < 4)
                {
                    YYYY = "0" + YYYY;
                }
                string MM = entFixa.DataDaEfetivacao.Month.ToString();
                while (MM.Length < 2)
                {
                    MM = "0" + MM;
                }
                string        competencia = YYYY + MM;
                Competencia[] comp        = await _gerenciadoFinanceiro.ConverteStringEmCompetenciasAsync(new string[] { competencia });

                EntregaFixaProcessada converted = new EntregaFixaProcessada(entFixa.DataDaEfetivacao, comp[0], entFixa.Executor);

                converted.Id           = entFixa.Id;
                converted.IdRegra      = entFixa.IdRegra;
                converted.SalvaNoBanco = entFixa.SalvaNoBanco;
                converted.Vinculacao   = entFixa.Vinculacao;
                converted.Serie        = entFixa.Serie;

                return(converted);
            }
            throw new InvalidOperationException("Tentativa de converter entrega nao fixa em entrega fixa");
        }
        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);
        }
        private async Task <IEnumerable <EntregaFixaProcessada> > TransformaEntregaBancoEmFixaPreProcessada(IEnumerable <IEntrega> entregasFixasDasRegrasNoBanco)
        {
            if (entregasFixasDasRegrasNoBanco == null || entregasFixasDasRegrasNoBanco.Count() == 0)
            {
                return(new List <EntregaFixaProcessada>());
            }

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

            foreach (IEntrega ent in entregasFixasDasRegrasNoBanco)
            {
                EntregaFixaProcessada converted = await TransformaEntregaBancoEmFixaPreProcessada(ent);

                entPreProcs.Add(converted);
            }
            return(entPreProcs);
        }