from __future__ import annotations from dataclasses import dataclass, field from datetime import UTC, datetime from uuid import uuid4 @dataclass(slots=True) class PointsOrder: id: str user_id: str order_type: str # membership / points product_code: str amount_cents: int original_amount_cents: int = 0 discount: float = 1.0 points_amount: int = 0 status: str = "pending" payment_method: str | None = None payment_id: str | None = None paid_at: datetime | None = None created_at: datetime = field(default_factory=lambda: datetime.now(UTC)) @classmethod def create( cls, user_id: str, order_type: str, product_code: str, amount_cents: int, *, original_amount_cents: int = 0, discount: float = 1.0, points_amount: int = 0, ) -> "PointsOrder": return cls( id=uuid4().hex, user_id=user_id, order_type=order_type, product_code=product_code, amount_cents=amount_cents, original_amount_cents=original_amount_cents, discount=discount, points_amount=points_amount, )