Beispiel #1
0
        public ActionResult OnePageGiving(PaymentForm pf, Dictionary <int, decimal?> fundItem)
        {
            // need save off the original amt to pay if there is an error later on.
            var amtToPay = pf.AmtToPay;

            var id = pf.OrgId;

            if (id == null)
            {
                return(Message("Missing OrgId"));
            }

            if (!Util.ValidEmail(pf.Email))
            {
                ModelState.AddModelError("Email", "Need a valid email address");
            }
            if (pf.IsUs && !pf.Zip.HasValue())
            {
                ModelState.AddModelError("Zip", "Zip is Required for US");
            }
            if (pf.ShowCampusOnePageGiving)
            {
                if ((pf.CampusId ?? 0) == 0)
                {
                    ModelState.AddModelError("CampusId", "Campus is Required");
                }
            }

            var m = new OnlineRegModel(Request, CurrentDatabase, pf.OrgId, pf.testing, null, null, pf.source)
            {
                URL = $"/OnePageGiving/{pf.OrgId}"
            };

            var pid = Util.UserPeopleId;

            if (pid.HasValue)
            {
                PrePopulate(m, pid.Value);
            }

            // we need to always retrieve the entire list of funds for one page giving calculations.
            m.List[0].RetrieveEntireFundList = true;

            // first re-build list of fund items with only ones that contain a value (amt).
            var fundItems = fundItem.Where(f => f.Value.GetValueOrDefault() > 0).ToDictionary(f => f.Key, f => f.Value);

            var designatedFund = m.settings[id.Value].DonationFundId ?? 0;

            if (designatedFund != 0)
            {
                fundItems.Add(designatedFund, pf.AmtToPay);
            }

            // set the fund items on online reg person if there are any.
            if (fundItems.Any())
            {
                m.List[0].FundItem = fundItems;
                pf.AmtToPay        = m.List[0].FundItemsChosen().Sum(f => f.Amt);
            }

            if (pf.AmtToPay.GetValueOrDefault() == 0)
            {
                ModelState.AddModelError("AmtToPay", "Invalid Amount");
            }

            SetHeaders(m);
            SetInstructions(m);

            var p = m.List[0];

            if (pf.ShowCampusOnePageGiving)
            {
                pf.Campuses = p.Campuses().ToList();
            }

            if (!ModelState.IsValid)
            {
                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }

            if (CheckAddress(pf) == false)
            {
                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }


            if (!ModelState.IsValid)
            {
                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }

            p.orgid          = m.Orgid;
            p.FirstName      = pf.First;
            p.LastName       = pf.Last;
            p.EmailAddress   = pf.Email;
            p.Phone          = pf.Phone;
            p.AddressLineOne = pf.Address;
            p.City           = pf.City;
            p.State          = pf.State;
            p.ZipCode        = pf.Zip;
            p.Country        = pf.Country;
            if (pf.ShowCampusOnePageGiving)
            {
                p.Campus = pf.CampusId.ToString();
            }

            p.IsNew = p.person == null;

            if (pf.testing)
            {
                pf.CheckTesting();
            }

            if (pf.Country.HasValue() && !pf.Zip.HasValue())
            {
                pf.Zip = "NA";
            }

            pf.ValidatePaymentForm(ModelState, false);
            if (!ModelState.IsValid)
            {
                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }


            if (m?.UserPeopleId != null && m.UserPeopleId > 0)
            {
                pf.CheckStoreInVault(ModelState, m.UserPeopleId.Value);
            }
            if (!ModelState.IsValid)
            {
                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }

            if (CurrentDatabase.Setting("UseRecaptcha"))
            {
                if (!GoogleRecaptcha.IsValidResponse(HttpContext, CurrentDatabase))
                {
                    m.List[0].FundItem = fundItem;
                    pf.AmtToPay        = amtToPay;
                    ModelState.AddModelError("TranId", "ReCaptcha validation failed.");
                    return(View("OnePageGiving/Index", new OnePageGivingModel {
                        OnlineRegPersonModel = m.List[0],
                        PaymentForm = pf
                    }));
                }
            }

            var ti = pf.ProcessPaymentTransaction(m);

            if ((ti.Approved ?? false) == false)
            {
                ModelState.AddModelError("TranId", ti.Message);

                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }
            if (pf.Zip == "NA")
            {
                pf.Zip = null;
            }

            var ret = m.ConfirmTransaction(ti);

            switch (ret.Route)
            {
            case RouteType.ModelAction:
                if (ti.Approved == true)
                {
                    var url = $"/OnePageGiving/ThankYou/{id}{(pf.testing ? $"?testing=true&source={pf.source}" : $"?source={pf.source}")}";
                    return(Redirect(url));
                }
                ErrorSignal.FromCurrentContext().Raise(new Exception(ti.Message));
                ModelState.AddModelError("TranId", ti.Message);

                m.List[0].FundItem = fundItem;
                pf.AmtToPay        = amtToPay;
                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
Beispiel #2
0
        public ActionResult OnePageGiving(PaymentForm pf)
        {
            if (!Util.ValidEmail(pf.Email))
            {
                ModelState.AddModelError("Email", "Need a valid email address");
            }
            if (pf.AmtToPay == 0)
            {
                ModelState.AddModelError("AmtToPay", "Invalid Amount");
            }
            if (pf.IsUs && !pf.Zip.HasValue())
            {
                ModelState.AddModelError("Zip", "Zip is Required for US");
            }
            if (pf.ShowCampusOnePageGiving)
            {
                if ((pf.CampusId ?? 0) == 0)
                {
                    ModelState.AddModelError("CampusId", "Campus is Required");
                }
            }

            var m = new OnlineRegModel(Request, pf.OrgId, pf.testing, null, null, pf.source)
            {
                URL = "/OnePageGiving/" + pf.OrgId
            };

            SetHeaders(m);
            SetInstructions(m);
            var p = m.List[0];

            if (pf.ShowCampusOnePageGiving)
            {
                pf.Campuses = p.Campuses().ToList();
            }

            if (!ModelState.IsValid)
            {
                return(View("OnePageGiving/Index", pf));
            }

            if (CheckAddress(pf) == false)
            {
                return(View("OnePageGiving/Index", pf));
            }

            pf.ValidatePaymentForm(ModelState, shouldValidateBilling: false);
            if (!ModelState.IsValid)
            {
                return(View("OnePageGiving/Index", pf));
            }

            p.orgid          = m.Orgid;
            p.FirstName      = pf.First;
            p.LastName       = pf.Last;
            p.EmailAddress   = pf.Email;
            p.Phone          = pf.Phone;
            p.AddressLineOne = pf.Address;
            p.City           = pf.City;
            p.State          = pf.State;
            p.ZipCode        = pf.Zip;
            p.Country        = pf.Country;
            if (pf.ShowCampusOnePageGiving)
            {
                p.Campus = pf.CampusId.ToString();
            }
            pf.State = pf.State;

            p.IsNew = p.person == null;

            if (pf.testing)
            {
                pf.CheckTesting();
            }
            var id = pf.OrgId;

            if (id == null)
            {
                return(Message("Missing OrgId"));
            }
            if (pf.Country.HasValue() && !pf.Zip.HasValue())
            {
                pf.Zip = "NA";
            }
            var ti = pf.ProcessPaymentTransaction(m);

            if ((ti.Approved ?? false) == false)
            {
                ModelState.AddModelError("TranId", ti.Message);
                return(View("OnePageGiving/Index", pf));
            }
            if (pf.Zip == "NA")
            {
                pf.Zip = null;
            }
            var fundid = m.settings[id.Value].DonationFundId ?? 0;

            p.FundItem.Add(fundid, pf.AmtToPay);
            var ret = m.ConfirmTransaction(ti);

            switch (ret.Route)
            {
            case RouteType.ModelAction:
                if (ti.Approved == true)
                {
                    TempData["onlineregmodel"] = Util.Serialize(m);
                    return(Redirect("/OnePageGiving/ThankYou"));
                }
                ErrorSignal.FromCurrentContext().Raise(new Exception(ti.Message));
                ModelState.AddModelError("TranId", ti.Message);
                return(View("OnePageGiving/Index", pf));

            case RouteType.Error:
                DbUtil.Db.LogActivity("OnePageGiving Error " + ret.Message, pf.OrgId);
                return(Message(ret.Message));

            default:     // unexptected Route
                ErrorSignal.FromCurrentContext().Raise(new Exception("OnePageGiving Unexpected route"));
                DbUtil.Db.LogActivity("OnlineReg Unexpected Route " + ret.Message, pf.OrgId);
                ModelState.AddModelError("TranId", "unexpected error in payment processing");
                return(View(ret.View ?? "OnePageGiving/Index", pf));
            }
        }