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

import typing_extensions
import typing_extensions
import typing
from .loyalty_account_mapping import LoyaltyAccountMappingParams
from .loyalty_account_expiring_point_deadline import LoyaltyAccountExpiringPointDeadlineParams


class LoyaltyAccountParams(typing_extensions.TypedDict):
    """
    Describes a loyalty account in a [loyalty program](entity:LoyaltyProgram). For more information, see
    [Create and Retrieve Loyalty Accounts](https://developer.squareup.com/docs/loyalty-api/loyalty-accounts).
    """

    id: typing_extensions.NotRequired[str]
    """
    The Square-assigned ID of the loyalty account.
    """

    program_id: str
    """
    The Square-assigned ID of the [loyalty program](entity:LoyaltyProgram) to which the account belongs.
    """

    balance: typing_extensions.NotRequired[int]
    """
    The available point balance in the loyalty account. If points are scheduled to expire, they are listed in the `expiring_point_deadlines` field.
    
    Your application should be able to handle loyalty accounts that have a negative point balance (`balance` is less than 0). This might occur if a seller makes a manual adjustment or as a result of a refund or exchange.
    """

    lifetime_points: typing_extensions.NotRequired[int]
    """
    The total points accrued during the lifetime of the account.
    """

    customer_id: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The Square-assigned ID of the [customer](entity:Customer) that is associated with the account.
    """

    enrolled_at: typing_extensions.NotRequired[typing.Optional[str]]
    """
    The timestamp when the buyer joined the loyalty program, in RFC 3339 format. This field is used to display the **Enrolled On** or **Member Since** date in first-party Square products.
    
    If this field is not set in a `CreateLoyaltyAccount` request, Square populates it after the buyer's first action on their account 
    (when `AccumulateLoyaltyPoints` or `CreateLoyaltyReward` is called). In first-party flows, Square populates the field when the buyer agrees to the terms of service in Square Point of Sale. 
    
    This field is typically specified in a `CreateLoyaltyAccount` request when creating a loyalty account for a buyer who already interacted with their account. 
    For example, you would set this field when migrating accounts from an external system. The timestamp in the request can represent a current or previous date and time, but it cannot be set for the future.
    """

    created_at: typing_extensions.NotRequired[str]
    """
    The timestamp when the loyalty account was created, in RFC 3339 format.
    """

    updated_at: typing_extensions.NotRequired[str]
    """
    The timestamp when the loyalty account was last updated, in RFC 3339 format.
    """

    mapping: typing_extensions.NotRequired[LoyaltyAccountMappingParams]
    """
    The mapping that associates the loyalty account with a buyer. Currently,
    a loyalty account can only be mapped to a buyer by phone number.
    
    To create a loyalty account, you must specify the `mapping` field, with the buyer's phone number
    in the `phone_number` field.
    """

    expiring_point_deadlines: typing_extensions.NotRequired[
        typing.Optional[typing.Sequence[LoyaltyAccountExpiringPointDeadlineParams]]
    ]
    """
    The schedule for when points expire in the loyalty account balance. This field is present only if the account has points that are scheduled to expire. 
    
    The total number of points in this field equals the number of points in the `balance` field.
    """
