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);
        }
Beispiel #2
0
        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,
            });
        }
Beispiel #4
0
        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,
            });
        }
Beispiel #7
0
        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,
                });
            }
        }
Beispiel #9
0
        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
            {
            };
        }