public async Task <Unit> Handle(ComandoDeLancamentoFinanceiro comando, CancellationToken cancellationToken) { await unitOfWork.BeginTransaction(); try { var conta = await repositorioDeContas.ObtemConta(comando.ContaDestino, comando.BancoDestino, comando.TipoDeConta, comando.CpfCnpjDestino); if (comando.TipoDeLancamento == TipoDeLancamento.Pagamento) { var pagamento = new Pagamento( comando.Protocolo, comando.Valor, comando.Descricao, new DateTime(comando.data_de_lancamento.Year, comando.data_de_lancamento.Month, comando.data_de_lancamento.Day) ); // var lancamento = await conta.Lanca(pagamento); // await repositorioDeContas.Atualiza(conta); //await repositorioDeLancamentos.Adiciona(lancamento); var evento = new EventoDeLancamentoFinanceiroProcessado { Lancamento = lancamento }; await mediator.Publish(evento); } await unitOfWork.Commit(); return(await Unit.Task); } catch (Exception ex) { var _ = ex.Message; await unitOfWork.Rollback(); throw; } }
internal async Task <Lancamento> Lanca(Pagamento pagamento) { var saldo = await ObtemSaldoNaData(pagamento.Data); if (saldo.Valor - pagamento.Valor < LIMITE_DE_SALDO) { throw new ApplicationException("A conta não pode ficar mais de R$ 20.000,00 negativos"); } saldo.Valor = saldo.Valor - pagamento.Valor; var lancamento = new Lancamento( pagamento.Protocolo, this, pagamento.Data, pagamento.Descricao, pagamento.Valor, TipoDeLancamento.Pagamento ); await repositorio.Adiciona(lancamento); return(lancamento); }