@hed-hog/operations 0.0.3 → 0.0.285
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.
- package/README.md +122 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/operations-data.controller.d.ts +139 -0
- package/dist/operations-data.controller.d.ts.map +1 -0
- package/dist/operations-data.controller.js +113 -0
- package/dist/operations-data.controller.js.map +1 -0
- package/dist/operations-growth.controller.d.ts +48 -0
- package/dist/operations-growth.controller.d.ts.map +1 -0
- package/dist/operations-growth.controller.js +90 -0
- package/dist/operations-growth.controller.js.map +1 -0
- package/dist/operations.module.d.ts.map +1 -1
- package/dist/operations.module.js +10 -4
- package/dist/operations.module.js.map +1 -1
- package/dist/operations.service.d.ts +178 -0
- package/dist/operations.service.d.ts.map +1 -0
- package/dist/operations.service.js +134 -0
- package/dist/operations.service.js.map +1 -0
- package/hedhog/data/menu.yaml +251 -132
- package/hedhog/data/operations_career_level.yaml +102 -0
- package/hedhog/data/operations_career_track.yaml +8 -0
- package/hedhog/data/operations_certification.yaml +38 -0
- package/hedhog/data/operations_evaluation_cycle.yaml +18 -0
- package/hedhog/data/operations_performance_criterion.yaml +48 -0
- package/hedhog/data/role.yaml +14 -7
- package/hedhog/data/route.yaml +143 -80
- package/hedhog/frontend/app/_components/allocation-calendar.tsx.ejs +56 -56
- package/hedhog/frontend/app/_components/kanban-board.tsx.ejs +83 -83
- package/hedhog/frontend/app/_components/operations-header.tsx.ejs +29 -29
- package/hedhog/frontend/app/_components/section-card.tsx.ejs +32 -32
- package/hedhog/frontend/app/_components/status-badge.tsx.ejs +15 -15
- package/hedhog/frontend/app/_components/timesheet-entry-dialog.tsx.ejs +142 -142
- package/hedhog/frontend/app/_lib/hooks/use-operations-data.ts.ejs +41 -41
- package/hedhog/frontend/app/_lib/hooks/use-operations-growth-data.ts.ejs +63 -0
- package/hedhog/frontend/app/_lib/mocks/allocations.mock.ts.ejs +74 -74
- package/hedhog/frontend/app/_lib/mocks/contracts.mock.ts.ejs +74 -74
- package/hedhog/frontend/app/_lib/mocks/operations-growth.mock.ts.ejs +824 -0
- package/hedhog/frontend/app/_lib/mocks/projects.mock.ts.ejs +60 -60
- package/hedhog/frontend/app/_lib/mocks/tasks.mock.ts.ejs +88 -88
- package/hedhog/frontend/app/_lib/mocks/timesheets.mock.ts.ejs +84 -84
- package/hedhog/frontend/app/_lib/mocks/users.mock.ts.ejs +67 -67
- package/hedhog/frontend/app/_lib/services/contracts.service.ts.ejs +10 -10
- package/hedhog/frontend/app/_lib/services/operations-growth.service.ts.ejs +31 -0
- package/hedhog/frontend/app/_lib/services/projects.service.ts.ejs +10 -10
- package/hedhog/frontend/app/_lib/services/tasks.service.ts.ejs +10 -10
- package/hedhog/frontend/app/_lib/services/timesheets.service.ts.ejs +10 -10
- package/hedhog/frontend/app/_lib/types/operations-growth.ts.ejs +209 -0
- package/hedhog/frontend/app/_lib/types/operations.ts.ejs +95 -95
- package/hedhog/frontend/app/_lib/utils/format.ts.ejs +25 -25
- package/hedhog/frontend/app/_lib/utils/growth.ts.ejs +62 -0
- package/hedhog/frontend/app/_lib/utils/metrics.ts.ejs +103 -103
- package/hedhog/frontend/app/_lib/utils/status.ts.ejs +80 -80
- package/hedhog/frontend/app/allocations/page.tsx.ejs +154 -99
- package/hedhog/frontend/app/approvals/page.tsx.ejs +147 -147
- package/hedhog/frontend/app/career/page.tsx.ejs +143 -0
- package/hedhog/frontend/app/certifications/page.tsx.ejs +201 -0
- package/hedhog/frontend/app/contracts/[id]/page.tsx.ejs +108 -108
- package/hedhog/frontend/app/contracts/page.tsx.ejs +180 -124
- package/hedhog/frontend/app/evaluations/page.tsx.ejs +277 -0
- package/hedhog/frontend/app/goals/page.tsx.ejs +170 -0
- package/hedhog/frontend/app/growth/page.tsx.ejs +288 -0
- package/hedhog/frontend/app/layout.tsx.ejs +9 -9
- package/hedhog/frontend/app/manager/page.tsx.ejs +175 -0
- package/hedhog/frontend/app/page.tsx.ejs +177 -177
- package/hedhog/frontend/app/projects/[id]/page.tsx.ejs +186 -186
- package/hedhog/frontend/app/projects/page.tsx.ejs +111 -111
- package/hedhog/frontend/app/rewards/page.tsx.ejs +195 -0
- package/hedhog/frontend/app/tasks/page.tsx.ejs +47 -47
- package/hedhog/frontend/app/timesheets/page.tsx.ejs +126 -126
- package/hedhog/frontend/messages/en.json +152 -142
- package/hedhog/frontend/messages/pt.json +152 -142
- package/hedhog/table/operations_allocation.yaml +52 -0
- package/hedhog/table/operations_calibration_item.yaml +61 -0
- package/hedhog/table/operations_calibration_session.yaml +25 -0
- package/hedhog/table/operations_career_level.yaml +75 -0
- package/hedhog/table/operations_career_track.yaml +21 -0
- package/hedhog/table/operations_certification.yaml +48 -0
- package/hedhog/table/operations_contract.yaml +57 -0
- package/hedhog/table/operations_employee.yaml +64 -0
- package/hedhog/table/operations_employee_certification.yaml +43 -0
- package/hedhog/table/operations_employee_connect.yaml +61 -0
- package/hedhog/table/operations_employee_evaluation.yaml +113 -0
- package/hedhog/table/operations_employee_evaluation_item.yaml +39 -0
- package/hedhog/table/operations_employee_profile.yaml +80 -0
- package/hedhog/table/operations_employee_skill_matrix.yaml +30 -0
- package/hedhog/table/operations_evaluation_cycle.yaml +31 -0
- package/hedhog/table/operations_goal.yaml +67 -0
- package/hedhog/table/operations_goal_progress.yaml +31 -0
- package/hedhog/table/operations_performance_criterion.yaml +29 -0
- package/hedhog/table/operations_project.yaml +66 -0
- package/hedhog/table/operations_promotion_readiness.yaml +49 -0
- package/hedhog/table/operations_promotion_recommendation.yaml +63 -0
- package/hedhog/table/operations_public_recognition.yaml +46 -0
- package/hedhog/table/operations_reward.yaml +100 -0
- package/hedhog/table/operations_score_event.yaml +81 -0
- package/hedhog/table/operations_task.yaml +60 -0
- package/hedhog/table/operations_timesheet.yaml +49 -0
- package/hedhog/table/operations_timesheet_entry.yaml +51 -0
- package/package.json +4 -4
- package/src/index.ts +2 -1
- package/src/language/en.json +8 -8
- package/src/language/pt.json +8 -8
- package/src/operations-data.controller.ts +54 -0
- package/src/operations-growth.controller.ts +44 -0
- package/src/operations.module.ts +21 -15
- package/src/operations.service.ts +137 -0
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useMemo } from 'react';
|
|
4
|
-
import { allocationsMock } from '../mocks/allocations.mock';
|
|
5
|
-
import { operationsUsersMock } from '../mocks/users.mock';
|
|
6
|
-
import { contractsService } from '../services/contracts.service';
|
|
7
|
-
import { projectsService } from '../services/projects.service';
|
|
8
|
-
import { tasksService } from '../services/tasks.service';
|
|
9
|
-
import { timesheetsService } from '../services/timesheets.service';
|
|
10
|
-
import {
|
|
11
|
-
getApprovalStatusData,
|
|
12
|
-
getDashboardMetrics,
|
|
13
|
-
getDailyTotals,
|
|
14
|
-
getHoursByProject,
|
|
15
|
-
getHoursByUser,
|
|
16
|
-
getPendingApprovalsSummary,
|
|
17
|
-
getRecentTimesheetEntries,
|
|
18
|
-
getWeeklyTrend,
|
|
19
|
-
} from '../utils/metrics';
|
|
20
|
-
|
|
21
|
-
export function useOperationsData() {
|
|
22
|
-
return useMemo(
|
|
23
|
-
() => ({
|
|
24
|
-
users: operationsUsersMock,
|
|
25
|
-
contracts: contractsService.list(),
|
|
26
|
-
projects: projectsService.list(),
|
|
27
|
-
tasks: tasksService.list(),
|
|
28
|
-
timesheets: timesheetsService.list(),
|
|
29
|
-
allocations: allocationsMock,
|
|
30
|
-
dashboardMetrics: getDashboardMetrics(),
|
|
31
|
-
hoursByProject: getHoursByProject(),
|
|
32
|
-
hoursByUser: getHoursByUser(),
|
|
33
|
-
approvalStatusData: getApprovalStatusData(),
|
|
34
|
-
weeklyTrendData: getWeeklyTrend(),
|
|
35
|
-
recentTimesheets: getRecentTimesheetEntries(),
|
|
36
|
-
dailyTotals: getDailyTotals(),
|
|
37
|
-
approvalSummary: getPendingApprovalsSummary(),
|
|
38
|
-
}),
|
|
39
|
-
[]
|
|
40
|
-
);
|
|
41
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { allocationsMock } from '../mocks/allocations.mock';
|
|
5
|
+
import { operationsUsersMock } from '../mocks/users.mock';
|
|
6
|
+
import { contractsService } from '../services/contracts.service';
|
|
7
|
+
import { projectsService } from '../services/projects.service';
|
|
8
|
+
import { tasksService } from '../services/tasks.service';
|
|
9
|
+
import { timesheetsService } from '../services/timesheets.service';
|
|
10
|
+
import {
|
|
11
|
+
getApprovalStatusData,
|
|
12
|
+
getDashboardMetrics,
|
|
13
|
+
getDailyTotals,
|
|
14
|
+
getHoursByProject,
|
|
15
|
+
getHoursByUser,
|
|
16
|
+
getPendingApprovalsSummary,
|
|
17
|
+
getRecentTimesheetEntries,
|
|
18
|
+
getWeeklyTrend,
|
|
19
|
+
} from '../utils/metrics';
|
|
20
|
+
|
|
21
|
+
export function useOperationsData() {
|
|
22
|
+
return useMemo(
|
|
23
|
+
() => ({
|
|
24
|
+
users: operationsUsersMock,
|
|
25
|
+
contracts: contractsService.list(),
|
|
26
|
+
projects: projectsService.list(),
|
|
27
|
+
tasks: tasksService.list(),
|
|
28
|
+
timesheets: timesheetsService.list(),
|
|
29
|
+
allocations: allocationsMock,
|
|
30
|
+
dashboardMetrics: getDashboardMetrics(),
|
|
31
|
+
hoursByProject: getHoursByProject(),
|
|
32
|
+
hoursByUser: getHoursByUser(),
|
|
33
|
+
approvalStatusData: getApprovalStatusData(),
|
|
34
|
+
weeklyTrendData: getWeeklyTrend(),
|
|
35
|
+
recentTimesheets: getRecentTimesheetEntries(),
|
|
36
|
+
dailyTotals: getDailyTotals(),
|
|
37
|
+
approvalSummary: getPendingApprovalsSummary(),
|
|
38
|
+
}),
|
|
39
|
+
[]
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { projectsMock } from '../mocks/projects.mock';
|
|
5
|
+
import { tasksMock } from '../mocks/tasks.mock';
|
|
6
|
+
import { timesheetsMock } from '../mocks/timesheets.mock';
|
|
7
|
+
import { operationsUsersMock } from '../mocks/users.mock';
|
|
8
|
+
import { operationsGrowthService } from '../services/operations-growth.service';
|
|
9
|
+
|
|
10
|
+
export function useOperationsGrowthData() {
|
|
11
|
+
return useMemo(() => {
|
|
12
|
+
const profiles = operationsGrowthService.listProfiles();
|
|
13
|
+
const scoreEvents = operationsGrowthService.listScoreEvents();
|
|
14
|
+
const recommendations =
|
|
15
|
+
operationsGrowthService.listPromotionRecommendations();
|
|
16
|
+
const goals = operationsGrowthService.listGoals();
|
|
17
|
+
const employeeCertifications =
|
|
18
|
+
operationsGrowthService.listEmployeeCertifications();
|
|
19
|
+
|
|
20
|
+
const ranking = [...profiles].sort(
|
|
21
|
+
(left, right) => right.currentScore - left.currentScore
|
|
22
|
+
);
|
|
23
|
+
const managerSummary = {
|
|
24
|
+
promotionEligible: recommendations.filter((item) => item.eligible).length,
|
|
25
|
+
goalsAtRisk: goals.filter((item) => item.status === 'at_risk').length,
|
|
26
|
+
pendingCertifications: employeeCertifications.filter(
|
|
27
|
+
(item) => item.status !== 'achieved'
|
|
28
|
+
).length,
|
|
29
|
+
totalRecognitions: operationsGrowthService.listRecognitions().length,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const scoreHistory = profiles.map((profile) => ({
|
|
33
|
+
employeeId: profile.employeeId,
|
|
34
|
+
events: scoreEvents.filter(
|
|
35
|
+
(event) => event.employeeId === profile.employeeId
|
|
36
|
+
),
|
|
37
|
+
}));
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
users: operationsUsersMock,
|
|
41
|
+
projects: projectsMock,
|
|
42
|
+
tasks: tasksMock,
|
|
43
|
+
timesheets: timesheetsMock,
|
|
44
|
+
careerTracks: operationsGrowthService.listCareerTracks(),
|
|
45
|
+
careerLevels: operationsGrowthService.listCareerLevels(),
|
|
46
|
+
profiles,
|
|
47
|
+
evaluationCycles: operationsGrowthService.listEvaluationCycles(),
|
|
48
|
+
performanceCriteria: operationsGrowthService.listPerformanceCriteria(),
|
|
49
|
+
evaluations: operationsGrowthService.listEvaluations(),
|
|
50
|
+
goals,
|
|
51
|
+
certificationCatalog: operationsGrowthService.listCertificationCatalog(),
|
|
52
|
+
employeeCertifications,
|
|
53
|
+
rewards: operationsGrowthService.listRewards(),
|
|
54
|
+
recognitions: operationsGrowthService.listRecognitions(),
|
|
55
|
+
scoreEvents,
|
|
56
|
+
promotionRecommendations: recommendations,
|
|
57
|
+
ranking,
|
|
58
|
+
managerSummary,
|
|
59
|
+
scoreHistory,
|
|
60
|
+
defaultEmployeeId: 'usr-diego',
|
|
61
|
+
};
|
|
62
|
+
}, []);
|
|
63
|
+
}
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
import type { Allocation } from '../types/operations';
|
|
2
|
-
|
|
3
|
-
export const allocationsMock: Allocation[] = [
|
|
4
|
-
{
|
|
5
|
-
id: 'alloc-001',
|
|
6
|
-
userId: 'usr-ana',
|
|
7
|
-
role: 'Delivery Manager',
|
|
8
|
-
projectId: 'prj-zenith-cloud',
|
|
9
|
-
weeklyHours: 18,
|
|
10
|
-
allocationPercent: 45,
|
|
11
|
-
startDate: '2026-03-03',
|
|
12
|
-
endDate: '2026-06-30',
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
id: 'alloc-002',
|
|
16
|
-
userId: 'usr-bruno',
|
|
17
|
-
role: 'Technical Lead',
|
|
18
|
-
projectId: 'prj-orion-web',
|
|
19
|
-
weeklyHours: 22,
|
|
20
|
-
allocationPercent: 55,
|
|
21
|
-
startDate: '2026-02-10',
|
|
22
|
-
endDate: '2026-06-30',
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: 'alloc-003',
|
|
26
|
-
userId: 'usr-carla',
|
|
27
|
-
role: 'Project Manager',
|
|
28
|
-
projectId: 'prj-atlas-crm',
|
|
29
|
-
weeklyHours: 24,
|
|
30
|
-
allocationPercent: 60,
|
|
31
|
-
startDate: '2026-03-01',
|
|
32
|
-
endDate: '2026-08-31',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
id: 'alloc-004',
|
|
36
|
-
userId: 'usr-diego',
|
|
37
|
-
role: 'Backend Engineer',
|
|
38
|
-
projectId: 'prj-orion-data',
|
|
39
|
-
weeklyHours: 20,
|
|
40
|
-
allocationPercent: 50,
|
|
41
|
-
startDate: '2026-02-03',
|
|
42
|
-
endDate: '2026-09-15',
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: 'alloc-005',
|
|
46
|
-
userId: 'usr-elisa',
|
|
47
|
-
role: 'Frontend Engineer',
|
|
48
|
-
projectId: 'prj-orion-web',
|
|
49
|
-
weeklyHours: 30,
|
|
50
|
-
allocationPercent: 75,
|
|
51
|
-
startDate: '2026-01-20',
|
|
52
|
-
endDate: '2026-06-30',
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
id: 'alloc-006',
|
|
56
|
-
userId: 'usr-fabio',
|
|
57
|
-
role: 'QA Analyst',
|
|
58
|
-
projectId: 'prj-orion-web',
|
|
59
|
-
weeklyHours: 16,
|
|
60
|
-
allocationPercent: 40,
|
|
61
|
-
startDate: '2026-02-17',
|
|
62
|
-
endDate: '2026-05-30',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
id: 'alloc-007',
|
|
66
|
-
userId: 'usr-gabi',
|
|
67
|
-
role: 'UX Designer',
|
|
68
|
-
projectId: 'prj-orion-data',
|
|
69
|
-
weeklyHours: 14,
|
|
70
|
-
allocationPercent: 35,
|
|
71
|
-
startDate: '2026-02-12',
|
|
72
|
-
endDate: '2026-07-31',
|
|
73
|
-
},
|
|
74
|
-
];
|
|
1
|
+
import type { Allocation } from '../types/operations';
|
|
2
|
+
|
|
3
|
+
export const allocationsMock: Allocation[] = [
|
|
4
|
+
{
|
|
5
|
+
id: 'alloc-001',
|
|
6
|
+
userId: 'usr-ana',
|
|
7
|
+
role: 'Delivery Manager',
|
|
8
|
+
projectId: 'prj-zenith-cloud',
|
|
9
|
+
weeklyHours: 18,
|
|
10
|
+
allocationPercent: 45,
|
|
11
|
+
startDate: '2026-03-03',
|
|
12
|
+
endDate: '2026-06-30',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'alloc-002',
|
|
16
|
+
userId: 'usr-bruno',
|
|
17
|
+
role: 'Technical Lead',
|
|
18
|
+
projectId: 'prj-orion-web',
|
|
19
|
+
weeklyHours: 22,
|
|
20
|
+
allocationPercent: 55,
|
|
21
|
+
startDate: '2026-02-10',
|
|
22
|
+
endDate: '2026-06-30',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'alloc-003',
|
|
26
|
+
userId: 'usr-carla',
|
|
27
|
+
role: 'Project Manager',
|
|
28
|
+
projectId: 'prj-atlas-crm',
|
|
29
|
+
weeklyHours: 24,
|
|
30
|
+
allocationPercent: 60,
|
|
31
|
+
startDate: '2026-03-01',
|
|
32
|
+
endDate: '2026-08-31',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'alloc-004',
|
|
36
|
+
userId: 'usr-diego',
|
|
37
|
+
role: 'Backend Engineer',
|
|
38
|
+
projectId: 'prj-orion-data',
|
|
39
|
+
weeklyHours: 20,
|
|
40
|
+
allocationPercent: 50,
|
|
41
|
+
startDate: '2026-02-03',
|
|
42
|
+
endDate: '2026-09-15',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'alloc-005',
|
|
46
|
+
userId: 'usr-elisa',
|
|
47
|
+
role: 'Frontend Engineer',
|
|
48
|
+
projectId: 'prj-orion-web',
|
|
49
|
+
weeklyHours: 30,
|
|
50
|
+
allocationPercent: 75,
|
|
51
|
+
startDate: '2026-01-20',
|
|
52
|
+
endDate: '2026-06-30',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 'alloc-006',
|
|
56
|
+
userId: 'usr-fabio',
|
|
57
|
+
role: 'QA Analyst',
|
|
58
|
+
projectId: 'prj-orion-web',
|
|
59
|
+
weeklyHours: 16,
|
|
60
|
+
allocationPercent: 40,
|
|
61
|
+
startDate: '2026-02-17',
|
|
62
|
+
endDate: '2026-05-30',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'alloc-007',
|
|
66
|
+
userId: 'usr-gabi',
|
|
67
|
+
role: 'UX Designer',
|
|
68
|
+
projectId: 'prj-orion-data',
|
|
69
|
+
weeklyHours: 14,
|
|
70
|
+
allocationPercent: 35,
|
|
71
|
+
startDate: '2026-02-12',
|
|
72
|
+
endDate: '2026-07-31',
|
|
73
|
+
},
|
|
74
|
+
];
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
import type { Contract } from '../types/operations';
|
|
2
|
-
|
|
3
|
-
export const contractsMock: Contract[] = [
|
|
4
|
-
{
|
|
5
|
-
id: 'ctr-orion',
|
|
6
|
-
name: 'Orion Platform Expansion',
|
|
7
|
-
client: 'Orion Retail Group',
|
|
8
|
-
type: 'monthly',
|
|
9
|
-
startDate: '2026-01-01',
|
|
10
|
-
endDate: '2026-12-31',
|
|
11
|
-
hourlyRate: 195,
|
|
12
|
-
hourLimit: 640,
|
|
13
|
-
status: 'active',
|
|
14
|
-
billingRules: [
|
|
15
|
-
'Monthly invoicing on the fifth business day',
|
|
16
|
-
'Overage billed at blended rate above hour cap',
|
|
17
|
-
'Change requests approved by client PM',
|
|
18
|
-
],
|
|
19
|
-
sla: 'P1 response in 2h, P2 in 6h, delivery governance weekly.',
|
|
20
|
-
revisions: ['Revision 1 - January scope uplift', 'Revision 2 - UX squad add-on'],
|
|
21
|
-
linkedProjectIds: ['prj-orion-web', 'prj-orion-data'],
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
id: 'ctr-zenith',
|
|
25
|
-
name: 'Zenith Support Retainer',
|
|
26
|
-
client: 'Zenith Health',
|
|
27
|
-
type: 'tm',
|
|
28
|
-
startDate: '2025-10-15',
|
|
29
|
-
endDate: '2026-10-14',
|
|
30
|
-
hourlyRate: 230,
|
|
31
|
-
hourLimit: 420,
|
|
32
|
-
status: 'active',
|
|
33
|
-
billingRules: [
|
|
34
|
-
'Time and material billing by approved entry',
|
|
35
|
-
'Emergency work charged at 1.25x after 8pm',
|
|
36
|
-
],
|
|
37
|
-
sla: '24x7 on-call for critical incidents with monthly ops review.',
|
|
38
|
-
revisions: ['Revision 1 - Added cloud migration stream'],
|
|
39
|
-
linkedProjectIds: ['prj-zenith-cloud'],
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
id: 'ctr-atlas',
|
|
43
|
-
name: 'Atlas CRM Rollout',
|
|
44
|
-
client: 'Atlas Logistics',
|
|
45
|
-
type: 'fixed',
|
|
46
|
-
startDate: '2026-02-01',
|
|
47
|
-
endDate: '2026-08-31',
|
|
48
|
-
hourlyRate: 175,
|
|
49
|
-
hourLimit: 520,
|
|
50
|
-
status: 'renewal',
|
|
51
|
-
billingRules: [
|
|
52
|
-
'Milestone billing split in 30/40/30',
|
|
53
|
-
'Additional scope converted to change order',
|
|
54
|
-
],
|
|
55
|
-
sla: 'Business hours support, weekly steering committee.',
|
|
56
|
-
revisions: ['Revision 1 - Extended rollout to LATAM team'],
|
|
57
|
-
linkedProjectIds: ['prj-atlas-crm'],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
id: 'ctr-nova',
|
|
61
|
-
name: 'Nova Discovery Program',
|
|
62
|
-
client: 'Nova Energy',
|
|
63
|
-
type: 'fixed',
|
|
64
|
-
startDate: '2025-06-01',
|
|
65
|
-
endDate: '2025-12-15',
|
|
66
|
-
hourlyRate: 160,
|
|
67
|
-
hourLimit: 320,
|
|
68
|
-
status: 'expired',
|
|
69
|
-
billingRules: ['Single invoice on phase completion'],
|
|
70
|
-
sla: 'Advisory cadence only.',
|
|
71
|
-
revisions: ['Final revision approved in November'],
|
|
72
|
-
linkedProjectIds: [],
|
|
73
|
-
},
|
|
74
|
-
];
|
|
1
|
+
import type { Contract } from '../types/operations';
|
|
2
|
+
|
|
3
|
+
export const contractsMock: Contract[] = [
|
|
4
|
+
{
|
|
5
|
+
id: 'ctr-orion',
|
|
6
|
+
name: 'Orion Platform Expansion',
|
|
7
|
+
client: 'Orion Retail Group',
|
|
8
|
+
type: 'monthly',
|
|
9
|
+
startDate: '2026-01-01',
|
|
10
|
+
endDate: '2026-12-31',
|
|
11
|
+
hourlyRate: 195,
|
|
12
|
+
hourLimit: 640,
|
|
13
|
+
status: 'active',
|
|
14
|
+
billingRules: [
|
|
15
|
+
'Monthly invoicing on the fifth business day',
|
|
16
|
+
'Overage billed at blended rate above hour cap',
|
|
17
|
+
'Change requests approved by client PM',
|
|
18
|
+
],
|
|
19
|
+
sla: 'P1 response in 2h, P2 in 6h, delivery governance weekly.',
|
|
20
|
+
revisions: ['Revision 1 - January scope uplift', 'Revision 2 - UX squad add-on'],
|
|
21
|
+
linkedProjectIds: ['prj-orion-web', 'prj-orion-data'],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'ctr-zenith',
|
|
25
|
+
name: 'Zenith Support Retainer',
|
|
26
|
+
client: 'Zenith Health',
|
|
27
|
+
type: 'tm',
|
|
28
|
+
startDate: '2025-10-15',
|
|
29
|
+
endDate: '2026-10-14',
|
|
30
|
+
hourlyRate: 230,
|
|
31
|
+
hourLimit: 420,
|
|
32
|
+
status: 'active',
|
|
33
|
+
billingRules: [
|
|
34
|
+
'Time and material billing by approved entry',
|
|
35
|
+
'Emergency work charged at 1.25x after 8pm',
|
|
36
|
+
],
|
|
37
|
+
sla: '24x7 on-call for critical incidents with monthly ops review.',
|
|
38
|
+
revisions: ['Revision 1 - Added cloud migration stream'],
|
|
39
|
+
linkedProjectIds: ['prj-zenith-cloud'],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'ctr-atlas',
|
|
43
|
+
name: 'Atlas CRM Rollout',
|
|
44
|
+
client: 'Atlas Logistics',
|
|
45
|
+
type: 'fixed',
|
|
46
|
+
startDate: '2026-02-01',
|
|
47
|
+
endDate: '2026-08-31',
|
|
48
|
+
hourlyRate: 175,
|
|
49
|
+
hourLimit: 520,
|
|
50
|
+
status: 'renewal',
|
|
51
|
+
billingRules: [
|
|
52
|
+
'Milestone billing split in 30/40/30',
|
|
53
|
+
'Additional scope converted to change order',
|
|
54
|
+
],
|
|
55
|
+
sla: 'Business hours support, weekly steering committee.',
|
|
56
|
+
revisions: ['Revision 1 - Extended rollout to LATAM team'],
|
|
57
|
+
linkedProjectIds: ['prj-atlas-crm'],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'ctr-nova',
|
|
61
|
+
name: 'Nova Discovery Program',
|
|
62
|
+
client: 'Nova Energy',
|
|
63
|
+
type: 'fixed',
|
|
64
|
+
startDate: '2025-06-01',
|
|
65
|
+
endDate: '2025-12-15',
|
|
66
|
+
hourlyRate: 160,
|
|
67
|
+
hourLimit: 320,
|
|
68
|
+
status: 'expired',
|
|
69
|
+
billingRules: ['Single invoice on phase completion'],
|
|
70
|
+
sla: 'Advisory cadence only.',
|
|
71
|
+
revisions: ['Final revision approved in November'],
|
|
72
|
+
linkedProjectIds: [],
|
|
73
|
+
},
|
|
74
|
+
];
|