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

import typing_extensions
import typing_extensions
import typing
from .money import MoneyParams
from ..types.order_service_charge_calculation_phase import OrderServiceChargeCalculationPhase
from .order_line_item_applied_tax import OrderLineItemAppliedTaxParams
from ..types.order_service_charge_type import OrderServiceChargeType
from ..types.order_service_charge_treatment_type import OrderServiceChargeTreatmentType
from ..types.order_service_charge_scope import OrderServiceChargeScope


class OrderServiceChargeParams(typing_extensions.TypedDict):
    """
    Represents a service charge applied to an order.
    """

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

    name: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The name of the service charge.
    """

    catalog_object_id: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The catalog object ID referencing the service charge [CatalogObject](entity:CatalogObject).
    """

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

    percentage: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The service charge percentage as a string representation of a
    decimal number. For example, `"7.25"` indicates a service charge of 7.25%.
    
    Exactly 1 of `percentage` or `amount_money` should be set.
    """

    amount_money: typing_extensions.NotRequired[MoneyParams]
    """
    The amount of a non-percentage-based service charge.
    
    Exactly one of `percentage` or `amount_money` should be set.
    """

    applied_money: typing_extensions.NotRequired[MoneyParams]
    """
    The amount of money applied to the order by the service charge,
    including any inclusive tax amounts, as calculated by Square.
    
    - For fixed-amount service charges, `applied_money` is equal to `amount_money`.
    - For percentage-based service charges, `applied_money` is the money
    calculated using the percentage.
    """

    total_money: typing_extensions.NotRequired[MoneyParams]
    """
    The total amount of money to collect for the service charge.
    
    __Note__: If an inclusive tax is applied to the service charge,
    `total_money` does not equal `applied_money` plus `total_tax_money`
    because the inclusive tax amount is already included in both
    `applied_money` and `total_tax_money`.
    """

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

    calculation_phase: typing_extensions.NotRequired[OrderServiceChargeCalculationPhase]
    """
    The calculation phase at which to apply the service charge.
    See [OrderServiceChargeCalculationPhase](#type-orderservicechargecalculationphase) for possible values
    """

    taxable: typing_extensions.NotRequired[typing.Optional[bool]]
    """
    Indicates whether the service charge can be taxed. If set to `true`,
    order-level taxes automatically apply to the service charge. Note that
    service charges calculated in the `TOTAL_PHASE` cannot be marked as taxable.
    """

    applied_taxes: typing_extensions.NotRequired[typing.Optional[typing.Sequence[OrderLineItemAppliedTaxParams]]]
    """
    The list of references to the taxes applied to this service charge. Each
    `OrderLineItemAppliedTax` has a `tax_uid` that references the `uid` of a top-level
    `OrderLineItemTax` that is being applied to this service charge. On reads, the amount applied
    is populated.
    
    An `OrderLineItemAppliedTax` is automatically created on every taxable service charge
    for all `ORDER` scoped taxes that are added to the order. `OrderLineItemAppliedTax` records
    for `LINE_ITEM` scoped taxes must be added in requests for the tax to apply to any taxable
    service charge. Taxable service charges have the `taxable` field set to `true` and calculated
    in the `SUBTOTAL_PHASE`.
    
    To change the amount of a tax, modify the referenced top-level tax.
    """

    metadata: typing_extensions.NotRequired[typing.Optional[typing.Dict[str, typing.Optional[str]]]]
    """
    Application-defined data attached to this service charge. 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).
    """

    type: typing_extensions.NotRequired[OrderServiceChargeType]
    """
    The type of the service charge.
    See [OrderServiceChargeType](#type-orderservicechargetype) for possible values
    """

    treatment_type: typing_extensions.NotRequired[OrderServiceChargeTreatmentType]
    """
    The treatment type of the service charge.
    See [OrderServiceChargeTreatmentType](#type-orderservicechargetreatmenttype) for possible values
    """

    scope: typing_extensions.NotRequired[OrderServiceChargeScope]
    """
    Indicates the level at which the apportioned service charge applies. For `ORDER`
    scoped service charges, Square generates references in `applied_service_charges` on
    all order line items that do not have them. For `LINE_ITEM` scoped service charges,
    the service charge only applies to line items with a service charge reference in their
    `applied_service_charges` field.
    
    This field is immutable. To change the scope of an apportioned service charge, you must delete
    the apportioned service charge and re-add it as a new apportioned service charge.
    See [OrderServiceChargeScope](#type-orderservicechargescope) for possible values
    """
