예제 #1
0
        public async Task <ISaida> LancarParcela(LancarParcelaEntrada lancarEntrada)
        {
            // Verifica se as informações para o lançamento foram informadas corretamente
            if (lancarEntrada.Invalido)
            {
                return(new Saida(false, lancarEntrada.Mensagens, null));
            }

            var parcela = await _parcelaRepositorio.ObterPorId(lancarEntrada.IdParcela, true);

            // Verifica se a parcela existe
            this.NotificarSeNulo(parcela, ParcelaMensagem.Id_Parcela_Nao_Existe);

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

            // Verifica se a parcela pertece a um agendamento do usuário informado.
            this.NotificarSeDiferentes(parcela.Agendamento.IdUsuario, lancarEntrada.IdUsuario, ParcelaMensagem.Parcela_Lancar_Nao_Pertence_Usuario);

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

            // Verifica se a parcela já foi lançada ou descartada
            this.NotificarSeVerdadeiro(parcela.Lancada, ParcelaMensagem.Parcela_Lancar_Ja_Lancada);
            this.NotificarSeVerdadeiro(parcela.Descartada, ParcelaMensagem.Parcela_Lancar_Ja_Descartada);

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

            parcela.Lancar(lancarEntrada);

            _parcelaRepositorio.Atualizar(parcela);

            // Cadastro o lançamento
            var cadastrarEntrada = new CadastrarLancamentoEntrada(
                parcela.Agendamento.IdUsuario,
                parcela.Agendamento.IdConta.Value,
                parcela.Agendamento.IdCategoria,
                lancarEntrada.Data,
                lancarEntrada.Valor,
                parcela.Agendamento.IdPessoa,
                parcela.Id,
                lancarEntrada.Observacao);

            var lancamento = new Lancamento(cadastrarEntrada);

            await _lancamentoRepositorio.Inserir(lancamento);

            await _uow.Commit();

            return(_uow.Invalido
                ? new Saida(false, _uow.Mensagens, null)
                : new Saida(true, new[] { ParcelaMensagem.Parcela_Lancada_Com_Sucesso }, new ParcelaSaida(parcela)));
        }
예제 #2
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))));
        }
        public void InserirLancamento(LancamentoFinanceiro lancamentoFinanceiro)
        {
            if (!_lancamentoRepositorio.ExisteTipoLancamento(lancamentoFinanceiro.TipoLancamento.ID))
            {
                throw new Exception(Mensagens.MENSAGEM_NAO_EXISTE_TIPO_LANCAMENTO_CADASTRADRO);
            }

            _lancamentoRepositorio.Inserir(lancamentoFinanceiro);
        }
        public void InserirLancamento(LancamentoFinanceiro lancamentoFinanceiro)
        {
            if (!_lancamentoRepositorio.ExisteTipoLancamento(lancamentoFinanceiro.TipoLancamento.ID))
            {
                throw new Exception("Tipo de lançamento não cadastrado!");
            }

            _lancamentoRepositorio.Inserir(lancamentoFinanceiro);
        }
예제 #5
0
        public void InserirLancamento(LancamentoFinanceiro lancamentoFinanceiro)
        {
            if (lancamentoFinanceiro.EntidadeValida())
            {
                throw new Exception(Mensagens.MENSAGEM_CAMPOS_OBRIGATORIOS_LANCAMENTO);
            }

            if (!_lancamentoRepositorio.ExisteTipoLancamento(lancamentoFinanceiro.TipoLancamento.Id))
            {
                throw new Exception(Mensagens.MENSAGEM_NAO_EXISTE_TIPO_LANCAMENTO_CADASTRADRO);
            }

            lancamentoFinanceiro.SetarValoresPadraoInserir();

            _lancamentoRepositorio.Inserir(lancamentoFinanceiro);
        }
예제 #6
0
        public async Task <ISaida> CadastrarLancamento(CadastrarLancamentoEntrada cadastroEntrada)
        {
            // Verifica se as informações para cadastro foram informadas corretamente
            if (cadastroEntrada.Invalido)
            {
                return(new Saida(false, cadastroEntrada.Mensagens, null));
            }

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

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

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

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

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

            var lancamento = new Lancamento(cadastroEntrada);

            await _lancamentoRepositorio.Inserir(lancamento);

            await _uow.Commit();

            return(_uow.Invalido
                ? new Saida(false, _uow.Mensagens, null)
                : new Saida(true, new[] { LancamentoMensagem.Lancamento_Cadastrado_Com_Sucesso }, new LancamentoSaida(await _lancamentoRepositorio.ObterPorId(lancamento.Id))));
        }
