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;
            }
        }
Пример #2
0
        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);
        }