public int ApiRefundPayment(long OprId = 0)
        {
            int Response = -1;

            if (TempData["TutorModel"] != null)
            {
                Operation op = PaymentDB.GetOprDetails(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));
                if (op.Captured == 0 || op.Auto == 1 || op.PaymentMethodId != LkpDetails["Card"] || DateTime.Compare(DateTime.Now, op.CancelationDate) > 0)
                {
                    return(0);
                }

                UserCache userCache = JsonConvert.DeserializeObject <UserCache>(TempData["TutorModel"].ToString());
                string    Learner   = String.Concat(userCache.FirstName, userCache.LastName);

                object jsonParameters = new
                {
                    reference = "REFUND-" + op.RelationId
                };
                Console.WriteLine(op.ApiReference);
                var     requestUrl     = "https://api.sandbox.checkout.com/payments/" + op.ApiReference + "/refunds";
                string  responseString = ApiRequest(jsonParameters, requestUrl);
                dynamic jObj           = (JObject)JsonConvert.DeserializeObject(responseString);
                if (jObj != null)
                {
                    op.RespDate    = DateTime.Now;
                    op.RespDetails = responseString.Replace("\"", string.Empty);
                    op.RespId      = jObj.id;
                    op.Auto        = 0;
                    op.Captured    = 1;
                    op.OprTypeId   = LkpDetails["Refund"];
                    op.SerialId    = Serials["RF"];
                    op.LinkedOprId = OprId;
                    op.UID         = userCache.UserId;
                    op.ObjEntityId = 1;//Nabih get user Entity id
                    Response       = PaymentDB.CancelOperation(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));
                    Response       = PaymentDB.SubmitOperation(op, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));
                    if (Response != 0)
                    {
                        op.LinkedOprId = Response;
                        SendNotification(DateTime.Now, Learner, "Refund Pymt", op.Amount, op.Captured);

                        //Operation 2 : Substract tutor Revenue

                        decimal revenue = 1 - Convert.ToDecimal(Perc["TutorPercentage"]);
                        SubtractTutorFees(op, op.TutorId, op.TutorName, revenue);
                        //Operation 3 : Cancel Checkout Fees
                        decimal fee = Convert.ToDecimal(Perc["CheckoutFees"]);
                        decimal Per = Convert.ToDecimal(Perc["CheckoutPercentage"]);
                        CancelFees(op, "Refund Checkout Fees", fee, Per, Serials["FC"]);
                    }
                }
            }
            return(Response);
        }
 public IActionResult Invoice(int OprId)
 {
     if (TempData["TutorModel"] != null)
     {
         UserCache    userCache    = JsonConvert.DeserializeObject <UserCache>(TempData["TutorModel"].ToString());
         PaymentModel paymentModel = new PaymentModel
         {
             User      = userCache.Extract(),
             operation = PaymentDB.GetOprDetails(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION))
         };
         TempData.Keep("TutorModel");
         return(PartialView(paymentModel));
     }
     return(PartialView(new PaymentModel()));
 }
        //Open Opr Details : Show Opr details and Refund if possible
        public IActionResult OprDetails(int OprId)
        {
            if (TempData["TutorModel"] != null)
            {
                UserCache    userCache    = JsonConvert.DeserializeObject <UserCache>(TempData["TutorModel"].ToString());
                PaymentModel paymentModel = new PaymentModel
                {
                    User      = userCache.Extract(),
                    operation = PaymentDB.GetOprDetails(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION))
                };
                if (paymentModel.operation == null)
                {
                    return(PartialView(new PaymentModel()));
                }
                Console.WriteLine(paymentModel.operation.Auto);
                Console.WriteLine(paymentModel.operation.PaymentMethodId);
                Console.WriteLine(DateTime.Compare(DateTime.Now, paymentModel.operation.CancelationDate) < 0);
                Console.WriteLine(paymentModel.operation.Captured);
                //if payment is not returned before   &&   not auto payment   &&   made by card    && before cancelation Date   -> THEN CAN BE REFUND
                if (paymentModel.operation.Canceled == 0 && paymentModel.operation.Auto == 0 && paymentModel.operation.PaymentMethodId == LkpDetails["Card"] && DateTime.Compare(DateTime.Now, paymentModel.operation.CancelationDate) < 0)
                {
                    //refund if opr is captured
                    if (paymentModel.operation.Captured == 1)
                    {
                        paymentModel.operation.Action    = "RefundPayment";
                        paymentModel.operation.CanRefund = true;
                    }
                    //Void if opr is not captured yet
                    else
                    {
                        paymentModel.operation.Action  = "VoidPayment";
                        paymentModel.operation.CanVoid = true;
                    }
                }
                else if (paymentModel.operation.Canceled == 1)
                {
                    paymentModel.operation.Action = "Canceled";
                }
                else
                {
                    paymentModel.operation.Action = "NoAction";
                }

                TempData.Keep("TutorModel");
                return(PartialView(paymentModel));
            }
            return(PartialView(new PaymentModel()));
        }
        public int ApiVoidPayment(long OprId = 0)
        {
            int Response = -1;

            if (TempData["TutorModel"] != null)
            {
                Operation op = PaymentDB.GetOprDetails(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));

                if (op.Captured == 0 || op.Auto == 1 || op.PaymentMethodId != LkpDetails["Card"])
                {
                    return(0);
                }

                UserCache userCache = JsonConvert.DeserializeObject <UserCache>(TempData["TutorModel"].ToString());
                string    Learner   = String.Concat(userCache.FirstName, userCache.LastName);

                object jsonParameters = new
                {
                    reference = "VOID-" + op.RelationId
                };
                Console.WriteLine(op.ApiReference);
                var     requestUrl     = "https://api.sandbox.checkout.com/payments/" + op.ApiReference + "/captures";
                string  responseString = ApiRequest(jsonParameters, requestUrl);
                dynamic jObj           = (JObject)JsonConvert.DeserializeObject(responseString);
                if (jObj != null)
                {
                    op.RespDate    = (DateTime)jObj.processed_on;
                    op.RespDetails = responseString.Replace("\"", string.Empty);
                    op.RespId      = jObj.id;
                    op.Auto        = 0;
                    op.Captured    = 1;
                    op.OprTypeId   = LkpDetails["Void"];
                    op.SerialId    = Serials["PB"];
                    op.LinkedOprId = OprId;
                    op.UID         = userCache.UserId;
                    op.ObjEntityId = 1;//Nabih get user Entity id

                    Response = PaymentDB.CancelOperation(OprId, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));
                    Response = PaymentDB.SubmitOperation(op, GetConfiguration().GetConnectionString(DEFAULT_CONNECTION));
                    if (Response != 0)
                    {
                        SendNotification(DateTime.Now, Learner, "Void Pymt", op.Amount, op.Captured);
                    }
                }
            }
            return(Response);
        }