"""Order models."""
from __future__ import annotations
from datetime import datetime
from typing import Any
from pypresscart.models._common import IncludeItem, PresscartModel
[docs]
class CheckoutLineItem(PresscartModel):
"""A line item in a checkout request."""
product_id: str
quantity: int = 1
is_add_on: bool = False
linked_order_line_item_id: str | None = None
[docs]
class CheckoutRequest(PresscartModel):
"""Body for ``POST /orders/checkout``."""
profile_id: str
line_items: list[CheckoutLineItem]
discount: float | None = 0
[docs]
class OutletRef(PresscartModel):
"""Minimal outlet reference embedded in line items."""
id: str | None = None
name: str | None = None
logo: str | None = None
website_url: str | None = None
[docs]
class LineItem(PresscartModel):
"""A line item on a returned order.
The Presscart API does not populate ``id`` on the line items
returned by ``POST /orders/checkout`` (the order has been created
but the line items haven't been persisted as ``OrderItem`` records
yet — those are surfaced by ``GET /order-items`` after payment).
Both ``id`` and ``order_id`` are therefore optional so unpaid
checkout responses parse cleanly.
"""
id: str | None = None
order_id: str | None = None
product_id: str
quantity: int
price: float | None = None
is_add_on: bool | None = None
linked_order_line_item_id: str | None = None
name: str | None = None
product_type_name: str | None = None
type_id: str | None = None
product_type_prefix: str | None = None
outlet: OutletRef | None = None
includes: list[IncludeItem] | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
deleted_at: datetime | None = None
[docs]
class TeamRef(PresscartModel):
name: str | None = None
contact_email: str | None = None
[docs]
class Order(PresscartModel):
"""Order returned by ``GET /orders`` / ``/orders/{id}`` and ``POST /orders/checkout``.
Team info is encoded differently per endpoint: ``GET /orders`` (list)
returns a nested ``team: { name, contact_email }`` block, while
``GET /orders/{id}`` flattens it to top-level ``name`` and ``email``.
Both shapes are modeled; whichever the endpoint emits will be
populated and the other will be ``None``.
"""
id: str
profile_id: str | None = None
client_id: str | None = None
checkout_by_id: str | None = None
team_id: str | None = None
total: float | None = None
subtotal: float | None = None
processing_fee: float | None = None
discount: float | None = None
credits_applied: float | None = None
coupon: str | None = None
client_secret: str | None = None
date_paid: datetime | None = None
status: str | None = None
reference_number: str | None = None
external_reference_number: str | None = None
customer_invoice_id: str | None = None
customer_invoice_source: str | None = None
customer_invoice_date: datetime | None = None
customer_invoice_url: str | None = None
is_guest_order: bool | None = None
guest_email: str | None = None
account_owner_email: str | None = None
guest_stripe_customer_id: str | None = None
metadata: dict[str, Any] | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
deleted_at: datetime | None = None
team: TeamRef | None = None
name: str | None = None
email: str | None = None
checkout_link: str | None = None
line_items: list[LineItem] = []
__all__ = [
"CheckoutLineItem",
"CheckoutRequest",
"LineItem",
"Order",
"OutletRef",
"TeamRef",
]