public CreateDonationDistDto GetRecurringGiftById(string authorizedUserToken, int recurringGiftId) { var searchStr = string.Format("\"{0}\",", recurringGiftId); CreateDonationDistDto createDonation = null; try { var records = _ministryPlatformService.GetPageViewRecords(_myHouseholdRecurringGiftsApiPageView, authorizedUserToken, searchStr); if (records != null && records.Any()) { var record = records.First(); createDonation = new CreateDonationDistDto { RecurringGiftId = record.ToNullableInt("Recurring_Gift_ID"), DonorId = record.ToInt("Donor_ID"), Frequency = record.ToInt("Frequency_ID"), DayOfWeek = record.ToInt("Day_Of_Week_ID"), DayOfMonth = record.ToInt("Day_Of_Month"), StartDate = record.ToDate("Start_Date").ToUniversalTime().Date, Amount = (int)((record["Amount"] as decimal? ?? 0.00M) * Constants.StripeDecimalConversionValue), ProgramId = record.ToString("Program_ID"), CongregationId = record.ToInt("Congregation_ID"), PaymentType = (int)AccountType.Checking == record.ToInt("Account_Type_ID") ? PaymentType.Bank.abbrv : PaymentType.CreditCard.abbrv, DonorAccountId = record.ToNullableInt("Donor_Account_ID"), SubscriptionId = record.ToString("Subscription_ID"), StripeCustomerId = record.ToString("Processor_ID"), StripeAccountId = record.ToString("Processor_Account_ID"), Recurrence = record.ToString("Recurrence"), ProgramName = record.ToString("Program_Name") }; } } catch (Exception ex) { throw new ApplicationException( string.Format("GetRecurringGift failed. Recurring Gift Id: {0}", recurringGiftId), ex); } return createDonation; }
public CreateDonationDistDto GetRecurringGiftForSubscription(string subscription) { var searchStr = string.Format(",\"{0}\",", subscription); CreateDonationDistDto createDonation = null; try { var records = WithApiLogin( apiToken => (_ministryPlatformService.GetPageViewRecords(_recurringGiftBySubscription, apiToken, searchStr))); if (records != null && records.Count > 0) { var record = records.First(); createDonation = new CreateDonationDistDto { DonorId = record.ToInt("Donor_ID"), Amount = record["Amount"] as decimal? ?? 0, ProgramId = record.ToString("Program_ID"), CongregationId = record.ToInt("Congregation_ID"), PaymentType = (int)AccountType.Checking == record.ToInt("Account_Type_ID") ? PaymentType.Bank.abbrv : PaymentType.CreditCard.abbrv, RecurringGiftId = record.ToNullableInt("Recurring_Gift_ID"), DonorAccountId = record.ToNullableInt("Donor_Account_ID"), SubscriptionId = record.ToString("Subscription_ID"), Frequency = record.ToInt("Frequency_ID"), ConsecutiveFailureCount = record.ToInt("Consecutive_Failure_Count"), StripeCustomerId = record.ToString("Processor_ID"), StripeAccountId = record.ToString("Processor_Account_ID") }; } } catch (Exception ex) { throw new ApplicationException( string.Format("GetRecurringGift failed. Subscription Id: {0}", subscription), ex); } return createDonation; }
public void TestEditRecurringGiftOnlyChangePayment() { const string authUserToken = "auth"; var today = DateTime.Today; var editGift = new RecurringGiftDto { RecurringGiftId = 345, StripeTokenId = "tok_123", PlanAmount = 500M, Program = "3", PlanInterval = PlanInterval.Weekly, StartDate = today }; var donor = new ContactDonor { DonorId = 456, ProcessorId = "cus_123" }; var existingGift = new CreateDonationDistDto { Amount = 50000, ProgramId = "3", Frequency = 1, StartDate = today, DonorAccountId = 234, SubscriptionId = "sub_123", DayOfWeek = (int)today.DayOfWeek, RecurringGiftId = 345, DonorId = 789, StripeCustomerId = "cus_456", StripeAccountId = "card_456" }; var stripeSource = new SourceData { id = "bank_1234", bank_last4 = "5678" }; const int newDonorAccountId = 987; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, editGift.RecurringGiftId)).Returns(existingGift); _paymentService.Setup(mocked => mocked.UpdateCustomerSource(existingGift.StripeCustomerId, editGift.StripeTokenId)).Returns(stripeSource); _mpDonorService.Setup(mocked => mocked.CreateDonorAccount(null, "0", stripeSource.bank_last4, null, existingGift.DonorId, stripeSource.id, existingGift.StripeCustomerId)).Returns(newDonorAccountId); _mpDonorService.Setup(mocked => mocked.UpdateRecurringGiftDonorAccount(authUserToken, existingGift.RecurringGiftId.Value, newDonorAccountId)); var result = _fixture.EditRecurringGift(authUserToken, editGift, donor); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); Assert.IsNotNull(result); }
public void TestEditRecurringGiftChangePaymentAndStartDate() { const string authUserToken = "auth"; var today = DateTime.Today; const int congregationId = 1; var editGift = new RecurringGiftDto { RecurringGiftId = 345, StripeTokenId = "tok_123", PlanAmount = 800M, Program = "3", PlanInterval = PlanInterval.Weekly, StartDate = today }; var donor = new ContactDonor { DonorId = 456, ProcessorId = "cus_123", Email = "*****@*****.**" }; var existingGift = new CreateDonationDistDto { Amount = 50000, ProgramId = "3", Frequency = 1, StartDate = today.AddDays(-7), DonorAccountId = 234, SubscriptionId = "sub_123", DayOfWeek = (int)today.AddDays(-7).DayOfWeek, RecurringGiftId = 345, DonorId = 789, StripeCustomerId = "cus_456", StripeAccountId = "card_456" }; var stripeSource = new SourceData { brand = "Visa", last4 = "1234", id = "card_123" }; const int newDonorAccountId = 987; var oldSubscription = new StripeSubscription { Id = "sub_123", Plan = new StripePlan { Id = "plan_123" } }; var newPlan = new StripePlan { Id = "plan_456" }; var newSubscription = new StripeSubscription { Id = "sub_456" }; const int newRecurringGiftId = 765; var newRecurringGift = new CreateDonationDistDto { Amount = 80000, ProgramId = "3", Frequency = 1, StartDate = today, DonorAccountId = 234, SubscriptionId = "sub_456", DayOfWeek = (int)today.DayOfWeek, RecurringGiftId = newRecurringGiftId, DonorId = 789 }; var contact = new MyContact() { Congregation_ID = congregationId }; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, editGift.RecurringGiftId)).Returns(existingGift); _paymentService.Setup(mocked => mocked.UpdateCustomerSource(existingGift.StripeCustomerId, editGift.StripeTokenId)).Returns(stripeSource); _mpDonorService.Setup(mocked => mocked.CreateDonorAccount(stripeSource.brand, "0", stripeSource.last4, null, existingGift.DonorId, stripeSource.id, existingGift.StripeCustomerId)).Returns(newDonorAccountId); _paymentService.Setup(mocked => mocked.CancelSubscription(existingGift.StripeCustomerId, existingGift.SubscriptionId)).Returns(oldSubscription); _paymentService.Setup(mocked => mocked.CreateSubscription(newPlan.Id, existingGift.StripeCustomerId, newRecurringGift.StartDate.Value)).Returns(newSubscription); _paymentService.Setup(mocked => mocked.CancelPlan(oldSubscription.Plan.Id)).Returns(oldSubscription.Plan); _paymentService.Setup(mocked => mocked.CreatePlan(editGift, donor)).Returns(newPlan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(authUserToken, existingGift.RecurringGiftId.Value)); _mpContactService.Setup(mocked => mocked.GetContactById(donor.ContactId)).Returns(contact); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord(authUserToken, donor.DonorId, newDonorAccountId, EnumMemberSerializationUtils.ToEnumString(editGift.PlanInterval), editGift.PlanAmount, editGift.StartDate, editGift.Program, newSubscription.Id, contact.Congregation_ID.Value)).Returns(newRecurringGiftId); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, newRecurringGiftId)).Returns(newRecurringGift); var result = _fixture.EditRecurringGift(authUserToken, editGift, donor); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); Assert.IsNotNull(result); Assert.AreEqual(newRecurringGift.RecurringGiftId, result.RecurringGiftId); Assert.AreEqual(newRecurringGift.StartDate, result.StartDate); Assert.AreEqual(newRecurringGift.Amount, result.PlanAmount); Assert.AreEqual(PlanInterval.Weekly, result.PlanInterval); Assert.AreEqual(newRecurringGift.ProgramId, result.Program); Assert.AreEqual(newRecurringGift.DonorId, result.DonorID); Assert.AreEqual(donor.Email, result.EmailAddress); Assert.AreEqual(newSubscription.Id, result.SubscriptionID); }
public void TestCancelRecurringGift() { const string authUserToken = "auth"; const int recurringGiftId = 123; var gift = new CreateDonationDistDto { DonorId = 456, SubscriptionId = "sub_123", StripeCustomerId = "cus_456", StripeAccountId = "card_789", ProgramName = "Crossroads", Amount = 123.45M, Recurrence = "12th of the month", DonorAccountId = 90 }; var plan = new StripePlan { Id = "plan_123" }; var subscription = new StripeSubscription { Plan = plan }; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, recurringGiftId)).Returns(gift); _paymentService.Setup(mocked => mocked.CancelSubscription(gift.StripeCustomerId, gift.SubscriptionId)).Returns(subscription); _paymentService.Setup(mocked => mocked.CancelPlan(subscription.Plan.Id)).Returns(plan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(authUserToken, recurringGiftId)); _mpDonorService.Setup(mocked => mocked.GetDonorAccountPymtType(gift.DonorAccountId.Value)).Returns(1); _mpDonorService.Setup( mocked => mocked.SendEmail(RecurringGiftCancelEmailTemplateId, gift.DonorId, (int)(123.45M / 100), "Check", It.IsAny<DateTime>(), "Crossroads", string.Empty, "12th of the month")); _fixture.CancelRecurringGift(authUserToken, recurringGiftId); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); }
public void TestEditRecurringGiftNoEdits() { const string authUserToken = "auth"; var today = DateTime.Today; var editGift = new RecurringGiftDto { RecurringGiftId = 345, StripeTokenId = string.Empty, PlanAmount = 500M, Program = "3", PlanInterval = PlanInterval.Weekly, StartDate = today }; var donor = new ContactDonor { DonorId = 456 }; var existingGift = new CreateDonationDistDto { Amount = 50000, ProgramId = "3", Frequency = 1, StartDate = today, DonorAccountId = 234, SubscriptionId = "sub_123", DayOfWeek = (int)today.DayOfWeek, RecurringGiftId = 345 }; _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById(authUserToken, editGift.RecurringGiftId)).Returns(existingGift); var result = _fixture.EditRecurringGift(authUserToken, editGift, donor); _mpDonorService.VerifyAll(); _paymentService.VerifyAll(); Assert.IsNotNull(result); }
public void TestCreateRecurringGift() { var recurringGiftDto = new RecurringGiftDto { StripeTokenId = "tok_123", PlanAmount = 123.45M, PlanInterval = PlanInterval.Weekly, Program = "987", StartDate = DateTime.Parse("1973-10-15") }; var contactDonor = new ContactDonor { DonorId = 678, ProcessorId = "cus_123", ContactId = 909090 }; var defaultSource = new SourceData { id = "card_123", brand = "Visa", last4 = "5150" }; var stripeCustomer = new StripeCustomer { brand = "visa", last4 = "9876", id = "cus_123", default_source = "card_123", sources = new Sources { data = new List<SourceData> { new SourceData { id = "bank_123", bank_last4 = "5678" }, defaultSource } } }; var stripePlan = new StripePlan { Id = "plan_123" }; const int donorAccountId = 999; var stripeSubscription = new StripeSubscription { Id = "sub_123" }; var contact = new MyContact() { Congregation_ID = 1 }; const int recurringGiftId = 888; var recurringGift = new CreateDonationDistDto { ProgramName = "Crossroads", Amount = 123.45M, Recurrence = "12th of the month", DonorAccountId = 90 }; _paymentService.Setup(mocked => mocked.CreateCustomer(recurringGiftDto.StripeTokenId, "678, Recurring Gift Subscription")).Returns(stripeCustomer); _paymentService.Setup(mocked => mocked.CreatePlan(recurringGiftDto, contactDonor)).Returns(stripePlan); _mpDonorService.Setup( mocked => mocked.CreateDonorAccount(defaultSource.brand, It.IsAny<string>(), defaultSource.last4, null, contactDonor.DonorId, defaultSource.id, stripeCustomer.id)).Returns(donorAccountId); _paymentService.Setup(mocked => mocked.CreateSubscription(stripePlan.Id, stripeCustomer.id, recurringGiftDto.StartDate)).Returns(stripeSubscription); _mpContactService.Setup(mocked => mocked.GetContactById(contactDonor.ContactId)).Returns(contact); _mpDonorService.Setup( mocked => mocked.CreateRecurringGiftRecord("auth", contactDonor.DonorId, donorAccountId, EnumMemberSerializationUtils.ToEnumString(recurringGiftDto.PlanInterval), recurringGiftDto.PlanAmount, recurringGiftDto.StartDate, recurringGiftDto.Program, stripeSubscription.Id, contact.Congregation_ID.Value)).Returns(recurringGiftId); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftById("auth", recurringGiftId)).Returns(recurringGift); _mpDonorService.Setup(mocked => mocked.GetDonorAccountPymtType(recurringGift.DonorAccountId.Value)).Returns(1); _mpDonorService.Setup( mocked => mocked.SendEmail(RecurringGiftSetupEmailTemplateId, recurringGift.DonorId, (int)(123.45M/100), "Check", It.IsAny<DateTime>(), "Crossroads", string.Empty, "12th of the month")); var response = _fixture.CreateRecurringGift("auth", recurringGiftDto, contactDonor); _paymentService.VerifyAll(); _mpDonorService.VerifyAll(); Assert.AreEqual(recurringGiftId, response); }
public void TestInvoicePaymentFailedCancelPlanAndSubscription() { const string processorId = "cus_123"; const string donorAccountProcessorId = "cus_456"; const string subscriptionId = "sub_123"; const int failCount = 3; const int recurringGiftId = 123456; const int donorId = 3421; const int frequency = 2; const string id = "9876"; const string charge = "ch_2468"; const string planId = "Donor ID #3421 weekly"; var e = new StripeEvent { LiveMode = true, Type = "invoice.payment_failed", Created = DateTime.Now.AddDays(-1), Data = new StripeEventData { Object = JObject.FromObject(new StripeInvoice() { Id = id, Customer = processorId, Charge = charge, Subscription = subscriptionId }) } }; var gift = new CreateDonationDistDto { Frequency = frequency, RecurringGiftId = recurringGiftId, SubscriptionId = subscriptionId, ConsecutiveFailureCount = failCount, DonorId = donorId, StripeCustomerId = donorAccountProcessorId }; var plan = new StripePlan { Id = planId }; var subscription = new StripeSubscription { Plan = plan }; _mpDonorService.Setup(mocked => mocked.ProcessRecurringGiftDecline(subscriptionId)); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftForSubscription(subscriptionId)).Returns(gift); _paymentService.Setup(mocked => mocked.CancelSubscription(donorAccountProcessorId, subscriptionId)).Returns(subscription); _paymentService.Setup(mocked => mocked.CancelPlan(subscription.Plan.Id)).Returns(plan); _mpDonorService.Setup(mocked => mocked.CancelRecurringGift(recurringGiftId)); Assert.IsNull(_fixture.ProcessStripeEvent(e)); _fixture.ProcessStripeEvent(e); _donorService.VerifyAll(); _mpDonorService.VerifyAll(); _donorService.VerifyAll(); _paymentService.VerifyAll(); }
public void TestInvoicePaymentFailedNoCancel() { const string processorId = "cus_123"; const string id = "9876"; const string subscriptionId = "sub_123"; const string charge = "ch_2468"; const int recurringGiftId = 123456; var e = new StripeEvent { LiveMode = true, Type = "invoice.payment_failed", Created = DateTime.Now.AddDays(-1), Data = new StripeEventData { Object = JObject.FromObject(new StripeInvoice() { Id = id, Customer = processorId, Charge = charge, Subscription = subscriptionId }) } }; var gift = new CreateDonationDistDto { Frequency = 1, RecurringGiftId = recurringGiftId }; _mpDonorService.Setup(mocked => mocked.ProcessRecurringGiftDecline(subscriptionId)); _mpDonorService.Setup(mocked => mocked.GetRecurringGiftForSubscription(subscriptionId)).Returns(gift); Assert.IsNull(_fixture.ProcessStripeEvent(e)); _fixture.ProcessStripeEvent(e); _mpDonorService.VerifyAll(); }
public void TestInvoicePaymentSucceeded() { var eventTimestamp = DateTime.Now; const string processorId = "cus_123"; const string subscriptionId = "sub_123"; const string chargeId = "ch_123"; var invoice = new StripeInvoice { Subscription = subscriptionId, Amount = 12300, Charge = chargeId, Customer = processorId, }; const int chargeAmount = 45600; int? feeAmount = 987; var charge = new StripeCharge { Amount = chargeAmount, BalanceTransaction = new StripeBalanceTransaction { Amount = 78900, Fee = feeAmount }, Status = "succeeded" }; _paymentService.Setup(mocked => mocked.GetCharge(chargeId)).Returns(charge); const int donorId = 321; const string programId = "3"; const string paymentType = "Bank"; const int recurringGiftId = 654; const int donorAccountId = 987; const int donationStatus = 4; const decimal amt = 789; var recurringGift = new CreateDonationDistDto { Amount = amt, DonorAccountId = donorAccountId, DonorId = donorId, PaymentType = paymentType, ProgramId = programId, RecurringGiftId = recurringGiftId }; _donorService.Setup(mocked => mocked.GetRecurringGiftForSubscription(subscriptionId)).Returns(recurringGift); _mpDonorService.Setup(mocked => mocked.UpdateRecurringGiftFailureCount(recurringGift.RecurringGiftId.Value, Constants.ResetFailCount)); _mpDonorService.Setup( mocked => mocked.CreateDonationAndDistributionRecord( It.Is<DonationAndDistributionRecord>( d => d.DonationAmt == (int) (chargeAmount/Constants.StripeDecimalConversionValue) && d.FeeAmt == feeAmount && d.DonorId == donorId && d.ProgramId.Equals(programId) && d.PledgeId == null && d.ChargeId.Equals(chargeId) && d.PymtType.Equals(paymentType) && d.ProcessorId.Equals(processorId) && d.RegisteredDonor && !d.Anonymous && d.RecurringGift && d.RecurringGiftId == recurringGiftId && d.DonorAcctId.Equals(donorAccountId+"") && d.CheckScannerBatchName == null && d.DonationStatus == donationStatus && d.CheckNumber == null))).Returns(123); _fixture.InvoicePaymentSucceeded(eventTimestamp, invoice); _paymentService.VerifyAll(); _mpDonorService.VerifyAll(); _donorService.VerifyAll(); }
private void SendRecurringGiftConfirmationEmail(string authorizedUserToken, int templateId, CreateDonationDistDto recurringGift, int? recurringGiftId = null) { try { if (recurringGift == null) { recurringGift = _mpDonorService.GetRecurringGiftById(authorizedUserToken, recurringGiftId.GetValueOrDefault()); } var acctType = _mpDonorService.GetDonorAccountPymtType(recurringGift.DonorAccountId.GetValueOrDefault()); var paymentType = MinistryPlatform.Translation.Enum.PaymentType.GetPaymentType(acctType).name; var frequency = recurringGift.Recurrence; var programName = recurringGift.ProgramName; var amt = decimal.Round(recurringGift.Amount, 2, MidpointRounding.AwayFromZero) / Constants.StripeDecimalConversionValue; _mpDonorService.SendEmail(templateId, recurringGift.DonorId, (int)amt, paymentType, DateTime.Now, programName, string.Empty, frequency); } catch (Exception e) { _logger.Warn(string.Format("Could not send email for recurring gift {0}", recurringGift == null ? recurringGiftId : recurringGift.RecurringGiftId), e); } }