{"version":3,"sources":["../../src/core/types.ts","../../src/core/schemas.ts","../../src/core/policies.ts","../../src/core/errors.ts","../../src/core/workflows.ts","../../src/core/finance.ts","../../src/core/locks.ts"],"names":["TimeEntryStatus","TimeCategoryType","z","RoundingInterval","differenceInMinutes","areIntervalsOverlapping"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Core TypeScript type definitions for Time Log domain\n */\n\nexport enum TimeEntryStatus {\n  DRAFT = 'DRAFT',\n  SUBMITTED = 'SUBMITTED',\n  APPROVED = 'APPROVED',\n  REJECTED = 'REJECTED',\n  LOCKED = 'LOCKED',\n  BILLED = 'BILLED',\n}\n\nexport enum TimeCategoryType {\n  BILLABLE = 'BILLABLE',\n  NON_BILLABLE = 'NON_BILLABLE',\n  INTERNAL = 'INTERNAL',\n  TRAINING = 'TRAINING',\n  MEETING = 'MEETING',\n}\n\nexport interface TimeEntry {\n  id: string;\n  projectId: string;\n  taskId?: string;\n  developerId: string;\n  clientId: string;\n  startAt: Date;\n  endAt: Date;\n  durationMinutes: number;\n  billable: boolean;\n  category: TimeCategoryType;\n  tags: string[];\n  status: TimeEntryStatus;\n  notes?: string;\n  approvedBy?: string;\n  approvedAt?: Date;\n  rejectedBy?: string;\n  rejectedAt?: Date;\n  rejectionReason?: string;\n  lockedAt?: Date;\n  billedAt?: Date;\n  invoiceId?: string;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\nexport interface Timesheet {\n  id: string;\n  developerId: string;\n  clientId: string;\n  periodStart: Date;\n  periodEnd: Date;\n  totalMinutes: number;\n  billableMinutes: number;\n  status: TimeEntryStatus;\n  submittedAt?: Date;\n  approvedAt?: Date;\n  approvedBy?: string;\n  entries: TimeEntry[];\n}\n\nexport interface RateCard {\n  id: string;\n  developerId?: string;\n  projectId?: string;\n  clientId?: string;\n  hourlyRate: number;\n  currency: string;\n  effectiveFrom: Date;\n  effectiveTo?: Date;\n  isActive: boolean;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\nexport interface TimeCategory {\n  id: string;\n  name: string;\n  type: TimeCategoryType;\n  billable: boolean;\n  color: string;\n  description?: string;\n  isActive: boolean;\n}\n\nexport interface TimeLock {\n  id: string;\n  projectId?: string;\n  clientId?: string;\n  periodStart: Date;\n  periodEnd: Date;\n  reason: string;\n  lockedBy: string;\n  lockedAt: Date;\n  unlockedBy?: string;\n  unlockedAt?: Date;\n  isActive: boolean;\n}\n\nexport interface AuditLog {\n  id: string;\n  entityType: string;\n  entityId: string;\n  action: string;\n  userId: string;\n  metadata?: Record<string, any>;\n  createdAt: Date;\n}","/**\n * Zod validation schemas for Time Log domain\n */\n\nimport { z } from 'zod';\nimport { TimeEntryStatus, TimeCategoryType } from './types';\n\n// Base schemas\nexport const timeEntryStatusSchema = z.nativeEnum(TimeEntryStatus);\nexport const timeCategoryTypeSchema = z.nativeEnum(TimeCategoryType);\n\n// TimeEntry schemas\nexport const createTimeEntrySchema = z.object({\n  projectId: z.string().min(1),\n  taskId: z.string().optional(),\n  developerId: z.string().min(1),\n  clientId: z.string().min(1),\n  startAt: z.string().datetime().or(z.date()),\n  endAt: z.string().datetime().or(z.date()),\n  billable: z.boolean().default(true),\n  category: timeCategoryTypeSchema.default(TimeCategoryType.BILLABLE),\n  tags: z.array(z.string()).default([]),\n  notes: z.string().optional(),\n});\n\nexport const updateTimeEntrySchema = createTimeEntrySchema.partial().extend({\n  id: z.string().min(1),\n});\n\nexport const submitTimeEntrySchema = z.object({\n  id: z.string().min(1),\n});\n\nexport const approveTimeEntrySchema = z.object({\n  id: z.string().min(1),\n  approvedBy: z.string().min(1),\n});\n\nexport const rejectTimeEntrySchema = z.object({\n  id: z.string().min(1),\n  rejectedBy: z.string().min(1),\n  reason: z.string().min(1),\n});\n\n// Timesheet schemas\nexport const timesheetQuerySchema = z.object({\n  developerId: z.string().optional(),\n  clientId: z.string().optional(),\n  projectId: z.string().optional(),\n  periodStart: z.string().datetime().or(z.date()),\n  periodEnd: z.string().datetime().or(z.date()),\n  status: timeEntryStatusSchema.optional(),\n});\n\n// RateCard schemas\nexport const createRateCardSchema = z.object({\n  developerId: z.string().optional(),\n  projectId: z.string().optional(),\n  clientId: z.string().optional(),\n  hourlyRate: z.number().positive(),\n  currency: z.string().length(3).default('USD'),\n  effectiveFrom: z.string().datetime().or(z.date()),\n  effectiveTo: z.string().datetime().or(z.date()).optional(),\n}).refine(\n  (data) => data.developerId || data.projectId || data.clientId,\n  { message: 'At least one of developerId, projectId, or clientId must be provided' }\n);\n\n// TimeCategory schemas\nexport const createTimeCategorySchema = z.object({\n  name: z.string().min(1).max(50),\n  type: timeCategoryTypeSchema,\n  billable: z.boolean(),\n  color: z.string().regex(/^#[0-9A-Fa-f]{6}$/),\n  description: z.string().optional(),\n});\n\n// TimeLock schemas\nexport const createTimeLockSchema = z.object({\n  projectId: z.string().optional(),\n  clientId: z.string().optional(),\n  periodStart: z.string().datetime().or(z.date()),\n  periodEnd: z.string().datetime().or(z.date()),\n  reason: z.string().min(1),\n  lockedBy: z.string().min(1),\n}).refine(\n  (data) => data.projectId || data.clientId,\n  { message: 'Either projectId or clientId must be provided' }\n);\n\n// Query and filter schemas\nexport const paginationSchema = z.object({\n  page: z.coerce.number().int().positive().default(1),\n  limit: z.coerce.number().int().positive().max(100).default(20),\n  sortBy: z.string().optional(),\n  sortOrder: z.enum(['asc', 'desc']).default('desc'),\n});\n\nexport const timeEntryFilterSchema = z.object({\n  developerId: z.string().optional(),\n  clientId: z.string().optional(),\n  projectId: z.string().optional(),\n  taskId: z.string().optional(),\n  status: timeEntryStatusSchema.optional(),\n  billable: z.coerce.boolean().optional(),\n  category: timeCategoryTypeSchema.optional(),\n  tags: z.array(z.string()).optional(),\n  startDate: z.string().datetime().or(z.date()).optional(),\n  endDate: z.string().datetime().or(z.date()).optional(),\n}).merge(paginationSchema);\n\n// Export types from schemas\nexport type CreateTimeEntryInput = z.infer<typeof createTimeEntrySchema>;\nexport type UpdateTimeEntryInput = z.infer<typeof updateTimeEntrySchema>;\nexport type TimeEntryFilter = z.infer<typeof timeEntryFilterSchema>;\nexport type TimesheetQuery = z.infer<typeof timesheetQuerySchema>;\nexport type CreateRateCardInput = z.infer<typeof createRateCardSchema>;\nexport type CreateTimeCategoryInput = z.infer<typeof createTimeCategorySchema>;\nexport type CreateTimeLockInput = z.infer<typeof createTimeLockSchema>;\nexport type PaginationParams = z.infer<typeof paginationSchema>;","/**\n * Business policies and rules for Time Log domain\n */\n\nimport { differenceInMinutes, isWithinInterval, areIntervalsOverlapping } from 'date-fns';\nimport { TimeEntry, TimeEntryStatus } from './types';\n\nexport enum RoundingInterval {\n  NONE = 0,\n  ONE_MINUTE = 1,\n  FIVE_MINUTES = 5,\n  SIX_MINUTES = 6, // 1/10th of an hour\n  FIFTEEN_MINUTES = 15, // Quarter hour\n}\n\n/**\n * Round duration to specified interval\n */\nexport function roundDuration(minutes: number, interval: RoundingInterval): number {\n  if (interval === RoundingInterval.NONE) {\n    return minutes;\n  }\n  return Math.round(minutes / interval) * interval;\n}\n\n/**\n * Calculate duration between two dates in minutes\n */\nexport function calculateDuration(startAt: Date, endAt: Date): number {\n  return Math.abs(differenceInMinutes(endAt, startAt));\n}\n\n/**\n * Check if two time entries overlap\n */\nexport function detectOverlap(entry1: Pick<TimeEntry, 'startAt' | 'endAt'>, entry2: Pick<TimeEntry, 'startAt' | 'endAt'>): boolean {\n  return areIntervalsOverlapping(\n    { start: entry1.startAt, end: entry1.endAt },\n    { start: entry2.startAt, end: entry2.endAt },\n    { inclusive: false }\n  );\n}\n\n/**\n * Check if multiple entries have overlaps\n */\nexport function findOverlaps(entries: Pick<TimeEntry, 'id' | 'startAt' | 'endAt'>[]): Array<[string, string]> {\n  const overlaps: Array<[string, string]> = [];\n  \n  for (let i = 0; i < entries.length; i++) {\n    for (let j = i + 1; j < entries.length; j++) {\n      if (detectOverlap(entries[i], entries[j])) {\n        overlaps.push([entries[i].id, entries[j].id]);\n      }\n    }\n  }\n  \n  return overlaps;\n}\n\n/**\n * Validate time entry duration constraints\n */\nexport function validateDuration(startAt: Date, endAt: Date): { valid: boolean; error?: string } {\n  const duration = calculateDuration(startAt, endAt);\n  \n  if (duration <= 0) {\n    return { valid: false, error: 'End time must be after start time' };\n  }\n  \n  if (duration > 1440) { // 24 hours\n    return { valid: false, error: 'Time entry cannot exceed 24 hours' };\n  }\n  \n  if (duration < 1) {\n    return { valid: false, error: 'Time entry must be at least 1 minute' };\n  }\n  \n  return { valid: true };\n}\n\n/**\n * Check if time entry can be edited based on status\n */\nexport function canEditTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.DRAFT || status === TimeEntryStatus.REJECTED;\n}\n\n/**\n * Check if time entry can be submitted\n */\nexport function canSubmitTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.DRAFT || status === TimeEntryStatus.REJECTED;\n}\n\n/**\n * Check if time entry can be approved\n */\nexport function canApproveTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.SUBMITTED;\n}\n\n/**\n * Check if time entry can be rejected\n */\nexport function canRejectTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.SUBMITTED || status === TimeEntryStatus.APPROVED;\n}\n\n/**\n * Check if time entry can be locked\n */\nexport function canLockTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.APPROVED;\n}\n\n/**\n * Check if time entry can be billed\n */\nexport function canBillTimeEntry(status: TimeEntryStatus): boolean {\n  return status === TimeEntryStatus.LOCKED;\n}\n\n/**\n * Calculate total minutes for a collection of time entries\n */\nexport function calculateTotalMinutes(entries: Pick<TimeEntry, 'durationMinutes'>[]): number {\n  return entries.reduce((total, entry) => total + entry.durationMinutes, 0);\n}\n\n/**\n * Calculate billable minutes for a collection of time entries\n */\nexport function calculateBillableMinutes(entries: Pick<TimeEntry, 'durationMinutes' | 'billable'>[]): number {\n  return entries\n    .filter(entry => entry.billable)\n    .reduce((total, entry) => total + entry.durationMinutes, 0);\n}\n\n/**\n * Group time entries by date\n */\nexport function groupEntriesByDate(entries: TimeEntry[]): Map<string, TimeEntry[]> {\n  const grouped = new Map<string, TimeEntry[]>();\n  \n  entries.forEach(entry => {\n    const dateKey = entry.startAt.toISOString().split('T')[0];\n    const existing = grouped.get(dateKey) || [];\n    grouped.set(dateKey, [...existing, entry]);\n  });\n  \n  return grouped;\n}\n\n/**\n * Check if a time period is locked\n */\nexport function isPeriodLocked(\n  startAt: Date,\n  endAt: Date,\n  locks: Array<{ periodStart: Date; periodEnd: Date; isActive: boolean }>\n): boolean {\n  return locks.some(lock => \n    lock.isActive && \n    areIntervalsOverlapping(\n      { start: startAt, end: endAt },\n      { start: lock.periodStart, end: lock.periodEnd },\n      { inclusive: true }\n    )\n  );\n}\n\n/**\n * Validate approval workflow transition\n */\nexport function validateStatusTransition(currentStatus: TimeEntryStatus, newStatus: TimeEntryStatus): { valid: boolean; error?: string } {\n  const validTransitions: Record<TimeEntryStatus, TimeEntryStatus[]> = {\n    [TimeEntryStatus.DRAFT]: [TimeEntryStatus.SUBMITTED],\n    [TimeEntryStatus.SUBMITTED]: [TimeEntryStatus.APPROVED, TimeEntryStatus.REJECTED],\n    [TimeEntryStatus.APPROVED]: [TimeEntryStatus.LOCKED, TimeEntryStatus.REJECTED],\n    [TimeEntryStatus.REJECTED]: [TimeEntryStatus.DRAFT, TimeEntryStatus.SUBMITTED],\n    [TimeEntryStatus.LOCKED]: [TimeEntryStatus.BILLED],\n    [TimeEntryStatus.BILLED]: [],\n  };\n  \n  const allowed = validTransitions[currentStatus] || [];\n  \n  if (!allowed.includes(newStatus)) {\n    return { \n      valid: false, \n      error: `Cannot transition from ${currentStatus} to ${newStatus}` \n    };\n  }\n  \n  return { valid: true };\n}","/**\n * Custom error types for Time Log domain\n */\n\nexport class TimeLogError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public statusCode: number = 400,\n    public details?: Record<string, any>\n  ) {\n    super(message);\n    this.name = 'TimeLogError';\n  }\n}\n\nexport class ValidationError extends TimeLogError {\n  constructor(message: string, details?: Record<string, any>) {\n    super(message, 'VALIDATION_ERROR', 400, details);\n    this.name = 'ValidationError';\n  }\n}\n\nexport class AuthorizationError extends TimeLogError {\n  constructor(message: string = 'Unauthorized access', details?: Record<string, any>) {\n    super(message, 'AUTHORIZATION_ERROR', 403, details);\n    this.name = 'AuthorizationError';\n  }\n}\n\nexport class NotFoundError extends TimeLogError {\n  constructor(resource: string, id?: string) {\n    const message = id ? `${resource} with id ${id} not found` : `${resource} not found`;\n    super(message, 'NOT_FOUND', 404);\n    this.name = 'NotFoundError';\n  }\n}\n\nexport class ConflictError extends TimeLogError {\n  constructor(message: string, details?: Record<string, any>) {\n    super(message, 'CONFLICT', 409, details);\n    this.name = 'ConflictError';\n  }\n}\n\nexport class OverlapError extends ConflictError {\n  constructor(overlappingEntries: Array<[string, string]>) {\n    super('Time entries overlap', { overlappingEntries });\n    this.name = 'OverlapError';\n  }\n}\n\nexport class PeriodLockedError extends ConflictError {\n  constructor(periodStart: Date, periodEnd: Date) {\n    super('Cannot modify entries in locked period', {\n      periodStart: periodStart.toISOString(),\n      periodEnd: periodEnd.toISOString(),\n    });\n    this.name = 'PeriodLockedError';\n  }\n}\n\nexport class InvalidStatusTransitionError extends ValidationError {\n  constructor(currentStatus: string, targetStatus: string) {\n    super(`Cannot transition from ${currentStatus} to ${targetStatus}`, {\n      currentStatus,\n      targetStatus,\n    });\n    this.name = 'InvalidStatusTransitionError';\n  }\n}\n\nexport class RateLimitError extends TimeLogError {\n  constructor(limit: number, window: string) {\n    super(`Rate limit exceeded: ${limit} requests per ${window}`, 'RATE_LIMIT', 429, {\n      limit,\n      window,\n    });\n    this.name = 'RateLimitError';\n  }\n}","/**\n * Workflow management for time entries\n */\n\nimport { TimeEntry, TimeEntryStatus, Timesheet, AuditLog } from './types';\nimport { \n  validateStatusTransition,\n  canSubmitTimeEntry,\n  canApproveTimeEntry,\n  canRejectTimeEntry,\n  canLockTimeEntry,\n  isPeriodLocked\n} from './policies';\nimport { InvalidStatusTransitionError, PeriodLockedError, ValidationError } from './errors';\n\nexport interface WorkflowContext {\n  userId: string;\n  userRole: string;\n  timestamp: Date;\n}\n\nexport interface SubmitEntriesParams {\n  entries: TimeEntry[];\n  context: WorkflowContext;\n  locks?: Array<{ periodStart: Date; periodEnd: Date; isActive: boolean }>;\n}\n\nexport interface SubmitEntriesResult {\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\n/**\n * Submit time entries\n */\nexport function submitTimeEntries(params: SubmitEntriesParams): SubmitEntriesResult {\n  const { entries, context, locks = [] } = params;\n  const updatedEntries: TimeEntry[] = [];\n  const auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[] = [];\n  \n  for (const entry of entries) {\n    // Check if entry can be submitted\n    if (!canSubmitTimeEntry(entry.status)) {\n      throw new InvalidStatusTransitionError(entry.status, TimeEntryStatus.SUBMITTED);\n    }\n    \n    // Check if period is locked\n    if (isPeriodLocked(entry.startAt, entry.endAt, locks)) {\n      throw new PeriodLockedError(entry.startAt, entry.endAt);\n    }\n    \n    // Update entry\n    const updatedEntry: TimeEntry = {\n      ...entry,\n      status: TimeEntryStatus.SUBMITTED,\n      updatedAt: context.timestamp,\n    };\n    \n    updatedEntries.push(updatedEntry);\n    \n    // Create audit log\n    auditLogs.push({\n      entityType: 'TimeEntry',\n      entityId: entry.id,\n      action: 'SUBMIT',\n      userId: context.userId,\n      metadata: {\n        userRole: context.userRole,\n        previousStatus: entry.status,\n        newStatus: TimeEntryStatus.SUBMITTED,\n      },\n    });\n  }\n  \n  return { entries: updatedEntries, auditLogs };\n}\n\nexport interface ApproveEntriesParams {\n  entries: TimeEntry[];\n  context: WorkflowContext;\n  locks?: Array<{ periodStart: Date; periodEnd: Date; isActive: boolean }>;\n}\n\nexport interface ApproveEntriesResult {\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\n/**\n * Approve time entries\n */\nexport function approveTimeEntries(params: ApproveEntriesParams): ApproveEntriesResult {\n  const { entries, context, locks = [] } = params;\n  const updatedEntries: TimeEntry[] = [];\n  const auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[] = [];\n  \n  for (const entry of entries) {\n    // Check if entry can be approved\n    if (!canApproveTimeEntry(entry.status)) {\n      throw new InvalidStatusTransitionError(entry.status, TimeEntryStatus.APPROVED);\n    }\n    \n    // Check if period is locked\n    if (isPeriodLocked(entry.startAt, entry.endAt, locks)) {\n      throw new PeriodLockedError(entry.startAt, entry.endAt);\n    }\n    \n    // Update entry\n    const updatedEntry: TimeEntry = {\n      ...entry,\n      status: TimeEntryStatus.APPROVED,\n      approvedBy: context.userId,\n      approvedAt: context.timestamp,\n      updatedAt: context.timestamp,\n    };\n    \n    updatedEntries.push(updatedEntry);\n    \n    // Create audit log\n    auditLogs.push({\n      entityType: 'TimeEntry',\n      entityId: entry.id,\n      action: 'APPROVE',\n      userId: context.userId,\n      metadata: {\n        userRole: context.userRole,\n        previousStatus: entry.status,\n        newStatus: TimeEntryStatus.APPROVED,\n      },\n    });\n  }\n  \n  return { entries: updatedEntries, auditLogs };\n}\n\nexport interface RejectEntriesParams {\n  entries: TimeEntry[];\n  reason: string;\n  context: WorkflowContext;\n}\n\nexport interface RejectEntriesResult {\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\n/**\n * Reject time entries\n */\nexport function rejectTimeEntries(params: RejectEntriesParams): RejectEntriesResult {\n  const { entries, reason, context } = params;\n  const updatedEntries: TimeEntry[] = [];\n  const auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[] = [];\n  \n  for (const entry of entries) {\n    // Check if entry can be rejected\n    if (!canRejectTimeEntry(entry.status)) {\n      throw new InvalidStatusTransitionError(entry.status, TimeEntryStatus.REJECTED);\n    }\n    \n    // Update entry\n    const updatedEntry: TimeEntry = {\n      ...entry,\n      status: TimeEntryStatus.REJECTED,\n      rejectedBy: context.userId,\n      rejectedAt: context.timestamp,\n      rejectionReason: reason,\n      updatedAt: context.timestamp,\n    };\n    \n    updatedEntries.push(updatedEntry);\n    \n    // Create audit log\n    auditLogs.push({\n      entityType: 'TimeEntry',\n      entityId: entry.id,\n      action: 'REJECT',\n      userId: context.userId,\n      metadata: {\n        userRole: context.userRole,\n        previousStatus: entry.status,\n        newStatus: TimeEntryStatus.REJECTED,\n        reason,\n      },\n    });\n  }\n  \n  return { entries: updatedEntries, auditLogs };\n}\n\nexport interface LockEntriesParams {\n  entries: TimeEntry[];\n  reason?: string;\n  context: WorkflowContext;\n}\n\nexport interface LockEntriesResult {\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\n/**\n * Lock time entries\n */\nexport function lockTimeEntries(params: LockEntriesParams): LockEntriesResult {\n  const { entries, reason, context } = params;\n  const updatedEntries: TimeEntry[] = [];\n  const auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[] = [];\n  \n  for (const entry of entries) {\n    // Check if entry can be locked\n    if (!canLockTimeEntry(entry.status)) {\n      throw new InvalidStatusTransitionError(entry.status, TimeEntryStatus.LOCKED);\n    }\n    \n    // Update entry\n    const updatedEntry: TimeEntry = {\n      ...entry,\n      status: TimeEntryStatus.LOCKED,\n      lockedAt: context.timestamp,\n      updatedAt: context.timestamp,\n    };\n    \n    updatedEntries.push(updatedEntry);\n    \n    // Create audit log\n    auditLogs.push({\n      entityType: 'TimeEntry',\n      entityId: entry.id,\n      action: 'LOCK',\n      userId: context.userId,\n      metadata: {\n        userRole: context.userRole,\n        previousStatus: entry.status,\n        newStatus: TimeEntryStatus.LOCKED,\n        reason,\n      },\n    });\n  }\n  \n  return { entries: updatedEntries, auditLogs };\n}\n\n/**\n * Submit a weekly timesheet\n */\nexport interface SubmitTimesheetParams {\n  timesheet: Timesheet;\n  entries: TimeEntry[];\n  context: WorkflowContext;\n  locks?: Array<{ periodStart: Date; periodEnd: Date; isActive: boolean }>;\n}\n\nexport interface SubmitTimesheetResult {\n  timesheet: Timesheet;\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\nexport function submitTimesheet(params: SubmitTimesheetParams): SubmitTimesheetResult {\n  const { timesheet, entries, context, locks = [] } = params;\n  \n  // Check if period is locked\n  if (isPeriodLocked(timesheet.periodStart, timesheet.periodEnd, locks)) {\n    throw new PeriodLockedError(timesheet.periodStart, timesheet.periodEnd);\n  }\n  \n  // Submit all draft entries in the timesheet\n  const draftEntries = entries.filter(e => e.status === TimeEntryStatus.DRAFT);\n  const { entries: submittedEntries, auditLogs: entryLogs } = submitTimeEntries({\n    entries: draftEntries,\n    context,\n    locks,\n  });\n  \n  // Update timesheet\n  const updatedTimesheet: Timesheet = {\n    ...timesheet,\n    status: TimeEntryStatus.SUBMITTED,\n    submittedAt: context.timestamp,\n    entries: [\n      ...entries.filter(e => e.status !== TimeEntryStatus.DRAFT),\n      ...submittedEntries,\n    ],\n  };\n  \n  // Create audit log for timesheet\n  const timesheetLog: Omit<AuditLog, 'id' | 'createdAt'> = {\n    entityType: 'Timesheet',\n    entityId: timesheet.id,\n    action: 'SUBMIT',\n    userId: context.userId,\n    metadata: {\n      userRole: context.userRole,\n      entriesSubmitted: submittedEntries.length,\n      weekStart: timesheet.periodStart.toISOString(),\n      weekEnd: timesheet.periodEnd.toISOString(),\n    },\n  };\n  \n  return {\n    timesheet: updatedTimesheet,\n    entries: updatedTimesheet.entries,\n    auditLogs: [...entryLogs, timesheetLog],\n  };\n}\n\n/**\n * Mark entries as billed\n */\nexport interface BillEntriesParams {\n  entries: TimeEntry[];\n  invoiceId: string;\n  context: WorkflowContext;\n}\n\nexport interface BillEntriesResult {\n  entries: TimeEntry[];\n  auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[];\n}\n\nexport function billTimeEntries(params: BillEntriesParams): BillEntriesResult {\n  const { entries, invoiceId, context } = params;\n  const updatedEntries: TimeEntry[] = [];\n  const auditLogs: Omit<AuditLog, 'id' | 'createdAt'>[] = [];\n  \n  for (const entry of entries) {\n    // Only locked entries can be billed\n    if (entry.status !== TimeEntryStatus.LOCKED) {\n      throw new InvalidStatusTransitionError(entry.status, TimeEntryStatus.BILLED);\n    }\n    \n    // Update entry\n    const updatedEntry: TimeEntry = {\n      ...entry,\n      status: TimeEntryStatus.BILLED,\n      billedAt: context.timestamp,\n      invoiceId,\n      updatedAt: context.timestamp,\n    };\n    \n    updatedEntries.push(updatedEntry);\n    \n    // Create audit log\n    auditLogs.push({\n      entityType: 'TimeEntry',\n      entityId: entry.id,\n      action: 'BILL',\n      userId: context.userId,\n      metadata: {\n        userRole: context.userRole,\n        previousStatus: entry.status,\n        newStatus: TimeEntryStatus.BILLED,\n        invoiceId,\n      },\n    });\n  }\n  \n  return { entries: updatedEntries, auditLogs };\n}","/**\n * Finance calculations and exports\n */\n\nimport { TimeEntry, RateCard, TimeEntryStatus } from './types';\nimport { roundDuration, RoundingInterval } from './policies';\n\nexport interface CostCalculationParams {\n  entries: TimeEntry[];\n  rateCards: RateCard[];\n  roundingInterval?: RoundingInterval;\n  atDate?: Date;\n}\n\nexport interface EntryCost {\n  entryId: string;\n  projectId: string;\n  developerId: string;\n  originalMinutes: number;\n  roundedMinutes: number;\n  hourlyRate: number;\n  currency: string;\n  cost: number;\n}\n\n/**\n * Resolve effective rate for a time entry\n * Precedence: project > client > developer default\n */\nexport function resolveEffectiveRate(\n  entry: TimeEntry,\n  rateCards: RateCard[],\n  atDate: Date = new Date()\n): RateCard | null {\n  // Filter active rate cards effective at the given date\n  const activeCards = rateCards.filter(card => {\n    if (!card.isActive) return false;\n    if (card.effectiveFrom > atDate) return false;\n    if (card.effectiveTo && card.effectiveTo < atDate) return false;\n    return true;\n  });\n  \n  // 1. Check for project-specific rate\n  const projectRate = activeCards\n    .filter(card => card.projectId === entry.projectId)\n    .sort((a, b) => b.effectiveFrom.getTime() - a.effectiveFrom.getTime())[0];\n  \n  if (projectRate) return projectRate;\n  \n  // 2. Check for client-specific rate\n  const clientRate = activeCards\n    .filter(card => card.clientId === entry.clientId)\n    .sort((a, b) => b.effectiveFrom.getTime() - a.effectiveFrom.getTime())[0];\n  \n  if (clientRate) return clientRate;\n  \n  // 3. Check for developer default rate\n  const developerRate = activeCards\n    .filter(card => \n      card.developerId === entry.developerId && \n      !card.projectId && \n      !card.clientId\n    )\n    .sort((a, b) => b.effectiveFrom.getTime() - a.effectiveFrom.getTime())[0];\n  \n  return developerRate || null;\n}\n\n/**\n * Calculate costs for time entries\n */\nexport function calculateEntryCosts(params: CostCalculationParams): EntryCost[] {\n  const { \n    entries, \n    rateCards, \n    roundingInterval = RoundingInterval.FIFTEEN_MINUTES,\n    atDate = new Date()\n  } = params;\n  \n  const costs: EntryCost[] = [];\n  \n  for (const entry of entries) {\n    // Only calculate costs for billable entries\n    if (!entry.billable) {\n      continue;\n    }\n    \n    const rate = resolveEffectiveRate(entry, rateCards, atDate);\n    \n    if (!rate) {\n      // No rate found, skip or use default\n      continue;\n    }\n    \n    const roundedMinutes = roundDuration(entry.durationMinutes, roundingInterval);\n    const hours = roundedMinutes / 60;\n    const cost = Math.round(hours * rate.hourlyRate * 100) / 100; // Round to 2 decimals\n    \n    costs.push({\n      entryId: entry.id,\n      projectId: entry.projectId,\n      developerId: entry.developerId,\n      originalMinutes: entry.durationMinutes,\n      roundedMinutes,\n      hourlyRate: rate.hourlyRate,\n      currency: rate.currency,\n      cost,\n    });\n  }\n  \n  return costs;\n}\n\nexport interface ProjectSummary {\n  projectId: string;\n  totalMinutes: number;\n  billableMinutes: number;\n  nonBillableMinutes: number;\n  totalCost: number;\n  currency: string;\n  entryCount: number;\n}\n\n/**\n * Aggregate entries by project\n */\nexport function aggregateByProject(\n  entries: TimeEntry[],\n  costs: EntryCost[]\n): ProjectSummary[] {\n  const projectMap = new Map<string, ProjectSummary>();\n  const costMap = new Map<string, EntryCost>();\n  \n  // Create cost lookup\n  costs.forEach(cost => costMap.set(cost.entryId, cost));\n  \n  for (const entry of entries) {\n    const cost = costMap.get(entry.id);\n    \n    let summary = projectMap.get(entry.projectId);\n    if (!summary) {\n      summary = {\n        projectId: entry.projectId,\n        totalMinutes: 0,\n        billableMinutes: 0,\n        nonBillableMinutes: 0,\n        totalCost: 0,\n        currency: cost?.currency || 'USD',\n        entryCount: 0,\n      };\n      projectMap.set(entry.projectId, summary);\n    }\n    \n    summary.totalMinutes += entry.durationMinutes;\n    if (entry.billable) {\n      summary.billableMinutes += entry.durationMinutes;\n    } else {\n      summary.nonBillableMinutes += entry.durationMinutes;\n    }\n    \n    if (cost && entry.billable) {\n      summary.totalCost += cost.cost;\n    }\n    \n    summary.entryCount++;\n  }\n  \n  return Array.from(projectMap.values());\n}\n\nexport interface DeveloperSummary {\n  developerId: string;\n  totalMinutes: number;\n  billableMinutes: number;\n  nonBillableMinutes: number;\n  totalCost: number;\n  currency: string;\n  entryCount: number;\n  projectBreakdown: Record<string, number>; // projectId -> minutes\n}\n\n/**\n * Aggregate entries by developer\n */\nexport function aggregateByDeveloper(\n  entries: TimeEntry[],\n  costs: EntryCost[]\n): DeveloperSummary[] {\n  const developerMap = new Map<string, DeveloperSummary>();\n  const costMap = new Map<string, EntryCost>();\n  \n  // Create cost lookup\n  costs.forEach(cost => costMap.set(cost.entryId, cost));\n  \n  for (const entry of entries) {\n    const cost = costMap.get(entry.id);\n    \n    let summary = developerMap.get(entry.developerId);\n    if (!summary) {\n      summary = {\n        developerId: entry.developerId,\n        totalMinutes: 0,\n        billableMinutes: 0,\n        nonBillableMinutes: 0,\n        totalCost: 0,\n        currency: cost?.currency || 'USD',\n        entryCount: 0,\n        projectBreakdown: {},\n      };\n      developerMap.set(entry.developerId, summary);\n    }\n    \n    summary.totalMinutes += entry.durationMinutes;\n    if (entry.billable) {\n      summary.billableMinutes += entry.durationMinutes;\n    } else {\n      summary.nonBillableMinutes += entry.durationMinutes;\n    }\n    \n    if (cost && entry.billable) {\n      summary.totalCost += cost.cost;\n    }\n    \n    // Update project breakdown\n    summary.projectBreakdown[entry.projectId] = \n      (summary.projectBreakdown[entry.projectId] || 0) + entry.durationMinutes;\n    \n    summary.entryCount++;\n  }\n  \n  return Array.from(developerMap.values());\n}\n\nexport interface DailySummary {\n  date: string; // YYYY-MM-DD\n  totalMinutes: number;\n  billableMinutes: number;\n  nonBillableMinutes: number;\n  totalCost: number;\n  currency: string;\n  entryCount: number;\n}\n\n/**\n * Aggregate entries by day\n */\nexport function aggregateByDay(\n  entries: TimeEntry[],\n  costs: EntryCost[]\n): DailySummary[] {\n  const dayMap = new Map<string, DailySummary>();\n  const costMap = new Map<string, EntryCost>();\n  \n  // Create cost lookup\n  costs.forEach(cost => costMap.set(cost.entryId, cost));\n  \n  for (const entry of entries) {\n    const cost = costMap.get(entry.id);\n    const dateKey = entry.startAt.toISOString().split('T')[0];\n    \n    let summary = dayMap.get(dateKey);\n    if (!summary) {\n      summary = {\n        date: dateKey,\n        totalMinutes: 0,\n        billableMinutes: 0,\n        nonBillableMinutes: 0,\n        totalCost: 0,\n        currency: cost?.currency || 'USD',\n        entryCount: 0,\n      };\n      dayMap.set(dateKey, summary);\n    }\n    \n    summary.totalMinutes += entry.durationMinutes;\n    if (entry.billable) {\n      summary.billableMinutes += entry.durationMinutes;\n    } else {\n      summary.nonBillableMinutes += entry.durationMinutes;\n    }\n    \n    if (cost && entry.billable) {\n      summary.totalCost += cost.cost;\n    }\n    \n    summary.entryCount++;\n  }\n  \n  return Array.from(dayMap.values())\n    .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/**\n * Generate finance export data\n */\nexport interface FinanceExportParams {\n  entries: TimeEntry[];\n  rateCards: RateCard[];\n  roundingInterval?: RoundingInterval;\n  includeNonBillable?: boolean;\n  groupBy?: 'project' | 'developer' | 'day';\n}\n\nexport interface FinanceExport {\n  summary: {\n    totalEntries: number;\n    totalMinutes: number;\n    billableMinutes: number;\n    nonBillableMinutes: number;\n    totalCost: number;\n    currency: string;\n    dateRange: {\n      from: Date;\n      to: Date;\n    };\n  };\n  costs: EntryCost[];\n  aggregations: {\n    byProject: ProjectSummary[];\n    byDeveloper: DeveloperSummary[];\n    byDay: DailySummary[];\n  };\n}\n\nexport function generateFinanceExport(params: FinanceExportParams): FinanceExport {\n  const {\n    entries,\n    rateCards,\n    roundingInterval = RoundingInterval.FIFTEEN_MINUTES,\n    includeNonBillable = false,\n  } = params;\n  \n  // Filter entries to only include approved/locked/billed\n  const eligibleStatuses = [\n    TimeEntryStatus.APPROVED,\n    TimeEntryStatus.LOCKED,\n    TimeEntryStatus.BILLED,\n  ];\n  \n  let filteredEntries = entries.filter(e => eligibleStatuses.includes(e.status));\n  \n  if (!includeNonBillable) {\n    filteredEntries = filteredEntries.filter(e => e.billable);\n  }\n  \n  // Calculate costs\n  const costs = calculateEntryCosts({\n    entries: filteredEntries,\n    rateCards,\n    roundingInterval,\n  });\n  \n  // Generate aggregations\n  const byProject = aggregateByProject(filteredEntries, costs);\n  const byDeveloper = aggregateByDeveloper(filteredEntries, costs);\n  const byDay = aggregateByDay(filteredEntries, costs);\n  \n  // Calculate summary\n  const totalCost = costs.reduce((sum, c) => sum + c.cost, 0);\n  const totalMinutes = filteredEntries.reduce((sum, e) => sum + e.durationMinutes, 0);\n  const billableMinutes = filteredEntries\n    .filter(e => e.billable)\n    .reduce((sum, e) => sum + e.durationMinutes, 0);\n  const nonBillableMinutes = totalMinutes - billableMinutes;\n  \n  // Find date range\n  const dates = filteredEntries.map(e => e.startAt);\n  const minDate = dates.length > 0 ? new Date(Math.min(...dates.map(d => d.getTime()))) : new Date();\n  const maxDate = dates.length > 0 ? new Date(Math.max(...dates.map(d => d.getTime()))) : new Date();\n  \n  return {\n    summary: {\n      totalEntries: filteredEntries.length,\n      totalMinutes,\n      billableMinutes,\n      nonBillableMinutes,\n      totalCost: Math.round(totalCost * 100) / 100,\n      currency: costs[0]?.currency || 'USD',\n      dateRange: {\n        from: minDate,\n        to: maxDate,\n      },\n    },\n    costs,\n    aggregations: {\n      byProject,\n      byDeveloper,\n      byDay,\n    },\n  };\n}\n\n/**\n * Invoice mapping hook interface\n */\nexport interface InvoiceMapping {\n  invoiceId: string;\n  clientId: string;\n  projectIds: string[];\n  dateRange: {\n    from: Date;\n    to: Date;\n  };\n  entries: TimeEntry[];\n  totalAmount: number;\n  currency: string;\n}\n\n/**\n * Map time entries to invoice\n */\nexport function mapToInvoice(\n  entries: TimeEntry[],\n  costs: EntryCost[],\n  invoiceId: string,\n  clientId: string\n): InvoiceMapping {\n  const costMap = new Map<string, EntryCost>();\n  costs.forEach(cost => costMap.set(cost.entryId, cost));\n  \n  const projectIds = Array.from(new Set(entries.map(e => e.projectId)));\n  const dates = entries.map(e => e.startAt);\n  const totalAmount = entries\n    .filter(e => e.billable)\n    .reduce((sum, e) => {\n      const cost = costMap.get(e.id);\n      return sum + (cost?.cost || 0);\n    }, 0);\n  \n  return {\n    invoiceId,\n    clientId,\n    projectIds,\n    dateRange: {\n      from: new Date(Math.min(...dates.map(d => d.getTime()))),\n      to: new Date(Math.max(...dates.map(d => d.getTime()))),\n    },\n    entries,\n    totalAmount: Math.round(totalAmount * 100) / 100,\n    currency: costs[0]?.currency || 'USD',\n  };\n}","/**\n * Time lock management\n */\n\nimport { TimeLock, TimeEntry, AuditLog } from './types';\nimport { areIntervalsOverlapping } from 'date-fns';\nimport { ConflictError, ValidationError } from './errors';\n\nexport interface CreateLockParams {\n  projectId?: string;\n  clientId?: string;\n  periodStart: Date;\n  periodEnd: Date;\n  reason: string;\n  lockedBy: string;\n}\n\nexport interface CreateLockResult {\n  lock: Omit<TimeLock, 'id'>;\n  auditLog: Omit<AuditLog, 'id' | 'createdAt'>;\n}\n\n/**\n * Create a time lock\n */\nexport function createTimeLock(params: CreateLockParams): CreateLockResult {\n  const { projectId, clientId, periodStart, periodEnd, reason, lockedBy } = params;\n  \n  // Validate that at least one scope is provided\n  if (!projectId && !clientId) {\n    throw new ValidationError('Either projectId or clientId must be provided');\n  }\n  \n  // Validate date range\n  if (periodEnd <= periodStart) {\n    throw new ValidationError('Period end must be after period start');\n  }\n  \n  const lock: Omit<TimeLock, 'id'> = {\n    projectId,\n    clientId,\n    periodStart,\n    periodEnd,\n    reason,\n    lockedBy,\n    lockedAt: new Date(),\n    isActive: true,\n  };\n  \n  const auditLog: Omit<AuditLog, 'id' | 'createdAt'> = {\n    entityType: 'TimeLock',\n    entityId: '', // Will be set after creation\n    action: 'CREATE',\n    userId: lockedBy,\n    metadata: {\n      projectId,\n      clientId,\n      periodStart: periodStart.toISOString(),\n      periodEnd: periodEnd.toISOString(),\n      reason,\n    },\n  };\n  \n  return { lock, auditLog };\n}\n\nexport interface UnlockParams {\n  lock: TimeLock;\n  unlockedBy: string;\n  reason?: string;\n}\n\nexport interface UnlockResult {\n  lock: TimeLock;\n  auditLog: Omit<AuditLog, 'id' | 'createdAt'>;\n}\n\n/**\n * Unlock a time lock\n */\nexport function unlockTimeLock(params: UnlockParams): UnlockResult {\n  const { lock, unlockedBy, reason } = params;\n  \n  if (!lock.isActive) {\n    throw new ValidationError('Lock is already inactive');\n  }\n  \n  const unlockedLock: TimeLock = {\n    ...lock,\n    isActive: false,\n    unlockedBy,\n    unlockedAt: new Date(),\n  };\n  \n  const auditLog: Omit<AuditLog, 'id' | 'createdAt'> = {\n    entityType: 'TimeLock',\n    entityId: lock.id,\n    action: 'UNLOCK',\n    userId: unlockedBy,\n    metadata: {\n      reason,\n      projectId: lock.projectId,\n      clientId: lock.clientId,\n    },\n  };\n  \n  return { lock: unlockedLock, auditLog };\n}\n\n/**\n * Check if a time entry conflicts with locks\n */\nexport function checkEntryLockConflict(\n  entry: TimeEntry,\n  locks: TimeLock[]\n): TimeLock | null {\n  const activeLocks = locks.filter(lock => lock.isActive);\n  \n  for (const lock of activeLocks) {\n    // Check scope match\n    const scopeMatch = \n      (lock.projectId && lock.projectId === entry.projectId) ||\n      (lock.clientId && lock.clientId === entry.clientId);\n    \n    if (!scopeMatch) continue;\n    \n    // Check time overlap\n    const overlaps = areIntervalsOverlapping(\n      { start: entry.startAt, end: entry.endAt },\n      { start: lock.periodStart, end: lock.periodEnd },\n      { inclusive: true }\n    );\n    \n    if (overlaps) {\n      return lock;\n    }\n  }\n  \n  return null;\n}\n\n/**\n * Check if a date range conflicts with locks\n */\nexport function checkPeriodLockConflict(\n  periodStart: Date,\n  periodEnd: Date,\n  projectId?: string,\n  clientId?: string,\n  locks: TimeLock[] = []\n): TimeLock | null {\n  const activeLocks = locks.filter(lock => lock.isActive);\n  \n  for (const lock of activeLocks) {\n    // Check scope match\n    const scopeMatch = \n      (projectId && lock.projectId === projectId) ||\n      (clientId && lock.clientId === clientId);\n    \n    if (!scopeMatch) continue;\n    \n    // Check time overlap\n    const overlaps = areIntervalsOverlapping(\n      { start: periodStart, end: periodEnd },\n      { start: lock.periodStart, end: lock.periodEnd },\n      { inclusive: true }\n    );\n    \n    if (overlaps) {\n      return lock;\n    }\n  }\n  \n  return null;\n}\n\n/**\n * Validate that new lock doesn't overlap with existing locks\n */\nexport function validateLockOverlap(\n  newLock: CreateLockParams,\n  existingLocks: TimeLock[]\n): void {\n  const activeLocks = existingLocks.filter(lock => lock.isActive);\n  \n  for (const lock of activeLocks) {\n    // Check if same scope\n    const sameScope = \n      (newLock.projectId && lock.projectId === newLock.projectId) ||\n      (newLock.clientId && lock.clientId === newLock.clientId);\n    \n    if (!sameScope) continue;\n    \n    // Check for overlap\n    const overlaps = areIntervalsOverlapping(\n      { start: newLock.periodStart, end: newLock.periodEnd },\n      { start: lock.periodStart, end: lock.periodEnd },\n      { inclusive: false }\n    );\n    \n    if (overlaps) {\n      throw new ConflictError(\n        `Lock period overlaps with existing lock from ${lock.periodStart.toISOString()} to ${lock.periodEnd.toISOString()}`\n      );\n    }\n  }\n}\n\n/**\n * Get all entries affected by a lock\n */\nexport function getAffectedEntries(\n  lock: TimeLock,\n  entries: TimeEntry[]\n): TimeEntry[] {\n  return entries.filter(entry => {\n    // Check scope match\n    const scopeMatch = \n      (lock.projectId && lock.projectId === entry.projectId) ||\n      (lock.clientId && lock.clientId === entry.clientId);\n    \n    if (!scopeMatch) return false;\n    \n    // Check time overlap\n    return areIntervalsOverlapping(\n      { start: entry.startAt, end: entry.endAt },\n      { start: lock.periodStart, end: lock.periodEnd },\n      { inclusive: true }\n    );\n  });\n}\n\n/**\n * Lock manager for bulk operations\n */\nexport class LockManager {\n  private locks: Map<string, TimeLock> = new Map();\n  \n  constructor(locks: TimeLock[] = []) {\n    locks.forEach(lock => this.locks.set(lock.id, lock));\n  }\n  \n  /**\n   * Add a lock to the manager\n   */\n  addLock(lock: TimeLock): void {\n    this.locks.set(lock.id, lock);\n  }\n  \n  /**\n   * Remove a lock from the manager\n   */\n  removeLock(lockId: string): void {\n    this.locks.delete(lockId);\n  }\n  \n  /**\n   * Get all active locks\n   */\n  getActiveLocks(): TimeLock[] {\n    return Array.from(this.locks.values()).filter(lock => lock.isActive);\n  }\n  \n  /**\n   * Check if an entry is locked\n   */\n  isEntryLocked(entry: TimeEntry): boolean {\n    const conflict = checkEntryLockConflict(entry, this.getActiveLocks());\n    return conflict !== null;\n  }\n  \n  /**\n   * Check if a period is locked\n   */\n  isPeriodLocked(\n    periodStart: Date,\n    periodEnd: Date,\n    projectId?: string,\n    clientId?: string\n  ): boolean {\n    const conflict = checkPeriodLockConflict(\n      periodStart,\n      periodEnd,\n      projectId,\n      clientId,\n      this.getActiveLocks()\n    );\n    return conflict !== null;\n  }\n  \n  /**\n   * Get locks for a specific project\n   */\n  getProjectLocks(projectId: string): TimeLock[] {\n    return this.getActiveLocks().filter(lock => lock.projectId === projectId);\n  }\n  \n  /**\n   * Get locks for a specific client\n   */\n  getClientLocks(clientId: string): TimeLock[] {\n    return this.getActiveLocks().filter(lock => lock.clientId === clientId);\n  }\n  \n  /**\n   * Get locks within a date range\n   */\n  getLocksInRange(startDate: Date, endDate: Date): TimeLock[] {\n    return this.getActiveLocks().filter(lock => \n      areIntervalsOverlapping(\n        { start: startDate, end: endDate },\n        { start: lock.periodStart, end: lock.periodEnd },\n        { inclusive: true }\n      )\n    );\n  }\n}"]}