Ejemplo n.º 1
0
        public bool ValidateAndMapCreateTransaction(TransactionViewModel vm, Controller controller, string userId, out Transaction transaction, out ErrorViewModel errors)
        {
            var modelState = controller.ModelState;
            transaction = null;
            errors = null;

            if (vm.Total == null || vm.Total <= 0)
            {
                errors = new ErrorViewModel { Error = TransactionErrors.ValidationErrors.TransactionInvalidTotalError };
                return false;
            }

            var transactionType = this.transTypeRepo.FindById(vm.TransactionTypeId, tt => tt.From, tt => tt.To);
            if (transactionType == null)
            {
                errors = new ErrorViewModel { Error = string.Format(TransactionErrors.ValidationErrors.TransactionTypeNotFoundError, vm.TransactionTypeId) };
                return false;
            }

            if (vm.FromId == vm.ToId)
            {
                errors = new ErrorViewModel { Error = TransactionErrors.ValidationErrors.TransactionToSameCategoryError };
                return false;
            }

            var fromCategory = this.categoryRepo.FindById(vm.FromId, c => c.CategoryType);
            if (fromCategory == null || !string.Equals(fromCategory.AccountingUserId, userId))
            {
                errors = new ErrorViewModel { Error = string.Format(TransactionErrors.ValidationErrors.TransactionFromCategoryNotFoundError, vm.FromId) };
                return false;
            }

            var toCategory = this.categoryRepo.FindById(vm.ToId, c => c.CategoryType);
            if (toCategory == null || !string.Equals(toCategory.AccountingUserId, userId))
            {
                errors = new ErrorViewModel { Error = string.Format(TransactionErrors.ValidationErrors.TransactionToCategoryNotFoundError, vm.ToId) };
                return false;
            }

            if (toCategory.CategoryType.Id != transactionType.To.Id || fromCategory.CategoryType.Id != transactionType.From.Id)
            {
                errors = new ErrorViewModel { Error = TransactionErrors.ValidationErrors.TransactionTypeCategoryTypeMismatchError };
                return false;
            }

            if (!modelState.IsValid)
            {
                modelState.Clear();
                controller.TryValidateModel(vm);
            }

            if (!modelState.IsValid)
            {
                errors = new ErrorViewModel
                {
                    Error = TransactionErrors.ValidationErrors.TransactionInvalidError,
                    Errors = modelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList()
                };

                this.logger.LogWarning("Invalid transaction model:" + string.Join(";",
                    modelState.Values.SelectMany(v => v.Errors)
                    .Select(e => e.ErrorMessage)));
                return false;
            }

            transaction = Mapper.Map<Transaction>(vm);
            transaction.Id = 0;
            transaction.Total = Math.Round(transaction.Total, 2);
            transaction.From = fromCategory;
            transaction.To = toCategory;
            transaction.TransactionType = transactionType;
            transaction.AccountingUserId = userId;

            return true;
        }