This commit refactors the application settings to include a new `AppFeatures` interface. This allows for granular control over which features are enabled for the application. The `AppFeatures` object includes boolean flags for: - `multiCondo`: Enables or disables the multi-condominium management feature. - `tickets`: Placeholder for future ticket system integration. - `payPal`: Enables or disables PayPal payment gateway integration. - `notices`: Enables or disables the display and management of notices. These flags are now fetched and stored in the application state, influencing UI elements and logic across various pages to conditionally render features based on their enabled status. For example, the multi-condo selection in `Layout.tsx` and the notice display in `FamilyList.tsx` are now gated by these feature flags. The `FamilyDetail.tsx` page also uses the `payPal` flag to conditionally enable the PayPal payment option. The `SettingsPage.tsx` has been updated to include a new 'features' tab for managing these flags.
167 lines
3.5 KiB
TypeScript
167 lines
3.5 KiB
TypeScript
|
|
export interface Condo {
|
|
id: string;
|
|
name: string;
|
|
address?: string;
|
|
streetNumber?: string; // Civico
|
|
city?: string; // Città
|
|
province?: string; // Provincia
|
|
zipCode?: string; // CAP
|
|
notes?: string; // Note
|
|
iban?: string;
|
|
paypalClientId?: string; // PayPal Client ID for receiving payments
|
|
defaultMonthlyQuota: number;
|
|
image?: string; // Optional placeholder for logo
|
|
}
|
|
|
|
export interface Family {
|
|
id: string;
|
|
condoId: string; // Link to specific condo
|
|
name: string;
|
|
unitNumber: string; // Internal apartment number (Interno)
|
|
stair?: string; // Scala
|
|
floor?: string; // Piano
|
|
notes?: string; // Note
|
|
contactEmail?: string;
|
|
balance: number; // Calculated balance (positive = credit, negative = debt)
|
|
customMonthlyQuota?: number; // Optional override for default quota
|
|
}
|
|
|
|
export interface Payment {
|
|
id: string;
|
|
familyId: string;
|
|
amount: number;
|
|
datePaid: string; // ISO Date string
|
|
forMonth: number; // 1-12
|
|
forYear: number;
|
|
notes?: string;
|
|
}
|
|
|
|
export interface SmtpConfig {
|
|
host: string;
|
|
port: number;
|
|
user: string;
|
|
pass: string;
|
|
secure: boolean;
|
|
fromEmail: string;
|
|
}
|
|
|
|
export interface AppFeatures {
|
|
multiCondo: boolean;
|
|
tickets: boolean;
|
|
payPal: boolean;
|
|
notices: boolean;
|
|
}
|
|
|
|
export interface AlertDefinition {
|
|
id: string;
|
|
subject: string;
|
|
body: string;
|
|
daysOffset: number; // Number of days
|
|
offsetType: 'before_next_month' | 'after_current_month';
|
|
sendHour: number; // 0-23
|
|
active: boolean;
|
|
lastSent?: string; // ISO Date of last execution
|
|
}
|
|
|
|
export type NoticeIconType = 'info' | 'warning' | 'maintenance' | 'event';
|
|
|
|
export interface Notice {
|
|
id: string;
|
|
condoId: string;
|
|
title: string;
|
|
content: string;
|
|
type: NoticeIconType;
|
|
link?: string;
|
|
date: string; // ISO Date
|
|
active: boolean;
|
|
}
|
|
|
|
export interface NoticeRead {
|
|
userId: string;
|
|
noticeId: string;
|
|
readAt: string;
|
|
}
|
|
|
|
export interface AppSettings {
|
|
// Global settings only
|
|
currentYear: number; // The active fiscal year (could be per-condo, but global for simplicity now)
|
|
smtpConfig?: SmtpConfig;
|
|
features: AppFeatures;
|
|
}
|
|
|
|
export enum PaymentStatus {
|
|
PAID = 'PAID',
|
|
UNPAID = 'UNPAID', // Past due
|
|
UPCOMING = 'UPCOMING', // Future
|
|
PENDING = 'PENDING'
|
|
}
|
|
|
|
export interface MonthStatus {
|
|
monthIndex: number; // 0-11
|
|
status: PaymentStatus;
|
|
payment?: Payment;
|
|
}
|
|
|
|
export interface User {
|
|
id: string;
|
|
email: string;
|
|
name?: string;
|
|
role?: 'admin' | 'poweruser' | 'user';
|
|
phone?: string;
|
|
familyId?: string | null;
|
|
receiveAlerts?: boolean;
|
|
}
|
|
|
|
export interface AuthResponse {
|
|
token: string;
|
|
user: User;
|
|
}
|
|
|
|
// --- TICKETS ---
|
|
|
|
export enum TicketStatus {
|
|
OPEN = 'OPEN',
|
|
IN_PROGRESS = 'IN_PROGRESS',
|
|
RESOLVED = 'RESOLVED',
|
|
CLOSED = 'CLOSED'
|
|
}
|
|
|
|
export enum TicketPriority {
|
|
LOW = 'LOW',
|
|
MEDIUM = 'MEDIUM',
|
|
HIGH = 'HIGH',
|
|
URGENT = 'URGENT'
|
|
}
|
|
|
|
export enum TicketCategory {
|
|
MAINTENANCE = 'MAINTENANCE', // Manutenzione
|
|
ADMINISTRATIVE = 'ADMINISTRATIVE', // Amministrativa
|
|
NOISE = 'NOISE', // Disturbo/Rumori
|
|
CLEANING = 'CLEANING', // Pulizie
|
|
OTHER = 'OTHER' // Altro
|
|
}
|
|
|
|
export interface TicketAttachment {
|
|
id: string;
|
|
ticketId: string;
|
|
fileName: string;
|
|
fileType: string; // MIME type
|
|
data: string; // Base64 Data URI
|
|
}
|
|
|
|
export interface Ticket {
|
|
id: string;
|
|
condoId: string;
|
|
userId: string;
|
|
title: string;
|
|
description: string;
|
|
status: TicketStatus;
|
|
priority: TicketPriority;
|
|
category: TicketCategory;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
attachments?: TicketAttachment[];
|
|
userName?: string; // Joined field
|
|
userEmail?: string; // Joined field
|
|
} |