コード例 #1
0
        public ActionResult SubmitRefund(FormCollection form)
        {
            try
            {
                PlanService planService = new PlanService();

                Braintree.Environment environment;
                if (ConfigurationManager.AppSettings["BtEnvironmentTestMode"].ToString() == "1")
                {
                    environment = Braintree.Environment.SANDBOX;
                }
                else
                {
                    environment = Braintree.Environment.PRODUCTION;
                }


                var gateway = new BraintreeGateway
                {
                    Environment = environment,
                    MerchantId  = ConfigurationManager.AppSettings["BtMerchantId"],
                    PublicKey   = ConfigurationManager.AppSettings["BtPublicKey"],
                    PrivateKey  = ConfigurationManager.AppSettings["BtPrivateKey"]
                };
                Result <Transaction> refundResult = null;
                string transactionId = form["hdntransactionid"].ToString();
                Service.Subscription subscription = subscriptionService.GetSubscriptionByTransactionId(transactionId);
                int    creditused = subscription.TotalCredit - subscription.RemainingCredit;
                double amountused = 0, remainingamount = 0, creditAmount = 0;

                if (form["hdnmode"].ToString() == "1")
                {
                    if (creditused != 0)
                    {
                        ViewBag.Error = "Unable to Fully Refund due to " + creditused + " credit(s) used ";
                        return(View());
                    }

                    refundResult = gateway.Transaction.Refund(form["hdntransactionid"].ToString());
                    subscriptionService.DeactivateCurrentSubscription(transactionId);
                }
                else
                {
                    if (form["txtamount"] == "")
                    {
                        ViewBag.Error = "Please Enter Amount";
                        return(View());
                    }

                    Service.Plan plan = planService.GetPlanDetailByPlanId(subscription.PlanId);
                    if (subscription.SubscriptionTypeId == 1)
                    {
                        creditAmount    = Convert.ToDouble(plan.CreditPrice);
                        amountused      = creditAmount * creditused;
                        remainingamount = subscription.SubscriptionPrice - amountused;
                        double newTotalPrice = subscription.TotalPrice - Convert.ToDouble(form["txtamount"]);
                        double totalCredit   = newTotalPrice / creditAmount;
                        if (Convert.ToDouble(form["txtamount"]) > remainingamount)
                        {
                            ViewBag.Error = "Amount is greater than remaining amount ";
                            return(View());
                        }
                        refundResult = gateway.Transaction.Refund(form["hdntransactionid"].ToString(), Convert.ToDecimal(form["txtamount"]));
                        if (refundResult.Message != "Cannot refund a transaction unless it is settled.")
                        {
                            subscriptionService.UpdateTotalCreditAndAmount(subscription.Id, newTotalPrice, totalCredit);
                        }
                    }
                    else if (subscription.SubscriptionTypeId == 2)
                    {
                        var daysInCurrentMonths = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
                        var perDayCreditAmount  = subscription.TotalPrice / daysInCurrentMonths;

                        var dayspend = DateTime.Now.Date.Day;

                        var amountUsed = dayspend * perDayCreditAmount;


                        if (Convert.ToDouble(form["txtamount"]) > amountUsed)
                        {
                            ViewBag.Error = "Amount is greater than remaining amount ";
                            return(View());
                        }

                        var remainingAmount = subscription.TotalPrice - Convert.ToDouble(form["txtamount"]);
                        refundResult = gateway.Transaction.Refund(form["hdntransactionid"].ToString(), Convert.ToDecimal(form["txtamount"]));
                        if (refundResult.Message != "Cannot refund a transaction unless it is settled.")
                        {
                            subscriptionService.UpdateTotalCreditAndAmount(subscription.Id, remainingAmount, 0);
                        }
                    }
                }



                RefundTranactionLog refundTranactionLog = new RefundTranactionLog();
                refundTranactionLog.TransactionId = transactionId;
                refundTranactionLog.Message       = refundResult.Message;
                if (refundResult.Errors != null)
                {
                    refundTranactionLog.Errors = refundResult.Errors.ToString();
                }
                refundTranactionLog.IsActive        = true;
                refundTranactionLog.CreatedDateTime = DateTime.Now;
                refundTranactionLog.Gateway         = Constant.Gateway.BrainTree.ToString();

                if (refundResult.Target != null)
                {
                    refundTranactionLog.RefundTransactionId = refundResult.Target.RefundedTransactionId;
                }


                subscriptionService.InsertRefundTranactionLog(refundTranactionLog);
            }
            catch (Exception ex)
            {
                throw ex;
            }


            return(View());
        }