public void Adicionar(ForecastET forecast)
        {
            var forecastExiste = _forecastRepository
                                 .Buscar(forecast.IdCelula, forecast.IdCliente, forecast.IdServico, forecast.NrAno);
            ForecastET forecastAnoSeguinteExiste = null;

            if (forecast.DataAniversario != null)
            {
                forecastAnoSeguinteExiste = forecast.DataAniversario.Value.Year > forecast.NrAno ?
                                            _forecastRepository.Buscar(forecast.IdCelula, forecast.IdCliente, forecast.IdServico,
                                                                       forecast.DataAniversario.Value.Year) :
                                            null;
            }

            if (forecastExiste != null || forecastAnoSeguinteExiste != null)
            {
                throw new ArgumentException($"Um Forecast para esta Célula, Cliente, Serviço e Ano já existe");
            }

            _forecastRepository.Adicionar(forecast);
            if (forecast.DataAniversario.HasValue && forecast.DataAniversario.Value.Year > forecast.NrAno)
            {
                var forecastDoAnoSeguinte        = CriarEntidadeForecastDoAnoSeguinte(forecast, AtribuirValoresDosMesesParaAnoSeguinteAdicao);
                var forecastDoSegundoAnoSeguinte = CriarEntidadeForecastDoAnoSeguinte(forecastDoAnoSeguinte, AtribuirValoresDosMesesParaAnoSeguinteAdicao);
                _forecastRepository.Adicionar(forecastDoAnoSeguinte);
                _forecastRepository.Adicionar(forecastDoSegundoAnoSeguinte);
            }

            _unitOfWork.Commit();
        }
 private void adicionarValorTotal(ForecastET forecastET)
 {
     forecastET.ValorForecast.ValorTotal = forecastET.ValorForecast.ValorJaneiro + forecastET.ValorForecast.ValorFevereiro + forecastET.ValorForecast.ValorMarco
                                           + forecastET.ValorForecast.ValorAbril + forecastET.ValorForecast.ValorMaio + forecastET.ValorForecast.ValorJunho
                                           + forecastET.ValorForecast.ValorJulho + forecastET.ValorForecast.ValorAgosto + forecastET.ValorForecast.ValorSetembro
                                           + forecastET.ValorForecast.ValorOutubro + forecastET.ValorForecast.ValorNovembro + forecastET.ValorForecast.ValorDezembro;
 }
 private Decimal?obterValorTotal(ForecastET forecastET)
 {
     return(forecastET.ValorForecast.ValorJaneiro + forecastET.ValorForecast.ValorFevereiro + forecastET.ValorForecast.ValorMarco
            + forecastET.ValorForecast.ValorAbril + forecastET.ValorForecast.ValorMaio + forecastET.ValorForecast.ValorJunho
            + forecastET.ValorForecast.ValorJulho + forecastET.ValorForecast.ValorAgosto + forecastET.ValorForecast.ValorSetembro
            + forecastET.ValorForecast.ValorOutubro + forecastET.ValorForecast.ValorNovembro + forecastET.ValorForecast.ValorDezembro);
 }
        public void Adicionar(ForecastET entity)
        {
            entity.Usuario = string.IsNullOrEmpty(_variables.UserName) ? "STFCORP" : _variables.UserName;

            if (entity.DataAlteracao == null)
            {
                entity.DataAlteracao = DateTime.Now;
            }
            DbSet.Add(entity);
        }
 private void AtualizarEntidadeForecastAnoSeguinte(ForecastET forecast, ForecastET forecastAnoSeguinte)
 {
     forecastAnoSeguinte.DescricaoJustificativa = forecast.DescricaoJustificativa;
     forecastAnoSeguinte.IdStatus                   = forecast.IdStatus;
     forecastAnoSeguinte.DataAniversario            = forecast.DataAniversario;
     forecastAnoSeguinte.DataAplicacaoReajuste      = forecast.DataAplicacaoReajuste;
     forecastAnoSeguinte.DataReajusteRetroativo     = forecast.DataReajusteRetroativo;
     forecastAnoSeguinte.ValorForecast.VlPercentual = forecast.ValorForecast.VlPercentual;
     forecastAnoSeguinte.ValorForecast.ValorAjuste  = forecast.ValorForecast.ValorAjuste;
     AtribuirValoresDosMesesParaAnoSeguinteEdicao(forecast, forecastAnoSeguinte);
 }
        private ForecastET CriarEntidadeForecastDoAnoSeguinte(ForecastET forecast, Action <ForecastET, ForecastET> funcAtribuicaoValorMeses)
        {
            ForecastET forecastDoAnoSeguinte = (ForecastET)forecast.Clone();

            forecastDoAnoSeguinte.ValorForecast = (ValorForecast)forecast.ValorForecast.Clone();
            forecastDoAnoSeguinte.NrAno++;
            forecastDoAnoSeguinte.ValorForecast.NrAno++;
            //AtribuirValoresDosMesesParaAnoSeguinte(forecast, forecastDoAnoSeguinte);
            funcAtribuicaoValorMeses(forecast, forecastDoAnoSeguinte);
            return(forecastDoAnoSeguinte);
        }
        public void Atualizar(ForecastET forecast)
        {
            _forecastRepository.Update(forecast);
            var forecastAnoSeguinte = _forecastRepository
                                      .BuscarPorIdComIncludes(forecast.IdCelula, forecast.IdCliente, forecast.IdServico, forecast.NrAno + 1);

            if (forecast.DataAniversario != null && forecast.DataAniversario.Value.Year > forecast.NrAno)
            {
                if (forecastAnoSeguinte == null)
                {
                    forecastAnoSeguinte = CriarEntidadeForecastDoAnoSeguinte
                                              (forecast, AtribuirValoresDosMesesParaAnoSeguinteEdicao);
                    _forecastRepository.Adicionar(forecastAnoSeguinte);
                }
                else
                {
                    AtualizarEntidadeForecastAnoSeguinte(forecast, forecastAnoSeguinte);
                    _forecastRepository.Update(forecastAnoSeguinte);
                }

                var forecastSegundoAnoSeguinte = _forecastRepository
                                                 .BuscarPorIdComIncludes(forecastAnoSeguinte.IdCelula, forecastAnoSeguinte.IdCliente,
                                                                         forecastAnoSeguinte.IdServico, forecastAnoSeguinte.NrAno + 1);
                if (forecastSegundoAnoSeguinte == null)
                {
                    forecastSegundoAnoSeguinte = CriarEntidadeForecastDoAnoSeguinte
                                                     (forecastAnoSeguinte, AtribuirValoresDosMesesParaAnoSeguinteEdicao);
                    _forecastRepository.Adicionar(forecastSegundoAnoSeguinte);
                }
                else
                {
                    AtualizarEntidadeForecastAnoSeguinte(forecastAnoSeguinte, forecastSegundoAnoSeguinte);
                    _forecastRepository.Update(forecastSegundoAnoSeguinte);
                }
            }

            //if (forecast != null &&  forecast.ValorForecast != null && forecast.ValorForecast.VlPercentual != null)
            //{
            //    forecast.ValorForecast.VlPercentual = forecast.ValorForecast.VlPercentual * 100;
            //}

            //if (forecastAnoSeguinte != null && forecastAnoSeguinte.ValorForecast != null && forecastAnoSeguinte.ValorForecast.VlPercentual != null)
            //{
            //    forecastAnoSeguinte.ValorForecast.VlPercentual = forecastAnoSeguinte.ValorForecast.VlPercentual * 100;
            //}

            _unitOfWork.Commit();
        }
        private void AtribuirValoresDosMesesParaAnoSeguinteAdicao(ForecastET forecast, ForecastET forecastAnoSeguinte = null)
        {
            var     mesesPropertiesList       = forecast.ValorForecast.GetType().GetProperties().Where(x => Attribute.IsDefined(x, typeof(MonthNumber)));
            decimal?valorDoUltimoMesPreenchdo = 0;

            foreach (var mesProperty in mesesPropertiesList)
            {
                if ((decimal?)mesProperty.GetValue(forecast.ValorForecast) != 0)
                {
                    valorDoUltimoMesPreenchdo = (decimal?)mesProperty.GetValue(forecast.ValorForecast);
                }
            }

            foreach (var mesProperty in mesesPropertiesList)
            {
                var numeroDoMes = (int)(mesProperty.CustomAttributes.FirstOrDefault().ConstructorArguments.FirstOrDefault().Value);
                //if (numeroDoMes <= forecast.DataAniversario.Value.Month)
                mesProperty.SetValue(forecastAnoSeguinte.ValorForecast, valorDoUltimoMesPreenchdo);
                //else
                //    mesProperty.SetValue(forecastAnoSeguinte.ValorForecast, (decimal?)0);
            }
        }
        private void AtribuirValoresDosMesesParaAnoSeguinteEdicao(ForecastET forecast, ForecastET forecastAnoSeguinte = null)
        {
            var mesesPropertiesList = forecast.ValorForecast.GetType().GetProperties()
                                      .Where(x => Attribute.IsDefined(x, typeof(MonthNumber)));

            decimal?valorAux = 0;

            //if (forecast.DataAniversario.Value.Year > forecast.NrAno)
            //{
            foreach (var mesProperty in mesesPropertiesList)
            {
                if ((decimal?)mesProperty.GetValue(forecast.ValorForecast) != 0)
                {
                    valorAux = (decimal?)mesProperty.GetValue(forecast.ValorForecast);
                }
            }
            //}
            //else
            //{
            //    var valorAniversario = (decimal?)forecast.ValorForecast.GetType().GetProperties()
            //        .Where(x => x.CustomAttributes.Any(y => y.ConstructorArguments.Any(z => (int)z.Value == forecast.DataAniversario.Value.Month)))
            //        .FirstOrDefault().GetValue(forecast.ValorForecast);
            //    valorAux = valorAniversario;
            //}

            foreach (var mesProperty in mesesPropertiesList)
            {
                var numeroDoMes = (int)(mesProperty.CustomAttributes.FirstOrDefault().ConstructorArguments
                                        .FirstOrDefault().Value);
                //if (numeroDoMes >= forecast.DataReajusteRetroativo.Value.Month && numeroDoMes <= forecast?.DataAniversario.Value.Month)
                //mesProperty.SetValue(forecastAnoSeguinte.ValorForecast, valorAux +
                //    (valorAux * (forecastAnoSeguinte.ValorForecast.VlPercentual)));
                mesProperty.SetValue(forecastAnoSeguinte.ValorForecast, valorAux);
                //else
                //    mesProperty.SetValue(forecastAnoSeguinte.ValorForecast, (decimal?)0);
            }
        }
        private DateTime?ObterDataAniversario(ForecastET forecastET)
        {
            DateTime?dataAniversario = null;

            if (forecastET.NrAno > 0)
            {
                var ano = forecastET.NrAno + 1;

                if (forecastET.ValorForecast.ValorJaneiro > 0)
                {
                    dataAniversario = new DateTime(ano, 1, 1);
                }

                if (forecastET.ValorForecast.ValorFevereiro > 0)
                {
                    dataAniversario = new DateTime(ano, 2, 1);
                }

                if (forecastET.ValorForecast.ValorMarco > 0)
                {
                    dataAniversario = new DateTime(ano, 3, 1);
                }
                if (forecastET.ValorForecast.ValorAbril > 0)
                {
                    dataAniversario = new DateTime(ano, 4, 1);
                }
                if (forecastET.ValorForecast.ValorMaio > 0)
                {
                    dataAniversario = new DateTime(ano, 5, 1);
                }
                if (forecastET.ValorForecast.ValorJunho > 0)
                {
                    dataAniversario = new DateTime(ano, 6, 1);
                }
                if (forecastET.ValorForecast.ValorJulho > 0)
                {
                    dataAniversario = new DateTime(ano, 7, 1);
                }
                if (forecastET.ValorForecast.ValorAgosto > 0)
                {
                    dataAniversario = new DateTime(ano, 8, 1);
                }
                if (forecastET.ValorForecast.ValorSetembro > 0)
                {
                    dataAniversario = new DateTime(ano, 9, 1);
                }
                if (forecastET.ValorForecast.ValorOutubro > 0)
                {
                    dataAniversario = new DateTime(ano, 10, 1);
                }
                if (forecastET.ValorForecast.ValorNovembro > 0)
                {
                    dataAniversario = new DateTime(ano, 11, 1);
                }
                if (forecastET.ValorForecast.ValorDezembro > 0)
                {
                    dataAniversario = new DateTime(ano, 12, 1);
                }
            }

            return(dataAniversario);
        }
        public void RealizarMigracao()
        {
            List <ForecastET> forecasts = new List <ForecastET>();

            List <ForecastET> forecastsPorAno = new List <ForecastET>();
            var connectionStringEacesso       = _connectionStrings.Value.EacessoConnection;

            using (IDbConnection dbConnection = new SqlConnection(connectionStringEacesso))
            {
                dbConnection.Open();

                var listaAno = ObterEfaturamentoAnos(dbConnection);

                listaAno.ForEach(ano =>
                {
                    var efaturamentoAgrupadoDtoLista = ObterEfaturamentoAgrupadoDto(dbConnection, ano).ToList();

                    foreach (var efaturamentoAgrupadoDto in efaturamentoAgrupadoDtoLista)
                    {
                        List <EfaturamentoAgrupadoDto> efaturamentoAgrupadoDtoGrupoLista = new List <EfaturamentoAgrupadoDto>();
                        try
                        {
                            var efaturamentoAgrupadoDtoGrupoExiste = forecastsPorAno.Any(e =>

                                                                                         e.IdCelula == efaturamentoAgrupadoDto.IdCelula &&
                                                                                         e.IdCliente == efaturamentoAgrupadoDto.IdCliente &&
                                                                                         e.IdServico == efaturamentoAgrupadoDto.IdServico &&
                                                                                         e.NrAno == ano
                                                                                         );

                            if (!efaturamentoAgrupadoDtoGrupoExiste)
                            {
                                efaturamentoAgrupadoDtoGrupoLista = efaturamentoAgrupadoDtoLista.FindAll(e =>

                                                                                                         e.IdCelula == efaturamentoAgrupadoDto.IdCelula &&
                                                                                                         e.IdCliente == efaturamentoAgrupadoDto.IdCliente &&
                                                                                                         e.IdServico == efaturamentoAgrupadoDto.IdServico &&
                                                                                                         e.Ano == ano
                                                                                                         );

                                if (efaturamentoAgrupadoDtoGrupoLista != null && efaturamentoAgrupadoDtoGrupoLista.Count > 0)
                                {
                                    var efaturamentoAgrupadoDtoGrupo = new EfaturamentoAgrupadoDto
                                    {
                                        IdCelula                        = efaturamentoAgrupadoDtoGrupoLista.First().IdCelula,
                                        IdCliente                       = efaturamentoAgrupadoDtoGrupoLista.First().IdCliente,
                                        IdServico                       = efaturamentoAgrupadoDtoGrupoLista.First().IdServico,
                                        Ano                             = efaturamentoAgrupadoDtoGrupoLista.First().Ano,
                                        ValorRecorrente                 = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrente),
                                        ValorRecorrenteNao              = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrenteNao),
                                        ValorRecorrenteNovasVendas      = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrenteNovasVendas),
                                        ValorRecorrentePerdas           = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrentePerdas),
                                        ValorRecorrenteMultas           = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrenteMultas),
                                        ValorRecorrenteRepactuacao      = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrenteRepactuacao),
                                        ValorRecorrenteRepactuacaoRetro = efaturamentoAgrupadoDtoGrupoLista.Sum(x => x.ValorRecorrenteRepactuacaoRetro),
                                    };

                                    var forecastET = new ForecastET
                                    {
                                        IdCelula               = efaturamentoAgrupadoDtoGrupo.IdCelula,
                                        IdCliente              = efaturamentoAgrupadoDtoGrupo.IdCliente,
                                        IdServico              = efaturamentoAgrupadoDtoGrupo.IdServico,
                                        NrAno                  = efaturamentoAgrupadoDtoGrupo.Ano,
                                        DataAplicacaoReajuste  = ObterDataAplicacaoReajuste(dbConnection, efaturamentoAgrupadoDtoGrupo.IdCelula, efaturamentoAgrupadoDtoGrupo.IdCliente, efaturamentoAgrupadoDtoGrupo.IdServico, ano),
                                        DataReajusteRetroativo = ObterDataReajusteRetroativo(dbConnection, efaturamentoAgrupadoDtoGrupo.IdCelula, efaturamentoAgrupadoDtoGrupo.IdCliente, efaturamentoAgrupadoDtoGrupo.IdServico, ano),
                                        //IdStatus = 0, //TODO EM BRANCO
                                        Usuario       = "Eacesso",
                                        DataAlteracao = DateTime.Now,
                                        //DescricaoJustificativa = "Teste de migração",
                                        ValorForecast = new ValorForecast
                                        {
                                            VlPercentual   = ObterValorPercentual(efaturamentoAgrupadoDtoGrupo),
                                            ValorJaneiro   = ObterValoreMes(ano, 1, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorFevereiro = ObterValoreMes(ano, 2, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorMarco     = ObterValoreMes(ano, 3, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorAbril     = ObterValoreMes(ano, 4, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorMaio      = ObterValoreMes(ano, 5, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorJunho     = ObterValoreMes(ano, 6, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorJulho     = ObterValoreMes(ano, 7, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorAgosto    = ObterValoreMes(ano, 8, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorSetembro  = ObterValoreMes(ano, 9, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorOutubro   = ObterValoreMes(ano, 10, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorNovembro  = ObterValoreMes(ano, 11, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            ValorDezembro  = ObterValoreMes(ano, 12, efaturamentoAgrupadoDtoLista, efaturamentoAgrupadoDto),
                                            Usuario        = "Eacesso",
                                            DataAlteracao  = DateTime.Now
                                        }
                                    };
                                    adicionarValorTotal(forecastET);
                                    //TODO Data de Aniversário para vir em branco
                                    //forecastET.DataAniversario = ObterDataAniversario(forecastET);

                                    forecastsPorAno.Add(forecastET);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            var erroMsg = "IdCelula:" + efaturamentoAgrupadoDtoGrupoLista.First().IdCelula.ToString() + " IdCliente: " + efaturamentoAgrupadoDtoGrupoLista.First().IdCliente.ToString() + " IdServico:" + efaturamentoAgrupadoDtoGrupoLista.First().IdServico.ToString();
                            AdicionarLogGenerico(ex, "Erro ao migrar dados FORECAST ano:" + ano.ToString(), erroMsg);
                            continue;
                        }
                    }

                    _forecastRepository.AdicionarRange(forecastsPorAno);
                    _unitOfWork.Commit();

                    forecastsPorAno = new List <ForecastET>();
                });
                dbConnection.Close();
            }
        }
 public ForecastET VerificarSeRegistroExiste(ForecastET forecast)
 {
     return(_forecastRepository.Buscar(forecast.IdCelula, forecast.IdCliente, forecast.IdServico, forecast.NrAno));
 }
 public void Update(ForecastET forecast)
 {
     _context.Entry(forecast);
     DbSet.Update(forecast);
     AtualizarDataAlteracaoEUsuario();
 }