Example #1
0
        private IGateway GetGateway(CMSDataContext db, PaymentInfo pi)
        {
            var account = MultipleGatewayUtils.GetAccount(db, pi.GatewayAccountId);

            if (account.IsNull())
            {
                throw new Exception("This process does not have a gateway configured");
            }

            bool IsTesting = MultipleGatewayUtils.GatewayTesting(db, PaymentProcessTypes.RecurringGiving);

            switch (account.GatewayId)
            {
            // case (int)GatewayTypes.Pushpay:
            // break;
            case (int)GatewayTypes.Sage:
                if ((pi.PreferredGivingType == "B" && pi.SageBankGuid.HasValue) ||
                    (pi.PreferredGivingType == "C" && pi.SageCardGuid.HasValue))
                {
                    return(db.Gateway(IsTesting, account));
                }
                break;

            case (int)GatewayTypes.Transnational:
                if ((pi.PreferredGivingType == "B" && pi.TbnBankVaultId.HasValue) ||
                    (pi.PreferredGivingType == "C" && pi.TbnCardVaultId.HasValue))
                {
                    return(db.Gateway(IsTesting, account));
                }
                break;

            case (int)GatewayTypes.Acceptiva:
                if (pi.AcceptivaPayerId.HasValue() &&
                    (pi.PreferredGivingType == "B" || pi.PreferredGivingType == "C"))
                {
                    return(db.Gateway(IsTesting, account));
                }
                break;

            case (int)GatewayTypes.BluePay:
                if ((pi.PreferredGivingType == "B") ||
                    (pi.PreferredGivingType == "C" && string.IsNullOrEmpty(pi.BluePayCardVaultId)))
                {
                    return(db.Gateway(IsTesting, account));
                }
                break;

            default:
                break;
            }

            // fall back to default gateway
            return(db.Gateway(IsTesting, null, processType: PaymentProcessTypes.RecurringGiving));
        }
Example #2
0
        public int DoGiving(CMSDataContext db)
        {
            var q = (from a in db.RecurringAmounts
                     where a.PeopleId == PeopleId
                     where a.ContributionFund.FundStatusId == 1
                     where a.ContributionFund.OnlineSort != null
                     where a.Amt > 0
                     select new GivingConfirmation.FundItem()
            {
                Amt = a.Amt.Value,
                Desc = a.ContributionFund.FundName,
                Fundid = a.FundId
            }).ToList();
            var total = q.Sum(vv => vv.Amt);

            if (total == 0)
            {
                return(0);
            }

            var accountId     = MultipleGatewayUtils.GetAccount(db, PaymentProcessTypes.RecurringGiving)?.GatewayAccountId ?? 0;
            var paymentInfo   = db.PaymentInfos.Single(x => x.PeopleId == PeopleId && x.GatewayAccountId == accountId);
            var preferredType = paymentInfo.PreferredGivingType ?? paymentInfo.PreferredPaymentType;

            var gw = GetGateway(db, paymentInfo);

            var orgid = (from o in db.Organizations
                         where o.RegistrationTypeId == RegistrationTypeCode.ManageGiving
                         select o.OrganizationId).FirstOrDefault();

            var t = new Transaction
            {
                TransactionDate    = DateTime.Now,
                TransactionId      = "started",
                First              = Person.FirstName,
                MiddleInitial      = Person.MiddleName.Truncate(1) ?? "",
                Last               = Person.LastName,
                Suffix             = Person.SuffixCode,
                Amt                = total,
                Description        = "Recurring Giving",
                Testing            = false,
                TransactionGateway = gw.GatewayName,
                Financeonly        = true,
                PaymentType        = preferredType,
                LastFourCC         = preferredType == PaymentType.CreditCard ? paymentInfo.MaskedCard.Last(4) : null,
                LastFourACH        = preferredType == PaymentType.Ach ? paymentInfo.MaskedAccount.Last(4) : null,
                OrgId              = orgid,
                LoginPeopleId      = Person.PeopleId,
            };

            var vaultid = gw.VaultId(PeopleId);

            if (!vaultid.HasValue())
            {
                t.Message  = "Missing VaultId";
                t.Approved = false;
            }
            db.Transactions.InsertOnSubmit(t);
            db.SubmitChanges();
            if (!vaultid.HasValue())
            {
                return(0);
            }

            var ret = gw.PayWithVault(PeopleId, total, "Recurring Giving", t.Id, preferredType);

            t.Message       = ret.Message;
            t.AuthCode      = ret.AuthCode;
            t.Approved      = ret.Approved;
            t.TransactionId = ret.TransactionId;

            var gift   = db.Setting("NameForPayment", "gift");
            var church = db.Setting("NameOfChurch", db.CmsHost);
            var notify = db.RecurringGivingNotifyPersons();
            var staff  = notify[0];
            var from   = Util.TryGetMailAddress(staff.EmailAddress);

            if (ret.Approved)
            {
                NextDate = FindNextDate(Util.Now.Date.AddDays(1));
                db.SubmitChanges();
                var msg = db.Content("RecurringGiftNotice") ?? new Content
                {
                    Title = $"Recurring {gift} for {{church}}",
                    Body  = $"Your gift of {total:C} was processed this morning."
                };
                var body    = GivingConfirmation.PostAndBuild(db, staff, Person, msg.Body, orgid, q, t, "Recurring Giving");
                var subject = msg.Title.Replace("{church}", church);
                var m       = new EmailReplacements(db, body, from);
                body = m.DoReplacements(db, Person);
                db.EmailFinanceInformation(from, Person, null, subject, body);
            }
            else
            {
                t.TransactionPeople.Add(new TransactionPerson
                {
                    PeopleId = Person.PeopleId,
                    Amt      = t.Amt,
                    OrgId    = orgid,
                });
                db.SubmitChanges();
                var msg = db.Content("RecurringGiftFailedNotice") ?? new Content
                {
                    Title = $"Recurring {gift} for {{church}} did not succeed",
                    Body  = @"Your payment of {total} failed to process this morning.<br>
The message was '{message}'.
Please contact the Finance office at the church."
                };
                var subject = msg.Title.Replace("{church}", church);
                var body    = msg.Body.Replace("{total}", $"${total:N2}")
                              .Replace("{message}", ret.Message);
                var m = new EmailReplacements(db, body, from);
                body = m.DoReplacements(db, Person);

                db.Email(from, Person, null, subject, body, false);
                foreach (var p in db.RecurringGivingNotifyPersons())
                {
                    db.EmailFinanceInformation(from, p, null,
                                               $"Recurring Giving Failed on {db.CmsHost}",
                                               $"<a href='{db.CmsHost}/Transactions/{t.Id}'>message: {ret.Message}, tranid:{t.Id}</a>");
                }
            }
            return(1);
        }