Beispiel #1
0
        public ActionResult Login(OnlineRegModel m)
        {
            var ret = AccountModel.AuthenticateLogon(m.username, m.password, Session, Request);

            if (ret is string)
            {
                ModelState.AddModelError("authentication", ret.ToString());
                return(FlowList(m, "Login"));
            }
            Session["OnlineRegLogin"] = true;
            if (m.Orgid == Util.CreateAccountCode)
            {
                return(Content("/Person2/" + Util.UserPeopleId));
            }
            var existingRegistration = m.GetExistingRegistration(Util.UserPeopleId ?? 0);

            if (existingRegistration != null)
            {
                TempData["er"] = m.UserPeopleId = Util.UserPeopleId;
                return(Content("/OnlineReg/Existing/" + existingRegistration.DatumId));
            }
            Debug.Assert(Util.UserPeopleId != null, "Util.UserPeopleId != null");

            m.CreateList();
            m.UserPeopleId = Util.UserPeopleId;

            if (m.ManagingSubscriptions())
            {
                TempData["ms"] = Util.UserPeopleId;
                return(Content("/OnlineReg/ManageSubscriptions/{0}".Fmt(m.masterorgid)));
            }
            if (m.ChoosingSlots())
            {
                TempData["ps"] = Util.UserPeopleId;
                return(Content("/OnlineReg/ManageVolunteer/{0}".Fmt(m.Orgid)));
            }
            if (m.OnlinePledge())
            {
                TempData["mp"] = Util.UserPeopleId;
                return(Content("/OnlineReg/ManagePledge/{0}".Fmt(m.Orgid)));
            }
            if (m.ManageGiving())
            {
                TempData["mg"] = Util.UserPeopleId;
                return(Content("/OnlineReg/ManageGiving/{0}".Fmt(m.Orgid)));
            }
            if (m.OnlineGiving())
            {
                return(Register(Util.UserPeopleId.Value, m));
            }

            if (m.UserSelectsOrganization())
            {
                OnlineRegPersonModelValidator.ValidateModelForFind(m.List[0], ModelState, m, 0);
            }

            m.List[0].LoggedIn = true;
            m.HistoryAdd("login");
            return(FlowList(m, "Login"));
        }
Beispiel #2
0
        private ActionResult RouteSpecialLogin(OnlineRegModel m)
        {
            if (Util.UserPeopleId == null)
            {
                throw new Exception("Util.UserPeopleId is null on login");
            }

            var link = RouteExistingRegistration(m);

            if (link.HasValue())
            {
                return(Redirect(link));
            }

            m.CreateAnonymousList();
            m.UserPeopleId = Util.UserPeopleId;

            if (m.OnlineGiving())
            {
                m.Log("Login OnlineGiving");
                return(RegisterFamilyMember(Util.UserPeopleId.Value, m));
            }

            link = RouteManageGivingSubscriptionsPledgeVolunteer(m);
            if (link.HasValue())
            {
                return(Content(link)); // this will be used for a redirect in javascript
            }
            return(null);
        }
Beispiel #3
0
 // Set suggested giving fee for an indidividual person
 private static void CheckSetFee(OnlineRegModel m, OnlineRegPersonModel p)
 {
     if (m.OnlineGiving() && p.setting.ExtraValueFeeName.HasValue())
     {
         var f     = CmsWeb.Models.OnlineRegPersonModel.Funds().SingleOrDefault(ff => ff.Text == p.setting.ExtraValueFeeName);
         var evamt = p.person.GetExtra(p.setting.ExtraValueFeeName).ToDecimal();
         if (f != null && evamt > 0)
         {
             p.FundItem[f.Value.ToInt()] = evamt;
         }
     }
 }
