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