Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __init__(self, item):
try:
assert isinstance(item, (InvoiceItem, SubscriptionItem))
except AssertionError:
raise UserError(400, 'Bad request')
# All exceptions must be raised before this point.
super().__init__()
self.type = \
'invoiceitem' if isinstance(item, InvoiceItem) else 'subscription'
if self.type == 'subscription':
self.subscription_item = item.id
self.subscription = item._subscription
self.plan = item.plan
self.proration = False
self.currency = item.plan.currency
self.description = item.plan.name
self.amount = item._calculate_amount()
self.period = item._current_period()
elif self.type == 'invoiceitem':
self.invoice_item = item.id
self.subscription = item.subscription
self.plan = item.plan
self.proration = item.proration
self.currency = item.currency
'paid_at': None,
'voided_at': None,
}
self.period_start = None
self.period_end = None
if subscription is not None:
self.period_start = subscription_obj.current_period_start
self.period_end = subscription_obj.current_period_end
self.lines = List('/v1/invoices/' + self.id + '/lines')
for item in items:
item.invoice = self.id
self.lines._list.append(InvoiceLineItem(item))
pending_items = [ii for ii in InvoiceItem._api_list_all(
None, customer=self.customer, limit=99)._list
if ii.invoice is None]
for ii in pending_items:
if not simulation:
ii.invoice = self.id
self.lines._list.append(InvoiceLineItem(ii))
if len(self.lines._list):
self.currency = self.lines._list[0].currency
else:
self.currency = 'eur' # arbitrary default
self._draft = True
self._voided = False
if not simulation and not upcoming:
def _api_list_all(cls, url, customer=None, limit=None):
try:
if customer is not None:
assert type(customer) is str and customer.startswith('cus_')
except AssertionError:
raise UserError(400, 'Bad request')
li = super(InvoiceItem, cls)._api_list_all(url, limit=limit)
li._list = [ii for ii in li._list if ii.invoice is None]
if customer is not None:
Customer._api_retrieve(customer) # to return 404 if not existant
li._list = [ii for ii in li._list if ii.customer == customer]
li._list.sort(key=lambda i: i.date, reverse=True)
return li
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=' +
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)
else: # if simulation
if subscription is not None:
# 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 = cls._api_list_all(None, customer=customer,
subscription=subscription,
limit=99)
for previous_invoice in previous._list:
old_plan = previous_invoice.lines._list[0].plan
old_tax_rates = [
tr.id
for tr in previous_invoice.lines._list[0].tax_rates]
invoice_items.append(
InvoiceItem(amount=- previous_invoice.subtotal,
currency=previous_invoice.currency,
proration=True,
description='Unused time',
subscription=subscription,
plan=old_plan.id,
tax_rates=old_tax_rates,
customer=customer,
period_start=previous_invoice.period_start,
period_end=previous_invoice.period_end))
invoice = cls(customer=customer,
items=invoice_items,
tax_percent=tax_percent,
default_tax_rates=default_tax_rates,
date=date,
description=description,