Ejemplo n.º 1
0
        public async Task <ISaida> CadastrarLancamento(LancamentoEntrada entrada)
        {
            // Verifica se as informações para cadastro foram informadas corretamente
            if (entrada.Invalido)
            {
                return(new Saida(false, entrada.Mensagens, null));
            }

            // Verifica se a categoria existe a partir do ID informado.
            this.NotificarSeFalso(await _categoriaRepositorio.VerificarExistenciaPorId(entrada.IdUsuario, entrada.IdCategoria), CategoriaMensagem.Id_Categoria_Nao_Existe);

            // Verifica se a conta existe a partir do ID informado.
            this.NotificarSeFalso(await _contaRepositorio.VerificarExistenciaPorId(entrada.IdUsuario, entrada.IdConta), ContaMensagem.Id_Conta_Nao_Existe);

            // Verifica se a pessoa existe a partir do ID informado.
            if (entrada.IdPessoa.HasValue)
            {
                this.NotificarSeFalso(await _pessoaRepositorio.VerificarExistenciaPorId(entrada.IdUsuario, entrada.IdPessoa.Value), PessoaMensagem.Id_Pessoa_Nao_Existe);
            }

            // Verifica se a parcela existe a partir do ID informado.
            if (entrada.IdParcela.HasValue)
            {
                this.NotificarSeFalso(await _parcelaRepositorio.VerificarExistenciaPorId(entrada.IdUsuario, entrada.IdParcela.Value), ParcelaMensagem.Id_Parcela_Nao_Existe);
            }

            if (this.Invalido)
            {
                return(new Saida(false, this.Mensagens, null));
            }

            var conta = await _contaRepositorio.ObterPorId(entrada.IdConta);

            // Verifica se a quantidade de ações vendidas é maior que o total de ações disponíveis na carteira.
            if (conta.Tipo == TipoConta.Acoes && entrada.IdCategoria == (int)TipoCategoriaEspecial.VendaAcoes)
            {
                var operacoes = await _lancamentoRepositorio.ObterPorPeriodo(conta.Id, new DateTime(2019, 1, 1), DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59));

                var qtdAcoesCompradas = operacoes.Where(x => x.IdCategoria == (int)TipoCategoriaEspecial.CompraAcoes).Sum(x => x.QtdRendaVariavel.HasValue ? x.QtdRendaVariavel.Value : 0);
                var qtdAcoesVendidas  = operacoes.Where(x => x.IdCategoria == (int)TipoCategoriaEspecial.VendaAcoes).Sum(x => x.QtdRendaVariavel.HasValue ? x.QtdRendaVariavel.Value : 0);

                var qtdAcoesDisponivel = qtdAcoesCompradas - qtdAcoesVendidas;

                this.NotificarSeVerdadeiro(entrada.QuantidadeAcoes > qtdAcoesDisponivel, LancamentoMensagem.Qtd_Acoes_Venda_Maior_Disponivel_Carteira);

                if (this.Invalido)
                {
                    return(new Saida(false, this.Mensagens, null));
                }
            }

            var lancamento = new Lancamento(entrada);

            await _lancamentoRepositorio.Inserir(lancamento);

            await _uow.Commit();

            return(new Saida(true, new[] { LancamentoMensagem.Lancamento_Cadastrado_Com_Sucesso }, new LancamentoSaida(await _lancamentoRepositorio.ObterPorId(lancamento.Id))));
        }