Beispiel #4
0
        public ActionResult OnePageGiving(int id, bool?testing, string source)
        {
            Response.NoCache();
            try
            {
                var m = new OnlineRegModel(Request, CurrentDatabase, id, testing, null, null, source);

                var pid = Util.UserPeopleId;
                if (pid.HasValue)
                {
                    PrePopulate(m, pid.Value);
                }

                SetHeaders(m);
                m.CheckRegisterLink(null);

                if (m.NotActive())
                {
                    return(View("OnePageGiving/NotActive", m));
                }

                if ((m.org.IsMissionTrip.IsNotNull() && m.org.IsMissionTrip == true) ? true : false)
                {
                    m.ProcessType = PaymentProcessTypes.OneTimeGiving;
                }
                else
                {
                    m.ProcessType = (m.org.RegistrationTypeId.IsNull() || m.org.RegistrationTypeId == RegistrationTypeCode.OnlineGiving)
                        ? PaymentProcessTypes.OneTimeGiving
                        : PaymentProcessTypes.OnlineRegistration;
                }

                int?GatewayId = MultipleGatewayUtils.GatewayId(CurrentDatabase, m.ProcessType);

                if (GatewayId == (int)GatewayTypes.Pushpay && m.OnlineGiving())
                {
                    ViewBag.Header = "One Page Giving";
                    if (string.IsNullOrEmpty(MultipleGatewayUtils.Setting(CurrentDatabase, "PushpayMerchant", "", (int)m.ProcessType)))
                    {
                        return(View("OnePageGiving/NotConfigured"));
                    }

                    return(Redirect($"/Pushpay/OnePage"));
                }

                var pf = PaymentForm.CreatePaymentForm(m);
                pf.AmtToPay = null;

                if (string.IsNullOrWhiteSpace(pf.Type))
                {
                    pf.Type = pf.NoCreditCardsAllowed ? "B" : "C";
                }

#if DEBUG
                if (!pid.HasValue)
                {
                    pf.First      = "Otis";
                    pf.Last       = "Sukamotis";
                    pf.Email      = "*****@*****.**";
                    pf.Address    = "135 Riveredge Cv";
                    pf.Zip        = "";
                    pf.CreditCard = "3111111111111111";
                    pf.Expires    = "1018";
                    pf.CVV        = "123";
                    pf.AmtToPay   = 23M;
                }
#endif

                var p = m.List[0];
                if (pf.ShowCampusOnePageGiving)
                {
                    pf.Campuses = p.Campuses().ToList();
                }

                var designatedFund = p.DesignatedDonationFund().FirstOrDefault();
                pf.Description = designatedFund != null ? designatedFund.Text : m.DescriptionForPayment;

                SetInstructions(m);

                return(View("OnePageGiving/Index", new OnePageGivingModel()
                {
                    OnlineRegPersonModel = m.List[0], PaymentForm = pf
                }));
            }
            catch (Exception ex)
            {
                if (ex is BadRegistrationException)
                {
                    return(Message(ex.Message));
                }
                throw;
            }
        }
