public async Task <long> CalculateProrate(string subscriptionId, string customerId) { var prorationDate = DateTimeOffset.UtcNow; var options = new UpcomingInvoiceOptions { CustomerId = customerId, SubscriptionId = subscriptionId, SubscriptionProrate = true, SubscriptionCancelNow = true, SubscriptionProrationDate = prorationDate.UtcDateTime }; var invoice = await _invoiceService.UpcomingAsync(options); // Calculate the proration cost: long cost = 0; foreach (var invoiceLineItem in invoice.Lines) { cost += invoiceLineItem.Amount; //if (invoiceLineItem.Period.Start == null) continue; //var periodStart = new DateTimeOffset(invoiceLineItem.Period.Start.Value); //if (periodStart.ToUnixTimeSeconds() == prorationDate.ToUnixTimeSeconds()) //{ // cost += invoiceLineItem.Amount; //} } return(cost); }
public ActionResult <Invoice> RetrieveUpcomingInvoice([FromBody] RetrieveUpcomingInvoiceRequest req) { var service = new SubscriptionService(); var subscription = service.Get(req.Subscription); var invoiceService = new InvoiceService(); var options = new UpcomingInvoiceOptions { Customer = req.Customer, Subscription = req.Subscription, SubscriptionItems = new List <InvoiceSubscriptionItemOptions> { new InvoiceSubscriptionItemOptions { Id = subscription.Items.Data[0].Id, Deleted = true, }, new InvoiceSubscriptionItemOptions { // TODO: This should be Price, but isnt in Stripe.net yet. Plan = Environment.GetEnvironmentVariable(req.NewPrice), Deleted = false, }, } }; Invoice upcoming = invoiceService.Upcoming(options); return(upcoming); }
public ActionResult <InvoiceResponse> InvoicePreview(string subscriptionId, string newPriceLookupKey) { var customerId = HttpContext.Request.Cookies["customer"]; var service = new SubscriptionService(); var subscription = service.Get(subscriptionId); var invoiceService = new InvoiceService(); var options = new UpcomingInvoiceOptions { Customer = customerId, Subscription = subscriptionId, SubscriptionItems = new List <InvoiceSubscriptionItemOptions> { new InvoiceSubscriptionItemOptions { Id = subscription.Items.Data[0].Id, Price = Environment.GetEnvironmentVariable(newPriceLookupKey.ToUpper()), }, } }; Invoice upcoming = invoiceService.Upcoming(options); return(new InvoiceResponse { Invoice = upcoming, }); }
public InvoiceServiceTest() { this.service = new InvoiceService(); this.createOptions = new InvoiceCreateOptions { CustomerId = "cus_123", TaxPercent = 12.5m, }; this.updateOptions = new InvoiceUpdateOptions { Metadata = new Dictionary <string, string> { { "key", "value" }, }, }; this.payOptions = new InvoicePayOptions { Forgive = true, SourceId = "src_123", }; this.listOptions = new InvoiceListOptions { Limit = 1, }; this.listLineItemsOptions = new InvoiceListLineItemsOptions { Limit = 1, }; this.upcomingOptions = new UpcomingInvoiceOptions { CustomerId = "cus_123", SubscriptionId = "sub_123", }; this.finalizeOptions = new InvoiceFinalizeOptions { }; this.markUncollectibleOptions = new InvoiceMarkUncollectibleOptions { }; this.sendOptions = new InvoiceSendOptions { }; this.voidOptions = new InvoiceVoidOptions { }; }
public Invoice GetUpcomingInvoice(string customerId) { var invoiceService = new Stripe.InvoiceService(); var upcomingInvoiceOptions = new UpcomingInvoiceOptions() { Customer = customerId }; return(invoiceService.Upcoming(upcomingInvoiceOptions)); }
public ActionResult <RetrieveSubscriptionInformationResponse> RetrieveSubscriptionInformation([FromBody] RetrieveSubscriptionInformationRequest req) { if (!ModelState.IsValid) { return(this.FailWithMessage("invalid params")); } var options = new SubscriptionGetOptions(); options.AddExpand("latest_invoice"); options.AddExpand("customer.invoice_settings.default_payment_method"); options.AddExpand("items.data.price.product"); var service = new SubscriptionService(); Subscription subscription; try { subscription = service.Get(req.Subscription, options); } catch (StripeException e) { return(this.FailWithMessage($"Failed to retrieve subscription with ID ({req.Subscription}): {e}")); } var invoiceOptions = new UpcomingInvoiceOptions { Subscription = req.Subscription, }; var invoiceService = new InvoiceService(); Invoice upcomingInvoice; try { upcomingInvoice = invoiceService.Upcoming(invoiceOptions); } catch (StripeException e) { return(this.FailWithMessage($"Failed to retrieve upcoming invoice: {e}")); } var item = subscription.Items.Data[0]; return(new RetrieveSubscriptionInformationResponse { Card = subscription.Customer.InvoiceSettings.DefaultPaymentMethod.Card, ProductDescription = item.Price.Product.Name, CurrentPrice = item.Price.Id, CurrentQuantity = item.Quantity, LatestInvoice = subscription.LatestInvoice, UpcomingInvoice = upcomingInvoice, }); }
public InvoiceServiceTest() { this.service = new InvoiceService(); this.createOptions = new InvoiceCreateOptions() { CustomerId = "cus_123", TaxPercent = 12.5m, }; this.updateOptions = new InvoiceUpdateOptions() { Metadata = new Dictionary <string, string>() { { "key", "value" }, }, }; this.payOptions = new InvoicePayOptions() { Forgive = true, SourceId = "src_123", }; this.listOptions = new InvoiceListOptions() { Limit = 1, }; this.listLineItemsOptions = new InvoiceListLineItemsOptions() { Limit = 1, }; this.upcomingOptions = new UpcomingInvoiceOptions() { CustomerId = "cus_123", SubscriptionId = "sub_123", }; }
public ActionResult <RetrieveUpcomingInvoiceResponse> RetrieveUpcomingInvoice([FromBody] RetrieveUpcomingInvoiceRequest req) { if (!ModelState.IsValid) { return(this.FailWithMessage("invalid params")); } var newPrice = Environment.GetEnvironmentVariable(req.NewPrice.ToUpper()); if (newPrice is null || newPrice == "") { return(this.FailWithMessage($"No price with the new price ID ({req.NewPrice}) found in .env")); } List <InvoiceSubscriptionItemOptions> items; Subscription subscription = null; if (req.Subscription != "" && req.Subscription != null) { var subscriptionService = new SubscriptionService(); subscription = subscriptionService.Get(req.Subscription); var currentPrice = subscription.Items.Data[0].Price.Id; if (currentPrice == newPrice) { items = new List <InvoiceSubscriptionItemOptions> { new InvoiceSubscriptionItemOptions { Id = subscription.Items.Data[0].Id, Quantity = req.Quantity, } }; } else { items = new List <InvoiceSubscriptionItemOptions> { new InvoiceSubscriptionItemOptions { Id = subscription.Items.Data[0].Id, Deleted = true, }, new InvoiceSubscriptionItemOptions { Price = newPrice, Quantity = req.Quantity, }, }; } } else { items = new List <InvoiceSubscriptionItemOptions> { new InvoiceSubscriptionItemOptions { Price = newPrice, Quantity = req.Quantity, }, }; } var invoiceService = new InvoiceService(); var options = new UpcomingInvoiceOptions { Customer = req.Customer, Subscription = req.Subscription, SubscriptionItems = items, }; Invoice upcomingInvoice = invoiceService.Upcoming(options); if (req.Subscription == "" || req.Subscription is null) { return(new RetrieveUpcomingInvoiceResponse { Invoice = upcomingInvoice, }); } else { var currentPeriodEnd = subscription.CurrentPeriodEnd; long immediateTotal = 0; long nextInvoiceSum = 0; foreach (var lineItem in upcomingInvoice.Lines.Data) { if (lineItem.Period.End == currentPeriodEnd) { immediateTotal += lineItem.Amount; } else { nextInvoiceSum += lineItem.Amount; } } return(new RetrieveUpcomingInvoiceResponse { ImmediateTotal = immediateTotal, NextInvoiceSum = nextInvoiceSum, Invoice = upcomingInvoice, }); } }
public InvoiceServiceTest( StripeMockFixture stripeMockFixture, MockHttpClientFixture mockHttpClientFixture) : base(stripeMockFixture, mockHttpClientFixture) { this.service = new InvoiceService(this.StripeClient); this.createOptions = new InvoiceCreateOptions { Customer = "cus_123", TaxPercent = 12.5m, }; this.updateOptions = new InvoiceUpdateOptions { Metadata = new Dictionary <string, string> { { "key", "value" }, }, }; this.payOptions = new InvoicePayOptions { Forgive = true, Source = "src_123", }; this.listOptions = new InvoiceListOptions { Limit = 1, }; this.listLineItemsOptions = new InvoiceListLineItemsOptions { Limit = 1, }; this.upcomingOptions = new UpcomingInvoiceOptions { Customer = "cus_123", Subscription = "sub_123", }; this.upcomingListLineItemsOptions = new UpcomingInvoiceListLineItemsOptions { Limit = 1, Customer = "cus_123", Subscription = "sub_123", }; this.finalizeOptions = new InvoiceFinalizeOptions { }; this.markUncollectibleOptions = new InvoiceMarkUncollectibleOptions { }; this.sendOptions = new InvoiceSendOptions { }; this.voidOptions = new InvoiceVoidOptions { }; }