public PaymentStatusVM ProcessPayment(PaymentInfo paymentRequest)
        {
            PaymentStatusVM paymentStatusVM = new PaymentStatusVM()
            {
                PaymentStatus         = Enums.PaymentProcessStatus.failed.ToString(),
                PaymentStatusDatetime = DateTime.Now
            };

            if (paymentRequest != null)
            {
                //insert in payment and payment status

                PaymentStatusInfo oPaymentStatusInfo = new PaymentStatusInfo()
                {
                    PaymentInfoId         = paymentRequest.Id,
                    PaymentStatus         = Enums.PaymentProcessStatus.pending.ToString(),
                    PaymentStatusDatetime = DateTime.Now,
                    PaymentInfo           = paymentRequest
                };

                unitOfWork.PaymentInfoRepo.Create(paymentRequest);
                unitOfWork.PaymentStatusInfoRepo.Create(oPaymentStatusInfo);
                unitOfWork.Commit();

                if (paymentRequest.Amount % 2 == 0)//if (new Random().Next(1, 11) % 2 == 0)
                {
                    paymentStatusVM.PaymentStatus = Enums.PaymentProcessStatus.processed.ToString();
                }
                else
                {
                    paymentStatusVM.PaymentStatus = Enums.PaymentProcessStatus.failed.ToString();
                }

                PaymentStatusInfo oPaymentStatusInfoOK = new PaymentStatusInfo()
                {
                    PaymentInfoId         = paymentRequest.Id,
                    PaymentStatus         = paymentStatusVM.PaymentStatus,
                    PaymentStatusDatetime = DateTime.Now,
                    PaymentInfo           = paymentRequest
                };

                unitOfWork.PaymentStatusInfoRepo.Create(oPaymentStatusInfoOK);
                unitOfWork.Commit();
            }

            return(paymentStatusVM);
        }
        public PaymentStatusVM ProcessPayment(PaymentInfo paymentRequest)
        {
            PaymentStatusVM paymentStatusVM = new PaymentStatusVM()
            {
                PaymentStatus         = Enums.PaymentProcessStatus.failed.ToString(),
                PaymentStatusDatetime = DateTime.Now
            };

            if (paymentRequest != null)
            {
                //insert in payment and payment status


                PaymentStatusInfo oPaymentStatusInfo = new PaymentStatusInfo()
                {
                    PaymentInfoId         = paymentRequest.Id,
                    PaymentStatus         = Enums.PaymentProcessStatus.pending.ToString(),
                    PaymentStatusDatetime = DateTime.Now,
                    PaymentInfo           = paymentRequest
                };

                unitOfWork.PaymentInfoRepo.Create(paymentRequest);
                unitOfWork.PaymentStatusInfoRepo.Create(oPaymentStatusInfo);
                unitOfWork.Commit();

                int tryCount = 3;
                //even amount will be processed , odd one will be failed //just for test case

                for (int i = 1; i <= tryCount; i++)                      //upto retry count
                {
                    if (paymentRequest.Amount % 2 == 0 && i == tryCount) //if (new Random().Next(1, 11) % 2 == 0)
                    {
                        paymentStatusVM.PaymentStatus = Enums.PaymentProcessStatus.processed.ToString();
                    }
                    else
                    {
                        paymentStatusVM.PaymentStatus = Enums.PaymentProcessStatus.failed.ToString();
                    }

                    PaymentStatusInfo oPaymentStatusInfoOK = new PaymentStatusInfo()
                    {
                        PaymentInfoId         = paymentRequest.Id,
                        PaymentStatus         = paymentStatusVM.PaymentStatus,
                        PaymentStatusDatetime = DateTime.Now,
                        PaymentInfo           = paymentRequest
                    };

                    unitOfWork.PaymentStatusInfoRepo.Create(oPaymentStatusInfoOK);
                    unitOfWork.Commit();

                    if (paymentStatusVM.PaymentStatus == Enums.PaymentProcessStatus.processed.ToString())
                    {
                        break;
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(500);
                    }
                }
            }

            return(paymentStatusVM);
        }