Beispiel #5
0
        private ConfirmEnum ConfirmTransaction(OnlineRegModel m, string TransactionID)
        {
            m.ParseSettings();
            if (m.List.Count == 0)
            {
                throw new Exception(" unexpected, no registrants found in confirmation");
            }
            var ret           = ConfirmEnum.Confirm;
            var managingsubs  = m.ManagingSubscriptions();
            var choosingslots = m.ChoosingSlots();
            var t             = m.Transaction;

            if (t == null && !managingsubs && !choosingslots)
            {
                m.History.Add("ConfirmTransaction");
                m.UpdateDatum(completed: true);
                var pf = PaymentForm.CreatePaymentForm(m);
                t        = pf.CreateTransaction(DbUtil.Db);
                m.TranId = t.Id;
            }
            if (t != null)
            {
                ViewBag.message = t.Message;
            }

            if (m.org != null && m.org.RegistrationTypeId == RegistrationTypeCode.CreateAccount)
            {
                m.List[0].CreateAccount();
                ret = ConfirmEnum.ConfirmAccount;
            }
            else if (m.OnlineGiving())
            {
                var p = m.List[0];
                if (p.IsNew)
                {
                    p.AddPerson(null, p.org.EntryPointId ?? 0);
                }

                var staff = DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId)[0];
                var text  = p.setting.Body.Replace("{church}", DbUtil.Db.Setting("NameOfChurch", "church"), ignoreCase: true);
                text = text.Replace("{amt}", (t.Amt ?? 0).ToString("N2"));
                text = text.Replace("{date}", DateTime.Today.ToShortDateString());
                text = text.Replace("{tranid}", t.Id.ToString());
                text = text.Replace("{name}", p.person.Name);
                text = text.Replace("{account}", "");
                text = text.Replace("{email}", p.person.EmailAddress);
                text = text.Replace("{phone}", p.person.HomePhone.FmtFone());
                text = text.Replace("{contact}", staff.Name);
                text = text.Replace("{contactemail}", staff.EmailAddress);
                text = text.Replace("{contactphone}", p.org.PhoneNumber.FmtFone());
                var re    = new Regex(@"(?<b>.*?)<!--ITEM\sROW\sSTART-->(?<row>.*?)\s*<!--ITEM\sROW\sEND-->(?<e>.*)", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                var match = re.Match(text);
                var b     = match.Groups["b"].Value;
                var row   = match.Groups["row"].Value.Replace("{funditem}", "{0}").Replace("{itemamt}", "{1:N2}");
                var e     = match.Groups["e"].Value;
                var sb    = new StringBuilder(b);

                var desc = "{0}; {1}; {2}".Fmt(
                    p.person.Name,
                    p.person.PrimaryAddress,
                    p.person.PrimaryZip);
                foreach (var g in p.FundItemsChosen())
                {
                    if (g.amt > 0)
                    {
                        sb.AppendFormat(row, g.desc, g.amt);
                        p.person.PostUnattendedContribution(DbUtil.Db, g.amt, g.fundid, desc, tranid: t.Id);
                    }
                }
                t.TransactionPeople.Add(new TransactionPerson
                {
                    PeopleId = p.person.PeopleId,
                    Amt      = t.Amt,
                    OrgId    = m.Orgid,
                });
                t.Financeonly = true;
                if (t.Donate > 0)
                {
                    var fundname = DbUtil.Db.ContributionFunds.Single(ff => ff.FundId == p.setting.DonationFundId).FundName;
                    sb.AppendFormat(row, fundname, t.Donate);
                    t.Fund = p.setting.DonationFund();
                    p.person.PostUnattendedContribution(DbUtil.Db, t.Donate ?? 0, p.setting.DonationFundId, desc, tranid: t.Id);
                }
                sb.Append(e);
                if (!t.TransactionId.HasValue())
                {
                    t.TransactionId = TransactionID;
                    if (m.testing == true && !t.TransactionId.Contains("(testing)"))
                    {
                        t.TransactionId += "(testing)";
                    }
                }
                var contributionemail = (from ex in p.person.PeopleExtras
                                         where ex.Field == "ContributionEmail"
                                         select ex.Data).SingleOrDefault();
                if (contributionemail.HasValue())
                {
                    contributionemail = (contributionemail ?? "").Trim();
                }
                if (!Util.ValidEmail(contributionemail))
                {
                    contributionemail = p.person.FromEmail;
                }

                Util.SendMsg(Util.SysFromEmail, Util.Host, Util.TryGetMailAddress(DbUtil.Db.StaffEmailForOrg(p.org.OrganizationId)),
                             p.setting.Subject, sb.ToString(),
                             Util.EmailAddressListFromString(contributionemail), 0, p.PeopleId);
                DbUtil.Db.Email(contributionemail, DbUtil.Db.StaffPeopleForOrg(p.org.OrganizationId),
                                "online giving contribution received",
                                "see contribution records for {0} ({1})".Fmt(p.person.Name, p.PeopleId));
                if (p.CreatingAccount == true)
                {
                    p.CreateAccount();
                }
            }
            else if (managingsubs)
            {
                m.ConfirmManageSubscriptions();
                ret = ConfirmEnum.ConfirmAccount;
            }
            else if (choosingslots)
            {
                m.ConfirmPickSlots();
                m.URL = null;
                ViewBag.ManagingVolunteer = true;
                ViewBag.CreatedAccount    = m.List[0].CreatingAccount;
                ret = ConfirmEnum.ConfirmAccount;
            }
            else if (m.OnlinePledge())
            {
                m.SendLinkForPledge();
                ViewBag.CreatedAccount = m.List[0].CreatingAccount;
                ret = ConfirmEnum.ConfirmAccount;
            }
            else if (m.ManageGiving())
            {
                m.SendLinkToManageGiving();
                ret = ConfirmEnum.ConfirmAccount;
            }
            else if (t.TransactionGateway.ToLower() == "serviceu")
            {
                t.TransactionId = TransactionID;
                if (m.testing == true && !t.TransactionId.Contains("(testing)"))
                {
                    t.TransactionId += "(testing)";
                }
                t.Message  = "Transaction Completed";
                t.Approved = true;
                m.EnrollAndConfirm();
                if (m.List.Any(pp => pp.PeopleId == null))
                {
                    LogOutOfOnlineReg();
                    throw new Exception("no person");
                }
                m.UseCoupon(t.TransactionId, t.Amt ?? 0);
            }
            else
            {
                if (!t.TransactionId.HasValue())
                {
                    t.TransactionId = TransactionID;
                    if (m.testing == true && !t.TransactionId.Contains("(testing)"))
                    {
                        t.TransactionId += "(testing)";
                    }
                }
                m.EnrollAndConfirm();
                if (m.List.Any(pp => pp.PeopleId == null))
                {
                    LogOutOfOnlineReg();
                    throw new Exception("no person");
                }
                m.UseCoupon(t.TransactionId, t.Amt ?? 0);
            }
            if (m.IsCreateAccount() || m.ManagingSubscriptions())
            {
                m.email = m.List[0].person.EmailAddress;
            }
            else
            {
                m.email = m.List[0].EmailAddress;
            }
            ViewBag.email = m.email;

            if (m.masterorgid.HasValue && m.Orgid.HasValue && !m.settings[m.Orgid.Value].Subject.HasValue())
            {
                ViewBag.orgname = m.masterorg.OrganizationName;
            }
            else
            {
                ViewBag.orgname = m.org != null ? m.org.OrganizationName : m.masterorg.OrganizationName;
            }

            LogOutOfOnlineReg();
            return(ret);
        }
