import datetime from typing import Any, Dict, List, Type, TypeVar, Union, cast import attr from dateutil.parser import isoparse from ..models.currency import Currency from ..models.invoice_status import InvoiceStatus from ..types import UNSET, Unset BA = TypeVar("BA", bound="Invoice") @attr.s(auto_attribs=True) class Invoice: """ An invoice. """ # noqa: E501 amount_due: Union[Unset, float] = UNSET amount_paid: Union[Unset, float] = UNSET amount_remaining: Union[Unset, float] = UNSET attempt_count: Union[Unset, int] = UNSET attempted: Union[Unset, bool] = False created_at: Union[Unset, datetime.datetime] = UNSET currency: Union[Unset, Currency] = UNSET customer_email: Union[Unset, str] = UNSET customer_id: Union[Unset, str] = UNSET default_payment_method: Union[Unset, str] = UNSET description: Union[Unset, str] = UNSET from ..models.discount import Discount discounts: Union[Unset, List[Discount]] = UNSET id: Union[Unset, str] = UNSET from ..models.invoice_line_item import InvoiceLineItem lines: Union[Unset, List[InvoiceLineItem]] = UNSET metadata: Union[Unset, Dict[str, str]] = UNSET number: Union[Unset, str] = UNSET paid: Union[Unset, bool] = False pdf: Union[Unset, str] = UNSET receipt_number: Union[Unset, str] = UNSET statement_descriptor: Union[Unset, str] = UNSET status: Union[Unset, InvoiceStatus] = UNSET subtotal: Union[Unset, float] = UNSET tax: Union[Unset, float] = UNSET total: Union[Unset, float] = UNSET url: Union[Unset, str] = UNSET additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: amount_due = self.amount_due amount_paid = self.amount_paid amount_remaining = self.amount_remaining attempt_count = self.attempt_count attempted = self.attempted created_at: Union[Unset, str] = UNSET if not isinstance(self.created_at, Unset): created_at = self.created_at.isoformat() if not isinstance(self.currency, Unset): currency = self.currency customer_email = self.customer_email customer_id = self.customer_id default_payment_method = self.default_payment_method description = self.description from ..models.discount import Discount discounts: Union[Unset, List[Discount]] = UNSET if not isinstance(self.discounts, Unset): discounts = self.discounts id = self.id from ..models.invoice_line_item import InvoiceLineItem lines: Union[Unset, List[InvoiceLineItem]] = UNSET if not isinstance(self.lines, Unset): lines = self.lines metadata = self.metadata number = self.number paid = self.paid pdf = self.pdf receipt_number = self.receipt_number statement_descriptor = self.statement_descriptor if not isinstance(self.status, Unset): status = self.status subtotal = self.subtotal tax = self.tax total = self.total url = self.url field_dict: Dict[str, Any] = {} field_dict.update(self.additional_properties) field_dict.update({}) if amount_due is not UNSET: field_dict['amount_due'] = amount_due if amount_paid is not UNSET: field_dict['amount_paid'] = amount_paid if amount_remaining is not UNSET: field_dict['amount_remaining'] = amount_remaining if attempt_count is not UNSET: field_dict['attempt_count'] = attempt_count if attempted is not UNSET: field_dict['attempted'] = attempted if created_at is not UNSET: field_dict['created_at'] = created_at if currency is not UNSET: field_dict['currency'] = currency if customer_email is not UNSET: field_dict['customer_email'] = customer_email if customer_id is not UNSET: field_dict['customer_id'] = customer_id if default_payment_method is not UNSET: field_dict['default_payment_method'] = default_payment_method if description is not UNSET: field_dict['description'] = description if discounts is not UNSET: field_dict['discounts'] = discounts if id is not UNSET: field_dict['id'] = id if lines is not UNSET: field_dict['lines'] = lines if metadata is not UNSET: field_dict['metadata'] = metadata if number is not UNSET: field_dict['number'] = number if paid is not UNSET: field_dict['paid'] = paid if pdf is not UNSET: field_dict['pdf'] = pdf if receipt_number is not UNSET: field_dict['receipt_number'] = receipt_number if statement_descriptor is not UNSET: field_dict['statement_descriptor'] = statement_descriptor if status is not UNSET: field_dict['status'] = status if subtotal is not UNSET: field_dict['subtotal'] = subtotal if tax is not UNSET: field_dict['tax'] = tax if total is not UNSET: field_dict['total'] = total if url is not UNSET: field_dict['url'] = url return field_dict @classmethod def from_dict(cls: Type[BA], src_dict: Dict[str, Any]) -> BA: d = src_dict.copy() amount_due = d.pop("amount_due", UNSET) amount_paid = d.pop("amount_paid", UNSET) amount_remaining = d.pop("amount_remaining", UNSET) attempt_count = d.pop("attempt_count", UNSET) attempted = d.pop("attempted", UNSET) _created_at = d.pop("created_at", UNSET) created_at: Union[Unset, datetime.datetime] if isinstance(_created_at, Unset): created_at = UNSET else: created_at = isoparse(_created_at) _currency = d.pop("currency", UNSET) currency: Union[Unset, Currency] if isinstance(_currency, Unset): currency = UNSET else: currency = _currency # type: ignore[arg-type] customer_email = d.pop("customer_email", UNSET) customer_id = d.pop("customer_id", UNSET) default_payment_method = d.pop("default_payment_method", UNSET) description = d.pop("description", UNSET) from ..models.discount import Discount discounts = cast(List[Discount], d.pop("discounts", UNSET)) id = d.pop("id", UNSET) from ..models.invoice_line_item import InvoiceLineItem lines = cast(List[InvoiceLineItem], d.pop("lines", UNSET)) metadata = d.pop("metadata", UNSET) number = d.pop("number", UNSET) paid = d.pop("paid", UNSET) pdf = d.pop("pdf", UNSET) receipt_number = d.pop("receipt_number", UNSET) statement_descriptor = d.pop("statement_descriptor", UNSET) _status = d.pop("status", UNSET) status: Union[Unset, InvoiceStatus] if isinstance(_status, Unset): status = UNSET else: status = _status # type: ignore[arg-type] subtotal = d.pop("subtotal", UNSET) tax = d.pop("tax", UNSET) total = d.pop("total", UNSET) url = d.pop("url", UNSET) invoice = cls( amount_due= amount_due, amount_paid= amount_paid, amount_remaining= amount_remaining, attempt_count= attempt_count, attempted= attempted, created_at= created_at, currency= currency, customer_email= customer_email, customer_id= customer_id, default_payment_method= default_payment_method, description= description, discounts= discounts, id= id, lines= lines, metadata= metadata, number= number, paid= paid, pdf= pdf, receipt_number= receipt_number, statement_descriptor= statement_descriptor, status= status, subtotal= subtotal, tax= tax, total= total, url= url, ) invoice.additional_properties = d return invoice @property def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) def __getitem__(self, key: str) -> Any: return self.additional_properties[key] def __setitem__(self, key: str, value: Any) -> None: self.additional_properties[key] = value def __delitem__(self, key: str) -> None: del self.additional_properties[key] def __contains__(self, key: str) -> bool: return key in self.additional_properties