57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
"""Reward redemption DTOs — Phase 7.3."""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from app.models.types import RedemptionStatus
|
|
from app.schemas.common import ORMBase
|
|
|
|
_FORBID = ConfigDict(extra="forbid")
|
|
|
|
|
|
class RedeemRequest(BaseModel):
|
|
model_config = _FORBID
|
|
|
|
member_id: UUID
|
|
idempotency_key: str | None = Field(default=None, max_length=100)
|
|
reason: str | None = Field(default=None, max_length=500)
|
|
metadata_json: dict | None = None
|
|
|
|
|
|
class CancelRequest(BaseModel):
|
|
model_config = _FORBID
|
|
|
|
reason: str = Field(max_length=500)
|
|
|
|
|
|
class RewardRedemptionRead(ORMBase):
|
|
id: UUID
|
|
tenant_id: UUID
|
|
program_id: UUID
|
|
reward_id: UUID
|
|
member_id: UUID
|
|
point_account_id: UUID
|
|
status: RedemptionStatus
|
|
points_spent: int
|
|
ledger_entry_id: UUID | None
|
|
voucher_code: str
|
|
idempotency_key: str | None
|
|
reason: str | None
|
|
cancel_reason: str | None
|
|
fulfilled_at: datetime | None
|
|
cancelled_at: datetime | None
|
|
metadata_json: dict | None
|
|
actor_user_id: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class RewardRedemptionPage(BaseModel):
|
|
items: list[RewardRedemptionRead]
|
|
total: int
|
|
offset: int
|
|
limit: int
|