Beispiel #6
0
        private Transaction ProcessPaymentTransaction(OnlineRegModel m, PaymentForm pf)
        {
            Transaction ti = null;

            if (m != null && m.Transaction != null)
            {
                ti = PaymentForm.CreateTransaction(DbUtil.Db, m.Transaction, pf.AmtToPay);
            }
            else
            {
                ti = pf.CreateTransaction(DbUtil.Db);
            }

            int?pid = null;

            if (m != null)
            {
                m.ParseSettings();
                var terms = Util.PickFirst(m.Terms, "");
                if (terms.HasValue())
                {
                    ViewData["Terms"] = terms;
                }
                pid = m.UserPeopleId;
                if (m.TranId == null)
                {
                    m.TranId = ti.Id;
                }
            }

            if (!pid.HasValue)
            {
                var pds = DbUtil.Db.FindPerson(pf.First, pf.Last, null, pf.Email, pf.Phone);
                if (pds.Count() == 1)
                {
                    pid = pds.Single().PeopleId.Value;
                }
            }
            TransactionResponse tinfo;
            var gateway = OnlineRegModel.GetTransactionGateway();

            if (gateway == "authorizenet")
            {
                if (pf.SavePayInfo)
                {
                    var anet = new AuthorizeNet(DbUtil.Db, pf.testing);
                    tinfo = anet.createCustomerProfileTransactionRequest(
                        pid ?? 0,
                        pf.AmtToPay ?? 0,
                        pf.Description,
                        pf.TranId ?? 0);
                }
                else
                if (pf.Type == "B")
                {
                    tinfo = OnlineRegModel.PostECheck(
                        pf.Routing, pf.Account,
                        pf.AmtToPay ?? 0,
                        ti.Id, pf.Description,
                        pid ?? 0, pf.First, pf.Last,
                        pf.Address, pf.City, pf.State, pf.Zip,
                        pf.testing);
                }
                else
                {
                    tinfo = OnlineRegModel.PostTransaction(
                        pf.CreditCard, pf.CCV,
                        DbUtil.NormalizeExpires(pf.Expires).ToString2("MMyy"),
                        pf.AmtToPay ?? 0,
                        ti.Id, pf.Description,
                        pid ?? 0, pf.Email, pf.First, pf.Last,
                        pf.Address, pf.City, pf.State, pf.Zip,
                        pf.testing);
                }
            }
            else if (gateway == "sage")
            {
                if (pf.SavePayInfo)
                {
                    var sage = new SagePayments(DbUtil.Db, pf.testing);
                    tinfo = sage.createVaultTransactionRequest(
                        pid ?? 0,
                        pf.AmtToPay ?? 0,
                        pf.Description,
                        ti.Id,
                        pf.Type);
                }
                else
                if (pf.Type == "B")
                {
                    tinfo = OnlineRegModel.PostVirtualCheckTransactionSage(
                        pf.Routing, pf.Account,
                        pf.AmtToPay ?? 0,
                        ti.Id, pf.Description,
                        pid ?? 0, pf.Email, pf.First, pf.MiddleInitial, pf.Last, pf.Suffix,
                        pf.Address, pf.City, pf.State, pf.Zip, pf.Phone,
                        pf.testing);
                }
                else
                {
                    tinfo = OnlineRegModel.PostTransactionSage(
                        pf.CreditCard, pf.CCV,
                        DbUtil.NormalizeExpires(pf.Expires).ToString2("MMyy"),
                        pf.AmtToPay ?? 0,
                        ti.Id, pf.Description,
                        pid ?? 0, pf.Email, pf.First, pf.MiddleInitial, pf.Last, pf.Suffix,
                        pf.Address, pf.City, pf.State, pf.Zip, pf.Phone,
                        pf.testing);
                }
            }

            else
            {
                throw new Exception("unknown gateway " + gateway);
            }

            ti.TransactionId = tinfo.TransactionId;
            if (ti.Testing == true && !ti.TransactionId.Contains("(testing)"))
            {
                ti.TransactionId += "(testing)";
            }
            ti.Approved = tinfo.Approved;
            if (ti.Approved == false)
            {
                ti.Amtdue += ti.Amt;
                if (m != null && m.OnlineGiving())
                {
                    ti.Amtdue = 0;
                }
            }
            ti.Message         = tinfo.Message;
            ti.AuthCode        = tinfo.AuthCode;
            ti.TransactionDate = DateTime.Now;
            DbUtil.Db.SubmitChanges();
            return(ti);
        }
