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)))); }
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)); }
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))); } }