Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
for si in self.items._list:
pending_items.append(si)
# Create associated invoice
invoice = Invoice(
customer=self.customer,
subscription=self.id,
items=pending_items,
tax_percent=self.tax_percent,
default_tax_rates=[tr.id
for tr in (self.default_tax_rates or [])],
date=self.current_period_start)
invoice._finalize()
if invoice.status != 'paid': # 0 € invoices are already 'paid'
Invoice._api_pay_invoice(invoice.id)
if invoice.status == 'paid':
self.status = 'active'
elif invoice.charge:
if invoice.charge.status == 'failed':
if self.status != 'incomplete':
self._on_recurring_payment_failure(invoice)
# If source is SEPA, subscription starts `active` (even with
# `enable_incomplete_payments`), then is canceled later if the
# payment fails:
if (invoice.charge.status == 'pending' and
PaymentMethod._api_retrieve(
invoice.charge.payment_method).type == 'sepa_debit'):
self.status = 'active'
if (self.items._list[0].plan.id != items[0]['plan'] or
self.items._list[0].quantity != items[0]['quantity']):
self.items = List('/v1/subscription_items?subscription=' +
self.id)
item = SubscriptionItem(subscription=self.id,
plan=items[0]['plan'],
quantity=items[0]['quantity'],
tax_rates=items[0]['tax_rates'])
self.items._list.append(item)
# Create unused time pending item.
# Get previous invoice for this subscription and customer, and
# deduce what is already paid:
# TODO: Better not to use limit, but take date into account
previous = Invoice._api_list_all(None, customer=self.customer,
subscription=self.id,
limit=99)
for previous_invoice in previous._list:
previous_tax_rates = [tr.id for tr in (
previous_invoice.lines._list[0].tax_rates or [])]
InvoiceItem(amount=- previous_invoice.subtotal,
currency=previous_invoice.currency,
proration=True,
description='Unused time',
subscription=self.id,
plan=old_plan.id,
tax_rates=previous_tax_rates,
customer=self.customer)
elif self.items._list[0].tax_rates != items[0]['tax_rates']:
self.items = List('/v1/subscription_items?subscription=' +
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
obj = cls._api_retrieve(id)
lines = List('/v1/invoices/' + id + '/lines', limit=limit)
lines._list = obj.lines._list
return lines
extra_apis.extend((
('GET', '/v1/invoices/upcoming', Invoice._api_upcoming_invoice),
('POST', '/v1/invoices/{id}/pay', Invoice._api_pay_invoice),
('POST', '/v1/invoices/{id}/void', Invoice._api_void_invoice),
('GET', '/v1/invoices/{id}/lines', Invoice._api_list_lines)))
class InvoiceItem(StripeObject):
object = 'invoiceitem'
_id_prefix = 'ii_'
def __init__(self, invoice=None, subscription=None, plan=None, amount=None,
currency=None, customer=None, period_start=None,
period_end=None, proration=False, description=None,
tax_rates=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
amount = try_convert_to_int(amount)
period_start = try_convert_to_int(period_start)
period_end = try_convert_to_int(period_end)
def _create_invoice(self):
pending_items = [ii for ii in InvoiceItem._api_list_all(
None, customer=self.customer, limit=99)._list
if ii.invoice is None]
for si in self.items._list:
pending_items.append(si)
# Create associated invoice
invoice = Invoice(
customer=self.customer,
subscription=self.id,
items=pending_items,
tax_percent=self.tax_percent,
default_tax_rates=[tr.id
for tr in (self.default_tax_rates or [])],
date=self.current_period_start)
invoice._finalize()
if invoice.status != 'paid': # 0 € invoices are already 'paid'
Invoice._api_pay_invoice(invoice.id)
if invoice.status == 'paid':
self.status = 'active'
elif invoice.charge:
if invoice.charge.status == 'failed':
if self.status != 'incomplete':
def _api_list_all(cls, url, customer=None, subscription=None, limit=None):
try:
if customer is not None:
assert type(customer) is str and customer.startswith('cus_')
if subscription is not None:
assert type(subscription) is str
assert subscription.startswith('sub_')
except AssertionError:
raise UserError(400, 'Bad request')
li = super(Invoice, cls)._api_list_all(url, limit=limit)
if customer is not None:
Customer._api_retrieve(customer) # to return 404 if not existant
li._list = [i for i in li._list if i.customer == customer]
if subscription is not None:
# to return 404 if not existant
Subscription._api_retrieve(subscription)
li._list = [i for i in li._list if i.subscription == subscription]
li._list.sort(key=lambda i: i.date, reverse=True)
return li
@classmethod
def _api_list_lines(cls, id, limit=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
obj = cls._api_retrieve(id)
lines = List('/v1/invoices/' + id + '/lines', limit=limit)
lines._list = obj.lines._list
return lines
extra_apis.extend((
('GET', '/v1/invoices/upcoming', Invoice._api_upcoming_invoice),
('POST', '/v1/invoices/{id}/pay', Invoice._api_pay_invoice),
('POST', '/v1/invoices/{id}/void', Invoice._api_void_invoice),
('GET', '/v1/invoices/{id}/lines', Invoice._api_list_lines)))
class InvoiceItem(StripeObject):
object = 'invoiceitem'
_id_prefix = 'ii_'
def __init__(self, invoice=None, subscription=None, plan=None, amount=None,
currency=None, customer=None, period_start=None,
period_end=None, proration=False, description=None,
tax_rates=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
def _api_list_lines(cls, id, limit=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
obj = cls._api_retrieve(id)
lines = List('/v1/invoices/' + id + '/lines', limit=limit)
lines._list = obj.lines._list
return lines
extra_apis.extend((
('GET', '/v1/invoices/upcoming', Invoice._api_upcoming_invoice),
('POST', '/v1/invoices/{id}/pay', Invoice._api_pay_invoice),
('POST', '/v1/invoices/{id}/void', Invoice._api_void_invoice),
('GET', '/v1/invoices/{id}/lines', Invoice._api_list_lines)))
class InvoiceItem(StripeObject):
object = 'invoiceitem'
_id_prefix = 'ii_'
def __init__(self, invoice=None, subscription=None, plan=None, amount=None,
currency=None, customer=None, period_start=None,
period_end=None, proration=False, description=None,
tax_rates=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
amount = try_convert_to_int(amount)
period_start = try_convert_to_int(period_start)