from typing import Literal, Optional from ninja import Schema from datetime import datetime from uuid import UUID class DiscountCodeSchema(Schema): id: int code: str type: str value: int max_discount: int | None = None is_active: bool starts_at: datetime | None = None ends_at: datetime | None = None usage_limit_total: int | None = None usage_limit_per_user: int | None = None min_amount: int | None = None applicable_event_ids: list[int] usage_count: int = 0 created_at: datetime updated_at: datetime class PagedDiscountCodeSchema(Schema): count: int results: list[DiscountCodeSchema] class DiscountCodeWriteSchema(Schema): code: str type: str = "percent" value: int max_discount: int | None = None is_active: bool = True starts_at: datetime | None = None ends_at: datetime | None = None usage_limit_total: int | None = None usage_limit_per_user: int | None = None min_amount: int | None = None applicable_event_ids: list[int] = [] class CreatePaymentIn(Schema): event_id: int description: str discount_code: str | None = None mobile: str | None = None email: str | None = None idempotency_key: UUID | None = None class CreatePaymentOut(Schema): start_pay_url: str | None = None authority: str | None = None payment_id: int | None = None idempotency_key: UUID | None = None status: Literal["initiated", "pending", "paid", "failed", "canceled"] base_amount: int discount_amount: int amount: int class PaymentDetailOut(Schema): payment_id: int event_id: int ref_id: str | None = None authority: str | None = None base_amount: int discount_amount: int amount: int status: str verified_at: str | None = None gateway_paid_at: str | None = None refund_status: Literal["none", "pending", "succeeded", "manual_review"] = "none" refund_attempts: int = 0 refund_last_attempt_at: str | None = None refund_next_attempt_at: str | None = None refund_reference: str | None = None refund_last_error: str | None = None verification_state: Literal[ "awaiting_verification", "checking", "retry_scheduled", "manual_review", "verified", "failed", "canceled", ] verification_attempts: int last_verification_at: str | None = None next_verification_at: str | None = None manual_review_at: str | None = None event: dict class UserPaymentEventSchema(Schema): id: int title: str slug: str image_url: Optional[str] = None class UserPaymentSchema(Schema): payment_id: int event: UserPaymentEventSchema base_amount: int discount_amount: int amount: int status: Literal["initiated", "pending", "paid", "failed", "canceled"] refund_status: Literal["none", "pending", "succeeded", "manual_review"] = "none" created_at: datetime paid_at: Optional[datetime] = None class PaginatedUserPaymentsSchema(Schema): count: int page: int page_size: int total_pages: int results: list[UserPaymentSchema] class CouponVerifyIn(Schema): event_id: int code: str class CouponVerifyOut(Schema): discount_amount: int final_price: int