@burdenoff/microfe-crewfoundry 2026.719.2 → 2026.723.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crewfoundryStore.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/store/crewfoundryStore.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crewfoundryStore.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/store/crewfoundryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { create as e } from "zustand";
|
|
2
2
|
import { graphqlFetch as t } from "@burdenoff/fe-libs/shared/graphql";
|
|
3
3
|
//#region src/crewfoundry/store/crewfoundryStore.ts
|
|
4
|
-
var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n payrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n }\n", r = "\n query CrewfoundryWorkspaceBootstrapWithOverlap(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $groupFirst: Int\n $conversationFirst: Int\n ) {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n payrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n projects(filter: { workspaceId: $workspaceId }, pagination: $projectPagination) {\n items {\n id\n name\n key\n creatorId\n status\n config\n archived\n createdAt\n updatedAt\n }\n }\n groups(first: $groupFirst) {\n edges {\n node {\n id\n name\n description\n groupType\n status\n memberCount\n ownerId\n createdAt\n }\n }\n }\n conversations(first: $conversationFirst) {\n edges {\n node {\n id\n title\n description\n state\n unreadCount\n memberCount\n updatedAt\n }\n }\n }\n }\n", i = "\n query CrewfoundryOverlapBilling {\n getBillingAccountsByOrg {\n id\n name\n isDefault\n paymentMethods {\n id\n type\n brand\n last4\n isDefault\n expiryMonth\n expiryYear\n }\n }\n }\n", a = "mutation CreateCrewEmployee($input: CreateCrewEmployeeInput!) { createCrewEmployee(input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }", o = "mutation UpdateCrewEmployee($id: ID!, $input: UpdateCrewEmployeeInput!) { updateCrewEmployee(id: $id, input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }", s = "mutation RemoveCrewEmployee($id: ID!) { removeCrewEmployee(id: $id) }", c = "mutation CreateCrewJobPosting($input: CreateCrewJobPostingInput!) { createCrewJobPosting(input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }", l = "mutation UpdateCrewJobPosting($id: ID!, $input: UpdateCrewJobPostingInput!) { updateCrewJobPosting(id: $id, input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }", u = "mutation CreateCrewCandidate($input: CreateCrewCandidateInput!) { createCrewCandidate(input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }", d = "mutation UpdateCrewCandidate($id: ID!, $input: UpdateCrewCandidateInput!) { updateCrewCandidate(id: $id, input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }", f = "mutation CreateCrewAnnouncement($input: CreateCrewAnnouncementInput!) { createCrewAnnouncement(input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }", p = "mutation CreateCrewLeaveRequest($input: CreateCrewLeaveRequestInput!) { createCrewLeaveRequest(input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }", m = "mutation UpdateCrewLeaveRequest($id: ID!, $input: UpdateCrewLeaveRequestInput!) { updateCrewLeaveRequest(id: $id, input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }", h = "mutation RemoveCrewJobPosting($id: ID!) { removeCrewJobPosting(id: $id) }", g = "mutation RemoveCrewCandidate($id: ID!) { removeCrewCandidate(id: $id) }", _ = "mutation UpdateCrewAnnouncement($id: ID!, $input: UpdateCrewAnnouncementInput!) { updateCrewAnnouncement(id: $id, input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }", v = "mutation RemoveCrewAnnouncement($id: ID!) { removeCrewAnnouncement(id: $id) }", y = "mutation CreateCrewInterview($input: CreateCrewInterviewInput!) { createCrewInterview(input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }", b = "mutation UpdateCrewInterview($id: ID!, $input: UpdateCrewInterviewInput!) { updateCrewInterview(id: $id, input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }", x = "mutation RemoveCrewInterview($id: ID!) { removeCrewInterview(id: $id) }", S = "mutation CreateCrewVendor($input: CreateCrewVendorInput!) { createCrewVendor(input: $input) { id name category contactPerson email phone status contractValue rating } }", C = "mutation UpdateCrewVendor($id: ID!, $input: UpdateCrewVendorInput!) { updateCrewVendor(id: $id, input: $input) { id name category contactPerson email phone status contractValue rating } }", w = "mutation RemoveCrewVendor($id: ID!) { removeCrewVendor(id: $id) }", ee = "mutation CreateCrewClient($input: CreateCrewClientInput!) { createCrewClient(input: $input) { id name industry contactPerson email phone status revenue projects since } }", te = "mutation UpdateCrewClient($id: ID!, $input: UpdateCrewClientInput!) { updateCrewClient(id: $id, input: $input) { id name industry contactPerson email phone status revenue projects since } }", ne = "mutation RemoveCrewClient($id: ID!) { removeCrewClient(id: $id) }", re = "mutation CreateCrewTeam($input: CreateCrewTeamInput!) { createCrewTeam(input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }", ie = "mutation UpdateCrewTeam($id: ID!, $input: UpdateCrewTeamInput!) { updateCrewTeam(id: $id, input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }", ae = "mutation RemoveCrewTeam($id: ID!) { removeCrewTeam(id: $id) }", oe = "mutation CreateCrewProject($input: CreateCrewProjectInput!) { createCrewProject(input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }", se = "mutation UpdateCrewProject($id: ID!, $input: UpdateCrewProjectInput!) { updateCrewProject(id: $id, input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }", ce = "mutation RemoveCrewProject($id: ID!) { removeCrewProject(id: $id) }", le = "mutation CreateCrewDepartment($input: CreateCrewDepartmentInput!) { createCrewDepartment(input: $input) { id name headId headName employeeCount budget location status } }", ue = "mutation UpdateCrewDepartment($id: ID!, $input: UpdateCrewDepartmentInput!) { updateCrewDepartment(id: $id, input: $input) { id name headId headName employeeCount budget location status } }", de = "mutation RemoveCrewDepartment($id: ID!) { removeCrewDepartment(id: $id) }", fe = "mutation CreateCrewPayrollRecord($input: CreateCrewPayrollRecordInput!) { createCrewPayrollRecord(input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }", T = "mutation UpdateCrewPayrollRecord($id: ID!, $input: UpdateCrewPayrollRecordInput!) { updateCrewPayrollRecord(id: $id, input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }", E = "mutation RemoveCrewPayrollRecord($id: ID!) { removeCrewPayrollRecord(id: $id) }", D = "mutation CreateCrewTimeEntry($input: CreateCrewTimeEntryInput!) { createCrewTimeEntry(input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }", O = "mutation UpdateCrewTimeEntry($id: ID!, $input: UpdateCrewTimeEntryInput!) { updateCrewTimeEntry(id: $id, input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }", k = "mutation RemoveCrewTimeEntry($id: ID!) { removeCrewTimeEntry(id: $id) }", A = "query EmployeeDocuments($employeeId: ID!) { employeeDocuments(employeeId: $employeeId) { id employeeId fileId title category uploadedBy uploadedAt } }", j = "mutation AttachEmployeeDocument($input: AttachCrewEmployeeDocumentInput!) { attachEmployeeDocument(input: $input) { id employeeId fileId title category uploadedBy uploadedAt } }", M = "mutation DetachEmployeeDocument($id: ID!) { detachEmployeeDocument(id: $id) }", N = "mutation EnsureFolderByPath($path: String!) { ensureFolderByPath(path: $path) { id } }", P = "mutation InitiateUpload($input: InitiateUploadInput!) { initiateUpload(input: $input) { session { id } uploadUrl } }", F = "mutation CompleteUpload($input: CompleteUploadInput!) { completeUpload(input: $input) { file { id } } }", I = "query CrewOnboardings { crewOnboardings { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", L = "mutation CreateCrewOnboarding($input: CreateCrewOnboardingInput!) { createCrewOnboarding(input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", R = "mutation UpdateCrewOnboarding($id: ID!, $input: UpdateCrewOnboardingInput!) { updateCrewOnboarding(id: $id, input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", z = "mutation RemoveCrewOnboarding($id: ID!) { removeCrewOnboarding(id: $id) }", B = "mutation CreateCrewOnboardingTask($input: CreateCrewOnboardingTaskInput!) { createCrewOnboardingTask(input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", V = "mutation UpdateCrewOnboardingTask($id: ID!, $input: UpdateCrewOnboardingTaskInput!) { updateCrewOnboardingTask(id: $id, input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", pe = "mutation RemoveCrewOnboardingTask($id: ID!) { removeCrewOnboardingTask(id: $id) }", me = "mutation ToggleCrewOnboardingTask($id: ID!, $completed: Boolean!) { toggleCrewOnboardingTask(id: $id, completed: $completed) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", H = (e) => e.toUpperCase().replaceAll("-", "_"), U = (e) => /* @__PURE__ */ Error(`${e} isn't available in CrewFoundry.`), W = {
|
|
4
|
+
var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n }\n", r = "\n query CrewPayrollRecords {\n crewPayrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n }\n", i = "\n query CrewfoundryWorkspaceBootstrapWithOverlap(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $groupFirst: Int\n $conversationFirst: Int\n ) {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n projects(filter: { workspaceId: $workspaceId }, pagination: $projectPagination) {\n items {\n id\n name\n key\n creatorId\n status\n config\n archived\n createdAt\n updatedAt\n }\n }\n groups(first: $groupFirst) {\n edges {\n node {\n id\n name\n description\n groupType\n status\n memberCount\n ownerId\n createdAt\n }\n }\n }\n conversations(first: $conversationFirst) {\n edges {\n node {\n id\n title\n description\n state\n unreadCount\n memberCount\n updatedAt\n }\n }\n }\n }\n", a = "\n query CrewfoundryOverlapBilling {\n getBillingAccountsByOrg {\n id\n name\n isDefault\n paymentMethods {\n id\n type\n brand\n last4\n isDefault\n expiryMonth\n expiryYear\n }\n }\n }\n", o = "mutation CreateCrewEmployee($input: CreateCrewEmployeeInput!) { createCrewEmployee(input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }", s = "mutation UpdateCrewEmployee($id: ID!, $input: UpdateCrewEmployeeInput!) { updateCrewEmployee(id: $id, input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }", c = "mutation RemoveCrewEmployee($id: ID!) { removeCrewEmployee(id: $id) }", l = "mutation CreateCrewJobPosting($input: CreateCrewJobPostingInput!) { createCrewJobPosting(input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }", u = "mutation UpdateCrewJobPosting($id: ID!, $input: UpdateCrewJobPostingInput!) { updateCrewJobPosting(id: $id, input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }", d = "mutation CreateCrewCandidate($input: CreateCrewCandidateInput!) { createCrewCandidate(input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }", f = "mutation UpdateCrewCandidate($id: ID!, $input: UpdateCrewCandidateInput!) { updateCrewCandidate(id: $id, input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }", p = "mutation CreateCrewAnnouncement($input: CreateCrewAnnouncementInput!) { createCrewAnnouncement(input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }", m = "mutation CreateCrewLeaveRequest($input: CreateCrewLeaveRequestInput!) { createCrewLeaveRequest(input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }", h = "mutation UpdateCrewLeaveRequest($id: ID!, $input: UpdateCrewLeaveRequestInput!) { updateCrewLeaveRequest(id: $id, input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }", g = "mutation RemoveCrewJobPosting($id: ID!) { removeCrewJobPosting(id: $id) }", _ = "mutation RemoveCrewCandidate($id: ID!) { removeCrewCandidate(id: $id) }", v = "mutation UpdateCrewAnnouncement($id: ID!, $input: UpdateCrewAnnouncementInput!) { updateCrewAnnouncement(id: $id, input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }", y = "mutation RemoveCrewAnnouncement($id: ID!) { removeCrewAnnouncement(id: $id) }", b = "mutation CreateCrewInterview($input: CreateCrewInterviewInput!) { createCrewInterview(input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }", x = "mutation UpdateCrewInterview($id: ID!, $input: UpdateCrewInterviewInput!) { updateCrewInterview(id: $id, input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }", S = "mutation RemoveCrewInterview($id: ID!) { removeCrewInterview(id: $id) }", C = "mutation CreateCrewVendor($input: CreateCrewVendorInput!) { createCrewVendor(input: $input) { id name category contactPerson email phone status contractValue rating } }", w = "mutation UpdateCrewVendor($id: ID!, $input: UpdateCrewVendorInput!) { updateCrewVendor(id: $id, input: $input) { id name category contactPerson email phone status contractValue rating } }", T = "mutation RemoveCrewVendor($id: ID!) { removeCrewVendor(id: $id) }", E = "mutation CreateCrewClient($input: CreateCrewClientInput!) { createCrewClient(input: $input) { id name industry contactPerson email phone status revenue projects since } }", ee = "mutation UpdateCrewClient($id: ID!, $input: UpdateCrewClientInput!) { updateCrewClient(id: $id, input: $input) { id name industry contactPerson email phone status revenue projects since } }", te = "mutation RemoveCrewClient($id: ID!) { removeCrewClient(id: $id) }", ne = "mutation CreateCrewTeam($input: CreateCrewTeamInput!) { createCrewTeam(input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }", re = "mutation UpdateCrewTeam($id: ID!, $input: UpdateCrewTeamInput!) { updateCrewTeam(id: $id, input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }", ie = "mutation RemoveCrewTeam($id: ID!) { removeCrewTeam(id: $id) }", ae = "mutation CreateCrewProject($input: CreateCrewProjectInput!) { createCrewProject(input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }", oe = "mutation UpdateCrewProject($id: ID!, $input: UpdateCrewProjectInput!) { updateCrewProject(id: $id, input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }", se = "mutation RemoveCrewProject($id: ID!) { removeCrewProject(id: $id) }", ce = "mutation CreateCrewDepartment($input: CreateCrewDepartmentInput!) { createCrewDepartment(input: $input) { id name headId headName employeeCount budget location status } }", le = "mutation UpdateCrewDepartment($id: ID!, $input: UpdateCrewDepartmentInput!) { updateCrewDepartment(id: $id, input: $input) { id name headId headName employeeCount budget location status } }", ue = "mutation RemoveCrewDepartment($id: ID!) { removeCrewDepartment(id: $id) }", de = "mutation CreateCrewPayrollRecord($input: CreateCrewPayrollRecordInput!) { createCrewPayrollRecord(input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }", fe = "mutation UpdateCrewPayrollRecord($id: ID!, $input: UpdateCrewPayrollRecordInput!) { updateCrewPayrollRecord(id: $id, input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }", D = "mutation RemoveCrewPayrollRecord($id: ID!) { removeCrewPayrollRecord(id: $id) }", O = "mutation CreateCrewTimeEntry($input: CreateCrewTimeEntryInput!) { createCrewTimeEntry(input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }", k = "mutation UpdateCrewTimeEntry($id: ID!, $input: UpdateCrewTimeEntryInput!) { updateCrewTimeEntry(id: $id, input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }", A = "mutation RemoveCrewTimeEntry($id: ID!) { removeCrewTimeEntry(id: $id) }", j = "query EmployeeDocuments($employeeId: ID!) { employeeDocuments(employeeId: $employeeId) { id employeeId fileId title category uploadedBy uploadedAt } }", M = "mutation AttachEmployeeDocument($input: AttachCrewEmployeeDocumentInput!) { attachEmployeeDocument(input: $input) { id employeeId fileId title category uploadedBy uploadedAt } }", N = "mutation DetachEmployeeDocument($id: ID!) { detachEmployeeDocument(id: $id) }", P = "mutation EnsureFolderByPath($path: String!) { ensureFolderByPath(path: $path) { id } }", F = "mutation InitiateUpload($input: InitiateUploadInput!) { initiateUpload(input: $input) { session { id } uploadUrl } }", I = "mutation CompleteUpload($input: CompleteUploadInput!) { completeUpload(input: $input) { file { id } } }", L = "query CrewOnboardings { crewOnboardings { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", R = "mutation CreateCrewOnboarding($input: CreateCrewOnboardingInput!) { createCrewOnboarding(input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", z = "mutation UpdateCrewOnboarding($id: ID!, $input: UpdateCrewOnboardingInput!) { updateCrewOnboarding(id: $id, input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }", B = "mutation RemoveCrewOnboarding($id: ID!) { removeCrewOnboarding(id: $id) }", V = "mutation CreateCrewOnboardingTask($input: CreateCrewOnboardingTaskInput!) { createCrewOnboardingTask(input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", pe = "mutation UpdateCrewOnboardingTask($id: ID!, $input: UpdateCrewOnboardingTaskInput!) { updateCrewOnboardingTask(id: $id, input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", me = "mutation RemoveCrewOnboardingTask($id: ID!) { removeCrewOnboardingTask(id: $id) }", he = "mutation ToggleCrewOnboardingTask($id: ID!, $completed: Boolean!) { toggleCrewOnboardingTask(id: $id, completed: $completed) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }", H = (e) => e.toUpperCase().replaceAll("-", "_"), U = (e) => /* @__PURE__ */ Error(`${e} isn't available in CrewFoundry.`), W = {
|
|
5
5
|
employee: ["status", "type"],
|
|
6
6
|
department: ["status"],
|
|
7
7
|
jobPosting: [
|
|
@@ -37,19 +37,19 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
37
37
|
}, K = (e) => ({
|
|
38
38
|
...G(e, W.onboarding),
|
|
39
39
|
tasks: (e.tasks ?? []).map((e) => G(e, W.onboardingTask))
|
|
40
|
-
}), q = (e) => e ? e.slice(0, 10) : "TBD",
|
|
40
|
+
}), q = (e) => e ? e.slice(0, 10) : "TBD", ge = (e) => !e || typeof e != "object" || Array.isArray(e) ? null : e, J = (e) => typeof e == "number" ? e : null, Y = (e) => typeof e == "string" ? e : null, _e = (e) => {
|
|
41
41
|
let t = e.toLowerCase();
|
|
42
42
|
return t === "active" ? "active" : t === "completed" ? "completed" : t === "cancelled" ? "cancelled" : t === "archived" ? "on_hold" : "planning";
|
|
43
|
-
},
|
|
43
|
+
}, ve = (e) => {
|
|
44
44
|
let t = e.toLowerCase();
|
|
45
45
|
return t === "active" ? "active" : t === "inactive" || t === "archived" || t === "deleted" ? "disbanded" : "forming";
|
|
46
|
-
},
|
|
47
|
-
let r =
|
|
46
|
+
}, ye = (e, t) => e.map((e, n) => {
|
|
47
|
+
let r = ge(e.config), i = J(r?.budget) ?? 25e3 + n * 2500, a = J(r?.spent) ?? Math.round(i * (e.status === "COMPLETED" ? 1 : .62)), o = J(r?.progress) ?? (e.status === "COMPLETED" ? 100 : 58), s = J(r?.tasks) ?? 20 + n % 9, c = J(r?.completedTasks) ?? Math.round(o / 100 * s), l = t[n % Math.max(t.length, 1)];
|
|
48
48
|
return {
|
|
49
49
|
id: e.id,
|
|
50
50
|
name: e.name,
|
|
51
51
|
description: Y(r?.description) || `${e.key} delivery plan`,
|
|
52
|
-
status:
|
|
52
|
+
status: _e(e.status),
|
|
53
53
|
priority: Y(r?.priority)?.toLowerCase() || "medium",
|
|
54
54
|
startDate: q(e.createdAt),
|
|
55
55
|
endDate: q(e.updatedAt),
|
|
@@ -63,7 +63,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
63
63
|
tasks: s,
|
|
64
64
|
completedTasks: c
|
|
65
65
|
};
|
|
66
|
-
}),
|
|
66
|
+
}), be = (e) => e.map(({ node: e }) => ({
|
|
67
67
|
id: e.id,
|
|
68
68
|
name: e.name,
|
|
69
69
|
description: e.description || `${e.name} team workspace`,
|
|
@@ -72,10 +72,10 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
72
72
|
members: [],
|
|
73
73
|
memberCount: e.memberCount,
|
|
74
74
|
department: e.groupType?.toLowerCase().replaceAll("_", " ") || "operations",
|
|
75
|
-
status:
|
|
75
|
+
status: ve(e.status),
|
|
76
76
|
projectCount: 0,
|
|
77
77
|
createdAt: q(e.createdAt)
|
|
78
|
-
})),
|
|
78
|
+
})), xe = (e) => e.filter(({ node: e }) => e.unreadCount > 0).map(({ node: e }) => ({
|
|
79
79
|
id: `conversation-${e.id}`,
|
|
80
80
|
title: e.title || "Conversation update",
|
|
81
81
|
message: `${e.unreadCount} unread in ${e.memberCount}-member channel`,
|
|
@@ -84,7 +84,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
84
84
|
read: !1,
|
|
85
85
|
createdAt: e.updatedAt,
|
|
86
86
|
actionUrl: "/crewfoundry/communications/messages-page"
|
|
87
|
-
})),
|
|
87
|
+
})), Se = (e) => {
|
|
88
88
|
let t = e.getBillingAccountsByOrg.find((e) => e?.isDefault && e?.id) || e.getBillingAccountsByOrg.find((e) => e?.id);
|
|
89
89
|
return t?.id ? (t.paymentMethods || []).filter((e) => !!e).map((e) => {
|
|
90
90
|
let n = e.expiryMonth ? String(e.expiryMonth).padStart(2, "0") : void 0, r = e.expiryYear ? String(e.expiryYear) : void 0, i = e.type === "BANK_TRANSFER" || e.type === "NETBANKING";
|
|
@@ -98,11 +98,11 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
98
98
|
expiry: n && r ? `${n}/${r}` : void 0
|
|
99
99
|
};
|
|
100
100
|
}) : [];
|
|
101
|
-
},
|
|
101
|
+
}, Ce = (e, t) => {
|
|
102
102
|
if (e.errors?.length) throw Error(e.errors[0]?.message || t);
|
|
103
103
|
if (!e.data) throw Error(t);
|
|
104
104
|
return e.data;
|
|
105
|
-
},
|
|
105
|
+
}, X = new Set([
|
|
106
106
|
"id",
|
|
107
107
|
"createdAt",
|
|
108
108
|
"createdOn",
|
|
@@ -124,28 +124,28 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
124
124
|
"viewCount",
|
|
125
125
|
"revenue",
|
|
126
126
|
"projects"
|
|
127
|
-
]),
|
|
127
|
+
]), we = (e) => {
|
|
128
128
|
if (!e) return e;
|
|
129
129
|
let t = e.input;
|
|
130
130
|
if (!t || typeof t != "object" || Array.isArray(t)) return e;
|
|
131
131
|
let n = {};
|
|
132
|
-
for (let [e, r] of Object.entries(t))
|
|
132
|
+
for (let [e, r] of Object.entries(t)) X.has(e) || (n[e] = r);
|
|
133
133
|
return {
|
|
134
134
|
...e,
|
|
135
135
|
input: n
|
|
136
136
|
};
|
|
137
|
-
}, Z = async (e, n, r, i, a = "workspace") =>
|
|
137
|
+
}, Z = async (e, n, r, i, a = "workspace") => Ce(await t({
|
|
138
138
|
gateway: a,
|
|
139
139
|
query: e,
|
|
140
|
-
variables:
|
|
140
|
+
variables: we(n),
|
|
141
141
|
authToken: r.authToken,
|
|
142
142
|
baseUrl: a === "workspace" ? r.apiGatewayUrl : void 0,
|
|
143
143
|
extraHeaders: { ...a === "workspace" && r.workspaceId ? { "x-workspace-id": r.workspaceId } : {} }
|
|
144
|
-
}), i),
|
|
144
|
+
}), i), Te = () => !1, Q = async (e, t, n, r, i = "workspace") => {
|
|
145
145
|
try {
|
|
146
146
|
return await Z(e, t, n, r, i);
|
|
147
147
|
} catch (e) {
|
|
148
|
-
return
|
|
148
|
+
return Te() && console.warn(`[crewfoundry] overlap query skipped: ${r}`, e), null;
|
|
149
149
|
}
|
|
150
150
|
}, $ = e((e) => ({
|
|
151
151
|
metrics: [
|
|
@@ -235,54 +235,58 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
235
235
|
initParams: t
|
|
236
236
|
});
|
|
237
237
|
try {
|
|
238
|
-
let [
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
238
|
+
let [o, s, c] = await Promise.all([
|
|
239
|
+
Q(i, {
|
|
240
|
+
workspaceId: t.workspaceId,
|
|
241
|
+
projectPagination: {
|
|
242
|
+
limit: 50,
|
|
243
|
+
offset: 0
|
|
244
|
+
},
|
|
245
|
+
groupFirst: 30,
|
|
246
|
+
conversationFirst: 30
|
|
247
|
+
}, t, "Unable to load workspace bootstrap with overlap data"),
|
|
248
|
+
Q(a, void 0, t, "Unable to load overlap billing data", "global"),
|
|
249
|
+
Q(r, void 0, t, "Unable to load payroll records")
|
|
250
|
+
]), l = o ? o.crewfoundryBootstrap : (await Z(n, void 0, t, "Unable to load CrewFoundry data")).crewfoundryBootstrap, u = o ? be(o.groups.edges) : [], d = o ? ye(o.projects.items, u) : [], f = o ? xe(o.conversations.edges) : [], p = u.length > 0 ? u : l.teams, m = d.length > 0 ? d : l.projects, h = f, g = s ? Se(s) : [], _ = l.employees.map((e) => G(e, W.employee)), v = l.departments.map((e) => G(e, W.department)), y = l.jobPostings.map((e) => G(e, W.jobPosting)), b = l.candidates.map((e) => G(e, W.candidate)), x = l.interviews.map((e) => G(e, W.interview)), S = [], C = [], w = l.announcements.map((e) => G(e, W.announcement)), T = p.map((e) => G(e, W.team)), E = m.map((e) => G(e, W.project));
|
|
247
251
|
e({
|
|
248
|
-
employees:
|
|
249
|
-
departments:
|
|
250
|
-
jobPostings:
|
|
251
|
-
candidates:
|
|
252
|
-
interviews:
|
|
253
|
-
courses:
|
|
252
|
+
employees: _,
|
|
253
|
+
departments: v,
|
|
254
|
+
jobPostings: y,
|
|
255
|
+
candidates: b,
|
|
256
|
+
interviews: x,
|
|
257
|
+
courses: S,
|
|
254
258
|
learningPaths: [],
|
|
255
|
-
marketplaceServices:
|
|
256
|
-
announcements:
|
|
257
|
-
teams:
|
|
258
|
-
projects:
|
|
259
|
-
payrollRecords:
|
|
260
|
-
leaveRequests:
|
|
261
|
-
timeEntries:
|
|
262
|
-
notifications:
|
|
263
|
-
paymentMethods:
|
|
259
|
+
marketplaceServices: C,
|
|
260
|
+
announcements: w,
|
|
261
|
+
teams: T,
|
|
262
|
+
projects: E,
|
|
263
|
+
payrollRecords: (c?.crewPayrollRecords ?? []).map((e) => G(e, W.payrollRecord)),
|
|
264
|
+
leaveRequests: l.leaveRequests.map((e) => G(e, W.leaveRequest)),
|
|
265
|
+
timeEntries: l.timeEntries.map((e) => G(e, W.timeEntry)),
|
|
266
|
+
notifications: h.map((e) => G(e, W.notification)),
|
|
267
|
+
paymentMethods: g.map((e) => G(e, W.paymentMethod)),
|
|
264
268
|
invoices: [],
|
|
265
|
-
vendors:
|
|
266
|
-
clients:
|
|
269
|
+
vendors: l.vendors.map((e) => G(e, W.vendor)),
|
|
270
|
+
clients: l.clients.map((e) => G(e, W.client)),
|
|
267
271
|
metrics: [
|
|
268
272
|
{
|
|
269
273
|
label: "Total Employees",
|
|
270
|
-
value: String(
|
|
274
|
+
value: String(_.length),
|
|
271
275
|
trend: "Live"
|
|
272
276
|
},
|
|
273
277
|
{
|
|
274
278
|
label: "Open Positions",
|
|
275
|
-
value: String(
|
|
279
|
+
value: String(y.filter((e) => e.status === "active").length),
|
|
276
280
|
trend: "Live"
|
|
277
281
|
},
|
|
278
282
|
{
|
|
279
283
|
label: "Hiring Pipeline",
|
|
280
|
-
value: String(
|
|
284
|
+
value: String(b.length),
|
|
281
285
|
trend: "Live"
|
|
282
286
|
},
|
|
283
287
|
{
|
|
284
288
|
label: "Cross-Team Projects",
|
|
285
|
-
value: String(
|
|
289
|
+
value: String(E.filter((e) => e.status === "active").length),
|
|
286
290
|
trend: "Live"
|
|
287
291
|
}
|
|
288
292
|
],
|
|
@@ -300,7 +304,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
300
304
|
setSelectedView: (t) => e({ selectedView: t }),
|
|
301
305
|
setWorkItems: (t) => e({ workItems: t }),
|
|
302
306
|
addEmployee: async (t) => {
|
|
303
|
-
let n = $.getState().initParams, r = await Z(
|
|
307
|
+
let n = $.getState().initParams, r = await Z(o, { input: {
|
|
304
308
|
...t,
|
|
305
309
|
status: H(t.status),
|
|
306
310
|
type: H(t.type)
|
|
@@ -308,7 +312,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
308
312
|
e((e) => ({ employees: [G(r.createCrewEmployee, W.employee), ...e.employees] }));
|
|
309
313
|
},
|
|
310
314
|
updateEmployee: async (t, n) => {
|
|
311
|
-
let r = $.getState().initParams, i = await Z(
|
|
315
|
+
let r = $.getState().initParams, i = await Z(s, {
|
|
312
316
|
id: t,
|
|
313
317
|
input: {
|
|
314
318
|
...n,
|
|
@@ -320,17 +324,17 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
320
324
|
},
|
|
321
325
|
removeEmployee: async (t) => {
|
|
322
326
|
let n = $.getState().initParams;
|
|
323
|
-
await Z(
|
|
327
|
+
await Z(c, { id: t }, n, "Unable to remove employee"), e((e) => ({ employees: e.employees.filter((e) => e.id !== t) }));
|
|
324
328
|
},
|
|
325
329
|
addJobPosting: async (t) => {
|
|
326
|
-
let n = $.getState().initParams, r = await Z(
|
|
330
|
+
let n = $.getState().initParams, r = await Z(l, { input: {
|
|
327
331
|
...t,
|
|
328
332
|
status: H(t.status)
|
|
329
333
|
} }, n, "Unable to create job posting");
|
|
330
334
|
e((e) => ({ jobPostings: [G(r.createCrewJobPosting, W.jobPosting), ...e.jobPostings] }));
|
|
331
335
|
},
|
|
332
336
|
updateJobPosting: async (t, n) => {
|
|
333
|
-
let r = $.getState().initParams, i = await Z(
|
|
337
|
+
let r = $.getState().initParams, i = await Z(u, {
|
|
334
338
|
id: t,
|
|
335
339
|
input: {
|
|
336
340
|
...n,
|
|
@@ -340,14 +344,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
340
344
|
e((e) => ({ jobPostings: e.jobPostings.map((e) => e.id === t ? G(i.updateCrewJobPosting, W.jobPosting) : e) }));
|
|
341
345
|
},
|
|
342
346
|
addCandidate: async (t) => {
|
|
343
|
-
let n = $.getState().initParams, r = await Z(
|
|
347
|
+
let n = $.getState().initParams, r = await Z(d, { input: {
|
|
344
348
|
...t,
|
|
345
349
|
status: H(t.status)
|
|
346
350
|
} }, n, "Unable to create candidate");
|
|
347
351
|
e((e) => ({ candidates: [G(r.createCrewCandidate, W.candidate), ...e.candidates] }));
|
|
348
352
|
},
|
|
349
353
|
updateCandidate: async (t, n) => {
|
|
350
|
-
let r = $.getState().initParams, i = await Z(
|
|
354
|
+
let r = $.getState().initParams, i = await Z(f, {
|
|
351
355
|
id: t,
|
|
352
356
|
input: {
|
|
353
357
|
...n,
|
|
@@ -357,11 +361,11 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
357
361
|
e((e) => ({ candidates: e.candidates.map((e) => e.id === t ? G(i.updateCrewCandidate, W.candidate) : e) }));
|
|
358
362
|
},
|
|
359
363
|
addAnnouncement: async (t) => {
|
|
360
|
-
let n = $.getState().initParams, r = await Z(
|
|
364
|
+
let n = $.getState().initParams, r = await Z(p, { input: t }, n, "Unable to create announcement");
|
|
361
365
|
e((e) => ({ announcements: [G(r.createCrewAnnouncement, W.announcement), ...e.announcements] }));
|
|
362
366
|
},
|
|
363
367
|
addLeaveRequest: async (t) => {
|
|
364
|
-
let n = $.getState().initParams, r = await Z(
|
|
368
|
+
let n = $.getState().initParams, r = await Z(m, { input: {
|
|
365
369
|
...t,
|
|
366
370
|
type: H(t.type),
|
|
367
371
|
status: H(t.status)
|
|
@@ -369,7 +373,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
369
373
|
e((e) => ({ leaveRequests: [G(r.createCrewLeaveRequest, W.leaveRequest), ...e.leaveRequests] }));
|
|
370
374
|
},
|
|
371
375
|
updateLeaveRequest: async (t, n) => {
|
|
372
|
-
let r = $.getState().initParams, i = await Z(
|
|
376
|
+
let r = $.getState().initParams, i = await Z(h, {
|
|
373
377
|
id: t,
|
|
374
378
|
input: {
|
|
375
379
|
...n,
|
|
@@ -393,14 +397,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
393
397
|
},
|
|
394
398
|
removeJobPosting: async (t) => {
|
|
395
399
|
let n = $.getState().initParams;
|
|
396
|
-
await Z(
|
|
400
|
+
await Z(g, { id: t }, n, "Unable to remove job posting"), e((e) => ({ jobPostings: e.jobPostings.filter((e) => e.id !== t) }));
|
|
397
401
|
},
|
|
398
402
|
removeCandidate: async (t) => {
|
|
399
403
|
let n = $.getState().initParams;
|
|
400
|
-
await Z(
|
|
404
|
+
await Z(_, { id: t }, n, "Unable to remove candidate"), e((e) => ({ candidates: e.candidates.filter((e) => e.id !== t) }));
|
|
401
405
|
},
|
|
402
406
|
updateAnnouncement: async (t, n) => {
|
|
403
|
-
let r = $.getState().initParams, i = await Z(
|
|
407
|
+
let r = $.getState().initParams, i = await Z(v, {
|
|
404
408
|
id: t,
|
|
405
409
|
input: n
|
|
406
410
|
}, r, "Unable to update announcement");
|
|
@@ -408,10 +412,10 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
408
412
|
},
|
|
409
413
|
removeAnnouncement: async (t) => {
|
|
410
414
|
let n = $.getState().initParams;
|
|
411
|
-
await Z(
|
|
415
|
+
await Z(y, { id: t }, n, "Unable to remove announcement"), e((e) => ({ announcements: e.announcements.filter((e) => e.id !== t) }));
|
|
412
416
|
},
|
|
413
417
|
addInterview: async (t) => {
|
|
414
|
-
let n = $.getState().initParams, r = await Z(
|
|
418
|
+
let n = $.getState().initParams, r = await Z(b, { input: {
|
|
415
419
|
...t,
|
|
416
420
|
type: H(t.type),
|
|
417
421
|
status: H(t.status)
|
|
@@ -419,7 +423,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
419
423
|
e((e) => ({ interviews: [G(r.createCrewInterview, W.interview), ...e.interviews] }));
|
|
420
424
|
},
|
|
421
425
|
updateInterview: async (t, n) => {
|
|
422
|
-
let r = $.getState().initParams, i = await Z(
|
|
426
|
+
let r = $.getState().initParams, i = await Z(x, {
|
|
423
427
|
id: t,
|
|
424
428
|
input: {
|
|
425
429
|
...n,
|
|
@@ -431,7 +435,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
431
435
|
},
|
|
432
436
|
removeInterview: async (t) => {
|
|
433
437
|
let n = $.getState().initParams;
|
|
434
|
-
await Z(
|
|
438
|
+
await Z(S, { id: t }, n, "Unable to remove interview"), e((e) => ({ interviews: e.interviews.filter((e) => e.id !== t) }));
|
|
435
439
|
},
|
|
436
440
|
addInvoice: async () => {
|
|
437
441
|
throw U("Invoices");
|
|
@@ -443,14 +447,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
443
447
|
throw U("Invoices");
|
|
444
448
|
},
|
|
445
449
|
addVendor: async (t) => {
|
|
446
|
-
let n = $.getState().initParams, r = await Z(
|
|
450
|
+
let n = $.getState().initParams, r = await Z(C, { input: {
|
|
447
451
|
...t,
|
|
448
452
|
status: H(t.status)
|
|
449
453
|
} }, n, "Unable to create vendor");
|
|
450
454
|
e((e) => ({ vendors: [G(r.createCrewVendor, W.vendor), ...e.vendors] }));
|
|
451
455
|
},
|
|
452
456
|
updateVendor: async (t, n) => {
|
|
453
|
-
let r = $.getState().initParams, i = await Z(
|
|
457
|
+
let r = $.getState().initParams, i = await Z(w, {
|
|
454
458
|
id: t,
|
|
455
459
|
input: {
|
|
456
460
|
...n,
|
|
@@ -461,17 +465,17 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
461
465
|
},
|
|
462
466
|
removeVendor: async (t) => {
|
|
463
467
|
let n = $.getState().initParams;
|
|
464
|
-
await Z(
|
|
468
|
+
await Z(T, { id: t }, n, "Unable to remove vendor"), e((e) => ({ vendors: e.vendors.filter((e) => e.id !== t) }));
|
|
465
469
|
},
|
|
466
470
|
addClient: async (t) => {
|
|
467
|
-
let n = $.getState().initParams, r = await Z(
|
|
471
|
+
let n = $.getState().initParams, r = await Z(E, { input: {
|
|
468
472
|
...t,
|
|
469
473
|
status: H(t.status)
|
|
470
474
|
} }, n, "Unable to create client");
|
|
471
475
|
e((e) => ({ clients: [G(r.createCrewClient, W.client), ...e.clients] }));
|
|
472
476
|
},
|
|
473
477
|
updateClient: async (t, n) => {
|
|
474
|
-
let r = $.getState().initParams, i = await Z(
|
|
478
|
+
let r = $.getState().initParams, i = await Z(ee, {
|
|
475
479
|
id: t,
|
|
476
480
|
input: {
|
|
477
481
|
...n,
|
|
@@ -482,14 +486,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
482
486
|
},
|
|
483
487
|
removeClient: async (t) => {
|
|
484
488
|
let n = $.getState().initParams;
|
|
485
|
-
await Z(
|
|
489
|
+
await Z(te, { id: t }, n, "Unable to remove client"), e((e) => ({ clients: e.clients.filter((e) => e.id !== t) }));
|
|
486
490
|
},
|
|
487
491
|
addTeam: async (t) => {
|
|
488
|
-
let n = $.getState().initParams, r = await Z(
|
|
492
|
+
let n = $.getState().initParams, r = await Z(ne, { input: t }, n, "Unable to create team");
|
|
489
493
|
e((e) => ({ teams: [G(r.createCrewTeam, W.team), ...e.teams] }));
|
|
490
494
|
},
|
|
491
495
|
updateTeam: async (t, n) => {
|
|
492
|
-
let r = $.getState().initParams, i = await Z(
|
|
496
|
+
let r = $.getState().initParams, i = await Z(re, {
|
|
493
497
|
id: t,
|
|
494
498
|
input: n
|
|
495
499
|
}, r, "Unable to update team");
|
|
@@ -497,10 +501,10 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
497
501
|
},
|
|
498
502
|
removeTeam: async (t) => {
|
|
499
503
|
let n = $.getState().initParams;
|
|
500
|
-
await Z(
|
|
504
|
+
await Z(ie, { id: t }, n, "Unable to remove team"), e((e) => ({ teams: e.teams.filter((e) => e.id !== t) }));
|
|
501
505
|
},
|
|
502
506
|
addProject: async (t) => {
|
|
503
|
-
let n = $.getState().initParams, r = await Z(
|
|
507
|
+
let n = $.getState().initParams, r = await Z(ae, { input: {
|
|
504
508
|
...t,
|
|
505
509
|
status: H(t.status),
|
|
506
510
|
priority: H(t.priority)
|
|
@@ -508,7 +512,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
508
512
|
e((e) => ({ projects: [G(r.createCrewProject, W.project), ...e.projects] }));
|
|
509
513
|
},
|
|
510
514
|
updateProject: async (t, n) => {
|
|
511
|
-
let r = $.getState().initParams, i = await Z(
|
|
515
|
+
let r = $.getState().initParams, i = await Z(oe, {
|
|
512
516
|
id: t,
|
|
513
517
|
input: {
|
|
514
518
|
...n,
|
|
@@ -520,7 +524,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
520
524
|
},
|
|
521
525
|
removeProject: async (t) => {
|
|
522
526
|
let n = $.getState().initParams;
|
|
523
|
-
await Z(
|
|
527
|
+
await Z(se, { id: t }, n, "Unable to remove project"), e((e) => ({ projects: e.projects.filter((e) => e.id !== t) }));
|
|
524
528
|
},
|
|
525
529
|
addMarketplaceService: async () => {
|
|
526
530
|
throw U("Marketplace services");
|
|
@@ -532,11 +536,11 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
532
536
|
throw U("Marketplace services");
|
|
533
537
|
},
|
|
534
538
|
addDepartment: async (t) => {
|
|
535
|
-
let n = $.getState().initParams, r = await Z(
|
|
539
|
+
let n = $.getState().initParams, r = await Z(ce, { input: t }, n, "Unable to create department");
|
|
536
540
|
e((e) => ({ departments: [G(r.createCrewDepartment, W.department), ...e.departments] }));
|
|
537
541
|
},
|
|
538
542
|
updateDepartment: async (t, n) => {
|
|
539
|
-
let r = $.getState().initParams, i = await Z(
|
|
543
|
+
let r = $.getState().initParams, i = await Z(le, {
|
|
540
544
|
id: t,
|
|
541
545
|
input: n
|
|
542
546
|
}, r, "Unable to update department");
|
|
@@ -544,7 +548,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
544
548
|
},
|
|
545
549
|
removeDepartment: async (t) => {
|
|
546
550
|
let n = $.getState().initParams;
|
|
547
|
-
await Z(
|
|
551
|
+
await Z(ue, { id: t }, n, "Unable to remove department"), e((e) => ({ departments: e.departments.filter((e) => e.id !== t) }));
|
|
548
552
|
},
|
|
549
553
|
addCourse: async () => {
|
|
550
554
|
throw U("Courses");
|
|
@@ -568,14 +572,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
568
572
|
throw U("Learning paths");
|
|
569
573
|
},
|
|
570
574
|
addPayrollRecord: async (t) => {
|
|
571
|
-
let n = $.getState().initParams, r = await Z(
|
|
575
|
+
let n = $.getState().initParams, r = await Z(de, { input: {
|
|
572
576
|
...t,
|
|
573
577
|
status: H(t.status)
|
|
574
578
|
} }, n, "Unable to create payroll record");
|
|
575
579
|
e((e) => ({ payrollRecords: [G(r.createCrewPayrollRecord, W.payrollRecord), ...e.payrollRecords] }));
|
|
576
580
|
},
|
|
577
581
|
updatePayrollRecord: async (t, n) => {
|
|
578
|
-
let r = $.getState().initParams, i = await Z(
|
|
582
|
+
let r = $.getState().initParams, i = await Z(fe, {
|
|
579
583
|
id: t,
|
|
580
584
|
input: {
|
|
581
585
|
...n,
|
|
@@ -586,14 +590,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
586
590
|
},
|
|
587
591
|
removePayrollRecord: async (t) => {
|
|
588
592
|
let n = $.getState().initParams;
|
|
589
|
-
await Z(
|
|
593
|
+
await Z(D, { id: t }, n, "Unable to remove payroll record"), e((e) => ({ payrollRecords: e.payrollRecords.filter((e) => e.id !== t) }));
|
|
590
594
|
},
|
|
591
595
|
addTimeEntry: async (t) => {
|
|
592
|
-
let n = $.getState().initParams, r = await Z(
|
|
596
|
+
let n = $.getState().initParams, r = await Z(O, { input: t }, n, "Unable to create time entry");
|
|
593
597
|
e((e) => ({ timeEntries: [G(r.createCrewTimeEntry, W.timeEntry), ...e.timeEntries] }));
|
|
594
598
|
},
|
|
595
599
|
updateTimeEntry: async (t, n) => {
|
|
596
|
-
let r = $.getState().initParams, i = await Z(
|
|
600
|
+
let r = $.getState().initParams, i = await Z(k, {
|
|
597
601
|
id: t,
|
|
598
602
|
input: n
|
|
599
603
|
}, r, "Unable to update time entry");
|
|
@@ -601,14 +605,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
601
605
|
},
|
|
602
606
|
removeTimeEntry: async (t) => {
|
|
603
607
|
let n = $.getState().initParams;
|
|
604
|
-
await Z(
|
|
608
|
+
await Z(A, { id: t }, n, "Unable to remove time entry"), e((e) => ({ timeEntries: e.timeEntries.filter((e) => e.id !== t) }));
|
|
605
609
|
},
|
|
606
610
|
fetchEmployeeDocuments: async (t) => {
|
|
607
|
-
let n = $.getState().initParams, r = await Z(
|
|
611
|
+
let n = $.getState().initParams, r = await Z(j, { employeeId: t }, n, "Unable to load employee documents");
|
|
608
612
|
e((e) => ({ employeeDocuments: [...e.employeeDocuments.filter((e) => e.employeeId !== t), ...r.employeeDocuments] }));
|
|
609
613
|
},
|
|
610
614
|
uploadEmployeeDocument: async ({ employeeId: t, file: n, title: r, category: i }) => {
|
|
611
|
-
let a = $.getState().initParams, o = await Z(
|
|
615
|
+
let a = $.getState().initParams, o = await Z(P, { path: "/CrewFoundry/Employee Documents" }, a, "Unable to resolve the employee documents folder"), s = n.name.includes(".") ? n.name.substring(n.name.lastIndexOf(".") + 1) : "", c = await Z(F, { input: {
|
|
612
616
|
fileName: n.name,
|
|
613
617
|
fileSize: String(n.size),
|
|
614
618
|
mimeType: n.type || "application/octet-stream",
|
|
@@ -623,9 +627,9 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
623
627
|
});
|
|
624
628
|
if (!e.ok) throw Error(`Failed to upload file bytes (status ${e.status})`);
|
|
625
629
|
}
|
|
626
|
-
let l = await Z(
|
|
630
|
+
let l = await Z(M, { input: {
|
|
627
631
|
employeeId: t,
|
|
628
|
-
fileId: (await Z(
|
|
632
|
+
fileId: (await Z(I, { input: {
|
|
629
633
|
sessionId: c.initiateUpload.session.id,
|
|
630
634
|
fileSize: String(n.size),
|
|
631
635
|
folderId: o.ensureFolderByPath.id
|
|
@@ -637,21 +641,21 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
637
641
|
},
|
|
638
642
|
detachEmployeeDocument: async (t) => {
|
|
639
643
|
let n = $.getState().initParams;
|
|
640
|
-
await Z(
|
|
644
|
+
await Z(N, { id: t }, n, "Unable to remove this document"), e((e) => ({ employeeDocuments: e.employeeDocuments.filter((e) => e.id !== t) }));
|
|
641
645
|
},
|
|
642
646
|
fetchOnboardings: async () => {
|
|
643
647
|
let t = $.getState().initParams;
|
|
644
648
|
e({
|
|
645
|
-
onboardings: (await Z(
|
|
649
|
+
onboardings: (await Z(L, {}, t, "Unable to load onboarding")).crewOnboardings.map(K),
|
|
646
650
|
onboardingsLoaded: !0
|
|
647
651
|
});
|
|
648
652
|
},
|
|
649
653
|
createOnboarding: async (t) => {
|
|
650
|
-
let n = $.getState().initParams, r = await Z(
|
|
654
|
+
let n = $.getState().initParams, r = await Z(R, { input: t }, n, "Unable to start onboarding");
|
|
651
655
|
e((e) => ({ onboardings: [K(r.createCrewOnboarding), ...e.onboardings] }));
|
|
652
656
|
},
|
|
653
657
|
updateOnboarding: async (t, n) => {
|
|
654
|
-
let r = $.getState().initParams, i = await Z(
|
|
658
|
+
let r = $.getState().initParams, i = await Z(z, {
|
|
655
659
|
id: t,
|
|
656
660
|
input: n
|
|
657
661
|
}, r, "Unable to update onboarding");
|
|
@@ -659,10 +663,10 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
659
663
|
},
|
|
660
664
|
removeOnboarding: async (t) => {
|
|
661
665
|
let n = $.getState().initParams;
|
|
662
|
-
await Z(
|
|
666
|
+
await Z(B, { id: t }, n, "Unable to remove onboarding"), e((e) => ({ onboardings: e.onboardings.filter((e) => e.id !== t) }));
|
|
663
667
|
},
|
|
664
668
|
createOnboardingTask: async (t) => {
|
|
665
|
-
let n = $.getState().initParams, r = G((await Z(
|
|
669
|
+
let n = $.getState().initParams, r = G((await Z(V, { input: t }, n, "Unable to create onboarding task")).createCrewOnboardingTask, W.onboardingTask);
|
|
666
670
|
e((e) => ({ onboardings: e.onboardings.map((e) => e.id === r.onboardingId ? {
|
|
667
671
|
...e,
|
|
668
672
|
tasks: [...e.tasks, r],
|
|
@@ -670,7 +674,7 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
670
674
|
} : e) }));
|
|
671
675
|
},
|
|
672
676
|
updateOnboardingTask: async (t, n) => {
|
|
673
|
-
let r = $.getState().initParams, i = G((await Z(
|
|
677
|
+
let r = $.getState().initParams, i = G((await Z(pe, {
|
|
674
678
|
id: t,
|
|
675
679
|
input: n
|
|
676
680
|
}, r, "Unable to update onboarding task")).updateCrewOnboardingTask, W.onboardingTask);
|
|
@@ -681,14 +685,14 @@ var n = "\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n emp
|
|
|
681
685
|
},
|
|
682
686
|
removeOnboardingTask: async (t) => {
|
|
683
687
|
let n = $.getState().initParams;
|
|
684
|
-
await Z(
|
|
688
|
+
await Z(me, { id: t }, n, "Unable to remove onboarding task"), e((e) => ({ onboardings: e.onboardings.map((e) => e.tasks.some((e) => e.id === t) ? {
|
|
685
689
|
...e,
|
|
686
690
|
tasks: e.tasks.filter((e) => e.id !== t),
|
|
687
691
|
totalTaskCount: Math.max(0, e.totalTaskCount - 1)
|
|
688
692
|
} : e) }));
|
|
689
693
|
},
|
|
690
694
|
toggleOnboardingTask: async (t, n) => {
|
|
691
|
-
let r = $.getState().initParams, i = G((await Z(
|
|
695
|
+
let r = $.getState().initParams, i = G((await Z(he, {
|
|
692
696
|
id: t,
|
|
693
697
|
completed: n
|
|
694
698
|
}, r, "Unable to update onboarding task")).toggleCrewOnboardingTask, W.onboardingTask);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crewfoundryStore.js","names":[],"sources":["../../../src/crewfoundry/store/crewfoundryStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport type { OverviewMetric, WorkItem } from '../types';\n\n// ── Domain Types ────────────────────────────────────────────────\nexport interface Employee {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n department: string;\n position: string;\n status: 'active' | 'inactive' | 'on_leave' | 'terminated';\n type: 'full_time' | 'part_time' | 'contract' | 'intern';\n salary: number;\n startDate: string;\n avatar?: string;\n location: string;\n managerId?: string;\n phone: string;\n performanceScore: number;\n /** Real per-employee skill tags (backend default `[]`). */\n skills: string[];\n /** Exit date for terminated employees; ISO string or null while employed. */\n terminationDate?: string | null;\n}\n\nexport interface Department {\n id: string;\n name: string;\n headId: string;\n headName: string;\n employeeCount: number;\n budget: number;\n location: string;\n status: 'active' | 'restructuring';\n}\n\nexport interface JobPosting {\n id: string;\n title: string;\n department: string;\n location: string;\n type: 'full_time' | 'part_time' | 'contract' | 'remote';\n experienceLevel: 'entry' | 'mid' | 'senior' | 'lead' | 'executive';\n salaryMin: number;\n salaryMax: number;\n status: 'draft' | 'active' | 'paused' | 'closed' | 'filled';\n applicants: number;\n postedDate: string;\n deadline: string;\n description: string;\n requirements: string[];\n benefits: string[];\n}\n\nexport interface Candidate {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n position: string;\n status: 'new' | 'screening' | 'interview' | 'assessment' | 'offer' | 'hired' | 'rejected';\n appliedDate: string;\n resumeUrl?: string;\n rating: number;\n source: string;\n experience: number;\n skills: string[];\n currentCompany: string;\n notes: string;\n /** Date the candidate was hired; ISO string or null until hired. */\n hiredDate?: string | null;\n}\n\nexport interface Interview {\n id: string;\n candidateId: string;\n candidateName: string;\n position: string;\n interviewerName: string;\n date: string;\n time: string;\n type: 'phone' | 'video' | 'onsite' | 'panel' | 'technical';\n status: 'scheduled' | 'completed' | 'cancelled' | 'no_show';\n feedback?: string;\n rating?: number;\n}\n\nexport interface LearningCourse {\n id: string;\n title: string;\n category: string;\n instructor: string;\n duration: string;\n level: 'beginner' | 'intermediate' | 'advanced';\n enrolled: number;\n completed: number;\n rating: number;\n status: 'active' | 'draft' | 'archived';\n thumbnail?: string;\n description: string;\n modules: number;\n skills: string[];\n}\n\nexport interface LearningPath {\n id: string;\n title: string;\n description: string;\n courses: string[];\n duration: string;\n level: string;\n enrolled: number;\n completionRate: number;\n}\n\nexport interface MarketplaceService {\n id: string;\n title: string;\n provider: string;\n category: string;\n price: number;\n priceType: 'hourly' | 'fixed' | 'monthly';\n rating: number;\n reviews: number;\n description: string;\n deliveryTime: string;\n status: 'active' | 'paused' | 'pending';\n skills: string[];\n}\n\nexport interface Announcement {\n id: string;\n title: string;\n content: string;\n author: string;\n authorRole: string;\n category: 'general' | 'hr' | 'it' | 'emergency' | 'event';\n priority: 'low' | 'medium' | 'high' | 'urgent';\n isPinned: boolean;\n createdAt: string;\n viewCount: number;\n tags: string[];\n}\n\nexport interface Team {\n id: string;\n name: string;\n description: string;\n leadId: string;\n leadName: string;\n members: string[];\n memberCount: number;\n department: string;\n status: 'active' | 'forming' | 'disbanded';\n projectCount: number;\n createdAt: string;\n}\n\nexport interface Project {\n id: string;\n name: string;\n description: string;\n status: 'planning' | 'active' | 'on_hold' | 'completed' | 'cancelled';\n priority: 'low' | 'medium' | 'high' | 'critical';\n startDate: string;\n endDate: string;\n progress: number;\n budget: number;\n spent: number;\n teamId: string;\n teamName: string;\n managerId: string;\n managerName: string;\n tasks: number;\n completedTasks: number;\n}\n\nexport interface PayrollRecord {\n id: string;\n employeeId: string;\n employeeName: string;\n department: string;\n period: string;\n grossPay: number;\n deductions: number;\n netPay: number;\n status: 'draft' | 'processing' | 'approved' | 'paid' | 'failed';\n payDate: string;\n paymentMethod: string;\n}\n\nexport interface LeaveRequest {\n id: string;\n employeeId: string;\n employeeName: string;\n department: string;\n type: 'annual' | 'sick' | 'personal' | 'maternity' | 'paternity' | 'unpaid';\n startDate: string;\n endDate: string;\n days: number;\n status: 'pending' | 'approved' | 'rejected' | 'cancelled';\n reason: string;\n approverName?: string;\n}\n\nexport interface TimeEntry {\n id: string;\n employeeId: string;\n employeeName: string;\n date: string;\n clockIn: string;\n clockOut: string;\n totalHours: number;\n overtime: number;\n project: string;\n status: 'pending' | 'approved' | 'rejected';\n /** Whether the logged time is billable to a client (backend default `true`). */\n billable: boolean;\n}\n\nexport interface Notification {\n id: string;\n title: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error';\n category: string;\n read: boolean;\n createdAt: string;\n actionUrl?: string;\n}\n\nexport interface Invoice {\n id: string;\n number: string;\n clientName: string;\n amount: number;\n status: 'draft' | 'sent' | 'paid' | 'overdue' | 'cancelled';\n issueDate: string;\n dueDate: string;\n items: { description: string; amount: number }[];\n}\n\nexport interface Vendor {\n id: string;\n name: string;\n category: string;\n contactPerson: string;\n email: string;\n phone: string;\n status: 'active' | 'inactive' | 'pending';\n contractValue: number;\n rating: number;\n}\n\nexport interface Client {\n id: string;\n name: string;\n industry: string;\n contactPerson: string;\n email: string;\n phone: string;\n status: 'active' | 'prospect' | 'churned';\n revenue: number;\n projects: number;\n since: string;\n}\n\n// BOFF-3987 — employee profile Documents tab. The binary + canonical file\n// metadata live in wspace-files-svc; this is just the (employee, file)\n// association crewfoundry owns.\nexport interface CrewEmployeeDocument {\n id: string;\n employeeId: string;\n fileId: string;\n title: string;\n category?: string | null;\n uploadedBy: string;\n uploadedAt: string;\n}\n\n// BOFF-3983 — requisition-to-hire onboarding tracker (mock cf-30).\nexport type OnboardingStage = 'offer' | 'paperwork' | 'it_setup' | 'training' | 'day_one';\nexport type OnboardingStatus = 'not_started' | 'in_progress' | 'completed' | 'cancelled';\n\nexport interface CrewOnboardingTask {\n id: string;\n onboardingId: string;\n stage: OnboardingStage;\n title: string;\n assigneeActorId?: string | null;\n assigneeName?: string | null;\n dueDate?: string | null;\n completedAt?: string | null;\n sortOrder: number;\n}\n\nexport interface CrewOnboarding {\n id: string;\n candidateId?: string | null;\n employeeId?: string | null;\n fullName: string;\n position: string;\n department?: string | null;\n startDate?: string | null;\n status: OnboardingStatus;\n currentStage: OnboardingStage;\n createdAt: string;\n tasks: CrewOnboardingTask[];\n totalTaskCount: number;\n completedTaskCount: number;\n progressPercent: number;\n}\n\nexport interface ExternalPaymentMethod {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n}\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport type { Gateway } from '@burdenoff/fe-libs/shared/config';\n\ntype InitParams = {\n workspaceId?: string;\n authToken?: string;\n apiGatewayUrl?: string;\n actorId?: string;\n};\n\ntype GraphqlResult<T> = {\n data: T | null;\n errors?: Array<{ message: string }>;\n};\n\nconst BOOTSTRAP_QUERY = `\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n payrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n }\n`;\n\nconst WORKSPACE_BOOTSTRAP_WITH_OVERLAP_QUERY = `\n query CrewfoundryWorkspaceBootstrapWithOverlap(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $groupFirst: Int\n $conversationFirst: Int\n ) {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n payrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n projects(filter: { workspaceId: $workspaceId }, pagination: $projectPagination) {\n items {\n id\n name\n key\n creatorId\n status\n config\n archived\n createdAt\n updatedAt\n }\n }\n groups(first: $groupFirst) {\n edges {\n node {\n id\n name\n description\n groupType\n status\n memberCount\n ownerId\n createdAt\n }\n }\n }\n conversations(first: $conversationFirst) {\n edges {\n node {\n id\n title\n description\n state\n unreadCount\n memberCount\n updatedAt\n }\n }\n }\n }\n`;\n\nconst OVERLAP_BILLING_QUERY = `\n query CrewfoundryOverlapBilling {\n getBillingAccountsByOrg {\n id\n name\n isDefault\n paymentMethods {\n id\n type\n brand\n last4\n isDefault\n expiryMonth\n expiryYear\n }\n }\n }\n`;\n\nconst CREATE_EMPLOYEE_MUTATION = `mutation CreateCrewEmployee($input: CreateCrewEmployeeInput!) { createCrewEmployee(input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }`;\nconst UPDATE_EMPLOYEE_MUTATION = `mutation UpdateCrewEmployee($id: ID!, $input: UpdateCrewEmployeeInput!) { updateCrewEmployee(id: $id, input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }`;\nconst REMOVE_EMPLOYEE_MUTATION = `mutation RemoveCrewEmployee($id: ID!) { removeCrewEmployee(id: $id) }`;\nconst CREATE_JOB_MUTATION = `mutation CreateCrewJobPosting($input: CreateCrewJobPostingInput!) { createCrewJobPosting(input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }`;\nconst UPDATE_JOB_MUTATION = `mutation UpdateCrewJobPosting($id: ID!, $input: UpdateCrewJobPostingInput!) { updateCrewJobPosting(id: $id, input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }`;\nconst CREATE_CANDIDATE_MUTATION = `mutation CreateCrewCandidate($input: CreateCrewCandidateInput!) { createCrewCandidate(input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }`;\nconst UPDATE_CANDIDATE_MUTATION = `mutation UpdateCrewCandidate($id: ID!, $input: UpdateCrewCandidateInput!) { updateCrewCandidate(id: $id, input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }`;\nconst CREATE_ANNOUNCEMENT_MUTATION = `mutation CreateCrewAnnouncement($input: CreateCrewAnnouncementInput!) { createCrewAnnouncement(input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }`;\nconst CREATE_LEAVE_MUTATION = `mutation CreateCrewLeaveRequest($input: CreateCrewLeaveRequestInput!) { createCrewLeaveRequest(input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }`;\nconst UPDATE_LEAVE_MUTATION = `mutation UpdateCrewLeaveRequest($id: ID!, $input: UpdateCrewLeaveRequestInput!) { updateCrewLeaveRequest(id: $id, input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }`;\n// Extra removes / updates for existing entities (delete + edit buttons).\nconst REMOVE_JOB_MUTATION = `mutation RemoveCrewJobPosting($id: ID!) { removeCrewJobPosting(id: $id) }`;\nconst REMOVE_CANDIDATE_MUTATION = `mutation RemoveCrewCandidate($id: ID!) { removeCrewCandidate(id: $id) }`;\nconst UPDATE_ANNOUNCEMENT_MUTATION = `mutation UpdateCrewAnnouncement($id: ID!, $input: UpdateCrewAnnouncementInput!) { updateCrewAnnouncement(id: $id, input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }`;\nconst REMOVE_ANNOUNCEMENT_MUTATION = `mutation RemoveCrewAnnouncement($id: ID!) { removeCrewAnnouncement(id: $id) }`;\n\n// Interview\nconst CREATE_INTERVIEW_MUTATION = `mutation CreateCrewInterview($input: CreateCrewInterviewInput!) { createCrewInterview(input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }`;\nconst UPDATE_INTERVIEW_MUTATION = `mutation UpdateCrewInterview($id: ID!, $input: UpdateCrewInterviewInput!) { updateCrewInterview(id: $id, input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }`;\nconst REMOVE_INTERVIEW_MUTATION = `mutation RemoveCrewInterview($id: ID!) { removeCrewInterview(id: $id) }`;\n\n// Vendor\nconst CREATE_VENDOR_MUTATION = `mutation CreateCrewVendor($input: CreateCrewVendorInput!) { createCrewVendor(input: $input) { id name category contactPerson email phone status contractValue rating } }`;\nconst UPDATE_VENDOR_MUTATION = `mutation UpdateCrewVendor($id: ID!, $input: UpdateCrewVendorInput!) { updateCrewVendor(id: $id, input: $input) { id name category contactPerson email phone status contractValue rating } }`;\nconst REMOVE_VENDOR_MUTATION = `mutation RemoveCrewVendor($id: ID!) { removeCrewVendor(id: $id) }`;\n\n// Client\nconst CREATE_CLIENT_MUTATION = `mutation CreateCrewClient($input: CreateCrewClientInput!) { createCrewClient(input: $input) { id name industry contactPerson email phone status revenue projects since } }`;\nconst UPDATE_CLIENT_MUTATION = `mutation UpdateCrewClient($id: ID!, $input: UpdateCrewClientInput!) { updateCrewClient(id: $id, input: $input) { id name industry contactPerson email phone status revenue projects since } }`;\nconst REMOVE_CLIENT_MUTATION = `mutation RemoveCrewClient($id: ID!) { removeCrewClient(id: $id) }`;\n\n// Team\nconst CREATE_TEAM_MUTATION = `mutation CreateCrewTeam($input: CreateCrewTeamInput!) { createCrewTeam(input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }`;\nconst UPDATE_TEAM_MUTATION = `mutation UpdateCrewTeam($id: ID!, $input: UpdateCrewTeamInput!) { updateCrewTeam(id: $id, input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }`;\nconst REMOVE_TEAM_MUTATION = `mutation RemoveCrewTeam($id: ID!) { removeCrewTeam(id: $id) }`;\n\n// Project\nconst CREATE_PROJECT_MUTATION = `mutation CreateCrewProject($input: CreateCrewProjectInput!) { createCrewProject(input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }`;\nconst UPDATE_PROJECT_MUTATION = `mutation UpdateCrewProject($id: ID!, $input: UpdateCrewProjectInput!) { updateCrewProject(id: $id, input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }`;\nconst REMOVE_PROJECT_MUTATION = `mutation RemoveCrewProject($id: ID!) { removeCrewProject(id: $id) }`;\n\n// Department\nconst CREATE_DEPARTMENT_MUTATION = `mutation CreateCrewDepartment($input: CreateCrewDepartmentInput!) { createCrewDepartment(input: $input) { id name headId headName employeeCount budget location status } }`;\nconst UPDATE_DEPARTMENT_MUTATION = `mutation UpdateCrewDepartment($id: ID!, $input: UpdateCrewDepartmentInput!) { updateCrewDepartment(id: $id, input: $input) { id name headId headName employeeCount budget location status } }`;\nconst REMOVE_DEPARTMENT_MUTATION = `mutation RemoveCrewDepartment($id: ID!) { removeCrewDepartment(id: $id) }`;\n\n// PayrollRecord\nconst CREATE_PAYROLL_MUTATION = `mutation CreateCrewPayrollRecord($input: CreateCrewPayrollRecordInput!) { createCrewPayrollRecord(input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }`;\nconst UPDATE_PAYROLL_MUTATION = `mutation UpdateCrewPayrollRecord($id: ID!, $input: UpdateCrewPayrollRecordInput!) { updateCrewPayrollRecord(id: $id, input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }`;\nconst REMOVE_PAYROLL_MUTATION = `mutation RemoveCrewPayrollRecord($id: ID!) { removeCrewPayrollRecord(id: $id) }`;\n\n// TimeEntry\nconst CREATE_TIME_ENTRY_MUTATION = `mutation CreateCrewTimeEntry($input: CreateCrewTimeEntryInput!) { createCrewTimeEntry(input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }`;\nconst UPDATE_TIME_ENTRY_MUTATION = `mutation UpdateCrewTimeEntry($id: ID!, $input: UpdateCrewTimeEntryInput!) { updateCrewTimeEntry(id: $id, input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }`;\nconst REMOVE_TIME_ENTRY_MUTATION = `mutation RemoveCrewTimeEntry($id: ID!) { removeCrewTimeEntry(id: $id) }`;\n\n// BOFF-3987 — employee documents\nconst EMPLOYEE_DOCUMENTS_QUERY = `query EmployeeDocuments($employeeId: ID!) { employeeDocuments(employeeId: $employeeId) { id employeeId fileId title category uploadedBy uploadedAt } }`;\nconst ATTACH_EMPLOYEE_DOCUMENT_MUTATION = `mutation AttachEmployeeDocument($input: AttachCrewEmployeeDocumentInput!) { attachEmployeeDocument(input: $input) { id employeeId fileId title category uploadedBy uploadedAt } }`;\nconst DETACH_EMPLOYEE_DOCUMENT_MUTATION = `mutation DetachEmployeeDocument($id: ID!) { detachEmployeeDocument(id: $id) }`;\n// Files-svc presigned upload dance (same 3-step protocol fe-libs' SaveToFilesButton\n// uses — see ~/products/dev/platform/context/files/), replicated here with the\n// store's own graphqlFetch helper instead of Apollo since this MFE has no Apollo\n// client wired in.\nconst ENSURE_FOLDER_BY_PATH_MUTATION = `mutation EnsureFolderByPath($path: String!) { ensureFolderByPath(path: $path) { id } }`;\nconst INITIATE_UPLOAD_MUTATION = `mutation InitiateUpload($input: InitiateUploadInput!) { initiateUpload(input: $input) { session { id } uploadUrl } }`;\nconst COMPLETE_UPLOAD_MUTATION = `mutation CompleteUpload($input: CompleteUploadInput!) { completeUpload(input: $input) { file { id } } }`;\n\n// BOFF-3983 — onboarding\nconst ONBOARDINGS_QUERY = `query CrewOnboardings { crewOnboardings { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst CREATE_ONBOARDING_MUTATION = `mutation CreateCrewOnboarding($input: CreateCrewOnboardingInput!) { createCrewOnboarding(input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst UPDATE_ONBOARDING_MUTATION = `mutation UpdateCrewOnboarding($id: ID!, $input: UpdateCrewOnboardingInput!) { updateCrewOnboarding(id: $id, input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst REMOVE_ONBOARDING_MUTATION = `mutation RemoveCrewOnboarding($id: ID!) { removeCrewOnboarding(id: $id) }`;\nconst CREATE_ONBOARDING_TASK_MUTATION = `mutation CreateCrewOnboardingTask($input: CreateCrewOnboardingTaskInput!) { createCrewOnboardingTask(input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\nconst UPDATE_ONBOARDING_TASK_MUTATION = `mutation UpdateCrewOnboardingTask($id: ID!, $input: UpdateCrewOnboardingTaskInput!) { updateCrewOnboardingTask(id: $id, input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\nconst REMOVE_ONBOARDING_TASK_MUTATION = `mutation RemoveCrewOnboardingTask($id: ID!) { removeCrewOnboardingTask(id: $id) }`;\nconst TOGGLE_ONBOARDING_TASK_MUTATION = `mutation ToggleCrewOnboardingTask($id: ID!, $completed: Boolean!) { toggleCrewOnboardingTask(id: $id, completed: $completed) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\n\nconst normalizeStatus = (value: string) => value.toUpperCase().replaceAll('-', '_');\n\nconst sharedOwnerError = (capability: string) =>\n new Error(`${capability} isn't available in CrewFoundry.`);\n\n// The backend returns enum values in UPPER_SNAKE case (e.g. \"ACTIVE\", \"FULL_TIME\", \"HIGH\"),\n// but the frontend model + every comparison/filter/badge uses lower_snake ('active', 'full_time').\n// Normalization is per-entity, NOT per-key: fields like `category`/`level` are genuine enums on\n// some entities (Announcement.category, Course.level) yet free text on others (Course.category =\n// \"Programming\", Vendor.category, LearningPath.level) — a global key list would corrupt those.\n// Each list below mirrors exactly the string-literal-union fields declared on that entity's interface.\nconst ENUM_KEYS = {\n employee: ['status', 'type'],\n department: ['status'],\n jobPosting: ['type', 'experienceLevel', 'status'],\n candidate: ['status'],\n interview: ['type', 'status'],\n course: ['level', 'status'],\n marketplaceService: ['priceType', 'status'],\n announcement: ['category', 'priority'],\n team: ['status'],\n project: ['status', 'priority'],\n payrollRecord: ['status'],\n leaveRequest: ['type', 'status'],\n timeEntry: ['status'],\n notification: ['type'],\n paymentMethod: ['type', 'status'],\n invoice: ['status'],\n vendor: ['status'],\n client: ['status'],\n onboarding: ['status', 'currentStage'],\n onboardingTask: ['stage'],\n} as const;\n\n// Lowercase only the given enum keys on an entity read back from the backend; leave every other\n// (free-text) field untouched. Idempotent — safe on already-lowercase values (some subgraphs\n// return lowercase already). This is the read-path inverse of `normalizeStatus`.\nconst lowerEnumKeys = <T>(entity: T, keys: readonly string[]): T => {\n if (!entity || typeof entity !== 'object') return entity;\n const out = { ...(entity as Record<string, unknown>) };\n for (const key of keys) {\n const value = out[key];\n if (typeof value === 'string') out[key] = value.toLowerCase();\n }\n return out as T;\n};\n\n// lowerEnumKeys only lowercases top-level string fields; CrewOnboarding nests\n// a `tasks` array whose own `stage` field also needs the same treatment, so\n// this composes lowerEnumKeys over both levels rather than duplicating it.\nconst lowerOnboarding = (onboarding: CrewOnboarding): CrewOnboarding => {\n const lowered = lowerEnumKeys(onboarding, ENUM_KEYS.onboarding);\n return {\n ...lowered,\n tasks: (onboarding.tasks ?? []).map((task) => lowerEnumKeys(task, ENUM_KEYS.onboardingTask)),\n };\n};\n\nconst toDateOnly = (value?: string | null) => (value ? value.slice(0, 10) : 'TBD');\n\nconst asRecord = (value: unknown): Record<string, unknown> | null => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n};\n\nconst asNumber = (value: unknown): number | null => (typeof value === 'number' ? value : null);\n\nconst asString = (value: unknown): string | null => (typeof value === 'string' ? value : null);\n\nconst mapProjectStatus = (value: string): Project['status'] => {\n const status = value.toLowerCase();\n if (status === 'active') return 'active';\n if (status === 'completed') return 'completed';\n if (status === 'cancelled') return 'cancelled';\n if (status === 'archived') return 'on_hold';\n return 'planning';\n};\n\nconst mapGroupStatus = (value: string): Team['status'] => {\n const status = value.toLowerCase();\n if (status === 'active') return 'active';\n if (status === 'inactive' || status === 'archived' || status === 'deleted') return 'disbanded';\n return 'forming';\n};\n\ntype OverlapWorkspaceResponse = {\n projects: {\n items: Array<{\n id: string;\n name: string;\n key: string;\n creatorId: string;\n status: string;\n config?: unknown;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n }>;\n };\n groups: {\n edges: Array<{\n node: {\n id: string;\n name: string;\n description?: string | null;\n groupType?: string | null;\n status: string;\n memberCount: number;\n ownerId: string;\n createdAt: string;\n };\n }>;\n };\n conversations: {\n edges: Array<{\n node: {\n id: string;\n title?: string | null;\n description?: string | null;\n state: string;\n unreadCount: number;\n memberCount: number;\n updatedAt: string;\n };\n }>;\n };\n};\n\ntype WorkspaceBootstrapWithOverlapResponse = BootstrapPayload & OverlapWorkspaceResponse;\n\ntype OverlapBillingResponse = {\n getBillingAccountsByOrg: Array<{\n id?: string | null;\n name?: string | null;\n isDefault?: boolean | null;\n paymentMethods?: Array<{\n id: string;\n type: string;\n brand?: string | null;\n last4?: string | null;\n isDefault: boolean;\n expiryMonth?: number | null;\n expiryYear?: number | null;\n } | null> | null;\n }>;\n};\n\ntype BootstrapPayload = {\n crewfoundryBootstrap: {\n employees: Employee[];\n departments: Department[];\n jobPostings: JobPosting[];\n candidates: Candidate[];\n interviews: Interview[];\n announcements: Announcement[];\n teams: Team[];\n projects: Project[];\n payrollRecords: PayrollRecord[];\n leaveRequests: LeaveRequest[];\n timeEntries: TimeEntry[];\n vendors: Vendor[];\n clients: Client[];\n };\n};\n\nconst mapOverlapProjects = (\n projects: OverlapWorkspaceResponse['projects']['items'],\n teams: Team[]\n) =>\n projects.map((project, index): Project => {\n const config = asRecord(project.config);\n const budget = asNumber(config?.budget) ?? 25000 + index * 2500;\n const spent =\n asNumber(config?.spent) ?? Math.round(budget * (project.status === 'COMPLETED' ? 1 : 0.62));\n const progress = asNumber(config?.progress) ?? (project.status === 'COMPLETED' ? 100 : 58);\n const tasks = asNumber(config?.tasks) ?? 20 + (index % 9);\n const completedTasks = asNumber(config?.completedTasks) ?? Math.round((progress / 100) * tasks);\n const team = teams[index % Math.max(teams.length, 1)];\n\n return {\n id: project.id,\n name: project.name,\n description: asString(config?.description) || `${project.key} delivery plan`,\n status: mapProjectStatus(project.status),\n priority: (asString(config?.priority)?.toLowerCase() as Project['priority']) || 'medium',\n startDate: toDateOnly(project.createdAt),\n endDate: toDateOnly(project.updatedAt),\n progress,\n budget,\n spent,\n teamId: team?.id || 'unassigned',\n teamName: team?.name || 'Unassigned Team',\n managerId: project.creatorId,\n managerName: `Lead ${project.creatorId.slice(0, 8)}`,\n tasks,\n completedTasks,\n };\n });\n\nconst mapOverlapTeams = (groups: OverlapWorkspaceResponse['groups']['edges']): Team[] =>\n groups.map(({ node }) => ({\n id: node.id,\n name: node.name,\n description: node.description || `${node.name} team workspace`,\n leadId: node.ownerId,\n leadName: `Lead ${node.ownerId.slice(0, 8)}`,\n members: [],\n memberCount: node.memberCount,\n department: node.groupType?.toLowerCase().replaceAll('_', ' ') || 'operations',\n status: mapGroupStatus(node.status),\n projectCount: 0,\n createdAt: toDateOnly(node.createdAt),\n }));\n\nconst mapConversationNotifications = (\n conversations: OverlapWorkspaceResponse['conversations']['edges']\n): Notification[] =>\n conversations\n .filter(({ node }) => node.unreadCount > 0)\n .map(({ node }) => ({\n id: `conversation-${node.id}`,\n title: node.title || 'Conversation update',\n message: `${node.unreadCount} unread in ${node.memberCount}-member channel`,\n type: node.state.toLowerCase() === 'active' ? 'info' : 'warning',\n category: 'communications',\n read: false,\n createdAt: node.updatedAt,\n actionUrl: `/crewfoundry/communications/messages-page`,\n }));\n\nconst mapBillingMethods = (data: OverlapBillingResponse): ExternalPaymentMethod[] => {\n const account =\n data.getBillingAccountsByOrg.find((item) => item?.isDefault && item?.id) ||\n data.getBillingAccountsByOrg.find((item) => item?.id);\n\n if (!account?.id) {\n return [];\n }\n\n return (account.paymentMethods || [])\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n .map((method) => {\n const month = method.expiryMonth ? String(method.expiryMonth).padStart(2, '0') : undefined;\n const year = method.expiryYear ? String(method.expiryYear) : undefined;\n const isBank = method.type === 'BANK_TRANSFER' || method.type === 'NETBANKING';\n\n return {\n id: method.id,\n type: isBank ? 'bank' : 'card',\n name: `${account.name || 'Billing'} ${isBank ? 'Bank Account' : 'Card'}`,\n bank: method.brand || account.name || 'Billing Account',\n last4: method.last4 || '0000',\n status: method.isDefault ? 'primary' : 'active',\n expiry: month && year ? `${month}/${year}` : undefined,\n };\n });\n};\n\nconst parseGraphql = <T>(result: GraphqlResult<T>, fallbackMessage: string): T => {\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message || fallbackMessage);\n }\n if (!result.data) {\n throw new Error(fallbackMessage);\n }\n return result.data;\n};\n\n// Fields that live on the client-side entity objects but are NEVER accepted by\n// any Crew* Create/Update GraphQL input — either a client-generated temp `id`,\n// a server-set timestamp, or a server-derived rollup counter. Sending them makes\n// the gateway reject the whole operation with a GraphQL validation error (which\n// the public gateway masks to a generic INTERNAL_SERVER_ERROR), so no row is\n// ever written. Stripping them centrally keeps every create/update mutation valid\n// without each caller having to hand-pick input fields. (Counters like rating /\n// applicants / viewCount that a few inputs DO accept are safe to drop too — they\n// default server-side, and the UI never lets a user set a derived rollup.)\nconst MUTATION_INPUT_OMIT_KEYS = new Set<string>([\n 'id',\n 'createdAt',\n 'createdOn',\n 'updatedAt',\n 'deletedAt',\n 'employeeCount',\n 'memberCount',\n 'projectCount',\n 'enrolled',\n 'completed',\n 'completionRate',\n 'reviews',\n 'rating',\n 'tasks',\n 'completedTasks',\n 'spent',\n 'progress',\n 'applicants',\n 'viewCount',\n 'revenue',\n 'projects',\n]);\n\nconst sanitizeMutationInput = (\n variables: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined => {\n if (!variables) {\n return variables;\n }\n const input = variables.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return variables;\n }\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (!MUTATION_INPUT_OMIT_KEYS.has(key)) {\n cleaned[key] = value;\n }\n }\n return { ...variables, input: cleaned };\n};\n\nconst runGraphql = async <T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n params: InitParams,\n fallbackMessage: string,\n gateway: Gateway = 'workspace'\n) => {\n const result = await graphqlFetch<T>({\n gateway,\n query,\n variables: sanitizeMutationInput(variables),\n authToken: params.authToken,\n // `apiGatewayUrl` is the workspace gateway base (dev override only). The\n // global gateway (e.g. billing overlap) resolves its own URL from fe-libs\n // config, so never force the workspace base onto a global-gateway call.\n baseUrl: gateway === 'workspace' ? params.apiGatewayUrl : undefined,\n extraHeaders: {\n ...(gateway === 'workspace' && params.workspaceId\n ? { 'x-workspace-id': params.workspaceId }\n : {}),\n },\n });\n return parseGraphql(result as GraphqlResult<T>, fallbackMessage);\n};\n\n// Overlap queries are best-effort: they enrich the crew bootstrap with real\n// wspace/global platform data but must never block the page if a field is\n// unavailable in a given environment. Swallow to null, but surface the reason\n// in dev so schema-arg drift (the historical failure mode) is visible.\n// Vite injects `import.meta.env.DEV`, but this package's tsconfig does not pull\n// in `vite/client` ambient types — narrow through a typed shape instead of `any`.\nconst isDevEnv = (): boolean => Boolean((import.meta as { env?: { DEV?: boolean } }).env?.DEV);\n\nconst runOverlap = async <T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n params: InitParams,\n fallbackMessage: string,\n gateway: Gateway = 'workspace'\n): Promise<T | null> => {\n try {\n return await runGraphql<T>(query, variables, params, fallbackMessage, gateway);\n } catch (error) {\n if (isDevEnv()) {\n console.warn(`[crewfoundry] overlap query skipped: ${fallbackMessage}`, error);\n }\n return null;\n }\n};\n\n// ── Store Interface ─────────────────────────────────────────────\ninterface CrewFoundryState {\n // Overview\n metrics: OverviewMetric[];\n workItems: WorkItem[];\n selectedView: string;\n\n // Domain data\n employees: Employee[];\n departments: Department[];\n jobPostings: JobPosting[];\n candidates: Candidate[];\n interviews: Interview[];\n courses: LearningCourse[];\n learningPaths: LearningPath[];\n marketplaceServices: MarketplaceService[];\n announcements: Announcement[];\n teams: Team[];\n projects: Project[];\n payrollRecords: PayrollRecord[];\n leaveRequests: LeaveRequest[];\n timeEntries: TimeEntry[];\n notifications: Notification[];\n paymentMethods: ExternalPaymentMethod[];\n invoices: Invoice[];\n vendors: Vendor[];\n clients: Client[];\n employeeDocuments: CrewEmployeeDocument[];\n onboardings: CrewOnboarding[];\n onboardingsLoaded: boolean;\n\n // Actions\n initialized: boolean;\n loading: boolean;\n error: string | null;\n initParams: InitParams;\n initializeData: (params: InitParams) => Promise<void>;\n setSelectedView: (view: string) => void;\n setWorkItems: (items: WorkItem[]) => void;\n addEmployee: (employee: Employee) => Promise<void>;\n updateEmployee: (id: string, updates: Partial<Employee>) => Promise<void>;\n removeEmployee: (id: string) => Promise<void>;\n addJobPosting: (job: JobPosting) => Promise<void>;\n updateJobPosting: (id: string, updates: Partial<JobPosting>) => Promise<void>;\n addCandidate: (candidate: Candidate) => Promise<void>;\n updateCandidate: (id: string, updates: Partial<Candidate>) => Promise<void>;\n removeJobPosting: (id: string) => Promise<void>;\n removeCandidate: (id: string) => Promise<void>;\n addAnnouncement: (announcement: Announcement) => Promise<void>;\n updateAnnouncement: (id: string, updates: Partial<Announcement>) => Promise<void>;\n removeAnnouncement: (id: string) => Promise<void>;\n addLeaveRequest: (request: LeaveRequest) => Promise<void>;\n updateLeaveRequest: (id: string, updates: Partial<LeaveRequest>) => Promise<void>;\n addInterview: (interview: Interview) => Promise<void>;\n updateInterview: (id: string, updates: Partial<Interview>) => Promise<void>;\n removeInterview: (id: string) => Promise<void>;\n addInvoice: (invoice: Invoice) => Promise<void>;\n updateInvoice: (id: string, updates: Partial<Invoice>) => Promise<void>;\n removeInvoice: (id: string) => Promise<void>;\n addVendor: (vendor: Vendor) => Promise<void>;\n updateVendor: (id: string, updates: Partial<Vendor>) => Promise<void>;\n removeVendor: (id: string) => Promise<void>;\n addClient: (client: Client) => Promise<void>;\n updateClient: (id: string, updates: Partial<Client>) => Promise<void>;\n removeClient: (id: string) => Promise<void>;\n addTeam: (team: Team) => Promise<void>;\n updateTeam: (id: string, updates: Partial<Team>) => Promise<void>;\n removeTeam: (id: string) => Promise<void>;\n addProject: (project: Project) => Promise<void>;\n updateProject: (id: string, updates: Partial<Project>) => Promise<void>;\n removeProject: (id: string) => Promise<void>;\n addMarketplaceService: (service: MarketplaceService) => Promise<void>;\n updateMarketplaceService: (id: string, updates: Partial<MarketplaceService>) => Promise<void>;\n removeMarketplaceService: (id: string) => Promise<void>;\n addDepartment: (department: Department) => Promise<void>;\n updateDepartment: (id: string, updates: Partial<Department>) => Promise<void>;\n removeDepartment: (id: string) => Promise<void>;\n addCourse: (course: LearningCourse) => Promise<void>;\n updateCourse: (id: string, updates: Partial<LearningCourse>) => Promise<void>;\n removeCourse: (id: string) => Promise<void>;\n enrollCourse: (id: string) => Promise<void>;\n addLearningPath: (path: LearningPath) => Promise<void>;\n updateLearningPath: (id: string, updates: Partial<LearningPath>) => Promise<void>;\n removeLearningPath: (id: string) => Promise<void>;\n addPayrollRecord: (record: PayrollRecord) => Promise<void>;\n updatePayrollRecord: (id: string, updates: Partial<PayrollRecord>) => Promise<void>;\n removePayrollRecord: (id: string) => Promise<void>;\n addTimeEntry: (entry: TimeEntry) => Promise<void>;\n updateTimeEntry: (id: string, updates: Partial<TimeEntry>) => Promise<void>;\n removeTimeEntry: (id: string) => Promise<void>;\n markNotificationRead: (id: string) => Promise<void>;\n markAllNotificationsRead: () => Promise<void>;\n\n // BOFF-3987 — employee documents\n fetchEmployeeDocuments: (employeeId: string) => Promise<void>;\n uploadEmployeeDocument: (params: {\n employeeId: string;\n file: File;\n title: string;\n category?: string;\n }) => Promise<void>;\n detachEmployeeDocument: (id: string) => Promise<void>;\n\n // BOFF-3983 — onboarding\n fetchOnboardings: () => Promise<void>;\n createOnboarding: (input: {\n candidateId?: string;\n employeeId?: string;\n fullName: string;\n position: string;\n department?: string;\n startDate?: string;\n }) => Promise<void>;\n updateOnboarding: (id: string, updates: Partial<CrewOnboarding>) => Promise<void>;\n removeOnboarding: (id: string) => Promise<void>;\n createOnboardingTask: (input: {\n onboardingId: string;\n stage: OnboardingStage;\n title: string;\n assigneeActorId?: string;\n assigneeName?: string;\n dueDate?: string;\n sortOrder?: number;\n }) => Promise<void>;\n updateOnboardingTask: (id: string, updates: Partial<CrewOnboardingTask>) => Promise<void>;\n removeOnboardingTask: (id: string) => Promise<void>;\n toggleOnboardingTask: (id: string, completed: boolean) => Promise<void>;\n}\n\nexport const useCrewFoundryStore = create<CrewFoundryState>((set) => ({\n // Overview\n metrics: [\n { label: 'Total Employees', value: '247', trend: '+5.2%' },\n { label: 'Open Positions', value: '24', trend: '+3 this week' },\n { label: 'Hiring Pipeline', value: '347', trend: '+52 applications' },\n { label: 'Employee Satisfaction', value: '4.6/5', trend: '+0.2' },\n ],\n workItems: [\n {\n id: 'w1',\n title: 'Q1 Performance Review Cycle',\n status: 'active',\n owner: 'HR',\n updatedAt: '2h ago',\n },\n {\n id: 'w2',\n title: 'New Health Benefits Enrollment',\n status: 'active',\n owner: 'Benefits',\n updatedAt: '5h ago',\n },\n {\n id: 'w3',\n title: 'Engineering Headcount Planning',\n status: 'at_risk',\n owner: 'Recruiting',\n updatedAt: '1d ago',\n },\n {\n id: 'w4',\n title: 'Employee Onboarding Automation',\n status: 'completed',\n owner: 'HR Ops',\n updatedAt: '2d ago',\n },\n ],\n selectedView: 'overview',\n initialized: false,\n loading: false,\n error: null,\n initParams: {},\n\n // Domain data\n employees: [],\n departments: [],\n jobPostings: [],\n candidates: [],\n interviews: [],\n courses: [],\n learningPaths: [],\n marketplaceServices: [],\n announcements: [],\n teams: [],\n projects: [],\n payrollRecords: [],\n leaveRequests: [],\n timeEntries: [],\n notifications: [],\n paymentMethods: [],\n invoices: [],\n vendors: [],\n clients: [],\n employeeDocuments: [],\n onboardings: [],\n onboardingsLoaded: false,\n\n // Actions\n initializeData: async (params) => {\n if (!params.workspaceId) {\n return;\n }\n set({ loading: true, error: null, initParams: params });\n try {\n const [workspaceWithOverlapData, billingOverlap] = await Promise.all([\n runOverlap<WorkspaceBootstrapWithOverlapResponse>(\n WORKSPACE_BOOTSTRAP_WITH_OVERLAP_QUERY,\n {\n workspaceId: params.workspaceId,\n projectPagination: { limit: 50, offset: 0 },\n groupFirst: 30,\n conversationFirst: 30,\n },\n params,\n 'Unable to load workspace bootstrap with overlap data'\n ),\n // getBillingAccountsByOrg lives on the GLOBAL supergraph, not wspace —\n // route it to the global gateway (org context comes from the x-org-id\n // header the gateway auto-attaches for global-gateway calls).\n runOverlap<OverlapBillingResponse>(\n OVERLAP_BILLING_QUERY,\n undefined,\n params,\n 'Unable to load overlap billing data',\n 'global'\n ),\n ]);\n\n const bootstrap = workspaceWithOverlapData\n ? workspaceWithOverlapData.crewfoundryBootstrap\n : (\n await runGraphql<BootstrapPayload>(\n BOOTSTRAP_QUERY,\n undefined,\n params,\n 'Unable to load CrewFoundry data'\n )\n ).crewfoundryBootstrap;\n\n const overlapTeams = workspaceWithOverlapData\n ? mapOverlapTeams(workspaceWithOverlapData.groups.edges)\n : [];\n const overlapProjects = workspaceWithOverlapData\n ? mapOverlapProjects(workspaceWithOverlapData.projects.items, overlapTeams)\n : [];\n const overlapNotifications = workspaceWithOverlapData\n ? mapConversationNotifications(workspaceWithOverlapData.conversations.edges)\n : [];\n\n const teams = overlapTeams.length > 0 ? overlapTeams : bootstrap.teams;\n const projects = overlapProjects.length > 0 ? overlapProjects : bootstrap.projects;\n const notifications = overlapNotifications;\n const paymentMethods = billingOverlap ? mapBillingMethods(billingOverlap) : [];\n\n // Normalize enum casing (UPPER_SNAKE from the backend -> lower_snake) once, per entity, so\n // every downstream count/filter/badge and the metrics below all operate on the same casing.\n const nEmployees = bootstrap.employees.map((e) => lowerEnumKeys(e, ENUM_KEYS.employee));\n const nDepartments = bootstrap.departments.map((d) => lowerEnumKeys(d, ENUM_KEYS.department));\n const nJobPostings = bootstrap.jobPostings.map((j) => lowerEnumKeys(j, ENUM_KEYS.jobPosting));\n const nCandidates = bootstrap.candidates.map((c) => lowerEnumKeys(c, ENUM_KEYS.candidate));\n const nInterviews = bootstrap.interviews.map((i) => lowerEnumKeys(i, ENUM_KEYS.interview));\n const nCourses: LearningCourse[] = [];\n const nMarketplaceServices: MarketplaceService[] = [];\n const nAnnouncements = bootstrap.announcements.map((a) =>\n lowerEnumKeys(a, ENUM_KEYS.announcement)\n );\n const nTeams = teams.map((t) => lowerEnumKeys(t, ENUM_KEYS.team));\n const nProjects = projects.map((p) => lowerEnumKeys(p, ENUM_KEYS.project));\n const nPayrollRecords = bootstrap.payrollRecords.map((r) =>\n lowerEnumKeys(r, ENUM_KEYS.payrollRecord)\n );\n const nLeaveRequests = bootstrap.leaveRequests.map((r) =>\n lowerEnumKeys(r, ENUM_KEYS.leaveRequest)\n );\n const nTimeEntries = bootstrap.timeEntries.map((t) => lowerEnumKeys(t, ENUM_KEYS.timeEntry));\n const nNotifications = notifications.map((n) => lowerEnumKeys(n, ENUM_KEYS.notification));\n const nPaymentMethods = paymentMethods.map((m) => lowerEnumKeys(m, ENUM_KEYS.paymentMethod));\n const nInvoices: Invoice[] = [];\n const nVendors = bootstrap.vendors.map((v) => lowerEnumKeys(v, ENUM_KEYS.vendor));\n const nClients = bootstrap.clients.map((c) => lowerEnumKeys(c, ENUM_KEYS.client));\n\n set({\n employees: nEmployees,\n departments: nDepartments,\n jobPostings: nJobPostings,\n candidates: nCandidates,\n interviews: nInterviews,\n courses: nCourses,\n learningPaths: [],\n marketplaceServices: nMarketplaceServices,\n announcements: nAnnouncements,\n teams: nTeams,\n projects: nProjects,\n payrollRecords: nPayrollRecords,\n leaveRequests: nLeaveRequests,\n timeEntries: nTimeEntries,\n notifications: nNotifications,\n paymentMethods: nPaymentMethods,\n invoices: nInvoices,\n vendors: nVendors,\n clients: nClients,\n metrics: [\n { label: 'Total Employees', value: String(nEmployees.length), trend: 'Live' },\n {\n label: 'Open Positions',\n value: String(nJobPostings.filter((j) => j.status === 'active').length),\n trend: 'Live',\n },\n { label: 'Hiring Pipeline', value: String(nCandidates.length), trend: 'Live' },\n {\n label: 'Cross-Team Projects',\n value: String(nProjects.filter((project) => project.status === 'active').length),\n trend: 'Live',\n },\n ],\n initialized: true,\n loading: false,\n });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Unable to load CrewFoundry data',\n loading: false,\n });\n }\n },\n setSelectedView: (view) => set({ selectedView: view }),\n setWorkItems: (items) => set({ workItems: items }),\n addEmployee: async (employee) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewEmployee: Employee }>(\n CREATE_EMPLOYEE_MUTATION,\n {\n input: {\n ...employee,\n status: normalizeStatus(employee.status),\n type: normalizeStatus(employee.type),\n },\n },\n params,\n 'Unable to create employee'\n );\n set((state) => ({\n employees: [lowerEnumKeys(data.createCrewEmployee, ENUM_KEYS.employee), ...state.employees],\n }));\n },\n updateEmployee: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const payload = {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n };\n const data = await runGraphql<{ updateCrewEmployee: Employee }>(\n UPDATE_EMPLOYEE_MUTATION,\n { id, input: payload },\n params,\n 'Unable to update employee'\n );\n set((state) => ({\n employees: state.employees.map((e) =>\n e.id === id ? lowerEnumKeys(data.updateCrewEmployee, ENUM_KEYS.employee) : e\n ),\n }));\n },\n removeEmployee: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewEmployee: boolean }>(\n REMOVE_EMPLOYEE_MUTATION,\n { id },\n params,\n 'Unable to remove employee'\n );\n set((state) => ({ employees: state.employees.filter((e) => e.id !== id) }));\n },\n addJobPosting: async (job) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewJobPosting: JobPosting }>(\n CREATE_JOB_MUTATION,\n {\n input: {\n ...job,\n status: normalizeStatus(job.status),\n },\n },\n params,\n 'Unable to create job posting'\n );\n set((state) => ({\n jobPostings: [\n lowerEnumKeys(data.createCrewJobPosting, ENUM_KEYS.jobPosting),\n ...state.jobPostings,\n ],\n }));\n },\n updateJobPosting: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewJobPosting: JobPosting }>(\n UPDATE_JOB_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update job posting'\n );\n set((state) => ({\n jobPostings: state.jobPostings.map((j) =>\n j.id === id ? lowerEnumKeys(data.updateCrewJobPosting, ENUM_KEYS.jobPosting) : j\n ),\n }));\n },\n addCandidate: async (candidate) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewCandidate: Candidate }>(\n CREATE_CANDIDATE_MUTATION,\n { input: { ...candidate, status: normalizeStatus(candidate.status) } },\n params,\n 'Unable to create candidate'\n );\n set((state) => ({\n candidates: [\n lowerEnumKeys(data.createCrewCandidate, ENUM_KEYS.candidate),\n ...state.candidates,\n ],\n }));\n },\n updateCandidate: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewCandidate: Candidate }>(\n UPDATE_CANDIDATE_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update candidate'\n );\n set((state) => ({\n candidates: state.candidates.map((c) =>\n c.id === id ? lowerEnumKeys(data.updateCrewCandidate, ENUM_KEYS.candidate) : c\n ),\n }));\n },\n addAnnouncement: async (announcement) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewAnnouncement: Announcement }>(\n CREATE_ANNOUNCEMENT_MUTATION,\n { input: announcement },\n params,\n 'Unable to create announcement'\n );\n set((state) => ({\n announcements: [\n lowerEnumKeys(data.createCrewAnnouncement, ENUM_KEYS.announcement),\n ...state.announcements,\n ],\n }));\n },\n addLeaveRequest: async (request) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewLeaveRequest: LeaveRequest }>(\n CREATE_LEAVE_MUTATION,\n {\n input: {\n ...request,\n type: normalizeStatus(request.type),\n status: normalizeStatus(request.status),\n },\n },\n params,\n 'Unable to create leave request'\n );\n set((state) => ({\n leaveRequests: [\n lowerEnumKeys(data.createCrewLeaveRequest, ENUM_KEYS.leaveRequest),\n ...state.leaveRequests,\n ],\n }));\n },\n updateLeaveRequest: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewLeaveRequest: LeaveRequest }>(\n UPDATE_LEAVE_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update leave request'\n );\n set((state) => ({\n leaveRequests: state.leaveRequests.map((l) =>\n l.id === id ? lowerEnumKeys(data.updateCrewLeaveRequest, ENUM_KEYS.leaveRequest) : l\n ),\n }));\n },\n markNotificationRead: async (id) => {\n set((state) => ({\n notifications: state.notifications.map((n) => (n.id === id ? { ...n, read: true } : n)),\n }));\n },\n markAllNotificationsRead: async () => {\n set((state) => ({ notifications: state.notifications.map((n) => ({ ...n, read: true })) }));\n },\n\n // ── Extra removes for existing entities ───────────────────────\n removeJobPosting: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewJobPosting: boolean }>(\n REMOVE_JOB_MUTATION,\n { id },\n params,\n 'Unable to remove job posting'\n );\n set((state) => ({ jobPostings: state.jobPostings.filter((j) => j.id !== id) }));\n },\n removeCandidate: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewCandidate: boolean }>(\n REMOVE_CANDIDATE_MUTATION,\n { id },\n params,\n 'Unable to remove candidate'\n );\n set((state) => ({ candidates: state.candidates.filter((c) => c.id !== id) }));\n },\n updateAnnouncement: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewAnnouncement: Announcement }>(\n UPDATE_ANNOUNCEMENT_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update announcement'\n );\n set((state) => ({\n announcements: state.announcements.map((a) =>\n a.id === id ? lowerEnumKeys(data.updateCrewAnnouncement, ENUM_KEYS.announcement) : a\n ),\n }));\n },\n removeAnnouncement: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewAnnouncement: boolean }>(\n REMOVE_ANNOUNCEMENT_MUTATION,\n { id },\n params,\n 'Unable to remove announcement'\n );\n set((state) => ({ announcements: state.announcements.filter((a) => a.id !== id) }));\n },\n\n // ── Interview (enum: type, status) ────────────────────────────\n addInterview: async (interview) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewInterview: Interview }>(\n CREATE_INTERVIEW_MUTATION,\n {\n input: {\n ...interview,\n type: normalizeStatus(interview.type),\n status: normalizeStatus(interview.status),\n },\n },\n params,\n 'Unable to schedule interview'\n );\n set((state) => ({\n interviews: [\n lowerEnumKeys(data.createCrewInterview, ENUM_KEYS.interview),\n ...state.interviews,\n ],\n }));\n },\n updateInterview: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewInterview: Interview }>(\n UPDATE_INTERVIEW_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update interview'\n );\n set((state) => ({\n interviews: state.interviews.map((i) =>\n i.id === id ? lowerEnumKeys(data.updateCrewInterview, ENUM_KEYS.interview) : i\n ),\n }));\n },\n removeInterview: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewInterview: boolean }>(\n REMOVE_INTERVIEW_MUTATION,\n { id },\n params,\n 'Unable to remove interview'\n );\n set((state) => ({ interviews: state.interviews.filter((i) => i.id !== id) }));\n },\n\n // ── Invoice data is owned by global-billing-svc ───────────────\n addInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n updateInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n removeInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n\n // ── Vendor (enum: status) ─────────────────────────────────────\n addVendor: async (vendor) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewVendor: Vendor }>(\n CREATE_VENDOR_MUTATION,\n { input: { ...vendor, status: normalizeStatus(vendor.status) } },\n params,\n 'Unable to create vendor'\n );\n set((state) => ({\n vendors: [lowerEnumKeys(data.createCrewVendor, ENUM_KEYS.vendor), ...state.vendors],\n }));\n },\n updateVendor: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewVendor: Vendor }>(\n UPDATE_VENDOR_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update vendor'\n );\n set((state) => ({\n vendors: state.vendors.map((v) =>\n v.id === id ? lowerEnumKeys(data.updateCrewVendor, ENUM_KEYS.vendor) : v\n ),\n }));\n },\n removeVendor: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewVendor: boolean }>(\n REMOVE_VENDOR_MUTATION,\n { id },\n params,\n 'Unable to remove vendor'\n );\n set((state) => ({ vendors: state.vendors.filter((v) => v.id !== id) }));\n },\n\n // ── Client (enum: status; `since`) ────────────────────────────\n addClient: async (client) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewClient: Client }>(\n CREATE_CLIENT_MUTATION,\n { input: { ...client, status: normalizeStatus(client.status) } },\n params,\n 'Unable to create client'\n );\n set((state) => ({\n clients: [lowerEnumKeys(data.createCrewClient, ENUM_KEYS.client), ...state.clients],\n }));\n },\n updateClient: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewClient: Client }>(\n UPDATE_CLIENT_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update client'\n );\n set((state) => ({\n clients: state.clients.map((c) =>\n c.id === id ? lowerEnumKeys(data.updateCrewClient, ENUM_KEYS.client) : c\n ),\n }));\n },\n removeClient: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewClient: boolean }>(\n REMOVE_CLIENT_MUTATION,\n { id },\n params,\n 'Unable to remove client'\n );\n set((state) => ({ clients: state.clients.filter((c) => c.id !== id) }));\n },\n\n // ── Team (plain status; not normalized) ───────────────────────\n addTeam: async (team) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewTeam: Team }>(\n CREATE_TEAM_MUTATION,\n { input: team },\n params,\n 'Unable to create team'\n );\n set((state) => ({\n teams: [lowerEnumKeys(data.createCrewTeam, ENUM_KEYS.team), ...state.teams],\n }));\n },\n updateTeam: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewTeam: Team }>(\n UPDATE_TEAM_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update team'\n );\n set((state) => ({\n teams: state.teams.map((t) =>\n t.id === id ? lowerEnumKeys(data.updateCrewTeam, ENUM_KEYS.team) : t\n ),\n }));\n },\n removeTeam: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewTeam: boolean }>(\n REMOVE_TEAM_MUTATION,\n { id },\n params,\n 'Unable to remove team'\n );\n set((state) => ({ teams: state.teams.filter((t) => t.id !== id) }));\n },\n\n // ── Project (enum: status, priority) ──────────────────────────\n addProject: async (project) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewProject: Project }>(\n CREATE_PROJECT_MUTATION,\n {\n input: {\n ...project,\n status: normalizeStatus(project.status),\n priority: normalizeStatus(project.priority),\n },\n },\n params,\n 'Unable to create project'\n );\n set((state) => ({\n projects: [lowerEnumKeys(data.createCrewProject, ENUM_KEYS.project), ...state.projects],\n }));\n },\n updateProject: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewProject: Project }>(\n UPDATE_PROJECT_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n ...(updates.priority ? { priority: normalizeStatus(updates.priority) } : {}),\n },\n },\n params,\n 'Unable to update project'\n );\n set((state) => ({\n projects: state.projects.map((p) =>\n p.id === id ? lowerEnumKeys(data.updateCrewProject, ENUM_KEYS.project) : p\n ),\n }));\n },\n removeProject: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewProject: boolean }>(\n REMOVE_PROJECT_MUTATION,\n { id },\n params,\n 'Unable to remove project'\n );\n set((state) => ({ projects: state.projects.filter((p) => p.id !== id) }));\n },\n\n // ── Marketplace data is owned by global-store-svc ─────────────\n addMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n updateMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n removeMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n\n // ── Department (plain status; not normalized) ─────────────────\n addDepartment: async (department) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewDepartment: Department }>(\n CREATE_DEPARTMENT_MUTATION,\n { input: department },\n params,\n 'Unable to create department'\n );\n set((state) => ({\n departments: [\n lowerEnumKeys(data.createCrewDepartment, ENUM_KEYS.department),\n ...state.departments,\n ],\n }));\n },\n updateDepartment: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewDepartment: Department }>(\n UPDATE_DEPARTMENT_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update department'\n );\n set((state) => ({\n departments: state.departments.map((d) =>\n d.id === id ? lowerEnumKeys(data.updateCrewDepartment, ENUM_KEYS.department) : d\n ),\n }));\n },\n removeDepartment: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewDepartment: boolean }>(\n REMOVE_DEPARTMENT_MUTATION,\n { id },\n params,\n 'Unable to remove department'\n );\n set((state) => ({ departments: state.departments.filter((d) => d.id !== id) }));\n },\n\n // ── Learning data is owned by the shared learning service ─────\n addCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n updateCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n removeCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n enrollCourse: async () => {\n throw sharedOwnerError('Course enrollment');\n },\n addLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n updateLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n removeLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n\n // ── PayrollRecord (enum: status) ──────────────────────────────\n addPayrollRecord: async (record) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewPayrollRecord: PayrollRecord }>(\n CREATE_PAYROLL_MUTATION,\n { input: { ...record, status: normalizeStatus(record.status) } },\n params,\n 'Unable to create payroll record'\n );\n set((state) => ({\n payrollRecords: [\n lowerEnumKeys(data.createCrewPayrollRecord, ENUM_KEYS.payrollRecord),\n ...state.payrollRecords,\n ],\n }));\n },\n updatePayrollRecord: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewPayrollRecord: PayrollRecord }>(\n UPDATE_PAYROLL_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update payroll record'\n );\n set((state) => ({\n payrollRecords: state.payrollRecords.map((p) =>\n p.id === id ? lowerEnumKeys(data.updateCrewPayrollRecord, ENUM_KEYS.payrollRecord) : p\n ),\n }));\n },\n removePayrollRecord: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewPayrollRecord: boolean }>(\n REMOVE_PAYROLL_MUTATION,\n { id },\n params,\n 'Unable to remove payroll record'\n );\n set((state) => ({ payrollRecords: state.payrollRecords.filter((p) => p.id !== id) }));\n },\n\n // ── TimeEntry (plain status; not normalized) ──────────────────\n addTimeEntry: async (entry) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewTimeEntry: TimeEntry }>(\n CREATE_TIME_ENTRY_MUTATION,\n { input: entry },\n params,\n 'Unable to create time entry'\n );\n set((state) => ({\n timeEntries: [\n lowerEnumKeys(data.createCrewTimeEntry, ENUM_KEYS.timeEntry),\n ...state.timeEntries,\n ],\n }));\n },\n updateTimeEntry: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewTimeEntry: TimeEntry }>(\n UPDATE_TIME_ENTRY_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update time entry'\n );\n set((state) => ({\n timeEntries: state.timeEntries.map((t) =>\n t.id === id ? lowerEnumKeys(data.updateCrewTimeEntry, ENUM_KEYS.timeEntry) : t\n ),\n }));\n },\n removeTimeEntry: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewTimeEntry: boolean }>(\n REMOVE_TIME_ENTRY_MUTATION,\n { id },\n params,\n 'Unable to remove time entry'\n );\n set((state) => ({ timeEntries: state.timeEntries.filter((t) => t.id !== id) }));\n },\n\n // ── BOFF-3987: employee documents ──────────────────────────────\n fetchEmployeeDocuments: async (employeeId) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ employeeDocuments: CrewEmployeeDocument[] }>(\n EMPLOYEE_DOCUMENTS_QUERY,\n { employeeId },\n params,\n 'Unable to load employee documents'\n );\n set((state) => ({\n // Replace only this employee's documents; leave any other employee's\n // already-fetched documents in the flat cache untouched.\n employeeDocuments: [\n ...state.employeeDocuments.filter((d) => d.employeeId !== employeeId),\n ...data.employeeDocuments,\n ],\n }));\n },\n uploadEmployeeDocument: async ({ employeeId, file, title, category }) => {\n const params = useCrewFoundryStore.getState().initParams;\n\n const folder = await runGraphql<{ ensureFolderByPath: { id: string } }>(\n ENSURE_FOLDER_BY_PATH_MUTATION,\n { path: '/CrewFoundry/Employee Documents' },\n params,\n 'Unable to resolve the employee documents folder'\n );\n\n const extension = file.name.includes('.')\n ? file.name.substring(file.name.lastIndexOf('.') + 1)\n : '';\n const initiated = await runGraphql<{\n initiateUpload: { session: { id: string }; uploadUrl: string | null };\n }>(\n INITIATE_UPLOAD_MUTATION,\n {\n input: {\n fileName: file.name,\n fileSize: String(file.size),\n mimeType: file.type || 'application/octet-stream',\n extension,\n folderId: folder.ensureFolderByPath.id,\n },\n },\n params,\n 'Unable to start the document upload'\n );\n\n if (initiated.initiateUpload.uploadUrl) {\n const putResponse = await fetch(initiated.initiateUpload.uploadUrl, {\n method: 'PUT',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n if (!putResponse.ok) {\n throw new Error(`Failed to upload file bytes (status ${putResponse.status})`);\n }\n }\n\n const completed = await runGraphql<{ completeUpload: { file: { id: string } } }>(\n COMPLETE_UPLOAD_MUTATION,\n {\n input: {\n sessionId: initiated.initiateUpload.session.id,\n fileSize: String(file.size),\n folderId: folder.ensureFolderByPath.id,\n },\n },\n params,\n 'Unable to finish the document upload'\n );\n\n const attached = await runGraphql<{ attachEmployeeDocument: CrewEmployeeDocument }>(\n ATTACH_EMPLOYEE_DOCUMENT_MUTATION,\n {\n input: {\n employeeId,\n fileId: completed.completeUpload.file.id,\n title,\n category: category || undefined,\n },\n },\n params,\n 'Unable to attach the document to this employee'\n );\n\n set((state) => ({\n employeeDocuments: [attached.attachEmployeeDocument, ...state.employeeDocuments],\n }));\n },\n detachEmployeeDocument: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ detachEmployeeDocument: boolean }>(\n DETACH_EMPLOYEE_DOCUMENT_MUTATION,\n { id },\n params,\n 'Unable to remove this document'\n );\n set((state) => ({\n employeeDocuments: state.employeeDocuments.filter((d) => d.id !== id),\n }));\n },\n\n // ── BOFF-3983: onboarding ───────────────────────────────────────\n fetchOnboardings: async () => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ crewOnboardings: CrewOnboarding[] }>(\n ONBOARDINGS_QUERY,\n {},\n params,\n 'Unable to load onboarding'\n );\n set({\n onboardings: data.crewOnboardings.map(lowerOnboarding),\n onboardingsLoaded: true,\n });\n },\n createOnboarding: async (input) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewOnboarding: CrewOnboarding }>(\n CREATE_ONBOARDING_MUTATION,\n { input },\n params,\n 'Unable to start onboarding'\n );\n set((state) => ({\n onboardings: [lowerOnboarding(data.createCrewOnboarding), ...state.onboardings],\n }));\n },\n updateOnboarding: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewOnboarding: CrewOnboarding }>(\n UPDATE_ONBOARDING_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update onboarding'\n );\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === id ? lowerOnboarding(data.updateCrewOnboarding) : o\n ),\n }));\n },\n removeOnboarding: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewOnboarding: boolean }>(\n REMOVE_ONBOARDING_MUTATION,\n { id },\n params,\n 'Unable to remove onboarding'\n );\n set((state) => ({ onboardings: state.onboardings.filter((o) => o.id !== id) }));\n },\n createOnboardingTask: async (input) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewOnboardingTask: CrewOnboardingTask }>(\n CREATE_ONBOARDING_TASK_MUTATION,\n { input },\n params,\n 'Unable to create onboarding task'\n );\n const task = lowerEnumKeys(data.createCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === task.onboardingId\n ? {\n ...o,\n tasks: [...o.tasks, task],\n totalTaskCount: o.totalTaskCount + 1,\n }\n : o\n ),\n }));\n },\n updateOnboardingTask: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewOnboardingTask: CrewOnboardingTask }>(\n UPDATE_ONBOARDING_TASK_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update onboarding task'\n );\n const task = lowerEnumKeys(data.updateCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === task.onboardingId\n ? { ...o, tasks: o.tasks.map((t) => (t.id === id ? task : t)) }\n : o\n ),\n }));\n },\n removeOnboardingTask: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewOnboardingTask: boolean }>(\n REMOVE_ONBOARDING_TASK_MUTATION,\n { id },\n params,\n 'Unable to remove onboarding task'\n );\n set((state) => ({\n onboardings: state.onboardings.map((o) => {\n if (!o.tasks.some((t) => t.id === id)) return o;\n return {\n ...o,\n tasks: o.tasks.filter((t) => t.id !== id),\n totalTaskCount: Math.max(0, o.totalTaskCount - 1),\n };\n }),\n }));\n },\n toggleOnboardingTask: async (id, completed) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ toggleCrewOnboardingTask: CrewOnboardingTask }>(\n TOGGLE_ONBOARDING_TASK_MUTATION,\n { id, completed },\n params,\n 'Unable to update onboarding task'\n );\n const task = lowerEnumKeys(data.toggleCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) => {\n if (o.id !== task.onboardingId) return o;\n const tasks = o.tasks.map((t) => (t.id === id ? task : t));\n const completedTaskCount = tasks.filter((t) => t.completedAt).length;\n return {\n ...o,\n tasks,\n completedTaskCount,\n progressPercent:\n tasks.length === 0 ? 0 : Math.round((completedTaskCount / tasks.length) * 1000) / 10,\n };\n }),\n }));\n },\n}));\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crewfoundryStore.js","names":[],"sources":["../../../src/crewfoundry/store/crewfoundryStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport type { OverviewMetric, WorkItem } from '../types';\n\n// ── Domain Types ────────────────────────────────────────────────\nexport interface Employee {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n department: string;\n position: string;\n status: 'active' | 'inactive' | 'on_leave' | 'terminated';\n type: 'full_time' | 'part_time' | 'contract' | 'intern';\n salary: number;\n startDate: string;\n avatar?: string;\n location: string;\n managerId?: string;\n phone: string;\n performanceScore: number;\n /** Real per-employee skill tags (backend default `[]`). */\n skills: string[];\n /** Exit date for terminated employees; ISO string or null while employed. */\n terminationDate?: string | null;\n}\n\nexport interface Department {\n id: string;\n name: string;\n headId: string;\n headName: string;\n employeeCount: number;\n budget: number;\n location: string;\n status: 'active' | 'restructuring';\n}\n\nexport interface JobPosting {\n id: string;\n title: string;\n department: string;\n location: string;\n type: 'full_time' | 'part_time' | 'contract' | 'remote';\n experienceLevel: 'entry' | 'mid' | 'senior' | 'lead' | 'executive';\n salaryMin: number;\n salaryMax: number;\n status: 'draft' | 'active' | 'paused' | 'closed' | 'filled';\n applicants: number;\n postedDate: string;\n deadline: string;\n description: string;\n requirements: string[];\n benefits: string[];\n}\n\nexport interface Candidate {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n position: string;\n status: 'new' | 'screening' | 'interview' | 'assessment' | 'offer' | 'hired' | 'rejected';\n appliedDate: string;\n resumeUrl?: string;\n rating: number;\n source: string;\n experience: number;\n skills: string[];\n currentCompany: string;\n notes: string;\n /** Date the candidate was hired; ISO string or null until hired. */\n hiredDate?: string | null;\n}\n\nexport interface Interview {\n id: string;\n candidateId: string;\n candidateName: string;\n position: string;\n interviewerName: string;\n date: string;\n time: string;\n type: 'phone' | 'video' | 'onsite' | 'panel' | 'technical';\n status: 'scheduled' | 'completed' | 'cancelled' | 'no_show';\n feedback?: string;\n rating?: number;\n}\n\nexport interface LearningCourse {\n id: string;\n title: string;\n category: string;\n instructor: string;\n duration: string;\n level: 'beginner' | 'intermediate' | 'advanced';\n enrolled: number;\n completed: number;\n rating: number;\n status: 'active' | 'draft' | 'archived';\n thumbnail?: string;\n description: string;\n modules: number;\n skills: string[];\n}\n\nexport interface LearningPath {\n id: string;\n title: string;\n description: string;\n courses: string[];\n duration: string;\n level: string;\n enrolled: number;\n completionRate: number;\n}\n\nexport interface MarketplaceService {\n id: string;\n title: string;\n provider: string;\n category: string;\n price: number;\n priceType: 'hourly' | 'fixed' | 'monthly';\n rating: number;\n reviews: number;\n description: string;\n deliveryTime: string;\n status: 'active' | 'paused' | 'pending';\n skills: string[];\n}\n\nexport interface Announcement {\n id: string;\n title: string;\n content: string;\n author: string;\n authorRole: string;\n category: 'general' | 'hr' | 'it' | 'emergency' | 'event';\n priority: 'low' | 'medium' | 'high' | 'urgent';\n isPinned: boolean;\n createdAt: string;\n viewCount: number;\n tags: string[];\n}\n\nexport interface Team {\n id: string;\n name: string;\n description: string;\n leadId: string;\n leadName: string;\n members: string[];\n memberCount: number;\n department: string;\n status: 'active' | 'forming' | 'disbanded';\n projectCount: number;\n createdAt: string;\n}\n\nexport interface Project {\n id: string;\n name: string;\n description: string;\n status: 'planning' | 'active' | 'on_hold' | 'completed' | 'cancelled';\n priority: 'low' | 'medium' | 'high' | 'critical';\n startDate: string;\n endDate: string;\n progress: number;\n budget: number;\n spent: number;\n teamId: string;\n teamName: string;\n managerId: string;\n managerName: string;\n tasks: number;\n completedTasks: number;\n}\n\nexport interface PayrollRecord {\n id: string;\n employeeId: string;\n employeeName: string;\n department: string;\n period: string;\n grossPay: number;\n deductions: number;\n netPay: number;\n status: 'draft' | 'processing' | 'approved' | 'paid' | 'failed';\n payDate: string;\n paymentMethod: string;\n}\n\nexport interface LeaveRequest {\n id: string;\n employeeId: string;\n employeeName: string;\n department: string;\n type: 'annual' | 'sick' | 'personal' | 'maternity' | 'paternity' | 'unpaid';\n startDate: string;\n endDate: string;\n days: number;\n status: 'pending' | 'approved' | 'rejected' | 'cancelled';\n reason: string;\n approverName?: string;\n}\n\nexport interface TimeEntry {\n id: string;\n employeeId: string;\n employeeName: string;\n date: string;\n clockIn: string;\n clockOut: string;\n totalHours: number;\n overtime: number;\n project: string;\n status: 'pending' | 'approved' | 'rejected';\n /** Whether the logged time is billable to a client (backend default `true`). */\n billable: boolean;\n}\n\nexport interface Notification {\n id: string;\n title: string;\n message: string;\n type: 'info' | 'success' | 'warning' | 'error';\n category: string;\n read: boolean;\n createdAt: string;\n actionUrl?: string;\n}\n\nexport interface Invoice {\n id: string;\n number: string;\n clientName: string;\n amount: number;\n status: 'draft' | 'sent' | 'paid' | 'overdue' | 'cancelled';\n issueDate: string;\n dueDate: string;\n items: { description: string; amount: number }[];\n}\n\nexport interface Vendor {\n id: string;\n name: string;\n category: string;\n contactPerson: string;\n email: string;\n phone: string;\n status: 'active' | 'inactive' | 'pending';\n contractValue: number;\n rating: number;\n}\n\nexport interface Client {\n id: string;\n name: string;\n industry: string;\n contactPerson: string;\n email: string;\n phone: string;\n status: 'active' | 'prospect' | 'churned';\n revenue: number;\n projects: number;\n since: string;\n}\n\n// BOFF-3987 — employee profile Documents tab. The binary + canonical file\n// metadata live in wspace-files-svc; this is just the (employee, file)\n// association crewfoundry owns.\nexport interface CrewEmployeeDocument {\n id: string;\n employeeId: string;\n fileId: string;\n title: string;\n category?: string | null;\n uploadedBy: string;\n uploadedAt: string;\n}\n\n// BOFF-3983 — requisition-to-hire onboarding tracker (mock cf-30).\nexport type OnboardingStage = 'offer' | 'paperwork' | 'it_setup' | 'training' | 'day_one';\nexport type OnboardingStatus = 'not_started' | 'in_progress' | 'completed' | 'cancelled';\n\nexport interface CrewOnboardingTask {\n id: string;\n onboardingId: string;\n stage: OnboardingStage;\n title: string;\n assigneeActorId?: string | null;\n assigneeName?: string | null;\n dueDate?: string | null;\n completedAt?: string | null;\n sortOrder: number;\n}\n\nexport interface CrewOnboarding {\n id: string;\n candidateId?: string | null;\n employeeId?: string | null;\n fullName: string;\n position: string;\n department?: string | null;\n startDate?: string | null;\n status: OnboardingStatus;\n currentStage: OnboardingStage;\n createdAt: string;\n tasks: CrewOnboardingTask[];\n totalTaskCount: number;\n completedTaskCount: number;\n progressPercent: number;\n}\n\nexport interface ExternalPaymentMethod {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n}\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport type { Gateway } from '@burdenoff/fe-libs/shared/config';\n\ntype InitParams = {\n workspaceId?: string;\n authToken?: string;\n apiGatewayUrl?: string;\n actorId?: string;\n};\n\ntype GraphqlResult<T> = {\n data: T | null;\n errors?: Array<{ message: string }>;\n};\n\nconst BOOTSTRAP_QUERY = `\n query CrewfoundryBootstrap {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n }\n`;\n\n// Payroll (BOFF-4887) is deliberately NOT part of crewfoundryBootstrap — it is\n// gated by the dedicated `crewfoundry-payroll` RBAC resource rather than the\n// general `crewfoundry:read` the bootstrap query uses, so a Workforce\n// Coordinator (or any role with only general workforce access) must not be\n// able to read gross/net pay and deductions just by loading the dashboard.\n// Fetched separately via `runOverlap` below (best-effort — a FORBIDDEN\n// response from a role without payroll access degrades to an empty list\n// rather than failing the whole bootstrap load).\nconst CREW_PAYROLL_RECORDS_QUERY = `\n query CrewPayrollRecords {\n crewPayrollRecords { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod }\n }\n`;\n\ntype CrewPayrollRecordsResponse = {\n crewPayrollRecords: PayrollRecord[];\n};\n\nconst WORKSPACE_BOOTSTRAP_WITH_OVERLAP_QUERY = `\n query CrewfoundryWorkspaceBootstrapWithOverlap(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $groupFirst: Int\n $conversationFirst: Int\n ) {\n crewfoundryBootstrap {\n employees { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate }\n departments { id name headId headName employeeCount budget location status }\n jobPostings { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits }\n candidates { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate }\n interviews { id candidateId candidateName position interviewerName date time type status feedback rating }\n announcements { id title content author authorRole category priority isPinned createdAt viewCount tags }\n teams { id name description leadId leadName members memberCount department status projectCount createdAt }\n projects { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks }\n leaveRequests { id employeeId employeeName department type startDate endDate days status reason approverName }\n timeEntries { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable }\n vendors { id name category contactPerson email phone status contractValue rating }\n clients { id name industry contactPerson email phone status revenue projects since }\n }\n projects(filter: { workspaceId: $workspaceId }, pagination: $projectPagination) {\n items {\n id\n name\n key\n creatorId\n status\n config\n archived\n createdAt\n updatedAt\n }\n }\n groups(first: $groupFirst) {\n edges {\n node {\n id\n name\n description\n groupType\n status\n memberCount\n ownerId\n createdAt\n }\n }\n }\n conversations(first: $conversationFirst) {\n edges {\n node {\n id\n title\n description\n state\n unreadCount\n memberCount\n updatedAt\n }\n }\n }\n }\n`;\n\nconst OVERLAP_BILLING_QUERY = `\n query CrewfoundryOverlapBilling {\n getBillingAccountsByOrg {\n id\n name\n isDefault\n paymentMethods {\n id\n type\n brand\n last4\n isDefault\n expiryMonth\n expiryYear\n }\n }\n }\n`;\n\nconst CREATE_EMPLOYEE_MUTATION = `mutation CreateCrewEmployee($input: CreateCrewEmployeeInput!) { createCrewEmployee(input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }`;\nconst UPDATE_EMPLOYEE_MUTATION = `mutation UpdateCrewEmployee($id: ID!, $input: UpdateCrewEmployeeInput!) { updateCrewEmployee(id: $id, input: $input) { id firstName lastName email department position status type salary startDate avatar location managerId phone performanceScore skills terminationDate } }`;\nconst REMOVE_EMPLOYEE_MUTATION = `mutation RemoveCrewEmployee($id: ID!) { removeCrewEmployee(id: $id) }`;\nconst CREATE_JOB_MUTATION = `mutation CreateCrewJobPosting($input: CreateCrewJobPostingInput!) { createCrewJobPosting(input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }`;\nconst UPDATE_JOB_MUTATION = `mutation UpdateCrewJobPosting($id: ID!, $input: UpdateCrewJobPostingInput!) { updateCrewJobPosting(id: $id, input: $input) { id title department location type experienceLevel salaryMin salaryMax status applicants postedDate deadline description requirements benefits } }`;\nconst CREATE_CANDIDATE_MUTATION = `mutation CreateCrewCandidate($input: CreateCrewCandidateInput!) { createCrewCandidate(input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }`;\nconst UPDATE_CANDIDATE_MUTATION = `mutation UpdateCrewCandidate($id: ID!, $input: UpdateCrewCandidateInput!) { updateCrewCandidate(id: $id, input: $input) { id firstName lastName email phone position status appliedDate resumeUrl rating source experience skills currentCompany notes hiredDate } }`;\nconst CREATE_ANNOUNCEMENT_MUTATION = `mutation CreateCrewAnnouncement($input: CreateCrewAnnouncementInput!) { createCrewAnnouncement(input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }`;\nconst CREATE_LEAVE_MUTATION = `mutation CreateCrewLeaveRequest($input: CreateCrewLeaveRequestInput!) { createCrewLeaveRequest(input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }`;\nconst UPDATE_LEAVE_MUTATION = `mutation UpdateCrewLeaveRequest($id: ID!, $input: UpdateCrewLeaveRequestInput!) { updateCrewLeaveRequest(id: $id, input: $input) { id employeeId employeeName department type startDate endDate days status reason approverName } }`;\n// Extra removes / updates for existing entities (delete + edit buttons).\nconst REMOVE_JOB_MUTATION = `mutation RemoveCrewJobPosting($id: ID!) { removeCrewJobPosting(id: $id) }`;\nconst REMOVE_CANDIDATE_MUTATION = `mutation RemoveCrewCandidate($id: ID!) { removeCrewCandidate(id: $id) }`;\nconst UPDATE_ANNOUNCEMENT_MUTATION = `mutation UpdateCrewAnnouncement($id: ID!, $input: UpdateCrewAnnouncementInput!) { updateCrewAnnouncement(id: $id, input: $input) { id title content author authorRole category priority isPinned createdAt viewCount tags } }`;\nconst REMOVE_ANNOUNCEMENT_MUTATION = `mutation RemoveCrewAnnouncement($id: ID!) { removeCrewAnnouncement(id: $id) }`;\n\n// Interview\nconst CREATE_INTERVIEW_MUTATION = `mutation CreateCrewInterview($input: CreateCrewInterviewInput!) { createCrewInterview(input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }`;\nconst UPDATE_INTERVIEW_MUTATION = `mutation UpdateCrewInterview($id: ID!, $input: UpdateCrewInterviewInput!) { updateCrewInterview(id: $id, input: $input) { id candidateId candidateName position interviewerName date time type status feedback rating } }`;\nconst REMOVE_INTERVIEW_MUTATION = `mutation RemoveCrewInterview($id: ID!) { removeCrewInterview(id: $id) }`;\n\n// Vendor\nconst CREATE_VENDOR_MUTATION = `mutation CreateCrewVendor($input: CreateCrewVendorInput!) { createCrewVendor(input: $input) { id name category contactPerson email phone status contractValue rating } }`;\nconst UPDATE_VENDOR_MUTATION = `mutation UpdateCrewVendor($id: ID!, $input: UpdateCrewVendorInput!) { updateCrewVendor(id: $id, input: $input) { id name category contactPerson email phone status contractValue rating } }`;\nconst REMOVE_VENDOR_MUTATION = `mutation RemoveCrewVendor($id: ID!) { removeCrewVendor(id: $id) }`;\n\n// Client\nconst CREATE_CLIENT_MUTATION = `mutation CreateCrewClient($input: CreateCrewClientInput!) { createCrewClient(input: $input) { id name industry contactPerson email phone status revenue projects since } }`;\nconst UPDATE_CLIENT_MUTATION = `mutation UpdateCrewClient($id: ID!, $input: UpdateCrewClientInput!) { updateCrewClient(id: $id, input: $input) { id name industry contactPerson email phone status revenue projects since } }`;\nconst REMOVE_CLIENT_MUTATION = `mutation RemoveCrewClient($id: ID!) { removeCrewClient(id: $id) }`;\n\n// Team\nconst CREATE_TEAM_MUTATION = `mutation CreateCrewTeam($input: CreateCrewTeamInput!) { createCrewTeam(input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }`;\nconst UPDATE_TEAM_MUTATION = `mutation UpdateCrewTeam($id: ID!, $input: UpdateCrewTeamInput!) { updateCrewTeam(id: $id, input: $input) { id name description leadId leadName members memberCount department status projectCount createdAt } }`;\nconst REMOVE_TEAM_MUTATION = `mutation RemoveCrewTeam($id: ID!) { removeCrewTeam(id: $id) }`;\n\n// Project\nconst CREATE_PROJECT_MUTATION = `mutation CreateCrewProject($input: CreateCrewProjectInput!) { createCrewProject(input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }`;\nconst UPDATE_PROJECT_MUTATION = `mutation UpdateCrewProject($id: ID!, $input: UpdateCrewProjectInput!) { updateCrewProject(id: $id, input: $input) { id name description status priority startDate endDate progress budget spent teamId teamName managerId managerName tasks completedTasks } }`;\nconst REMOVE_PROJECT_MUTATION = `mutation RemoveCrewProject($id: ID!) { removeCrewProject(id: $id) }`;\n\n// Department\nconst CREATE_DEPARTMENT_MUTATION = `mutation CreateCrewDepartment($input: CreateCrewDepartmentInput!) { createCrewDepartment(input: $input) { id name headId headName employeeCount budget location status } }`;\nconst UPDATE_DEPARTMENT_MUTATION = `mutation UpdateCrewDepartment($id: ID!, $input: UpdateCrewDepartmentInput!) { updateCrewDepartment(id: $id, input: $input) { id name headId headName employeeCount budget location status } }`;\nconst REMOVE_DEPARTMENT_MUTATION = `mutation RemoveCrewDepartment($id: ID!) { removeCrewDepartment(id: $id) }`;\n\n// PayrollRecord\nconst CREATE_PAYROLL_MUTATION = `mutation CreateCrewPayrollRecord($input: CreateCrewPayrollRecordInput!) { createCrewPayrollRecord(input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }`;\nconst UPDATE_PAYROLL_MUTATION = `mutation UpdateCrewPayrollRecord($id: ID!, $input: UpdateCrewPayrollRecordInput!) { updateCrewPayrollRecord(id: $id, input: $input) { id employeeId employeeName department period grossPay deductions netPay status payDate paymentMethod } }`;\nconst REMOVE_PAYROLL_MUTATION = `mutation RemoveCrewPayrollRecord($id: ID!) { removeCrewPayrollRecord(id: $id) }`;\n\n// TimeEntry\nconst CREATE_TIME_ENTRY_MUTATION = `mutation CreateCrewTimeEntry($input: CreateCrewTimeEntryInput!) { createCrewTimeEntry(input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }`;\nconst UPDATE_TIME_ENTRY_MUTATION = `mutation UpdateCrewTimeEntry($id: ID!, $input: UpdateCrewTimeEntryInput!) { updateCrewTimeEntry(id: $id, input: $input) { id employeeId employeeName date clockIn clockOut totalHours overtime project status billable } }`;\nconst REMOVE_TIME_ENTRY_MUTATION = `mutation RemoveCrewTimeEntry($id: ID!) { removeCrewTimeEntry(id: $id) }`;\n\n// BOFF-3987 — employee documents\nconst EMPLOYEE_DOCUMENTS_QUERY = `query EmployeeDocuments($employeeId: ID!) { employeeDocuments(employeeId: $employeeId) { id employeeId fileId title category uploadedBy uploadedAt } }`;\nconst ATTACH_EMPLOYEE_DOCUMENT_MUTATION = `mutation AttachEmployeeDocument($input: AttachCrewEmployeeDocumentInput!) { attachEmployeeDocument(input: $input) { id employeeId fileId title category uploadedBy uploadedAt } }`;\nconst DETACH_EMPLOYEE_DOCUMENT_MUTATION = `mutation DetachEmployeeDocument($id: ID!) { detachEmployeeDocument(id: $id) }`;\n// Files-svc presigned upload dance (same 3-step protocol fe-libs' SaveToFilesButton\n// uses — see ~/products/dev/platform/context/files/), replicated here with the\n// store's own graphqlFetch helper instead of Apollo since this MFE has no Apollo\n// client wired in.\nconst ENSURE_FOLDER_BY_PATH_MUTATION = `mutation EnsureFolderByPath($path: String!) { ensureFolderByPath(path: $path) { id } }`;\nconst INITIATE_UPLOAD_MUTATION = `mutation InitiateUpload($input: InitiateUploadInput!) { initiateUpload(input: $input) { session { id } uploadUrl } }`;\nconst COMPLETE_UPLOAD_MUTATION = `mutation CompleteUpload($input: CompleteUploadInput!) { completeUpload(input: $input) { file { id } } }`;\n\n// BOFF-3983 — onboarding\nconst ONBOARDINGS_QUERY = `query CrewOnboardings { crewOnboardings { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst CREATE_ONBOARDING_MUTATION = `mutation CreateCrewOnboarding($input: CreateCrewOnboardingInput!) { createCrewOnboarding(input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst UPDATE_ONBOARDING_MUTATION = `mutation UpdateCrewOnboarding($id: ID!, $input: UpdateCrewOnboardingInput!) { updateCrewOnboarding(id: $id, input: $input) { id candidateId employeeId fullName position department startDate status currentStage createdAt totalTaskCount completedTaskCount progressPercent tasks { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } } }`;\nconst REMOVE_ONBOARDING_MUTATION = `mutation RemoveCrewOnboarding($id: ID!) { removeCrewOnboarding(id: $id) }`;\nconst CREATE_ONBOARDING_TASK_MUTATION = `mutation CreateCrewOnboardingTask($input: CreateCrewOnboardingTaskInput!) { createCrewOnboardingTask(input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\nconst UPDATE_ONBOARDING_TASK_MUTATION = `mutation UpdateCrewOnboardingTask($id: ID!, $input: UpdateCrewOnboardingTaskInput!) { updateCrewOnboardingTask(id: $id, input: $input) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\nconst REMOVE_ONBOARDING_TASK_MUTATION = `mutation RemoveCrewOnboardingTask($id: ID!) { removeCrewOnboardingTask(id: $id) }`;\nconst TOGGLE_ONBOARDING_TASK_MUTATION = `mutation ToggleCrewOnboardingTask($id: ID!, $completed: Boolean!) { toggleCrewOnboardingTask(id: $id, completed: $completed) { id onboardingId stage title assigneeActorId assigneeName dueDate completedAt sortOrder } }`;\n\nconst normalizeStatus = (value: string) => value.toUpperCase().replaceAll('-', '_');\n\nconst sharedOwnerError = (capability: string) =>\n new Error(`${capability} isn't available in CrewFoundry.`);\n\n// The backend returns enum values in UPPER_SNAKE case (e.g. \"ACTIVE\", \"FULL_TIME\", \"HIGH\"),\n// but the frontend model + every comparison/filter/badge uses lower_snake ('active', 'full_time').\n// Normalization is per-entity, NOT per-key: fields like `category`/`level` are genuine enums on\n// some entities (Announcement.category, Course.level) yet free text on others (Course.category =\n// \"Programming\", Vendor.category, LearningPath.level) — a global key list would corrupt those.\n// Each list below mirrors exactly the string-literal-union fields declared on that entity's interface.\nconst ENUM_KEYS = {\n employee: ['status', 'type'],\n department: ['status'],\n jobPosting: ['type', 'experienceLevel', 'status'],\n candidate: ['status'],\n interview: ['type', 'status'],\n course: ['level', 'status'],\n marketplaceService: ['priceType', 'status'],\n announcement: ['category', 'priority'],\n team: ['status'],\n project: ['status', 'priority'],\n payrollRecord: ['status'],\n leaveRequest: ['type', 'status'],\n timeEntry: ['status'],\n notification: ['type'],\n paymentMethod: ['type', 'status'],\n invoice: ['status'],\n vendor: ['status'],\n client: ['status'],\n onboarding: ['status', 'currentStage'],\n onboardingTask: ['stage'],\n} as const;\n\n// Lowercase only the given enum keys on an entity read back from the backend; leave every other\n// (free-text) field untouched. Idempotent — safe on already-lowercase values (some subgraphs\n// return lowercase already). This is the read-path inverse of `normalizeStatus`.\nconst lowerEnumKeys = <T>(entity: T, keys: readonly string[]): T => {\n if (!entity || typeof entity !== 'object') return entity;\n const out = { ...(entity as Record<string, unknown>) };\n for (const key of keys) {\n const value = out[key];\n if (typeof value === 'string') out[key] = value.toLowerCase();\n }\n return out as T;\n};\n\n// lowerEnumKeys only lowercases top-level string fields; CrewOnboarding nests\n// a `tasks` array whose own `stage` field also needs the same treatment, so\n// this composes lowerEnumKeys over both levels rather than duplicating it.\nconst lowerOnboarding = (onboarding: CrewOnboarding): CrewOnboarding => {\n const lowered = lowerEnumKeys(onboarding, ENUM_KEYS.onboarding);\n return {\n ...lowered,\n tasks: (onboarding.tasks ?? []).map((task) => lowerEnumKeys(task, ENUM_KEYS.onboardingTask)),\n };\n};\n\nconst toDateOnly = (value?: string | null) => (value ? value.slice(0, 10) : 'TBD');\n\nconst asRecord = (value: unknown): Record<string, unknown> | null => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n};\n\nconst asNumber = (value: unknown): number | null => (typeof value === 'number' ? value : null);\n\nconst asString = (value: unknown): string | null => (typeof value === 'string' ? value : null);\n\nconst mapProjectStatus = (value: string): Project['status'] => {\n const status = value.toLowerCase();\n if (status === 'active') return 'active';\n if (status === 'completed') return 'completed';\n if (status === 'cancelled') return 'cancelled';\n if (status === 'archived') return 'on_hold';\n return 'planning';\n};\n\nconst mapGroupStatus = (value: string): Team['status'] => {\n const status = value.toLowerCase();\n if (status === 'active') return 'active';\n if (status === 'inactive' || status === 'archived' || status === 'deleted') return 'disbanded';\n return 'forming';\n};\n\ntype OverlapWorkspaceResponse = {\n projects: {\n items: Array<{\n id: string;\n name: string;\n key: string;\n creatorId: string;\n status: string;\n config?: unknown;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n }>;\n };\n groups: {\n edges: Array<{\n node: {\n id: string;\n name: string;\n description?: string | null;\n groupType?: string | null;\n status: string;\n memberCount: number;\n ownerId: string;\n createdAt: string;\n };\n }>;\n };\n conversations: {\n edges: Array<{\n node: {\n id: string;\n title?: string | null;\n description?: string | null;\n state: string;\n unreadCount: number;\n memberCount: number;\n updatedAt: string;\n };\n }>;\n };\n};\n\ntype WorkspaceBootstrapWithOverlapResponse = BootstrapPayload & OverlapWorkspaceResponse;\n\ntype OverlapBillingResponse = {\n getBillingAccountsByOrg: Array<{\n id?: string | null;\n name?: string | null;\n isDefault?: boolean | null;\n paymentMethods?: Array<{\n id: string;\n type: string;\n brand?: string | null;\n last4?: string | null;\n isDefault: boolean;\n expiryMonth?: number | null;\n expiryYear?: number | null;\n } | null> | null;\n }>;\n};\n\ntype BootstrapPayload = {\n crewfoundryBootstrap: {\n employees: Employee[];\n departments: Department[];\n jobPostings: JobPosting[];\n candidates: Candidate[];\n interviews: Interview[];\n announcements: Announcement[];\n teams: Team[];\n projects: Project[];\n leaveRequests: LeaveRequest[];\n timeEntries: TimeEntry[];\n vendors: Vendor[];\n clients: Client[];\n };\n};\n\nconst mapOverlapProjects = (\n projects: OverlapWorkspaceResponse['projects']['items'],\n teams: Team[]\n) =>\n projects.map((project, index): Project => {\n const config = asRecord(project.config);\n const budget = asNumber(config?.budget) ?? 25000 + index * 2500;\n const spent =\n asNumber(config?.spent) ?? Math.round(budget * (project.status === 'COMPLETED' ? 1 : 0.62));\n const progress = asNumber(config?.progress) ?? (project.status === 'COMPLETED' ? 100 : 58);\n const tasks = asNumber(config?.tasks) ?? 20 + (index % 9);\n const completedTasks = asNumber(config?.completedTasks) ?? Math.round((progress / 100) * tasks);\n const team = teams[index % Math.max(teams.length, 1)];\n\n return {\n id: project.id,\n name: project.name,\n description: asString(config?.description) || `${project.key} delivery plan`,\n status: mapProjectStatus(project.status),\n priority: (asString(config?.priority)?.toLowerCase() as Project['priority']) || 'medium',\n startDate: toDateOnly(project.createdAt),\n endDate: toDateOnly(project.updatedAt),\n progress,\n budget,\n spent,\n teamId: team?.id || 'unassigned',\n teamName: team?.name || 'Unassigned Team',\n managerId: project.creatorId,\n managerName: `Lead ${project.creatorId.slice(0, 8)}`,\n tasks,\n completedTasks,\n };\n });\n\nconst mapOverlapTeams = (groups: OverlapWorkspaceResponse['groups']['edges']): Team[] =>\n groups.map(({ node }) => ({\n id: node.id,\n name: node.name,\n description: node.description || `${node.name} team workspace`,\n leadId: node.ownerId,\n leadName: `Lead ${node.ownerId.slice(0, 8)}`,\n members: [],\n memberCount: node.memberCount,\n department: node.groupType?.toLowerCase().replaceAll('_', ' ') || 'operations',\n status: mapGroupStatus(node.status),\n projectCount: 0,\n createdAt: toDateOnly(node.createdAt),\n }));\n\nconst mapConversationNotifications = (\n conversations: OverlapWorkspaceResponse['conversations']['edges']\n): Notification[] =>\n conversations\n .filter(({ node }) => node.unreadCount > 0)\n .map(({ node }) => ({\n id: `conversation-${node.id}`,\n title: node.title || 'Conversation update',\n message: `${node.unreadCount} unread in ${node.memberCount}-member channel`,\n type: node.state.toLowerCase() === 'active' ? 'info' : 'warning',\n category: 'communications',\n read: false,\n createdAt: node.updatedAt,\n actionUrl: `/crewfoundry/communications/messages-page`,\n }));\n\nconst mapBillingMethods = (data: OverlapBillingResponse): ExternalPaymentMethod[] => {\n const account =\n data.getBillingAccountsByOrg.find((item) => item?.isDefault && item?.id) ||\n data.getBillingAccountsByOrg.find((item) => item?.id);\n\n if (!account?.id) {\n return [];\n }\n\n return (account.paymentMethods || [])\n .filter((item): item is NonNullable<typeof item> => Boolean(item))\n .map((method) => {\n const month = method.expiryMonth ? String(method.expiryMonth).padStart(2, '0') : undefined;\n const year = method.expiryYear ? String(method.expiryYear) : undefined;\n const isBank = method.type === 'BANK_TRANSFER' || method.type === 'NETBANKING';\n\n return {\n id: method.id,\n type: isBank ? 'bank' : 'card',\n name: `${account.name || 'Billing'} ${isBank ? 'Bank Account' : 'Card'}`,\n bank: method.brand || account.name || 'Billing Account',\n last4: method.last4 || '0000',\n status: method.isDefault ? 'primary' : 'active',\n expiry: month && year ? `${month}/${year}` : undefined,\n };\n });\n};\n\nconst parseGraphql = <T>(result: GraphqlResult<T>, fallbackMessage: string): T => {\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message || fallbackMessage);\n }\n if (!result.data) {\n throw new Error(fallbackMessage);\n }\n return result.data;\n};\n\n// Fields that live on the client-side entity objects but are NEVER accepted by\n// any Crew* Create/Update GraphQL input — either a client-generated temp `id`,\n// a server-set timestamp, or a server-derived rollup counter. Sending them makes\n// the gateway reject the whole operation with a GraphQL validation error (which\n// the public gateway masks to a generic INTERNAL_SERVER_ERROR), so no row is\n// ever written. Stripping them centrally keeps every create/update mutation valid\n// without each caller having to hand-pick input fields. (Counters like rating /\n// applicants / viewCount that a few inputs DO accept are safe to drop too — they\n// default server-side, and the UI never lets a user set a derived rollup.)\nconst MUTATION_INPUT_OMIT_KEYS = new Set<string>([\n 'id',\n 'createdAt',\n 'createdOn',\n 'updatedAt',\n 'deletedAt',\n 'employeeCount',\n 'memberCount',\n 'projectCount',\n 'enrolled',\n 'completed',\n 'completionRate',\n 'reviews',\n 'rating',\n 'tasks',\n 'completedTasks',\n 'spent',\n 'progress',\n 'applicants',\n 'viewCount',\n 'revenue',\n 'projects',\n]);\n\nconst sanitizeMutationInput = (\n variables: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined => {\n if (!variables) {\n return variables;\n }\n const input = variables.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return variables;\n }\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (!MUTATION_INPUT_OMIT_KEYS.has(key)) {\n cleaned[key] = value;\n }\n }\n return { ...variables, input: cleaned };\n};\n\nconst runGraphql = async <T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n params: InitParams,\n fallbackMessage: string,\n gateway: Gateway = 'workspace'\n) => {\n const result = await graphqlFetch<T>({\n gateway,\n query,\n variables: sanitizeMutationInput(variables),\n authToken: params.authToken,\n // `apiGatewayUrl` is the workspace gateway base (dev override only). The\n // global gateway (e.g. billing overlap) resolves its own URL from fe-libs\n // config, so never force the workspace base onto a global-gateway call.\n baseUrl: gateway === 'workspace' ? params.apiGatewayUrl : undefined,\n extraHeaders: {\n ...(gateway === 'workspace' && params.workspaceId\n ? { 'x-workspace-id': params.workspaceId }\n : {}),\n },\n });\n return parseGraphql(result as GraphqlResult<T>, fallbackMessage);\n};\n\n// Overlap queries are best-effort: they enrich the crew bootstrap with real\n// wspace/global platform data but must never block the page if a field is\n// unavailable in a given environment. Swallow to null, but surface the reason\n// in dev so schema-arg drift (the historical failure mode) is visible.\n// Vite injects `import.meta.env.DEV`, but this package's tsconfig does not pull\n// in `vite/client` ambient types — narrow through a typed shape instead of `any`.\nconst isDevEnv = (): boolean => Boolean((import.meta as { env?: { DEV?: boolean } }).env?.DEV);\n\nconst runOverlap = async <T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n params: InitParams,\n fallbackMessage: string,\n gateway: Gateway = 'workspace'\n): Promise<T | null> => {\n try {\n return await runGraphql<T>(query, variables, params, fallbackMessage, gateway);\n } catch (error) {\n if (isDevEnv()) {\n console.warn(`[crewfoundry] overlap query skipped: ${fallbackMessage}`, error);\n }\n return null;\n }\n};\n\n// ── Store Interface ─────────────────────────────────────────────\ninterface CrewFoundryState {\n // Overview\n metrics: OverviewMetric[];\n workItems: WorkItem[];\n selectedView: string;\n\n // Domain data\n employees: Employee[];\n departments: Department[];\n jobPostings: JobPosting[];\n candidates: Candidate[];\n interviews: Interview[];\n courses: LearningCourse[];\n learningPaths: LearningPath[];\n marketplaceServices: MarketplaceService[];\n announcements: Announcement[];\n teams: Team[];\n projects: Project[];\n payrollRecords: PayrollRecord[];\n leaveRequests: LeaveRequest[];\n timeEntries: TimeEntry[];\n notifications: Notification[];\n paymentMethods: ExternalPaymentMethod[];\n invoices: Invoice[];\n vendors: Vendor[];\n clients: Client[];\n employeeDocuments: CrewEmployeeDocument[];\n onboardings: CrewOnboarding[];\n onboardingsLoaded: boolean;\n\n // Actions\n initialized: boolean;\n loading: boolean;\n error: string | null;\n initParams: InitParams;\n initializeData: (params: InitParams) => Promise<void>;\n setSelectedView: (view: string) => void;\n setWorkItems: (items: WorkItem[]) => void;\n addEmployee: (employee: Employee) => Promise<void>;\n updateEmployee: (id: string, updates: Partial<Employee>) => Promise<void>;\n removeEmployee: (id: string) => Promise<void>;\n addJobPosting: (job: JobPosting) => Promise<void>;\n updateJobPosting: (id: string, updates: Partial<JobPosting>) => Promise<void>;\n addCandidate: (candidate: Candidate) => Promise<void>;\n updateCandidate: (id: string, updates: Partial<Candidate>) => Promise<void>;\n removeJobPosting: (id: string) => Promise<void>;\n removeCandidate: (id: string) => Promise<void>;\n addAnnouncement: (announcement: Announcement) => Promise<void>;\n updateAnnouncement: (id: string, updates: Partial<Announcement>) => Promise<void>;\n removeAnnouncement: (id: string) => Promise<void>;\n addLeaveRequest: (request: LeaveRequest) => Promise<void>;\n updateLeaveRequest: (id: string, updates: Partial<LeaveRequest>) => Promise<void>;\n addInterview: (interview: Interview) => Promise<void>;\n updateInterview: (id: string, updates: Partial<Interview>) => Promise<void>;\n removeInterview: (id: string) => Promise<void>;\n addInvoice: (invoice: Invoice) => Promise<void>;\n updateInvoice: (id: string, updates: Partial<Invoice>) => Promise<void>;\n removeInvoice: (id: string) => Promise<void>;\n addVendor: (vendor: Vendor) => Promise<void>;\n updateVendor: (id: string, updates: Partial<Vendor>) => Promise<void>;\n removeVendor: (id: string) => Promise<void>;\n addClient: (client: Client) => Promise<void>;\n updateClient: (id: string, updates: Partial<Client>) => Promise<void>;\n removeClient: (id: string) => Promise<void>;\n addTeam: (team: Team) => Promise<void>;\n updateTeam: (id: string, updates: Partial<Team>) => Promise<void>;\n removeTeam: (id: string) => Promise<void>;\n addProject: (project: Project) => Promise<void>;\n updateProject: (id: string, updates: Partial<Project>) => Promise<void>;\n removeProject: (id: string) => Promise<void>;\n addMarketplaceService: (service: MarketplaceService) => Promise<void>;\n updateMarketplaceService: (id: string, updates: Partial<MarketplaceService>) => Promise<void>;\n removeMarketplaceService: (id: string) => Promise<void>;\n addDepartment: (department: Department) => Promise<void>;\n updateDepartment: (id: string, updates: Partial<Department>) => Promise<void>;\n removeDepartment: (id: string) => Promise<void>;\n addCourse: (course: LearningCourse) => Promise<void>;\n updateCourse: (id: string, updates: Partial<LearningCourse>) => Promise<void>;\n removeCourse: (id: string) => Promise<void>;\n enrollCourse: (id: string) => Promise<void>;\n addLearningPath: (path: LearningPath) => Promise<void>;\n updateLearningPath: (id: string, updates: Partial<LearningPath>) => Promise<void>;\n removeLearningPath: (id: string) => Promise<void>;\n addPayrollRecord: (record: PayrollRecord) => Promise<void>;\n updatePayrollRecord: (id: string, updates: Partial<PayrollRecord>) => Promise<void>;\n removePayrollRecord: (id: string) => Promise<void>;\n addTimeEntry: (entry: TimeEntry) => Promise<void>;\n updateTimeEntry: (id: string, updates: Partial<TimeEntry>) => Promise<void>;\n removeTimeEntry: (id: string) => Promise<void>;\n markNotificationRead: (id: string) => Promise<void>;\n markAllNotificationsRead: () => Promise<void>;\n\n // BOFF-3987 — employee documents\n fetchEmployeeDocuments: (employeeId: string) => Promise<void>;\n uploadEmployeeDocument: (params: {\n employeeId: string;\n file: File;\n title: string;\n category?: string;\n }) => Promise<void>;\n detachEmployeeDocument: (id: string) => Promise<void>;\n\n // BOFF-3983 — onboarding\n fetchOnboardings: () => Promise<void>;\n createOnboarding: (input: {\n candidateId?: string;\n employeeId?: string;\n fullName: string;\n position: string;\n department?: string;\n startDate?: string;\n }) => Promise<void>;\n updateOnboarding: (id: string, updates: Partial<CrewOnboarding>) => Promise<void>;\n removeOnboarding: (id: string) => Promise<void>;\n createOnboardingTask: (input: {\n onboardingId: string;\n stage: OnboardingStage;\n title: string;\n assigneeActorId?: string;\n assigneeName?: string;\n dueDate?: string;\n sortOrder?: number;\n }) => Promise<void>;\n updateOnboardingTask: (id: string, updates: Partial<CrewOnboardingTask>) => Promise<void>;\n removeOnboardingTask: (id: string) => Promise<void>;\n toggleOnboardingTask: (id: string, completed: boolean) => Promise<void>;\n}\n\nexport const useCrewFoundryStore = create<CrewFoundryState>((set) => ({\n // Overview\n metrics: [\n { label: 'Total Employees', value: '247', trend: '+5.2%' },\n { label: 'Open Positions', value: '24', trend: '+3 this week' },\n { label: 'Hiring Pipeline', value: '347', trend: '+52 applications' },\n { label: 'Employee Satisfaction', value: '4.6/5', trend: '+0.2' },\n ],\n workItems: [\n {\n id: 'w1',\n title: 'Q1 Performance Review Cycle',\n status: 'active',\n owner: 'HR',\n updatedAt: '2h ago',\n },\n {\n id: 'w2',\n title: 'New Health Benefits Enrollment',\n status: 'active',\n owner: 'Benefits',\n updatedAt: '5h ago',\n },\n {\n id: 'w3',\n title: 'Engineering Headcount Planning',\n status: 'at_risk',\n owner: 'Recruiting',\n updatedAt: '1d ago',\n },\n {\n id: 'w4',\n title: 'Employee Onboarding Automation',\n status: 'completed',\n owner: 'HR Ops',\n updatedAt: '2d ago',\n },\n ],\n selectedView: 'overview',\n initialized: false,\n loading: false,\n error: null,\n initParams: {},\n\n // Domain data\n employees: [],\n departments: [],\n jobPostings: [],\n candidates: [],\n interviews: [],\n courses: [],\n learningPaths: [],\n marketplaceServices: [],\n announcements: [],\n teams: [],\n projects: [],\n payrollRecords: [],\n leaveRequests: [],\n timeEntries: [],\n notifications: [],\n paymentMethods: [],\n invoices: [],\n vendors: [],\n clients: [],\n employeeDocuments: [],\n onboardings: [],\n onboardingsLoaded: false,\n\n // Actions\n initializeData: async (params) => {\n if (!params.workspaceId) {\n return;\n }\n set({ loading: true, error: null, initParams: params });\n try {\n const [workspaceWithOverlapData, billingOverlap, payrollData] = await Promise.all([\n runOverlap<WorkspaceBootstrapWithOverlapResponse>(\n WORKSPACE_BOOTSTRAP_WITH_OVERLAP_QUERY,\n {\n workspaceId: params.workspaceId,\n projectPagination: { limit: 50, offset: 0 },\n groupFirst: 30,\n conversationFirst: 30,\n },\n params,\n 'Unable to load workspace bootstrap with overlap data'\n ),\n // getBillingAccountsByOrg lives on the GLOBAL supergraph, not wspace —\n // route it to the global gateway (org context comes from the x-org-id\n // header the gateway auto-attaches for global-gateway calls).\n runOverlap<OverlapBillingResponse>(\n OVERLAP_BILLING_QUERY,\n undefined,\n params,\n 'Unable to load overlap billing data',\n 'global'\n ),\n // Payroll (BOFF-4887): fetched via runOverlap (best-effort), not\n // runGraphql, because crewPayrollRecords is gated by the dedicated\n // crewfoundry-payroll RBAC resource — a caller without that grant\n // (e.g. Workforce Coordinator) gets a FORBIDDEN response here, which\n // must degrade to an empty payroll list, not fail the whole\n // dashboard load.\n runOverlap<CrewPayrollRecordsResponse>(\n CREW_PAYROLL_RECORDS_QUERY,\n undefined,\n params,\n 'Unable to load payroll records'\n ),\n ]);\n\n const bootstrap = workspaceWithOverlapData\n ? workspaceWithOverlapData.crewfoundryBootstrap\n : (\n await runGraphql<BootstrapPayload>(\n BOOTSTRAP_QUERY,\n undefined,\n params,\n 'Unable to load CrewFoundry data'\n )\n ).crewfoundryBootstrap;\n\n const overlapTeams = workspaceWithOverlapData\n ? mapOverlapTeams(workspaceWithOverlapData.groups.edges)\n : [];\n const overlapProjects = workspaceWithOverlapData\n ? mapOverlapProjects(workspaceWithOverlapData.projects.items, overlapTeams)\n : [];\n const overlapNotifications = workspaceWithOverlapData\n ? mapConversationNotifications(workspaceWithOverlapData.conversations.edges)\n : [];\n\n const teams = overlapTeams.length > 0 ? overlapTeams : bootstrap.teams;\n const projects = overlapProjects.length > 0 ? overlapProjects : bootstrap.projects;\n const notifications = overlapNotifications;\n const paymentMethods = billingOverlap ? mapBillingMethods(billingOverlap) : [];\n\n // Normalize enum casing (UPPER_SNAKE from the backend -> lower_snake) once, per entity, so\n // every downstream count/filter/badge and the metrics below all operate on the same casing.\n const nEmployees = bootstrap.employees.map((e) => lowerEnumKeys(e, ENUM_KEYS.employee));\n const nDepartments = bootstrap.departments.map((d) => lowerEnumKeys(d, ENUM_KEYS.department));\n const nJobPostings = bootstrap.jobPostings.map((j) => lowerEnumKeys(j, ENUM_KEYS.jobPosting));\n const nCandidates = bootstrap.candidates.map((c) => lowerEnumKeys(c, ENUM_KEYS.candidate));\n const nInterviews = bootstrap.interviews.map((i) => lowerEnumKeys(i, ENUM_KEYS.interview));\n const nCourses: LearningCourse[] = [];\n const nMarketplaceServices: MarketplaceService[] = [];\n const nAnnouncements = bootstrap.announcements.map((a) =>\n lowerEnumKeys(a, ENUM_KEYS.announcement)\n );\n const nTeams = teams.map((t) => lowerEnumKeys(t, ENUM_KEYS.team));\n const nProjects = projects.map((p) => lowerEnumKeys(p, ENUM_KEYS.project));\n // Payroll (BOFF-4887): sourced from its own dedicated, crewfoundry-payroll\n // gated query, not the bootstrap response — see CREW_PAYROLL_RECORDS_QUERY\n // above. `payrollData` is null when the query fails or the caller lacks\n // payroll access; either way that degrades to an empty list.\n const nPayrollRecords = (payrollData?.crewPayrollRecords ?? []).map((r) =>\n lowerEnumKeys(r, ENUM_KEYS.payrollRecord)\n );\n const nLeaveRequests = bootstrap.leaveRequests.map((r) =>\n lowerEnumKeys(r, ENUM_KEYS.leaveRequest)\n );\n const nTimeEntries = bootstrap.timeEntries.map((t) => lowerEnumKeys(t, ENUM_KEYS.timeEntry));\n const nNotifications = notifications.map((n) => lowerEnumKeys(n, ENUM_KEYS.notification));\n const nPaymentMethods = paymentMethods.map((m) => lowerEnumKeys(m, ENUM_KEYS.paymentMethod));\n const nInvoices: Invoice[] = [];\n const nVendors = bootstrap.vendors.map((v) => lowerEnumKeys(v, ENUM_KEYS.vendor));\n const nClients = bootstrap.clients.map((c) => lowerEnumKeys(c, ENUM_KEYS.client));\n\n set({\n employees: nEmployees,\n departments: nDepartments,\n jobPostings: nJobPostings,\n candidates: nCandidates,\n interviews: nInterviews,\n courses: nCourses,\n learningPaths: [],\n marketplaceServices: nMarketplaceServices,\n announcements: nAnnouncements,\n teams: nTeams,\n projects: nProjects,\n payrollRecords: nPayrollRecords,\n leaveRequests: nLeaveRequests,\n timeEntries: nTimeEntries,\n notifications: nNotifications,\n paymentMethods: nPaymentMethods,\n invoices: nInvoices,\n vendors: nVendors,\n clients: nClients,\n metrics: [\n { label: 'Total Employees', value: String(nEmployees.length), trend: 'Live' },\n {\n label: 'Open Positions',\n value: String(nJobPostings.filter((j) => j.status === 'active').length),\n trend: 'Live',\n },\n { label: 'Hiring Pipeline', value: String(nCandidates.length), trend: 'Live' },\n {\n label: 'Cross-Team Projects',\n value: String(nProjects.filter((project) => project.status === 'active').length),\n trend: 'Live',\n },\n ],\n initialized: true,\n loading: false,\n });\n } catch (error) {\n set({\n error: error instanceof Error ? error.message : 'Unable to load CrewFoundry data',\n loading: false,\n });\n }\n },\n setSelectedView: (view) => set({ selectedView: view }),\n setWorkItems: (items) => set({ workItems: items }),\n addEmployee: async (employee) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewEmployee: Employee }>(\n CREATE_EMPLOYEE_MUTATION,\n {\n input: {\n ...employee,\n status: normalizeStatus(employee.status),\n type: normalizeStatus(employee.type),\n },\n },\n params,\n 'Unable to create employee'\n );\n set((state) => ({\n employees: [lowerEnumKeys(data.createCrewEmployee, ENUM_KEYS.employee), ...state.employees],\n }));\n },\n updateEmployee: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const payload = {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n };\n const data = await runGraphql<{ updateCrewEmployee: Employee }>(\n UPDATE_EMPLOYEE_MUTATION,\n { id, input: payload },\n params,\n 'Unable to update employee'\n );\n set((state) => ({\n employees: state.employees.map((e) =>\n e.id === id ? lowerEnumKeys(data.updateCrewEmployee, ENUM_KEYS.employee) : e\n ),\n }));\n },\n removeEmployee: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewEmployee: boolean }>(\n REMOVE_EMPLOYEE_MUTATION,\n { id },\n params,\n 'Unable to remove employee'\n );\n set((state) => ({ employees: state.employees.filter((e) => e.id !== id) }));\n },\n addJobPosting: async (job) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewJobPosting: JobPosting }>(\n CREATE_JOB_MUTATION,\n {\n input: {\n ...job,\n status: normalizeStatus(job.status),\n },\n },\n params,\n 'Unable to create job posting'\n );\n set((state) => ({\n jobPostings: [\n lowerEnumKeys(data.createCrewJobPosting, ENUM_KEYS.jobPosting),\n ...state.jobPostings,\n ],\n }));\n },\n updateJobPosting: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewJobPosting: JobPosting }>(\n UPDATE_JOB_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update job posting'\n );\n set((state) => ({\n jobPostings: state.jobPostings.map((j) =>\n j.id === id ? lowerEnumKeys(data.updateCrewJobPosting, ENUM_KEYS.jobPosting) : j\n ),\n }));\n },\n addCandidate: async (candidate) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewCandidate: Candidate }>(\n CREATE_CANDIDATE_MUTATION,\n { input: { ...candidate, status: normalizeStatus(candidate.status) } },\n params,\n 'Unable to create candidate'\n );\n set((state) => ({\n candidates: [\n lowerEnumKeys(data.createCrewCandidate, ENUM_KEYS.candidate),\n ...state.candidates,\n ],\n }));\n },\n updateCandidate: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewCandidate: Candidate }>(\n UPDATE_CANDIDATE_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update candidate'\n );\n set((state) => ({\n candidates: state.candidates.map((c) =>\n c.id === id ? lowerEnumKeys(data.updateCrewCandidate, ENUM_KEYS.candidate) : c\n ),\n }));\n },\n addAnnouncement: async (announcement) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewAnnouncement: Announcement }>(\n CREATE_ANNOUNCEMENT_MUTATION,\n { input: announcement },\n params,\n 'Unable to create announcement'\n );\n set((state) => ({\n announcements: [\n lowerEnumKeys(data.createCrewAnnouncement, ENUM_KEYS.announcement),\n ...state.announcements,\n ],\n }));\n },\n addLeaveRequest: async (request) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewLeaveRequest: LeaveRequest }>(\n CREATE_LEAVE_MUTATION,\n {\n input: {\n ...request,\n type: normalizeStatus(request.type),\n status: normalizeStatus(request.status),\n },\n },\n params,\n 'Unable to create leave request'\n );\n set((state) => ({\n leaveRequests: [\n lowerEnumKeys(data.createCrewLeaveRequest, ENUM_KEYS.leaveRequest),\n ...state.leaveRequests,\n ],\n }));\n },\n updateLeaveRequest: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewLeaveRequest: LeaveRequest }>(\n UPDATE_LEAVE_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update leave request'\n );\n set((state) => ({\n leaveRequests: state.leaveRequests.map((l) =>\n l.id === id ? lowerEnumKeys(data.updateCrewLeaveRequest, ENUM_KEYS.leaveRequest) : l\n ),\n }));\n },\n markNotificationRead: async (id) => {\n set((state) => ({\n notifications: state.notifications.map((n) => (n.id === id ? { ...n, read: true } : n)),\n }));\n },\n markAllNotificationsRead: async () => {\n set((state) => ({ notifications: state.notifications.map((n) => ({ ...n, read: true })) }));\n },\n\n // ── Extra removes for existing entities ───────────────────────\n removeJobPosting: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewJobPosting: boolean }>(\n REMOVE_JOB_MUTATION,\n { id },\n params,\n 'Unable to remove job posting'\n );\n set((state) => ({ jobPostings: state.jobPostings.filter((j) => j.id !== id) }));\n },\n removeCandidate: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewCandidate: boolean }>(\n REMOVE_CANDIDATE_MUTATION,\n { id },\n params,\n 'Unable to remove candidate'\n );\n set((state) => ({ candidates: state.candidates.filter((c) => c.id !== id) }));\n },\n updateAnnouncement: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewAnnouncement: Announcement }>(\n UPDATE_ANNOUNCEMENT_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update announcement'\n );\n set((state) => ({\n announcements: state.announcements.map((a) =>\n a.id === id ? lowerEnumKeys(data.updateCrewAnnouncement, ENUM_KEYS.announcement) : a\n ),\n }));\n },\n removeAnnouncement: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewAnnouncement: boolean }>(\n REMOVE_ANNOUNCEMENT_MUTATION,\n { id },\n params,\n 'Unable to remove announcement'\n );\n set((state) => ({ announcements: state.announcements.filter((a) => a.id !== id) }));\n },\n\n // ── Interview (enum: type, status) ────────────────────────────\n addInterview: async (interview) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewInterview: Interview }>(\n CREATE_INTERVIEW_MUTATION,\n {\n input: {\n ...interview,\n type: normalizeStatus(interview.type),\n status: normalizeStatus(interview.status),\n },\n },\n params,\n 'Unable to schedule interview'\n );\n set((state) => ({\n interviews: [\n lowerEnumKeys(data.createCrewInterview, ENUM_KEYS.interview),\n ...state.interviews,\n ],\n }));\n },\n updateInterview: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewInterview: Interview }>(\n UPDATE_INTERVIEW_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.type ? { type: normalizeStatus(updates.type) } : {}),\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update interview'\n );\n set((state) => ({\n interviews: state.interviews.map((i) =>\n i.id === id ? lowerEnumKeys(data.updateCrewInterview, ENUM_KEYS.interview) : i\n ),\n }));\n },\n removeInterview: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewInterview: boolean }>(\n REMOVE_INTERVIEW_MUTATION,\n { id },\n params,\n 'Unable to remove interview'\n );\n set((state) => ({ interviews: state.interviews.filter((i) => i.id !== id) }));\n },\n\n // ── Invoice data is owned by global-billing-svc ───────────────\n addInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n updateInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n removeInvoice: async () => {\n throw sharedOwnerError('Invoices');\n },\n\n // ── Vendor (enum: status) ─────────────────────────────────────\n addVendor: async (vendor) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewVendor: Vendor }>(\n CREATE_VENDOR_MUTATION,\n { input: { ...vendor, status: normalizeStatus(vendor.status) } },\n params,\n 'Unable to create vendor'\n );\n set((state) => ({\n vendors: [lowerEnumKeys(data.createCrewVendor, ENUM_KEYS.vendor), ...state.vendors],\n }));\n },\n updateVendor: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewVendor: Vendor }>(\n UPDATE_VENDOR_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update vendor'\n );\n set((state) => ({\n vendors: state.vendors.map((v) =>\n v.id === id ? lowerEnumKeys(data.updateCrewVendor, ENUM_KEYS.vendor) : v\n ),\n }));\n },\n removeVendor: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewVendor: boolean }>(\n REMOVE_VENDOR_MUTATION,\n { id },\n params,\n 'Unable to remove vendor'\n );\n set((state) => ({ vendors: state.vendors.filter((v) => v.id !== id) }));\n },\n\n // ── Client (enum: status; `since`) ────────────────────────────\n addClient: async (client) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewClient: Client }>(\n CREATE_CLIENT_MUTATION,\n { input: { ...client, status: normalizeStatus(client.status) } },\n params,\n 'Unable to create client'\n );\n set((state) => ({\n clients: [lowerEnumKeys(data.createCrewClient, ENUM_KEYS.client), ...state.clients],\n }));\n },\n updateClient: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewClient: Client }>(\n UPDATE_CLIENT_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update client'\n );\n set((state) => ({\n clients: state.clients.map((c) =>\n c.id === id ? lowerEnumKeys(data.updateCrewClient, ENUM_KEYS.client) : c\n ),\n }));\n },\n removeClient: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewClient: boolean }>(\n REMOVE_CLIENT_MUTATION,\n { id },\n params,\n 'Unable to remove client'\n );\n set((state) => ({ clients: state.clients.filter((c) => c.id !== id) }));\n },\n\n // ── Team (plain status; not normalized) ───────────────────────\n addTeam: async (team) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewTeam: Team }>(\n CREATE_TEAM_MUTATION,\n { input: team },\n params,\n 'Unable to create team'\n );\n set((state) => ({\n teams: [lowerEnumKeys(data.createCrewTeam, ENUM_KEYS.team), ...state.teams],\n }));\n },\n updateTeam: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewTeam: Team }>(\n UPDATE_TEAM_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update team'\n );\n set((state) => ({\n teams: state.teams.map((t) =>\n t.id === id ? lowerEnumKeys(data.updateCrewTeam, ENUM_KEYS.team) : t\n ),\n }));\n },\n removeTeam: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewTeam: boolean }>(\n REMOVE_TEAM_MUTATION,\n { id },\n params,\n 'Unable to remove team'\n );\n set((state) => ({ teams: state.teams.filter((t) => t.id !== id) }));\n },\n\n // ── Project (enum: status, priority) ──────────────────────────\n addProject: async (project) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewProject: Project }>(\n CREATE_PROJECT_MUTATION,\n {\n input: {\n ...project,\n status: normalizeStatus(project.status),\n priority: normalizeStatus(project.priority),\n },\n },\n params,\n 'Unable to create project'\n );\n set((state) => ({\n projects: [lowerEnumKeys(data.createCrewProject, ENUM_KEYS.project), ...state.projects],\n }));\n },\n updateProject: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewProject: Project }>(\n UPDATE_PROJECT_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n ...(updates.priority ? { priority: normalizeStatus(updates.priority) } : {}),\n },\n },\n params,\n 'Unable to update project'\n );\n set((state) => ({\n projects: state.projects.map((p) =>\n p.id === id ? lowerEnumKeys(data.updateCrewProject, ENUM_KEYS.project) : p\n ),\n }));\n },\n removeProject: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewProject: boolean }>(\n REMOVE_PROJECT_MUTATION,\n { id },\n params,\n 'Unable to remove project'\n );\n set((state) => ({ projects: state.projects.filter((p) => p.id !== id) }));\n },\n\n // ── Marketplace data is owned by global-store-svc ─────────────\n addMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n updateMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n removeMarketplaceService: async () => {\n throw sharedOwnerError('Marketplace services');\n },\n\n // ── Department (plain status; not normalized) ─────────────────\n addDepartment: async (department) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewDepartment: Department }>(\n CREATE_DEPARTMENT_MUTATION,\n { input: department },\n params,\n 'Unable to create department'\n );\n set((state) => ({\n departments: [\n lowerEnumKeys(data.createCrewDepartment, ENUM_KEYS.department),\n ...state.departments,\n ],\n }));\n },\n updateDepartment: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewDepartment: Department }>(\n UPDATE_DEPARTMENT_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update department'\n );\n set((state) => ({\n departments: state.departments.map((d) =>\n d.id === id ? lowerEnumKeys(data.updateCrewDepartment, ENUM_KEYS.department) : d\n ),\n }));\n },\n removeDepartment: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewDepartment: boolean }>(\n REMOVE_DEPARTMENT_MUTATION,\n { id },\n params,\n 'Unable to remove department'\n );\n set((state) => ({ departments: state.departments.filter((d) => d.id !== id) }));\n },\n\n // ── Learning data is owned by the shared learning service ─────\n addCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n updateCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n removeCourse: async () => {\n throw sharedOwnerError('Courses');\n },\n enrollCourse: async () => {\n throw sharedOwnerError('Course enrollment');\n },\n addLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n updateLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n removeLearningPath: async () => {\n throw sharedOwnerError('Learning paths');\n },\n\n // ── PayrollRecord (enum: status) ──────────────────────────────\n addPayrollRecord: async (record) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewPayrollRecord: PayrollRecord }>(\n CREATE_PAYROLL_MUTATION,\n { input: { ...record, status: normalizeStatus(record.status) } },\n params,\n 'Unable to create payroll record'\n );\n set((state) => ({\n payrollRecords: [\n lowerEnumKeys(data.createCrewPayrollRecord, ENUM_KEYS.payrollRecord),\n ...state.payrollRecords,\n ],\n }));\n },\n updatePayrollRecord: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewPayrollRecord: PayrollRecord }>(\n UPDATE_PAYROLL_MUTATION,\n {\n id,\n input: {\n ...updates,\n ...(updates.status ? { status: normalizeStatus(updates.status) } : {}),\n },\n },\n params,\n 'Unable to update payroll record'\n );\n set((state) => ({\n payrollRecords: state.payrollRecords.map((p) =>\n p.id === id ? lowerEnumKeys(data.updateCrewPayrollRecord, ENUM_KEYS.payrollRecord) : p\n ),\n }));\n },\n removePayrollRecord: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewPayrollRecord: boolean }>(\n REMOVE_PAYROLL_MUTATION,\n { id },\n params,\n 'Unable to remove payroll record'\n );\n set((state) => ({ payrollRecords: state.payrollRecords.filter((p) => p.id !== id) }));\n },\n\n // ── TimeEntry (plain status; not normalized) ──────────────────\n addTimeEntry: async (entry) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewTimeEntry: TimeEntry }>(\n CREATE_TIME_ENTRY_MUTATION,\n { input: entry },\n params,\n 'Unable to create time entry'\n );\n set((state) => ({\n timeEntries: [\n lowerEnumKeys(data.createCrewTimeEntry, ENUM_KEYS.timeEntry),\n ...state.timeEntries,\n ],\n }));\n },\n updateTimeEntry: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewTimeEntry: TimeEntry }>(\n UPDATE_TIME_ENTRY_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update time entry'\n );\n set((state) => ({\n timeEntries: state.timeEntries.map((t) =>\n t.id === id ? lowerEnumKeys(data.updateCrewTimeEntry, ENUM_KEYS.timeEntry) : t\n ),\n }));\n },\n removeTimeEntry: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewTimeEntry: boolean }>(\n REMOVE_TIME_ENTRY_MUTATION,\n { id },\n params,\n 'Unable to remove time entry'\n );\n set((state) => ({ timeEntries: state.timeEntries.filter((t) => t.id !== id) }));\n },\n\n // ── BOFF-3987: employee documents ──────────────────────────────\n fetchEmployeeDocuments: async (employeeId) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ employeeDocuments: CrewEmployeeDocument[] }>(\n EMPLOYEE_DOCUMENTS_QUERY,\n { employeeId },\n params,\n 'Unable to load employee documents'\n );\n set((state) => ({\n // Replace only this employee's documents; leave any other employee's\n // already-fetched documents in the flat cache untouched.\n employeeDocuments: [\n ...state.employeeDocuments.filter((d) => d.employeeId !== employeeId),\n ...data.employeeDocuments,\n ],\n }));\n },\n uploadEmployeeDocument: async ({ employeeId, file, title, category }) => {\n const params = useCrewFoundryStore.getState().initParams;\n\n const folder = await runGraphql<{ ensureFolderByPath: { id: string } }>(\n ENSURE_FOLDER_BY_PATH_MUTATION,\n { path: '/CrewFoundry/Employee Documents' },\n params,\n 'Unable to resolve the employee documents folder'\n );\n\n const extension = file.name.includes('.')\n ? file.name.substring(file.name.lastIndexOf('.') + 1)\n : '';\n const initiated = await runGraphql<{\n initiateUpload: { session: { id: string }; uploadUrl: string | null };\n }>(\n INITIATE_UPLOAD_MUTATION,\n {\n input: {\n fileName: file.name,\n fileSize: String(file.size),\n mimeType: file.type || 'application/octet-stream',\n extension,\n folderId: folder.ensureFolderByPath.id,\n },\n },\n params,\n 'Unable to start the document upload'\n );\n\n if (initiated.initiateUpload.uploadUrl) {\n const putResponse = await fetch(initiated.initiateUpload.uploadUrl, {\n method: 'PUT',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n if (!putResponse.ok) {\n throw new Error(`Failed to upload file bytes (status ${putResponse.status})`);\n }\n }\n\n const completed = await runGraphql<{ completeUpload: { file: { id: string } } }>(\n COMPLETE_UPLOAD_MUTATION,\n {\n input: {\n sessionId: initiated.initiateUpload.session.id,\n fileSize: String(file.size),\n folderId: folder.ensureFolderByPath.id,\n },\n },\n params,\n 'Unable to finish the document upload'\n );\n\n const attached = await runGraphql<{ attachEmployeeDocument: CrewEmployeeDocument }>(\n ATTACH_EMPLOYEE_DOCUMENT_MUTATION,\n {\n input: {\n employeeId,\n fileId: completed.completeUpload.file.id,\n title,\n category: category || undefined,\n },\n },\n params,\n 'Unable to attach the document to this employee'\n );\n\n set((state) => ({\n employeeDocuments: [attached.attachEmployeeDocument, ...state.employeeDocuments],\n }));\n },\n detachEmployeeDocument: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ detachEmployeeDocument: boolean }>(\n DETACH_EMPLOYEE_DOCUMENT_MUTATION,\n { id },\n params,\n 'Unable to remove this document'\n );\n set((state) => ({\n employeeDocuments: state.employeeDocuments.filter((d) => d.id !== id),\n }));\n },\n\n // ── BOFF-3983: onboarding ───────────────────────────────────────\n fetchOnboardings: async () => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ crewOnboardings: CrewOnboarding[] }>(\n ONBOARDINGS_QUERY,\n {},\n params,\n 'Unable to load onboarding'\n );\n set({\n onboardings: data.crewOnboardings.map(lowerOnboarding),\n onboardingsLoaded: true,\n });\n },\n createOnboarding: async (input) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewOnboarding: CrewOnboarding }>(\n CREATE_ONBOARDING_MUTATION,\n { input },\n params,\n 'Unable to start onboarding'\n );\n set((state) => ({\n onboardings: [lowerOnboarding(data.createCrewOnboarding), ...state.onboardings],\n }));\n },\n updateOnboarding: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewOnboarding: CrewOnboarding }>(\n UPDATE_ONBOARDING_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update onboarding'\n );\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === id ? lowerOnboarding(data.updateCrewOnboarding) : o\n ),\n }));\n },\n removeOnboarding: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewOnboarding: boolean }>(\n REMOVE_ONBOARDING_MUTATION,\n { id },\n params,\n 'Unable to remove onboarding'\n );\n set((state) => ({ onboardings: state.onboardings.filter((o) => o.id !== id) }));\n },\n createOnboardingTask: async (input) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ createCrewOnboardingTask: CrewOnboardingTask }>(\n CREATE_ONBOARDING_TASK_MUTATION,\n { input },\n params,\n 'Unable to create onboarding task'\n );\n const task = lowerEnumKeys(data.createCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === task.onboardingId\n ? {\n ...o,\n tasks: [...o.tasks, task],\n totalTaskCount: o.totalTaskCount + 1,\n }\n : o\n ),\n }));\n },\n updateOnboardingTask: async (id, updates) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ updateCrewOnboardingTask: CrewOnboardingTask }>(\n UPDATE_ONBOARDING_TASK_MUTATION,\n { id, input: updates },\n params,\n 'Unable to update onboarding task'\n );\n const task = lowerEnumKeys(data.updateCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) =>\n o.id === task.onboardingId\n ? { ...o, tasks: o.tasks.map((t) => (t.id === id ? task : t)) }\n : o\n ),\n }));\n },\n removeOnboardingTask: async (id) => {\n const params = useCrewFoundryStore.getState().initParams;\n await runGraphql<{ removeCrewOnboardingTask: boolean }>(\n REMOVE_ONBOARDING_TASK_MUTATION,\n { id },\n params,\n 'Unable to remove onboarding task'\n );\n set((state) => ({\n onboardings: state.onboardings.map((o) => {\n if (!o.tasks.some((t) => t.id === id)) return o;\n return {\n ...o,\n tasks: o.tasks.filter((t) => t.id !== id),\n totalTaskCount: Math.max(0, o.totalTaskCount - 1),\n };\n }),\n }));\n },\n toggleOnboardingTask: async (id, completed) => {\n const params = useCrewFoundryStore.getState().initParams;\n const data = await runGraphql<{ toggleCrewOnboardingTask: CrewOnboardingTask }>(\n TOGGLE_ONBOARDING_TASK_MUTATION,\n { id, completed },\n params,\n 'Unable to update onboarding task'\n );\n const task = lowerEnumKeys(data.toggleCrewOnboardingTask, ENUM_KEYS.onboardingTask);\n set((state) => ({\n onboardings: state.onboardings.map((o) => {\n if (o.id !== task.onboardingId) return o;\n const tasks = o.tasks.map((t) => (t.id === id ? task : t));\n const completedTaskCount = tasks.filter((t) => t.completedAt).length;\n return {\n ...o,\n tasks,\n completedTaskCount,\n progressPercent:\n tasks.length === 0 ? 0 : Math.round((completedTaskCount / tasks.length) * 1000) / 10,\n };\n }),\n }));\n },\n}));\n"],"mappings":"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"}
|