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