Пример #1
0
        public async Task <PaymentChangeStatusResponse> UpdatePaymentStatusAsync(PaymentChangeStatusRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var payment = _paymentRepository.GetAll().FirstOrDefault(p => p.Id == request.Id);

            if (payment == null)
            {
                throw new InvalidOperationException(nameof(payment));
            }

            var validationResult = _paymentValidator.Validate(payment, request);

            if (validationResult.Result != PaymentChangeStatusResult.Ok)
            {
                return(validationResult);
            }

            payment.Status            = request.Status;
            payment.StatusDescription = Enum.GetName(typeof(PaymentStatus), request.Status);
            payment.Reason            = request.Reason;

            _paymentRepository.Update(payment);
            await _unitOfWork.CommitAsync();

            return(validationResult);
        }
Пример #2
0
        public PaymentChangeStatusResponse Validate(Payment payment, PaymentChangeStatusRequest paymentChangeStatusRequest)
        {
            if(payment.Status == PaymentStatus.Approved 
               || payment.Status == PaymentStatus.Rejected)
            return new PaymentChangeStatusResponse()
            {
                Result = PaymentChangeStatusResult.Error,
                Message = "Can't change status for payment which has 'Approved' or 'Rejected' status"
            };

            switch (paymentChangeStatusRequest.Status)
            {
                case PaymentStatus.Approved when payment.Currency == "EUR" && payment.Amount > 4000:
                    return new PaymentChangeStatusResponse()
                    {
                        Result = PaymentChangeStatusResult.ValidationError,
                        Message = "Can't approve payment with amount more than 4000 for EUR"
                    };
                case PaymentStatus.Rejected when paymentChangeStatusRequest.Reason != "This is suspicious":
                    return new PaymentChangeStatusResponse()
                    {
                        Result = PaymentChangeStatusResult.ValidationError,
                        Message = "Reason should be 'This is suspicious' for Reject"
                    };
            }

            return new PaymentChangeStatusResponse()
            {
               Result = PaymentChangeStatusResult.Ok,
               Message = string.Empty
            };
        }