export type ProjectStatus = "NOT_OPEN" | "RUNNING" | "PAUSED" | "ENDED" | "CLOSED" | "OPEN" | "FINISHED" | string; export type TicketStatus = | "WAITING" | "CALLED" | "ARRIVED" | "SERVING" | "COMPLETED" | "MISSED" | "CANCELED" | "CANCELLED" | string; export type CallMode = "TICKET" | "PEOPLE" | "BOTH"; export interface UserDto { id: string; username: string; display_name?: string; role: string; } export interface AdminUserDto extends UserDto { active: boolean; protected?: boolean; project_ids: string[]; created_at?: string; } export interface ProjectDto { id: string; code?: string; name: string; status: ProjectStatus; batch_size: number; call_batch_size?: number; call_mode?: CallMode; default_call_ticket_count?: number; max_call_ticket_count?: number; default_call_people_count?: number; max_call_people_count?: number; min_party_size?: number; max_party_size?: number; ticket_prefix?: string; timezone?: string; grace_period_minutes?: number; experienced_people_start?: number; visitor_notice?: string | null; eta?: { interval_per_person_seconds?: number; }; } export interface ProjectProfilePayload { name: string; code: string; timezone: string; ticket_prefix: string; } export interface AuthPayload { user: UserDto; projects: ProjectDto[]; } export interface QueueTicketDto { id: string; ticket_number: string; display_number?: string | null; phone?: string; phone_masked?: string | null; phone_last4?: string; last_name?: string | null; honorific?: string | null; status: TicketStatus; party_size: number; created_at?: string | null; estimated_wait?: unknown; public_token?: string | null; public_url?: string | null; } export interface CallBatchDto { id: string; batch_number: string | number; status: string; call_mode?: Exclude; requested_count?: number; ticket_count?: number; people_count?: number; tickets: QueueTicketDto[]; called_at?: string | null; } export interface DeviceResultDto { channel: string; status: string; message?: string | null; } export interface QueueSnapshotDto { project: ProjectDto; revision: string | number; waiting: QueueTicketDto[]; current_batch?: CallBatchDto | null; recent_batches?: CallBatchDto[]; metrics: { waiting_count: number; waiting_ticket_count: number; waiting_people_count: number; called_count?: number; called_ticket_count?: number; called_people_count?: number; estimated_wait?: unknown; last_ticket_number?: string | null; next_ticket_number?: string | null; }; server_time?: string | null; last_success_at?: string | null; } export interface CreateTicketPayload { phone: string; party_size: number; last_name?: string; honorific?: string; allow_duplicate?: boolean; } export interface CreateTicketResponse { ticket: QueueTicketDto; public_token?: string; public_url?: string; status_path?: string; revision: string | number; } export interface PublicProjectDto { id: string; name: string; status: ProjectStatus; visitor_notice?: string | null; min_party_size: number; max_party_size: number; } export interface CallNextResponse { batch: CallBatchDto; revision: string | number; device_results: DeviceResultDto[]; } export interface PublicStatusDto { ticket_number: string; display_number?: string | null; phone_last4?: string; project_name: string; project?: { id?: string; name?: string; status?: ProjectStatus; }; status: TicketStatus; party_size: number; tickets_ahead?: number | null; people_ahead?: number | null; latest_called_number?: string | null; estimated_wait?: unknown; called_at?: string | null; last_updated_at?: string | null; entrance?: string | null; message?: string | null; visitor_notice?: string | null; experienced_people?: number | null; } export interface PublicStatusSearchDto { tickets: PublicStatusDto[]; } export interface DisplaySnapshotDto { project_name: string; status: ProjectStatus; current_batch?: CallBatchDto | null; recent_batches: CallBatchDto[]; waiting_count: number; waiting_ticket_count: number; waiting_people_count: number; experienced_people: number; estimated_wait?: unknown; last_updated_at?: string | null; device_status?: unknown; } export interface AdminProjectDto extends Partial { id: string; name: string; status: ProjectStatus; waiting_count?: number; waiting_ticket_count?: number; waiting_people_count?: number; issued_ticket_count?: number; latest_ticket_number?: string | null; experienced_people?: number; current_batch?: string | number | CallBatchDto | null; estimated_wait?: unknown; last_updated_at?: string | null; device_status?: unknown; } export interface UpdateProjectSettingsPayload { status: string; call_mode: CallMode; default_call_ticket_count: number; max_call_ticket_count: number; default_call_people_count: number; max_call_people_count: number; min_party_size: number; max_party_size: number; grace_period_minutes: number; experienced_people_start: number; eta_interval_seconds: number; visitor_notice: string; } export interface AdminActiveTicketDto { id: string; project_id: string; project_name: string; ticket_number: string; phone: string; last_name?: string | null; honorific?: string | null; party_size: number; status: TicketStatus; created_at: string; } export interface AdminOverviewDto { summary: { running_projects: number; waiting_count: number; waiting_ticket_count: number; waiting_people_count: number; anomaly_projects: number; offline_devices: number; }; projects: AdminProjectDto[]; active_tickets: AdminActiveTicketDto[]; } export interface AdminHistoryQuery { project_id?: string; from: string; to: string; status?: string; query?: string; page?: number; page_size?: number; } export interface AdminHistoryTicketDto { id: string; project_id: string; project_name: string; project_code?: string; queue_session_id: string; business_date: string; ticket_number: string; ticket_sequence?: number; party_size: number; status: TicketStatus; joined_at?: string | null; called_at?: string | null; arrived_at?: string | null; completed_at?: string | null; missed_at?: string | null; terminal_at?: string | null; wait_seconds?: number | null; created_by?: string | null; phone?: string | null; phone_last4?: string | null; phone_masked?: string | null; last_name?: string | null; honorific?: string | null; personal_data_status: "AVAILABLE" | "ANONYMIZED" | string; personal_data_purged_at?: string | null; history_anonymized_at?: string | null; batch_id?: string | null; batch_sequence?: number | null; batch_position?: number | null; } export interface AdminHistoryBatchDto { id: string; project_id: string; project_name: string; project_code?: string; queue_session_id: string; business_date: string; batch_sequence: number; revision?: number; status: string; call_mode?: "TICKET" | "PEOPLE" | string; requested_count: number; ticket_count: number; people_count: number; requested_by?: string | null; called_at?: string | null; completed_at?: string | null; ticket_numbers?: string[]; tickets?: AdminHistoryTicketDto[]; } export interface AdminHistoryPageDto { items: T[]; page: number; page_size: number; total: number; from: string; to: string; } export interface AdminHistoryHourlyDto { hour: number; issued_tickets: number; issued_people: number; called_tickets: number; called_people: number; } export interface AdminHistoryPeakHourDto extends AdminHistoryHourlyDto { rank: number; } export interface AdminHistoryDailyDto { business_date: string; total_tickets: number; total_people: number; called_tickets: number; completed_tickets: number; missed_tickets: number; canceled_tickets: number; completion_rate: number; missed_rate: number; canceled_rate: number; average_wait_seconds?: number | null; max_wait_seconds?: number | null; } export interface AdminHistoryProjectDto { project_id: string; project_name: string; project_code?: string; total_tickets: number; total_people: number; called_tickets: number; completed_tickets: number; missed_tickets: number; canceled_tickets: number; completion_rate: number; missed_rate: number; canceled_rate: number; average_wait_seconds?: number | null; max_wait_seconds?: number | null; } export interface AdminHistoryAlertDto { severity: number; type: string; title: string; detail: string; project_id: string; project_name: string; total_tickets: number; } export interface AdminHistorySummaryDto { from: string; to: string; summary: { total_tickets: number; total_people: number; called_tickets: number; called_people: number; completed_tickets: number; completed_people: number; missed_tickets: number; canceled_tickets: number; completion_rate: number; missed_rate: number; canceled_rate: number; average_wait_seconds?: number | null; max_wait_seconds?: number | null; }; hourly: AdminHistoryHourlyDto[]; peak_hours?: AdminHistoryPeakHourDto[]; daily?: AdminHistoryDailyDto[]; projects?: AdminHistoryProjectDto[]; alerts?: AdminHistoryAlertDto[]; }