コード例 #1
0
ファイル: ContaController.cs プロジェクト: wbuback/bufunfa
        public async Task <IActionResult> RealizarTransferencia([FromBody, SwaggerParameter("Informações da transferência.", Required = true)] TransferenciaViewModel model)
        {
            var entrada = new TransferenciaEntrada(
                base.ObterIdUsuarioClaim(),
                model.IdContaOrigem.Value,
                model.IdContaDestino.Value,
                model.Data.Value,
                model.Valor.Value,
                model.Observacao);

            return(new ApiResult(await _contaServico.RealizarTransferencia(entrada)));
        }
コード例 #2
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)));
        }