Esempio n. 1
0
        public void Transferir(TransferenciaDTO transferenciaDTO)
        {
            var notificacoes = transferenciaDTO.Validar();

            if (notificacoes.Any())
            {
                NotificarErroNegocio(notificacoes);
                return;
            }

            var contaOrigem = _contaRepository.Buscar
                              (
                transferenciaDTO.BancoOrigem,
                transferenciaDTO.ContaOrigem,
                transferenciaDTO.AgenciaOrigem
                              );

            if (contaOrigem == null)
            {
                NotificarErroNegocio("Conta de origem não encontrada");
                return;
            }

            var contaDestino = _contaRepository.Buscar
                               (
                transferenciaDTO.BancoDestino,
                transferenciaDTO.ContaDestino,
                transferenciaDTO.AgenciaDestino
                               );

            if (contaDestino == null)
            {
                NotificarErroNegocio("Conta de Destino não encontrada");
                return;
            }

            if (!contaOrigem.Debitar(transferenciaDTO.Valor))
            {
                NotificarErroNegocio("Saldo insuficiente para completar a operação");
                return;
            }

            contaDestino.Creditar(transferenciaDTO.Valor);

            var lancamento = new Lancamento
            {
                ContaDestino = contaDestino,
                ContaOrigem  = contaOrigem,
                Data         = DateTime.Now,
                Valor        = transferenciaDTO.Valor
            };

            _contaRepository.Atualizar(contaOrigem);
            _contaRepository.Atualizar(contaDestino);
            _contaRepository.AdicionarLancamento(lancamento);

            try
            {
                _unitOfWork.Commit();
            }
            catch (Exception ex)
            {
                NotificarErroInterno(ex.Message);
            }
        }