public IHttpActionResult GetTransactionsLog()
        {
            var transactionLog = _unitOfWork.TransactionLogs.GetAllOrderByCreationTsDesc();

            List <TransactionApiOutputDto> _transactionsApiOutputDto = new List <TransactionApiOutputDto>();

            foreach (var l in transactionLog)
            {
                var transactionId = _unitOfWork.Transactions.GetTransactionFromTransactionLog(l.Id);

                var transactionApiOutputDto = new TransactionApiOutputDto
                {
                    amount             = l.Amount,
                    card_brand         = l.Card_brand,
                    card_holder_name   = l.Card_holder_name,
                    card_number_first  = l.Card_number_first,
                    card_number_last   = l.Card_number_last,
                    creation_timestamp = l.Creation_timestamp,
                    installments       = l.Installments,
                    status_code        = l.Status_code,
                    status_reason      = l.Status_reason,
                    transaction_id     = transactionId,
                    transaction_type   = l.Transaction_type,
                    transaction_log_id = l.Id
                };

                var errorLog = _unitOfWork.ErrorLogs.GetAllErrorsFromTransactionLog(l.Id);

                List <ErrorDto> _errorsDto = new List <ErrorDto>();
                foreach (var e in errorLog)
                {
                    var errorDto = new ErrorDto(e.Error_code, e.Error_message);
                    _errorsDto.Add(errorDto);
                }

                transactionApiOutputDto.errors = _errorsDto;

                _transactionsApiOutputDto.Add(transactionApiOutputDto);
            }

            return(Ok(_transactionsApiOutputDto));
        }
        public IHttpActionResult GetTransactionLog(int id)
        {
            var transactionLog = _unitOfWork.TransactionLogs.SingleOrDefault(c => c.Id == id);

            if (transactionLog == null)
            {
                return(NotFound());
            }

            var transactionId = _unitOfWork.Transactions.GetTransactionFromTransactionLog(id);

            var transactionApiOutputDto = new TransactionApiOutputDto
            {
                amount             = transactionLog.Amount,
                card_brand         = transactionLog.Card_brand,
                card_holder_name   = transactionLog.Card_holder_name,
                card_number_first  = transactionLog.Card_number_first,
                card_number_last   = transactionLog.Card_number_last,
                creation_timestamp = transactionLog.Creation_timestamp,
                installments       = transactionLog.Installments,
                status_code        = transactionLog.Status_code,
                status_reason      = transactionLog.Status_reason,
                transaction_id     = transactionId,
                transaction_type   = transactionLog.Transaction_type,
                transaction_log_id = transactionLog.Id
            };

            var errorLog = _unitOfWork.ErrorLogs.GetAllErrorsFromTransactionLog(transactionLog.Id);

            List <ErrorDto> _errorsDto = new List <ErrorDto>();

            foreach (var e in errorLog)
            {
                var errorDto = new ErrorDto(e.Error_code, e.Error_message);
                _errorsDto.Add(errorDto);
            }

            transactionApiOutputDto.errors = _errorsDto;

            return(Ok(transactionApiOutputDto));
        }
        public IHttpActionResult CreateTransaction(TransactionApiInputDto transactionApiInputDto)
        {
            //Coloca valor do parâmetro show_errors numa var booleana para uso futuro
            var showErros = transactionApiInputDto.show_errors;

            //Cria lista de erros encontrados durante a validação
            List <Error> errors = new List <Error>();

            var transactionType = new TransactionType();
            var cardBrand       = new CardBrand();
            var card            = new Card();
            var clientInDB      = new Client();

            decimal transAmountInDecimal = 0m;

            //A transação é presumida recusada inicialmente
            var statusCode   = Constantes.scRecusada;
            var statusReason = Constantes.srErroInesperado;

            if (!ModelState.IsValid)
            {
                foreach (var e in ModelState.SelectMany(keyValuePair => keyValuePair.Value.Errors))
                {
                    errors.Add(new Error(500, "Erro Inesperado (" + e.ErrorMessage + ")"));
                }
                //errors.Add(new Error(500, "Erro Inesperado."));
            }

            if (errors.Count == 0)
            {
                var validador = new Validador(_unitOfWork, showErros);
                validador.ProcessTransaction(transactionApiInputDto);

                statusCode   = validador.statusCode;
                statusReason = validador.statusReason;

                transAmountInDecimal = validador.transAmountInDecimal;

                transactionType = validador.transactionType;
                cardBrand       = validador.cardBrand;
                card            = validador.card;
                clientInDB      = validador.clientInDB;

                errors = validador.errors;
            }
            ;

            // *** FIM DA VALIDAÇÂO ***


            //___/ Cria Dto para saida da API \_____________________

            var transactionApiOutputDto = new TransactionApiOutputDto();

            transactionApiOutputDto.amount           = transactionApiInputDto.amount;
            transactionApiOutputDto.card_brand       = transactionApiInputDto.card_brand;
            transactionApiOutputDto.card_holder_name = transactionApiInputDto.card_holder_name;

            var cardNumberFirst = "";
            var cardNumberLast  = "";

            if (!String.IsNullOrEmpty(transactionApiInputDto.card_number))
            {
                cardNumberFirst = transactionApiInputDto.card_number.Substring(1, 4);
                if (transactionApiInputDto.card_number.Length >= 4)
                {
                    cardNumberLast = transactionApiInputDto.card_number.Substring(transactionApiInputDto.card_number.Length - 4, 4);
                }
            }

            transactionApiOutputDto.card_number_first = cardNumberFirst;
            transactionApiOutputDto.card_number_last  = cardNumberLast;

            transactionApiOutputDto.installments       = transactionApiInputDto.installments;
            transactionApiOutputDto.transaction_type   = transactionApiInputDto.transaction_type;
            transactionApiOutputDto.creation_timestamp = DateTime.Now;

            transactionApiOutputDto.status_code   = statusCode;
            transactionApiOutputDto.status_reason = statusReason;

            //Gera registro da transação(transaction log) solicitada para ser salva na base de dados
            var transactionLog = new TransactionLog
            {
                Amount             = transactionApiInputDto.amount,
                Card_brand         = transactionApiInputDto.card_brand,
                Card_holder_name   = transactionApiInputDto.card_holder_name,
                Card_number_first  = cardNumberFirst,
                Card_number_last   = cardNumberLast,
                Installments       = transactionApiInputDto.installments,
                Transaction_type   = transactionApiInputDto.transaction_type,
                Status_code        = statusCode,
                Status_reason      = statusReason,
                Creation_timestamp = DateTime.Now,
            };

            //Adiciona registro de TransactionLog a base de dados
            _unitOfWork.TransactionLogs.Add(transactionLog);

            //Caso algum erro tenha sido encontrado...
            if (errors.Count > 0)
            {
                if (showErros)
                {
                    //Passa todos os erros em errors para errorsDto
                    List <ErrorDto> errorsDto = new List <ErrorDto>();
                    if (errors.Count > 0)
                    {
                        foreach (var e in errors)
                        {
                            var errorDto = new ErrorDto(e.error_code, e.error_message);
                            errorsDto.Add(errorDto);
                            var errorLog = new ErrorLog
                            {
                                TransactionLogId = transactionLog.Id,
                                Error_code       = e.error_code,
                                Error_message    = e.error_message
                            };
                            _unitOfWork.ErrorLogs.Add(errorLog);
                        }
                    }

                    //Adiciona erros à TransactionApiOutputDto
                    transactionApiOutputDto.errors = errorsDto;
                }

                //Atualiza a base de dados
                _unitOfWork.Complete();

                //Adiciona registro de TransactionLog a Dto de saida
                transactionApiOutputDto.transaction_log_id = transactionLog.Id;

                //Retorna TransactionApiPoutputDto como JSon
                return(Json(transactionApiOutputDto));
            }


            // Validação Terminada com Sucesso \__________________

            // Criar a transação vinculada ao cartão e coloca a data de criação
            var transaction = new Transaction {
                Amount            = transAmountInDecimal,
                Card              = card,
                TransactionType   = transactionType,
                Installments      = transactionApiInputDto.installments,
                CreationTimestamp = DateTime.Now,
                TransactionLogId  = transactionLog.Id
            };

            //Adiciona a transação à base de dados
            _unitOfWork.Transactions.Add(transaction);

            //Atualiza o saldo do cliente com o valor da transação
            clientInDB.Saldo = clientInDB.Saldo - transAmountInDecimal;

            //Atualiza a base de dados
            _unitOfWork.Complete();

            //Adiciona registro de TransactionLog a Dto de saida
            transactionApiOutputDto.transaction_log_id = transactionLog.Id;

            //Atualiza a TransactionApiOutputDto com a Id da transação
            transactionApiOutputDto.transaction_id = transaction.Id;

            //Retorna TransactionApiOutputDto como Json e disponibiliza o link para a transação criada
            return(Created(new Uri(Request.RequestUri + "/" + transaction.Id), transactionApiOutputDto));
        }