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)); }
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); }