Beispiel #7
0
        public ActionResult ProcessPayment(PaymentForm pf)
        {
            Response.NoCache();

#if DEBUG
#else
            if (Session["FormId"] != null)
            {
                if ((Guid)Session["FormId"] == pf.FormId)
                {
                    return(Message("Already submitted"));
                }
            }
#endif

            OnlineRegModel m  = null;
            var            ed = DbUtil.Db.RegistrationDatas.SingleOrDefault(e => e.Id == pf.DatumId);
            if (ed != null)
            {
                m = Util.DeSerialize <OnlineRegModel>(ed.Data);
            }

            var peopleId = 0;
            if (m != null)
            {
                peopleId = m.UserPeopleId ?? 0;
            }

#if DEBUG
#else
            if (m != null && m.History.Any(h => h.Contains("ProcessPayment")))
            {
                return(Content("Already submitted"));
            }
#endif

            if (m != null && m.OnlineGiving())
            {
                var previousTransaction =
                    (from t in DbUtil.Db.Transactions
                     where t.Amt == pf.AmtToPay
                     where t.OrgId == m.Orgid
                     where t.TransactionDate > DateTime.Now.AddMinutes(-60)
                     where DbUtil.Db.Contributions.Any(cc => cc.PeopleId == m.List[0].PeopleId && cc.TranId == t.Id)
                     select t).FirstOrDefault();
                if (previousTransaction != null)
                {
                    return(Message("You have already submitted a gift in this amount a short while ago. Please let us know if you saw an error and what the message said."));
                }
            }

            if (pf.AmtToPay < 0)
            {
                pf.AmtToPay = 0;
            }
            if (pf.Donate < 0)
            {
                pf.Donate = 0;
            }

            pf.AllowCoupon = false;

            SetHeaders(pf.OrgId ?? 0);

            if ((pf.AmtToPay ?? 0) <= 0 && (pf.Donate ?? 0) <= 0)
            {
                DbUtil.Db.SubmitChanges();
                ModelState.AddModelError("form", "amount zero");
                return(View("Payment/Process", pf));
            }

            try
            {
                ValidatePaymentForm(pf);

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

                if (m != null && pf.IsLoggedIn.GetValueOrDefault() && pf.SavePayInfo)
                {
                    var gateway = DbUtil.Db.Gateway(m.testing ?? false);
                    // we need to perform a $1 auth if this is a brand new credit card that we are going to store it in the vault.
                    // otherwise we skip doing an auth just call store in vault just like normal.
                    if (!VerifyCardWithAuth(gateway, pf, peopleId))
                    {
                        return(View("Payment/Process", pf));
                    }

                    InitializePaymentInfo(peopleId, pf);
                    StoreInVault(gateway, pf, peopleId);
                }

                var ti = ProcessPaymentTransaction(m, pf);

                if (ti.Approved == false)
                {
                    ModelState.AddModelError("form", ti.Message);
                    return(View("Payment/Process", pf));
                }

                if (m != null)
                {
                    m.TranId = ti.Id;
                    m.HistoryAdd("ProcessPayment");
                    ed.Data      = Util.Serialize(m);
                    ed.Completed = true;
                    DbUtil.Db.SubmitChanges();
                }
                Session["FormId"] = pf.FormId;

                if (pf.DatumId > 0)
                {
                    try
                    {
                        var view = ConfirmTransaction(m, ti.TransactionId);
                        switch (view)
                        {
                        case ConfirmEnum.Confirm:
                            return(View("Confirm", m));

                        case ConfirmEnum.ConfirmAccount:
                            return(View("ConfirmAccount"));
                        }
                    }
                    catch (Exception ex)
                    {
                        Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                        TempData["error"] = ex.Message;
                        return(Redirect("/Error"));
                    }
                }

                ConfirmDuePaidTransaction(ti, ti.TransactionId, sendmail: true);

                ViewBag.amtdue = PaymentForm.AmountDueTrans(DbUtil.Db, ti).ToString("C");
                return(View("PayAmtDue/Confirm", ti));
            }
            catch (Exception ex)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                ModelState.AddModelError("form", ex.Message);
                return(View("Payment/Process", pf));
            }
        }