Ejemplo n.º 2
0
        private async Task <PeriodoGraficoRelacaoValorCategoriaPorAnoSaida> ObterPeriodoGraficoRelacaoValorCategoriaPorAnoSaida(int ano, int idCategoria, PeriodoSaida periodo, int idUsuario)
        {
            var dataInicioPeriodo = periodo.DataInicio.Year < ano ? new DateTime(ano, 1, 1) : periodo.DataInicio;
            var dataFimPeriodo    = periodo.DataFim.Year > ano ? new DateTime(ano, 12, 31) : periodo.DataFim;

            // Obtém todos os lançamentos para um período
            var lancamentosPorPeriodo = await _lancamentoRepositorio.ObterPorPeriodo(dataInicioPeriodo, dataFimPeriodo, idUsuario);

            // Obtém somente os lançamentos do período com a categoria informada
            var lancamentosGrafico = lancamentosPorPeriodo?.Where(x => x.Categoria.IdCategoriaPai == idCategoria || x.Categoria.Id == idCategoria).Select(x => new LancamentoSaida(x));

            // Obtém os detalhes dos lançamentos onde o detalhe possui a categoria informada
            var lancamentoDetalhesGrafico = (from lancamento in lancamentosPorPeriodo
                                             from detalhe in lancamento.Detalhes
                                             where detalhe.Categoria.IdCategoriaPai == idCategoria || detalhe.Categoria.Id == idCategoria
                                             select detalhe)?.Select(x => new LancamentoDetalheSaida(x)).ToList();

            // Obtém as parcelas de faturas já lançadas, com a categoria informada
            var parcelasGrafico = (await _parcelaRepositorio.ObterPorDataLancamento(dataInicioPeriodo, dataFimPeriodo, idUsuario))?.Where(x => x.Agendamento.Categoria.IdCategoriaPai == idCategoria || x.Agendamento.IdCategoria == idCategoria).Select(x => new ParcelaSaida(x));

            return(new PeriodoGraficoRelacaoValorCategoriaPorAnoSaida(
                       periodo,
                       lancamentosGrafico,
                       lancamentoDetalhesGrafico,
                       parcelasGrafico,
                       dataInicioPeriodo != periodo.DataInicio ? dataInicioPeriodo : (DateTime?)null,
                       dataFimPeriodo != periodo.DataFim ? dataFimPeriodo : (DateTime?)null));
        }
Ejemplo n.º 3
0
        public async Task <ISaida> ObterAnaliseAtivo(int idConta, int idUsuario, decimal?valorCotacao = null)
        {
            var saida = await ObterContaPorId(idConta, idUsuario);

            if (!saida.Sucesso || saida.Sucesso && saida.Retorno == null)
            {
                return(saida);
            }

            var conta = (ContaSaida)saida.Retorno;

            this.NotificarSeFalso(conta.CodigoTipo == (int)TipoConta.Acoes || conta.CodigoTipo == (int)TipoConta.FII, ContaMensagem.Analise_Carteira_Somente_Conta_Renda_Variavel);

            if (this.Invalido)
            {
                return(new Saida(false, this.Mensagens, null));
            }

            var operacoes = await _lancamentoRepositorio.ObterPorPeriodo(conta.Id, new DateTime(2019, 1, 1), DateTime.Today.AddHours(23).AddMinutes(59).AddSeconds(59));

            if (valorCotacao.HasValue && valorCotacao.Value > 0)
            {
                // O valor da cotação foi informado manualmente.
                return(new Saida(true, new[] { ContaMensagem.Analise_Carteira_Obtida_Com_Sucesso }, new RendaVariavelAnaliseSaida(conta, operacoes, new RendaVariavelCotacaoSaida(valorCotacao.Value))));
            }
            else if (valorCotacao.HasValue && valorCotacao.Value == 0)
            {
                // Obtém a cotação da ação junto a API
                var apiSaida = await _apiAlphaVantageProxy.ObterCotacaoPorSiglaAtivo(conta.Nome);

                var cotacao = apiSaida != null
                    ? new RendaVariavelCotacaoSaida(apiSaida.Price, apiSaida.ChangePercent, apiSaida.LatestTradingDay)
                    : null;

                return(new Saida(true, new[] { ContaMensagem.Analise_Carteira_Obtida_Com_Sucesso }, new RendaVariavelAnaliseSaida(conta, operacoes, cotacao)));
            }
            else
            {
                return(new Saida(true, new[] { ContaMensagem.Analise_Carteira_Obtida_Com_Sucesso }, new RendaVariavelAnaliseSaida(conta, operacoes, null)));
            }
        }