<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_invoice_item( 		self, 		amount, 		currency, 		description=None, 		discountable=None, 		invoice=None, 		metadata=None, 		subscription=None, 	):
 		""" 		Adds an arbitrary charge or credit to the customer's upcoming invoice. 		Different than creating a charge. Charges are separate bills that get 		processed immediately. Invoice items are appended to the customer's next 		invoice. This is extremely useful when adding surcharges to subscriptions. 		:param amount: The amount to charge. 		:type amount: Decimal. Precision is 2; anything more will be ignored. 		:param currency: 3-letter ISO code for currency 		:type currency: string 		:param description: An arbitrary string. 		:type description: string 		:param discountable: Controls whether discounts apply to this invoice item. Defaults to False for 			prorations or negative invoice items, and True for all other invoice items. 		:type discountable: boolean 		:param invoice: An existing invoice to add this invoice item to. When left blank, the invoice 			item will be added to the next upcoming scheduled invoice. Use this when adding 			invoice items in response to an ``invoice.created`` webhook. You cannot add an invoice 			item to an invoice that has already been paid, attempted or closed. 		:type invoice: Invoice or string (invoice ID) 		:param metadata: A set of key/value pairs useful for storing additional information. 		:type metadata: dict 		:param subscription: A subscription to add this invoice item to. When left blank, the invoice 			item will be be added to the next upcoming scheduled invoice. When set, 			scheduled invoices for subscriptions other than the specified subscription 			will ignore the invoice item. Use this when you want to express that an 			invoice item has been accrued within the context of a particular subscription. 		:type subscription: Subscription or string (subscription ID) 		.. Notes: 		.. if you're using ``Customer.add_invoice_item()`` instead of ``Customer.add_invoice_item()``, \ 		``invoice`` and ``subscriptions`` can only be strings 		"""

		from .billing import InvoiceItem

		if not isinstance(amount, decimal.Decimal):
			raise ValueError("You must supply a decimal value representing dollars.")

		# Convert Invoice to id
		if invoice is not None and isinstance(invoice, StripeModel):
			invoice = invoice.id

		# Convert Subscription to id
		if subscription is not None and isinstance(subscription, StripeModel):
			subscription = subscription.id

		stripe_invoiceitem = InvoiceItem._api_create(
			amount=int(amount * 100),  # Convert dollars into cents
			currency=currency,
			customer=self.id,
			description=description,
			discountable=discountable,
			invoice=invoice,
			metadata=metadata,
			subscription=subscription,
		)

		return InvoiceItem.sync_from_stripe_data(stripe_invoiceitem)