예제 #7
0
        public async Task <ISaida> PagarFatura(PagarFaturaEntrada entrada)
        {
            // Verifica se as informações para alteração foram informadas corretamente
            if (entrada.Invalido)
            {
                return(new Saida(false, entrada.Mensagens, null));
            }

            var cartaoSaida = await this.ObterCartaoCreditoPorId(entrada.IdCartaoCredito, entrada.IdUsuario, false);

            if (!cartaoSaida.Sucesso)
            {
                return(cartaoSaida);
            }

            var cartaoCredito = (CartaoCreditoSaida)cartaoSaida.Retorno;

            var dataFatura = new DateTime(entrada.AnoFatura, entrada.MesFatura, cartaoCredito.DiaVencimentoFatura);

            // Obtém todas as parcelas que compôem a fatura
            var parcelas = await _parcelaRepositorio.ObterPorCartaoCredito(entrada.IdCartaoCredito, dataFatura);

            var valorFatura = parcelas?.Where(x => !x.Lancada && !x.Descartada).Sum(x => x.Valor) + (entrada.ValorAdicionalDebito.HasValue ? entrada.ValorAdicionalDebito.Value : 0) - (entrada.ValorAdicionalCredito.HasValue ? entrada.ValorAdicionalCredito.Value : 0) ?? 0;

            // Verifica se o valor do pagamento é suficiente para o pagamento da fatura
            this.NotificarSeMenorQue(entrada.ValorPagamento, valorFatura, CartaoCreditoMensagem.Fatura_Valor_Pagamento_Menor_Valor_Total_Fatura);

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

            var contaSaida = await _contaServico.ObterContaPorId(entrada.IdContaPagamento, entrada.IdUsuario);

            if (!contaSaida.Sucesso)
            {
                return(cartaoSaida);
            }

            var contaPagamento = (ContaSaida)contaSaida.Retorno;

            // Verifica se o saldo da conta é maior ou igual ao valor da fatura
            this.NotificarSeMenorQue(contaPagamento.ValorSaldoAtual ?? 0, entrada.ValorPagamento, string.Format(CartaoCreditoMensagem.Fatura_Saldo_Insuficiente_Pagamento_Fatura, contaPagamento.ValorSaldoAtual?.ToString("C2")));

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

            Pessoa pessoa = null;

            if (entrada.IdPessoaPagamento.HasValue)
            {
                pessoa = await _pessoaRepositorio.ObterPorId(entrada.IdPessoaPagamento.Value);

                this
                .NotificarSeNulo(pessoa, PessoaMensagem.Id_Pessoa_Nao_Existe)
                .NotificarSeDiferentes(pessoa?.IdUsuario, entrada.IdUsuario, PessoaMensagem.Pessoa_Nao_Pertence_Usuario);

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

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

            var lancamentoFatura = new Lancamento(new LancamentoEntrada(
                                                      entrada.IdUsuario,
                                                      entrada.IdContaPagamento,
                                                      (int)TipoCategoriaEspecial.PagamentoFaturaCartao,
                                                      entrada.DataPagamento,
                                                      entrada.ValorPagamento,
                                                      idPessoa: pessoa?.Id,
                                                      observacao: $"Fatura {dataFatura.ToString("MMM").ToUpper()}/{dataFatura.ToString("yyyy")}"));

            // Insere o lançamento referente ao pagamento da fatura
            await _lancamentoRepositorio.Inserir(lancamentoFatura);

            await _uow.Commit();

            var fatura = new Fatura(
                entrada.IdCartaoCredito,
                lancamentoFatura.Id,
                entrada.MesFatura,
                entrada.AnoFatura,
                entrada.ValorAdicionalCredito,
                entrada.ObservacaoCredito,
                entrada.ValorAdicionalDebito,
                entrada.ObservacaoDebito);

            // Insere a fatura
            await _faturaRepositorio.Inserir(fatura);

            await _uow.Commit();

            foreach (var parcela in parcelas)
            {
                parcela.PagarFatura(fatura.Id, entrada.DataPagamento);
            }

            await _uow.Commit();

            fatura = await _faturaRepositorio.ObterPorId(fatura.Id);

            return(new Saida(true, new[] { CartaoCreditoMensagem.Fatura_Paga_Com_Sucesso }, new FaturaSaida(fatura, parcelas.Select(x => new ParcelaSaida(x)).ToList())));
        }
예제 #8
0
        public async Task <ISaida> RealizarTransferencia(TransferenciaEntrada entrada)
        {
            // Verifica se as informações para realizar a transferência foram informadas corretamente
            if (entrada.Invalido)
            {
                return(new Saida(false, entrada.Mensagens, null));
            }

            var contaOrigem = await _contaRepositorio.ObterPorId(entrada.IdContaOrigem);

            var contaDestino = await _contaRepositorio.ObterPorId(entrada.IdContaDestino);

            this
            .NotificarSeNulo(contaOrigem, ContaMensagem.Conta_Origem_Transferencia_Nao_Existe)
            .NotificarSeNulo(contaDestino, ContaMensagem.Conta_Destino_Transferencia_Nao_Existe);

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

            this
            .NotificarSeFalso(contaOrigem.IdUsuario == entrada.IdUsuario, ContaMensagem.Conta_Origem_Transferencia_Nao_Pertence_Usuario)
            .NotificarSeFalso(contaDestino.IdUsuario == entrada.IdUsuario, ContaMensagem.Conta_Destino_Transferencia_Nao_Pertence_Usuario);

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

            var saldoDisponivelOrigem = await CalcularSaldoDisponivelAtual(contaOrigem);

            saldoDisponivelOrigem = saldoDisponivelOrigem ?? 0;

            // Verifica se a conta de origem possui saldo suficiente para realizar a transferência
            this.NotificarSeVerdadeiro(saldoDisponivelOrigem < entrada.Valor, string.Format(ContaMensagem.Saldo_Insuficiente_Conta_Origem_Transferencia, saldoDisponivelOrigem?.ToString("C2")));

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

            var idTransferencia = Guid.NewGuid().ToString();

            // Lançamento de origem
            var lancamentoOrigem = new Lancamento(new LancamentoEntrada(
                                                      entrada.IdUsuario,
                                                      entrada.IdContaOrigem,
                                                      (int)TipoCategoriaEspecial.TransferenciaOrigem,
                                                      entrada.Data,
                                                      entrada.Valor,
                                                      observacao: !string.IsNullOrEmpty(entrada.Observacao)
                    ? $"Transferência para {contaDestino.Nome} ({entrada.Observacao})"
                    : $"Transferência para {contaDestino.Nome}"), idTransferencia);

            // Lançamento de destino
            var lancamentoDestino = new Lancamento(new LancamentoEntrada(
                                                       entrada.IdUsuario,
                                                       entrada.IdContaDestino,
                                                       (int)TipoCategoriaEspecial.TransferenciaDestino,
                                                       entrada.Data,
                                                       entrada.Valor,
                                                       observacao: !string.IsNullOrEmpty(entrada.Observacao)
                    ? $"Transferência de {contaOrigem.Nome} ({entrada.Observacao})"
                    : $"Transferência de {contaOrigem.Nome}"), idTransferencia);

            await _lancamentoRepositorio.Inserir(lancamentoOrigem);

            await _lancamentoRepositorio.Inserir(lancamentoDestino);

            await _uow.Commit();

            saldoDisponivelOrigem = await CalcularSaldoDisponivelAtual(contaOrigem);

            var saldoDisponivelDestino = await CalcularSaldoDisponivelAtual(contaDestino);

            var contaOrigemSaida = new ContaSaida(contaOrigem, saldoDisponivelOrigem);

            var contaDestinoSaida = new ContaSaida(contaDestino, saldoDisponivelDestino);

            return(new Saida(true, new[] { ContaMensagem.Transferencia_Realizada_Com_Sucesso }, new TransferenciaSaida(contaOrigemSaida, contaDestinoSaida, entrada.Data, entrada.Valor, entrada.Observacao)));
        }