Beispiel #8
0
        private Transaction ProcessPaymentTransaction(OnlineRegModel m, PaymentForm pf)
        {
            var ti = (m != null && m.Transaction != null)
                ? PaymentForm.CreateTransaction(DbUtil.Db, m.Transaction, pf.AmtToPay)
                : pf.CreateTransaction(DbUtil.Db);

            int?pid = null;

            if (m != null)
            {
                m.ParseSettings();
                var terms = Util.PickFirst(m.Terms, "");
                if (terms.HasValue())
                {
                    ViewData["Terms"] = terms;
                }

                pid = m.UserPeopleId;
                if (m.TranId == null)
                {
                    m.TranId = ti.Id;
                }
            }

            if (!pid.HasValue)
            {
                var pds = DbUtil.Db.FindPerson(pf.First, pf.Last, null, pf.Email, pf.Phone);
                if (pds.Count() == 1)
                {
                    pid = pds.Single().PeopleId.Value;
                }
            }

            TransactionResponse tinfo;
            var gw = DbUtil.Db.Gateway(pf.testing);

            if (pf.SavePayInfo)
            {
                tinfo = gw.PayWithVault(pid ?? 0, pf.AmtToPay ?? 0, pf.Description, ti.Id, pf.Type);
            }
            else
            {
                tinfo = pf.Type == PaymentType.Ach
                    ? PayWithCheck(gw, pf, pid, ti)
                    : PayWithCreditCard(gw, pf, pid, ti);
            }

            ti.TransactionId = tinfo.TransactionId;

            if (ti.Testing.GetValueOrDefault() && !ti.TransactionId.Contains("(testing)"))
            {
                ti.TransactionId += "(testing)";
            }

            ti.Approved = tinfo.Approved;

            if (!ti.Approved.GetValueOrDefault())
            {
                ti.Amtdue += ti.Amt;
                if (m != null && m.OnlineGiving())
                {
                    ti.Amtdue = 0;
                }
            }

            ti.Message         = tinfo.Message;
            ti.AuthCode        = tinfo.AuthCode;
            ti.TransactionDate = DateTime.Now;

            DbUtil.Db.SubmitChanges();
            return(ti);
        }