the-tip-top-frontend/types/index.ts
soufiane 22553e5c89 fix: add ticket statistics properties to User type
Added optional ticketsCount, pendingTickets, and claimedTickets properties
to User interface to fix TypeScript build error in user details page. These
properties are populated by the getUserById API endpoint.

Fixes: TypeScript compilation error preventing deployment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-19 15:27:18 +01:00

238 lines
4.5 KiB
TypeScript

// User Types
export interface User {
id: string;
email: string;
firstName: string;
lastName: string;
phone?: string;
address?: string;
city?: string;
postalCode?: string;
gender?: 'MALE' | 'FEMALE' | 'OTHER' | 'NOT_SPECIFIED';
dateOfBirth?: string;
role: 'CLIENT' | 'EMPLOYEE' | 'ADMIN';
isVerified: boolean;
createdAt: string;
updatedAt?: string;
// Ticket statistics (populated in getUserById)
ticketsCount?: number;
pendingTickets?: number;
claimedTickets?: number;
}
// Auth Types
export interface LoginCredentials {
email: string;
password: string;
}
export interface RegisterData {
email: string;
password: string;
confirmPassword: string;
firstName: string;
lastName: string;
phone?: string;
}
export interface AuthResponse {
user: User;
token: string;
}
// Ticket Types
export type TicketStatus = 'PENDING' | 'REJECTED' | 'CLAIMED';
export interface Ticket {
id: string;
code: string;
userId?: string;
prizeId?: string;
status: TicketStatus;
playedAt?: string;
claimedAt?: string;
validatedAt?: string;
validatedBy?: string;
rejectionReason?: string;
createdAt?: string;
updatedAt?: string;
prize?: Prize;
user?: User;
}
// Prize Types
export type PrizeType =
| 'INFUSEUR'
| 'THE_SIGNATURE'
| 'COFFRET_DECOUVERTE'
| 'COFFRET_PRESTIGE'
| 'THE_GRATUIT'
| 'GRAND_PRIZE'
| 'PHYSICAL'
| 'DISCOUNT';
export interface Prize {
id: string;
name: string;
type: PrizeType;
description: string;
value: string;
probability: number;
stock: number; // Stock restant
initialStock?: number; // Stock initial (généré)
ticketsUsed?: number; // Nombre de tickets utilisés
isActive: boolean;
imageUrl?: string;
createdAt: string;
updatedAt?: string;
}
export interface CreatePrizeData {
name: string;
type: PrizeType;
description: string;
value: string;
probability: number;
stock: number;
}
export interface UpdatePrizeData {
name?: string;
description?: string;
value?: string;
probability?: number;
stock?: number;
isActive?: boolean;
}
// Game Types
export interface PlayGameRequest {
ticketCode: string;
}
export interface PlayGameResponse {
success: boolean;
ticket: Ticket;
prize: Prize;
message: string;
}
// Statistics Types
export interface GameStatistics {
totalTickets: number;
claimedTickets: number;
pendingTickets: number;
rejectedTickets: number;
prizeDistribution: {
[key in PrizeType]: number;
};
totalParticipants: number;
claimRate: number;
}
// API Response Types
export interface ApiResponse<T> {
success: boolean;
data?: T;
message?: string;
error?: string;
}
export interface PaginatedResponse<T> {
data: T[];
total: number;
page: number;
limit: number;
totalPages: number;
}
// Form Validation Types
export interface ValidationError {
field: string;
message: string;
}
// Navigation Types
export interface NavItem {
label: string;
href: string;
icon?: string;
roles?: User['role'][];
}
// Admin Types
export interface CreateEmployeeData {
email: string;
password: string;
firstName: string;
lastName: string;
}
export interface UpdateUserData {
role?: 'CLIENT' | 'EMPLOYEE' | 'ADMIN';
isVerified?: boolean;
firstName?: string;
lastName?: string;
}
export interface AdminStatistics {
users: {
total: number;
clients: number;
employees: number;
admins: number;
verifiedEmails: number;
};
tickets: {
total: number;
distributed: number; // Tickets fournis/distribués
used: number; // Tickets utilisés en temps réel
pending: number;
rejected: number;
claimed: number;
};
prizes: {
total: number;
active: number;
totalStock: number;
distributed: number;
byCategory?: PrizeDistribution[]; // Répartition des lots par catégorie
};
demographics?: DemographicStatistics; // Statistiques démographiques
}
// Répartition des lots par catégorie
export interface PrizeDistribution {
prizeId: string;
prizeName: string;
prizeType: PrizeType;
count: number;
percentage: number;
}
// Statistiques démographiques des participants
export interface DemographicStatistics {
gender?: {
male: number;
female: number;
other: number;
notSpecified: number;
};
ageRanges?: {
range: string; // ex: "18-25", "26-35", etc.
count: number;
percentage: number;
}[];
locations?: {
city: string;
postalCode?: string;
count: number;
percentage: number;
}[];
topCities?: {
city: string;
count: number;
percentage: number;
}[];
}