# This file was auto-generated by Fern from our API Definition.

import typing_extensions
import typing_extensions
import typing
from .order_quantity_unit import OrderQuantityUnitParams
from ..types.order_line_item_item_type import OrderLineItemItemType
from .order_line_item_modifier import OrderLineItemModifierParams
from .order_line_item_applied_tax import OrderLineItemAppliedTaxParams
from .order_line_item_applied_discount import OrderLineItemAppliedDiscountParams
from .order_line_item_applied_service_charge import OrderLineItemAppliedServiceChargeParams
from .money import MoneyParams
from .order_line_item_pricing_blocklists import OrderLineItemPricingBlocklistsParams


class OrderLineItemParams(typing_extensions.TypedDict):
    """
    Represents a line item in an order. Each line item describes a different
    product to purchase, with its own quantity and price details.
    """

    uid: typing_extensions.NotRequired[typing.Optional[str]]
    """
    A unique ID that identifies the line item only within this order.
    """

    name: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The name of the line item.
    """

    quantity: str
    """
    The count, or measurement, of a line item being purchased:
    
    If `quantity` is a whole number, and `quantity_unit` is not specified, then `quantity` denotes an item count.  For example: `3` apples.
    
    If `quantity` is a whole or decimal number, and `quantity_unit` is also specified, then `quantity` denotes a measurement.  For example: `2.25` pounds of broccoli.
    
    For more information, see [Specify item quantity and measurement unit](https://developer.squareup.com/docs/orders-api/create-orders#specify-item-quantity-and-measurement-unit).
    
    Line items with a quantity of `0` are automatically removed
    when paying for or otherwise completing the order.
    """

    quantity_unit: typing_extensions.NotRequired[OrderQuantityUnitParams]
    """
    The measurement unit and decimal precision that this line item's quantity is measured in.
    """

    note: typing_extensions.NotRequired[typing.Optional[str]]
    """
    An optional note associated with the line item.
    """

    catalog_object_id: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The [CatalogItemVariation](entity:CatalogItemVariation) ID applied to this line item.
    """

    catalog_version: typing_extensions.NotRequired[typing.Optional[int]]
    """
    The version of the catalog object that this line item references.
    """

    variation_name: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The name of the variation applied to this line item.
    """

    item_type: typing_extensions.NotRequired[OrderLineItemItemType]
    """
    The type of line item: an itemized sale, a non-itemized sale (custom amount), or the
    activation or reloading of a gift card.
    See [OrderLineItemItemType](#type-orderlineitemitemtype) for possible values
    """

    metadata: typing_extensions.NotRequired[typing.Optional[typing.Dict[str, typing.Optional[str]]]]
    """
    Application-defined data attached to this line item. Metadata fields are intended
    to store descriptive references or associations with an entity in another system or store brief
    information about the object. Square does not process this field; it only stores and returns it
    in relevant API calls. Do not use metadata to store any sensitive information (such as personally
    identifiable information or card details).
    
    Keys written by applications must be 60 characters or less and must be in the character set
    `[a-zA-Z0-9_-]`. Entries can also include metadata generated by Square. These keys are prefixed
    with a namespace, separated from the key with a ':' character.
    
    Values have a maximum length of 255 characters.
    
    An application can have up to 10 entries per metadata field.
    
    Entries written by applications are private and can only be read or modified by the same
    application.
    
    For more information, see [Metadata](https://developer.squareup.com/docs/build-basics/metadata).
    """

    modifiers: typing_extensions.NotRequired[typing.Optional[typing.Sequence[OrderLineItemModifierParams]]]
    """
    The [CatalogModifier](entity:CatalogModifier)s applied to this line item.
    """

    applied_taxes: typing_extensions.NotRequired[typing.Optional[typing.Sequence[OrderLineItemAppliedTaxParams]]]
    """
    The list of references to taxes applied to this line item. Each
    `OrderLineItemAppliedTax` has a `tax_uid` that references the `uid` of a
    top-level `OrderLineItemTax` applied to the line item. On reads, the
    amount applied is populated.
    
    An `OrderLineItemAppliedTax` is automatically created on every line
    item for all `ORDER` scoped taxes added to the order. `OrderLineItemAppliedTax`
    records for `LINE_ITEM` scoped taxes must be added in requests for the tax
    to apply to any line items.
    
    To change the amount of a tax, modify the referenced top-level tax.
    """

    applied_discounts: typing_extensions.NotRequired[
        typing.Optional[typing.Sequence[OrderLineItemAppliedDiscountParams]]
    ]
    """
    The list of references to discounts applied to this line item. Each
    `OrderLineItemAppliedDiscount` has a `discount_uid` that references the `uid` of a top-level
    `OrderLineItemDiscounts` applied to the line item. On reads, the amount
    applied is populated.
    
    An `OrderLineItemAppliedDiscount` is automatically created on every line item for all
    `ORDER` scoped discounts that are added to the order. `OrderLineItemAppliedDiscount` records
    for `LINE_ITEM` scoped discounts must be added in requests for the discount to apply to any
    line items.
    
    To change the amount of a discount, modify the referenced top-level discount.
    """

    applied_service_charges: typing_extensions.NotRequired[
        typing.Optional[typing.Sequence[OrderLineItemAppliedServiceChargeParams]]
    ]
    """
    The list of references to service charges applied to this line item. Each
    `OrderLineItemAppliedServiceCharge` has a `service_charge_id` that references the `uid` of a
    top-level `OrderServiceCharge` applied to the line item. On reads, the amount applied is
    populated.
    
    To change the amount of a service charge, modify the referenced top-level service charge.
    """

    base_price_money: typing_extensions.NotRequired[MoneyParams]
    """
    The base price for a single unit of the line item.
    """

    variation_total_price_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total price of all item variations sold in this line item.
    The price is calculated as `base_price_money` multiplied by `quantity`.
    It does not include modifiers.
    """

    gross_sales_money: typing_extensions.NotRequired[MoneyParams]
    """
    The amount of money made in gross sales for this line item.
    The amount is calculated as the sum of the variation's total price and each modifier's total price.
    For inclusive tax items in the US, Canada, and Japan, tax is deducted from `gross_sales_money`. For Europe and
    Australia, inclusive tax remains as part of the gross sale calculation.
    """

    total_tax_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total amount of tax money to collect for the line item.
    """

    total_discount_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total amount of discount money to collect for the line item.
    """

    total_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total amount of money to collect for this line item.
    """

    pricing_blocklists: typing_extensions.NotRequired[OrderLineItemPricingBlocklistsParams]
    """
    Describes pricing adjustments that are blocked from automatic
    application to a line item. For more information, see
    [Apply Taxes and Discounts](https://developer.squareup.com/docs/orders-api/apply-taxes-and-discounts).
    """

    total_service_charge_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total amount of apportioned service charge money to collect for the line item.
    """
