export type WorkReviewStatus = 'pending_review' | 'revision_required' | 'approved' export type WorkReviewRole = 'manager' | 'final_reviewer' export type WorkReviewReviewMode = 'dual' | 'single_reviewer_test' export type WorkReviewDecision = 'approved' | 'revision_required' export type WorkReviewAnnotationShape = 'point' | 'rectangle' | 'ellipse' | 'arrow' export type WorkReviewImageAnnotation = { id: string x: number y: number x2?: number y2?: number shape?: WorkReviewAnnotationShape color?: string comment: string } export type WorkReviewImageSlice = { url: string width: number height: number } export type WorkReviewImageGroup = { version?: number imageId?: string sourceName: string sourceWidth?: number sourceHeight?: number previewUrl: string previewWidth: number previewHeight: number width: number height: number slices: WorkReviewImageSlice[] } export type WorkReviewImageComment = { imageId?: string imageIndex: number sourceName?: string decision: WorkReviewDecision comment: string annotations?: WorkReviewImageAnnotation[] } export type WorkReviewReview = { id: string reviewerRole: WorkReviewRole reviewerName: string decision: WorkReviewDecision imageComments: WorkReviewImageComment[] generalComment: string | null reviewedAt: string } export type WorkReviewVersion = { id: string version: number submissionNote: string | null status: WorkReviewStatus submittedAt: string completedAt: string | null imageUrls: string[] imageGroups: WorkReviewImageGroup[] referenceImageUrls: string[] referenceImageGroups: WorkReviewImageGroup[] reviews: WorkReviewReview[] } export type WorkReviewPerson = { id: string name: string } export type WorkReviewReviewerOption = WorkReviewPerson & { jobNumber: string | null departmentName: string | null positionTitle: string | null } export type WorkReviewProject = { id: string title: string description: string | null workDate: string status: WorkReviewStatus latestVersion: number submitter: WorkReviewPerson & { snapshot?: Record | null } manager: WorkReviewPerson finalReviewer: WorkReviewPerson createdAt: string updatedAt: string reviewMode?: WorkReviewReviewMode requiredReviewRoles?: WorkReviewRole[] versions: WorkReviewVersion[] permissions: { canResubmit: boolean pendingReviewRoles: WorkReviewRole[] } } export type WorkReviewMe = { user: { id: string name: string avatar: string | null role: string } employee: { id: string displayName: string flowerName?: string | null realName?: string | null departmentName?: string | null positionTitle?: string | null positionLevel?: string | null levelType?: string | null } | null permissions: { canSubmit: boolean canDeleteProjects: boolean isSystemAdmin: boolean isManager: boolean isFinalReviewer: boolean } } export type WorkReviewBoardData = { me: WorkReviewMe items: WorkReviewProject[] pagination: { page: number pageSize: number total: number totalPages: number } } export type WorkReviewProcessedImage = { uploadId: string mimeType: 'image/webp' width: number height: number kind: 'slice' | 'preview' sourceName: string sourceIndex: number sliceIndex: number sliceCount: number } export type WorkReviewSubmissionInput = { title?: string description?: string workDate?: string reviewerEmployeeId?: string expectedLatestVersion?: number submissionNote?: string processedImages: WorkReviewProcessedImage[] processedReferenceImages: WorkReviewProcessedImage[] } export type WorkReviewReviewInput = { reviewerRole: WorkReviewRole imageComments: Array<{ imageIndex: number decision: WorkReviewDecision comment: string annotations?: WorkReviewImageAnnotation[] }> generalComment: string }