Skip to content

Commit 9e0c094

Browse files
committed
Invoice: Add support for Create Preview Invoice API
The Upcoming Invoice API is deprecated and removed since API version 2025-03-31: https://docs.stripe.com/changelog/basil/2025-03-31/invoice-preview-api-deprecations The new Create Preview Invoice API is almost the same and only the parameters structure changed. Reference: https://docs.stripe.com/api/invoices/create_preview
1 parent 91cb475 commit 9e0c094

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

localstripe/resources.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,6 +1602,40 @@ def _api_upcoming_invoice(cls, customer=None, subscription=None,
16021602

16031603
return invoice
16041604

1605+
@classmethod
1606+
def _api_create_preview_invoice(cls, customer=None, subscription=None,
1607+
subscription_details=None):
1608+
try:
1609+
if subscription_details is not None:
1610+
assert type(subscription_details) is dict
1611+
except AssertionError:
1612+
raise UserError(400, 'Bad request')
1613+
1614+
details = subscription_details or {}
1615+
default_tax_rates = details.get('default_tax_rates')
1616+
items = details.get('items')
1617+
proration_date = details.get('proration_date')
1618+
trial_end = details.get('trial_end')
1619+
1620+
invoice = cls._get_next_invoice(
1621+
customer=customer,
1622+
subscription=subscription,
1623+
upcoming=True,
1624+
subscription_default_tax_rates=default_tax_rates,
1625+
subscription_items=items,
1626+
subscription_proration_date=proration_date,
1627+
subscription_trial_end=trial_end)
1628+
1629+
# Do not store this invoice but real Stripe server do for a limited
1630+
# amount of time (72 hours) which make it possible to retrieve it
1631+
# on route /v1/invoices/:id:
1632+
# https://docs.stripe.com/invoicing/preview
1633+
del store[cls.object + ':' + invoice.id]
1634+
1635+
invoice.id = f'upcoming_{invoice.id}'
1636+
1637+
return invoice
1638+
16051639
@classmethod
16061640
def _api_pay_invoice(cls, id):
16071641
obj = Invoice._api_retrieve(id)
@@ -1664,6 +1698,8 @@ def _api_list_lines(cls, id, limit=None, **kwargs):
16641698

16651699
extra_apis.extend((
16661700
('GET', '/v1/invoices/upcoming', Invoice._api_upcoming_invoice),
1701+
('POST', '/v1/invoices/create_preview',
1702+
Invoice._api_create_preview_invoice),
16671703
('POST', '/v1/invoices/{id}/pay', Invoice._api_pay_invoice),
16681704
('POST', '/v1/invoices/{id}/void', Invoice._api_void_invoice),
16691705
('GET', '/v1/invoices/{id}/lines', Invoice._api_list_lines)))

test.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,11 @@ code=$(curl -sg -o /dev/null -w "%{http_code}" -u $SK: \
472472
$HOST/v1/invoices/upcoming?customer=$cus)
473473
[ "$code" = 404 ]
474474

475+
code=$(curl -sg -o /dev/null -w "%{http_code}" -u $SK: \
476+
$HOST/v1/invoices/create_preview \
477+
-d customer=$cus)
478+
[ "$code" = 404 ]
479+
475480
curl -sSfg -u $SK: $HOST/v1/subscriptions \
476481
-d customer=$cus \
477482
-d items[0][plan]=basique-mensuel \
@@ -492,6 +497,17 @@ curl -sSfg -u $SK: $HOST/v1/invoices/upcoming?customer=$cus\&subscription_items[
492497

493498
curl -sSfg -u $SK: $HOST/v1/invoices/upcoming?customer=$cus\&subscription=$sub\&subscription_items[0][id]=si_RBrVStcKDimMnp\&subscription_items[0][plan]=basique-annuel\&subscription_proration_date=1504182686\&subscription_tax_percent=20
494499

500+
curl -sSfg -u $SK: $HOST/v1/invoices/create_preview \
501+
-d customer=$cus
502+
503+
curl -sSfg -u $SK: $HOST/v1/invoices/create_preview \
504+
-d customer=$cus \
505+
-d subscription=$sub \
506+
-d subscription_details[default_tax_rates][0]=$txr1 \
507+
-d subscription_details[items][0][id]=si_RBrVStcKDimMnp \
508+
-d subscription_details[items][0][plan]=basique-annuel \
509+
-d subscription_details[proration_date]=1504182686
510+
495511
curl -sSfg -u $SK: $HOST/v1/invoices/$in/lines
496512

497513
cus=$(curl -sSfg -u $SK: $HOST/v1/customers \

0 commit comments

Comments
 (0)