/** * Core TypeScript type definitions for Time Log domain */ declare enum TimeEntryStatus { DRAFT = "DRAFT", SUBMITTED = "SUBMITTED", APPROVED = "APPROVED", REJECTED = "REJECTED", LOCKED = "LOCKED", BILLED = "BILLED" } declare enum TimeCategoryType { BILLABLE = "BILLABLE", NON_BILLABLE = "NON_BILLABLE", INTERNAL = "INTERNAL", TRAINING = "TRAINING", MEETING = "MEETING" } interface TimeEntry { id: string; projectId: string; taskId?: string; developerId: string; clientId: string; startAt: Date; endAt: Date; durationMinutes: number; billable: boolean; category: TimeCategoryType; tags: string[]; status: TimeEntryStatus; notes?: string; approvedBy?: string; approvedAt?: Date; rejectedBy?: string; rejectedAt?: Date; rejectionReason?: string; lockedAt?: Date; billedAt?: Date; invoiceId?: string; createdAt: Date; updatedAt: Date; } interface Timesheet { id: string; developerId: string; clientId: string; periodStart: Date; periodEnd: Date; totalMinutes: number; billableMinutes: number; status: TimeEntryStatus; submittedAt?: Date; approvedAt?: Date; approvedBy?: string; entries: TimeEntry[]; } interface RateCard { id: string; developerId?: string; projectId?: string; clientId?: string; hourlyRate: number; currency: string; effectiveFrom: Date; effectiveTo?: Date; isActive: boolean; createdAt: Date; updatedAt: Date; } interface TimeCategory { id: string; name: string; type: TimeCategoryType; billable: boolean; color: string; description?: string; isActive: boolean; } interface TimeLock { id: string; projectId?: string; clientId?: string; periodStart: Date; periodEnd: Date; reason: string; lockedBy: string; lockedAt: Date; unlockedBy?: string; unlockedAt?: Date; isActive: boolean; } interface AuditLog { id: string; entityType: string; entityId: string; action: string; userId: string; metadata?: Record; createdAt: Date; } export { type AuditLog as A, type RateCard as R, TimeEntryStatus as T, TimeCategoryType as a, type TimeEntry as b, type Timesheet as c, type TimeCategory as d, type TimeLock as e };