export interface Project { id: string; name: string; client: string; startDate: string | null; endDate: string | null; environment: string | null; technician: string | null; weightKg?: number | null; paintedWeight?: number; createdAt?: string; updatedAt?: string; parts?: Part[]; paintingSchemes?: PaintingScheme[]; applicationRecords?: ApplicationRecord[]; inspections?: Inspection[]; createdBy?: string; } export interface Part { id: string; projectId: string; description: string; dimensions?: string; weight?: number; type?: string; area?: number; complexity?: number; quantity: number; notes?: string; } export interface PaintingScheme { id: string; projectId: string; name: string; type?: string; coat?: string; // Primer, Intermediate, Finish, Stripe Coat solidsVolume?: number; yieldTheoretical?: number; epsMin?: number; epsMax?: number; dilution?: number; manufacturer?: string; color?: string; notes?: string; // Consumption Planning paintConsumption?: number; thinnerConsumption?: number; paintId?: string | TechnicalDataSheet; // ID or Populated thinnerId?: string | TechnicalDataSheet; // ID or Populated colorHex?: string; thinnerSymbol?: string; createdBy?: string; } export interface ApplicationRecord { id: string; projectId: string; coatStage: string; pieceDescription?: string; date?: string; operator?: string; realWeight?: number; volumeUsed?: number; areaPainted?: number; wetThicknessAvg?: number; dryThicknessCalc?: number; realYield?: number; method?: string; diluentUsed?: number; notes?: string; items?: { partId: string; quantity: number; }[]; createdBy?: string; } export interface Inspection { id: string; projectId: string; applicationRecordId?: string; // Link to Lote stockItemId?: string | { _id: string; batchNumber: string; dataSheetId: { name: string; type?: string; manufacturer?: string; }; }; // Link to Stock Item (Paint) instrumentId?: string | { _id: string; name: string; serialNumber: string; type: string; }; // Link to Instrument type?: 'painting' | 'surface_treatment'; // Common date?: string; inspector?: string; partTemperature?: number; weightKg?: number; appearance?: string; // 'approved' | 'rejected' | 'notes' defects?: string; photos?: string[]; // Painting pieceDescription?: string; epsPoints?: (number | null)[]; adhesionTest?: string; // Surface Treatment batch?: string; treatmentExecutor?: string; treatmentType?: string; cleaningDegree?: string; roughnessReadings?: (number | null)[]; flashRust?: string; temperature?: number; relativeHumidity?: number; period?: 'morning' | 'afternoon' | 'night'; createdBy?: string; } export interface TechnicalDataSheet { id: string; _id?: string; name: string; manufacturer?: string; type?: string; fileUrl: string; uploadDate: string; solidsVolume?: number; density?: number; mixingRatio?: string; yieldTheoretical?: number; wftMin?: number; wftMax?: number; dftMin?: number; dftMax?: number; reducer?: string; mixingRatioWeight?: string; mixingRatioVolume?: string; dftReference?: number; yieldFactor?: number; dilution?: number; notes?: string; manufacturerCode?: string; minStock?: number; typicalApplication?: string; } export interface PieceCategory { id: string; name: string; weight: number; area?: number; historicalYield: number; historicalDft: number; efficiency: number; litrosPeso?: number; // Consumo calculado por peso litrosArea?: number; // Consumo calculado por área } export interface YieldStudy { id: string; name: string; dataSheetId: string; targetDft: number; dilutionPercent: number; categories: PieceCategory[]; createdAt: string; updatedAt: string; totalWeight: number; estimatedPaintVolume: number; // Por peso (kg) estimatedReducerVolume: number; // Por peso (kg) estimatedPaintVolumeByArea?: number; // Por área (m²) estimatedReducerVolumeByArea?: number; // Por área (m²) averageComplexity: number; } // User Roles System export type UserRole = 'guest' | 'user' | 'admin'; export interface AppUser { id: string; _id?: string; logtoId?: string; email: string; name: string; role: UserRole; isBanned: boolean; createdAt: string; updatedAt: string; organizationId?: string | null; organizationRole?: UserRole | null; } export interface GeometryType { id: string; _id?: string; name: string; efficiencyLoss?: number; updatedAt?: string; } export type NotificationType = 'info' | 'warning' | 'error' | 'success'; export interface INotification { _id: string; title: string; message: string; type: NotificationType; isRead: boolean; isArchived: boolean; archivedBy: string[]; deletedBy: string[]; createdAt: string; metadata?: Record; }