@hed-hog/operations 0.0.329 → 0.0.331
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 +5 -5
- package/dist/controllers/operations-collaborators.controller.d.ts +7 -216
- package/dist/controllers/operations-collaborators.controller.d.ts.map +1 -1
- package/dist/controllers/operations-contracts.controller.d.ts +6 -6
- package/dist/controllers/operations-projects.controller.d.ts +25 -0
- package/dist/controllers/operations-projects.controller.d.ts.map +1 -1
- package/dist/controllers/operations-projects.controller.js +48 -0
- package/dist/controllers/operations-projects.controller.js.map +1 -1
- package/dist/controllers/operations-reports.controller.d.ts +1 -1
- package/dist/controllers/operations-tasks.controller.d.ts +30 -5
- package/dist/controllers/operations-tasks.controller.d.ts.map +1 -1
- package/dist/controllers/operations-tasks.controller.js +43 -32
- package/dist/controllers/operations-tasks.controller.js.map +1 -1
- package/dist/controllers/operations-timesheets.controller.d.ts +9 -9
- package/dist/dashboard/components/DashboardLayout.d.ts +30 -0
- package/dist/dashboard/components/DashboardLayout.d.ts.map +1 -0
- package/dist/dashboard/components/DashboardLayout.js +87 -0
- package/dist/dashboard/components/DashboardLayout.js.map +1 -0
- package/dist/dashboard/components/widget-registry.d.ts +23 -0
- package/dist/dashboard/components/widget-registry.d.ts.map +1 -0
- package/dist/dashboard/components/widget-registry.js +245 -0
- package/dist/dashboard/components/widget-registry.js.map +1 -0
- package/dist/dashboard/hooks/useDashboardData.d.ts +20 -0
- package/dist/dashboard/hooks/useDashboardData.d.ts.map +1 -0
- package/dist/dashboard/hooks/useDashboardData.js +24 -0
- package/dist/dashboard/hooks/useDashboardData.js.map +1 -0
- package/dist/dashboard/types/widgets.types.d.ts +233 -0
- package/dist/dashboard/types/widgets.types.d.ts.map +1 -0
- package/dist/dashboard/types/widgets.types.js +6 -0
- package/dist/dashboard/types/widgets.types.js.map +1 -0
- package/dist/dashboard/widgets/CapacityDistribution.d.ts +23 -0
- package/dist/dashboard/widgets/CapacityDistribution.d.ts.map +1 -0
- package/dist/dashboard/widgets/CapacityDistribution.js +11 -0
- package/dist/dashboard/widgets/CapacityDistribution.js.map +1 -0
- package/dist/dashboard/widgets/EffortByProject.d.ts +22 -0
- package/dist/dashboard/widgets/EffortByProject.d.ts.map +1 -0
- package/dist/dashboard/widgets/EffortByProject.js +11 -0
- package/dist/dashboard/widgets/EffortByProject.js.map +1 -0
- package/dist/dashboard/widgets/HeadcountByArea.d.ts +24 -0
- package/dist/dashboard/widgets/HeadcountByArea.d.ts.map +1 -0
- package/dist/dashboard/widgets/HeadcountByArea.js +11 -0
- package/dist/dashboard/widgets/HeadcountByArea.js.map +1 -0
- package/dist/dashboard/widgets/ManagedProjectsStatus.d.ts +18 -0
- package/dist/dashboard/widgets/ManagedProjectsStatus.d.ts.map +1 -0
- package/dist/dashboard/widgets/ManagedProjectsStatus.js +12 -0
- package/dist/dashboard/widgets/ManagedProjectsStatus.js.map +1 -0
- package/dist/dashboard/widgets/MyHoursPeriodKpi.d.ts +22 -0
- package/dist/dashboard/widgets/MyHoursPeriodKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyHoursPeriodKpi.js +12 -0
- package/dist/dashboard/widgets/MyHoursPeriodKpi.js.map +1 -0
- package/dist/dashboard/widgets/MyOpenRequestsKpi.d.ts +19 -0
- package/dist/dashboard/widgets/MyOpenRequestsKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyOpenRequestsKpi.js +17 -0
- package/dist/dashboard/widgets/MyOpenRequestsKpi.js.map +1 -0
- package/dist/dashboard/widgets/MyPendingRequestsList.d.ts +23 -0
- package/dist/dashboard/widgets/MyPendingRequestsList.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyPendingRequestsList.js +14 -0
- package/dist/dashboard/widgets/MyPendingRequestsList.js.map +1 -0
- package/dist/dashboard/widgets/MyProjectAllocationsKpi.d.ts +22 -0
- package/dist/dashboard/widgets/MyProjectAllocationsKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyProjectAllocationsKpi.js +11 -0
- package/dist/dashboard/widgets/MyProjectAllocationsKpi.js.map +1 -0
- package/dist/dashboard/widgets/MyQuickActions.d.ts +23 -0
- package/dist/dashboard/widgets/MyQuickActions.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyQuickActions.js +18 -0
- package/dist/dashboard/widgets/MyQuickActions.js.map +1 -0
- package/dist/dashboard/widgets/MyRelevantDeadlines.d.ts +23 -0
- package/dist/dashboard/widgets/MyRelevantDeadlines.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyRelevantDeadlines.js +22 -0
- package/dist/dashboard/widgets/MyRelevantDeadlines.js.map +1 -0
- package/dist/dashboard/widgets/MyTimesheetStatusKpi.d.ts +17 -0
- package/dist/dashboard/widgets/MyTimesheetStatusKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyTimesheetStatusKpi.js +11 -0
- package/dist/dashboard/widgets/MyTimesheetStatusKpi.js.map +1 -0
- package/dist/dashboard/widgets/MyWeeklyJourney.d.ts +21 -0
- package/dist/dashboard/widgets/MyWeeklyJourney.d.ts.map +1 -0
- package/dist/dashboard/widgets/MyWeeklyJourney.js +19 -0
- package/dist/dashboard/widgets/MyWeeklyJourney.js.map +1 -0
- package/dist/dashboard/widgets/PortfolioCostsKpi.d.ts +19 -0
- package/dist/dashboard/widgets/PortfolioCostsKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/PortfolioCostsKpi.js +12 -0
- package/dist/dashboard/widgets/PortfolioCostsKpi.js.map +1 -0
- package/dist/dashboard/widgets/PortfolioEffortKpi.d.ts +18 -0
- package/dist/dashboard/widgets/PortfolioEffortKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/PortfolioEffortKpi.js +8 -0
- package/dist/dashboard/widgets/PortfolioEffortKpi.js.map +1 -0
- package/dist/dashboard/widgets/PortfolioProjectsKpi.d.ts +22 -0
- package/dist/dashboard/widgets/PortfolioProjectsKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/PortfolioProjectsKpi.js +56 -0
- package/dist/dashboard/widgets/PortfolioProjectsKpi.js.map +1 -0
- package/dist/dashboard/widgets/PortfolioRiskKpi.d.ts +19 -0
- package/dist/dashboard/widgets/PortfolioRiskKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/PortfolioRiskKpi.js +11 -0
- package/dist/dashboard/widgets/PortfolioRiskKpi.js.map +1 -0
- package/dist/dashboard/widgets/ProjectStatusOverview.d.ts +19 -0
- package/dist/dashboard/widgets/ProjectStatusOverview.d.ts.map +1 -0
- package/dist/dashboard/widgets/ProjectStatusOverview.js +18 -0
- package/dist/dashboard/widgets/ProjectStatusOverview.js.map +1 -0
- package/dist/dashboard/widgets/StrategicDeadlines.d.ts +24 -0
- package/dist/dashboard/widgets/StrategicDeadlines.d.ts.map +1 -0
- package/dist/dashboard/widgets/StrategicDeadlines.js +22 -0
- package/dist/dashboard/widgets/StrategicDeadlines.js.map +1 -0
- package/dist/dashboard/widgets/TeamApprovalQueue.d.ts +24 -0
- package/dist/dashboard/widgets/TeamApprovalQueue.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamApprovalQueue.js +12 -0
- package/dist/dashboard/widgets/TeamApprovalQueue.js.map +1 -0
- package/dist/dashboard/widgets/TeamCapacityKpi.d.ts +18 -0
- package/dist/dashboard/widgets/TeamCapacityKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamCapacityKpi.js +19 -0
- package/dist/dashboard/widgets/TeamCapacityKpi.js.map +1 -0
- package/dist/dashboard/widgets/TeamHeadcountKpi.d.ts +22 -0
- package/dist/dashboard/widgets/TeamHeadcountKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamHeadcountKpi.js +56 -0
- package/dist/dashboard/widgets/TeamHeadcountKpi.js.map +1 -0
- package/dist/dashboard/widgets/TeamHoursKpi.d.ts +19 -0
- package/dist/dashboard/widgets/TeamHoursKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamHoursKpi.js +13 -0
- package/dist/dashboard/widgets/TeamHoursKpi.js.map +1 -0
- package/dist/dashboard/widgets/TeamPendingApprovalsKpi.d.ts +20 -0
- package/dist/dashboard/widgets/TeamPendingApprovalsKpi.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamPendingApprovalsKpi.js +11 -0
- package/dist/dashboard/widgets/TeamPendingApprovalsKpi.js.map +1 -0
- package/dist/dashboard/widgets/TeamUtilizationOverview.d.ts +18 -0
- package/dist/dashboard/widgets/TeamUtilizationOverview.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamUtilizationOverview.js +17 -0
- package/dist/dashboard/widgets/TeamUtilizationOverview.js.map +1 -0
- package/dist/dashboard/widgets/TeamWorkloadAlerts.d.ts +24 -0
- package/dist/dashboard/widgets/TeamWorkloadAlerts.d.ts.map +1 -0
- package/dist/dashboard/widgets/TeamWorkloadAlerts.js +19 -0
- package/dist/dashboard/widgets/TeamWorkloadAlerts.js.map +1 -0
- package/dist/dashboard/widgets/index.d.ts +24 -0
- package/dist/dashboard/widgets/index.d.ts.map +1 -0
- package/dist/dashboard/widgets/index.js +54 -0
- package/dist/dashboard/widgets/index.js.map +1 -0
- package/dist/dto/create-collaborator.dto.d.ts +0 -1
- package/dist/dto/create-collaborator.dto.d.ts.map +1 -1
- package/dist/dto/create-collaborator.dto.js +0 -6
- package/dist/dto/create-collaborator.dto.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/operations.controller.d.ts +42 -0
- package/dist/operations.controller.d.ts.map +1 -1
- package/dist/operations.service.d.ts +178 -264
- package/dist/operations.service.d.ts.map +1 -1
- package/dist/operations.service.js +2170 -1340
- package/dist/operations.service.js.map +1 -1
- package/dist/operations.service.spec.js +345 -174
- package/dist/operations.service.spec.js.map +1 -1
- package/hedhog/data/dashboard_component.yaml +66 -0
- package/hedhog/data/dashboard_component_role.yaml +8 -8
- package/hedhog/data/dashboard_item.yaml +25 -25
- package/hedhog/data/dashboard_role.yaml +1 -1
- package/hedhog/data/menu.yaml +6 -16
- package/hedhog/data/role.yaml +1 -1
- package/hedhog/data/route.yaml +116 -55
- package/hedhog/frontend/app/_components/async-options-combobox.tsx.ejs +15 -9
- package/hedhog/frontend/app/_components/collaborator-form-screen.tsx.ejs +39 -99
- package/hedhog/frontend/app/_components/collaborator-picker.tsx.ejs +158 -0
- package/hedhog/frontend/app/_components/my-project-summary-screen.tsx.ejs +314 -116
- package/hedhog/frontend/app/_components/project-assignments-tab.tsx.ejs +434 -449
- package/hedhog/frontend/app/_components/project-costs-section.tsx.ejs +51 -81
- package/hedhog/frontend/app/_components/project-details-screen.tsx.ejs +328 -423
- package/hedhog/frontend/app/_components/project-file-attachments.tsx.ejs +371 -0
- package/hedhog/frontend/app/_components/project-form-screen.tsx.ejs +446 -377
- package/hedhog/frontend/app/_components/task-detail-sheet.tsx.ejs +803 -581
- package/hedhog/frontend/app/_components/task-file-attachments.tsx.ejs +14 -9
- package/hedhog/frontend/app/_components/task-form-fields.tsx.ejs +406 -0
- package/hedhog/frontend/app/_components/task-form-sheet.tsx.ejs +629 -784
- package/hedhog/frontend/app/_components/task-info-display.tsx.ejs +137 -0
- package/hedhog/frontend/app/_components/timesheet-entry-create-sheet.tsx.ejs +306 -0
- package/hedhog/frontend/app/_lib/api.ts.ejs +480 -476
- package/hedhog/frontend/app/_lib/hooks/use-values-visibility.ts.ejs +61 -0
- package/hedhog/frontend/app/_lib/types.ts.ejs +66 -5
- package/hedhog/frontend/app/_lib/utils/format.ts.ejs +0 -2
- package/hedhog/frontend/app/_lib/utils/task-ui.ts.ejs +43 -0
- package/hedhog/frontend/app/approvals/page.tsx.ejs +11 -2
- package/hedhog/frontend/app/collaborator-types/page.tsx.ejs +6 -1
- package/hedhog/frontend/app/collaborators/page.tsx.ejs +127 -42
- package/hedhog/frontend/app/contracts/page.tsx.ejs +29 -8
- package/hedhog/frontend/app/dashboard/widgets/CapacityDistribution.tsx.ejs +84 -0
- package/hedhog/frontend/app/dashboard/widgets/EffortByProject.tsx.ejs +85 -0
- package/hedhog/frontend/app/dashboard/widgets/HeadcountByArea.tsx.ejs +101 -0
- package/hedhog/frontend/app/dashboard/widgets/ManagedProjectsStatus.tsx.ejs +113 -0
- package/hedhog/frontend/app/dashboard/widgets/MyHoursPeriodKpi.tsx.ejs +87 -0
- package/hedhog/frontend/app/dashboard/widgets/MyOpenRequestsKpi.tsx.ejs +97 -0
- package/hedhog/frontend/app/dashboard/widgets/MyPendingRequestsList.tsx.ejs +99 -0
- package/hedhog/frontend/app/dashboard/widgets/MyProjectAllocationsKpi.tsx.ejs +78 -0
- package/hedhog/frontend/app/dashboard/widgets/MyQuickActions.tsx.ejs +130 -0
- package/hedhog/frontend/app/dashboard/widgets/MyRelevantDeadlines.tsx.ejs +144 -0
- package/hedhog/frontend/app/dashboard/widgets/MyTimesheetStatusKpi.tsx.ejs +78 -0
- package/hedhog/frontend/app/dashboard/widgets/MyWeeklyJourney.tsx.ejs +99 -0
- package/hedhog/frontend/app/dashboard/widgets/PortfolioCostsKpi.tsx.ejs +112 -0
- package/hedhog/frontend/app/dashboard/widgets/PortfolioEffortKpi.tsx.ejs +93 -0
- package/hedhog/frontend/app/dashboard/widgets/PortfolioProjectsKpi.tsx.ejs +96 -0
- package/hedhog/frontend/app/dashboard/widgets/PortfolioRiskKpi.tsx.ejs +115 -0
- package/hedhog/frontend/app/dashboard/widgets/ProjectStatusOverview.tsx.ejs +120 -0
- package/hedhog/frontend/app/dashboard/widgets/StrategicDeadlines.tsx.ejs +146 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamApprovalQueue.tsx.ejs +108 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamCapacityKpi.tsx.ejs +97 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamHeadcountKpi.tsx.ejs +100 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamHoursKpi.tsx.ejs +104 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamPendingApprovalsKpi.tsx.ejs +110 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamUtilizationOverview.tsx.ejs +115 -0
- package/hedhog/frontend/app/dashboard/widgets/TeamWorkloadAlerts.tsx.ejs +117 -0
- package/hedhog/frontend/app/dashboard/widgets/index.ts.ejs +26 -0
- package/hedhog/frontend/app/departments/page.tsx.ejs +6 -1
- package/hedhog/frontend/app/my-projects/page.tsx.ejs +59 -16
- package/hedhog/frontend/app/my-tasks/page.tsx.ejs +329 -106
- package/hedhog/frontend/app/project-cost-categories/page.tsx.ejs +58 -52
- package/hedhog/frontend/app/project-cost-types/page.tsx.ejs +58 -51
- package/hedhog/frontend/app/projects/page.tsx.ejs +436 -35
- package/hedhog/frontend/app/reports/collaborators/page.tsx.ejs +65 -52
- package/hedhog/frontend/app/reports/projects/page.tsx.ejs +80 -82
- package/hedhog/frontend/app/schedule-adjustments/page.tsx.ejs +13 -2
- package/hedhog/frontend/app/time-off/page.tsx.ejs +6 -1
- package/hedhog/frontend/app/timesheets/page.tsx.ejs +10 -4
- package/hedhog/frontend/messages/en.json +460 -61
- package/hedhog/frontend/messages/operations/en.json +61 -52
- package/hedhog/frontend/messages/operations/pt.json +59 -43
- package/hedhog/frontend/messages/pt.json +460 -61
- package/hedhog/frontend/widgets/capacity-distribution.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/effort-by-project.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/headcount-by-area.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/index.ts.ejs +25 -0
- package/hedhog/frontend/widgets/managed-projects-status.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-hours-period-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-open-requests-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-pending-requests-list.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-project-allocations-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-quick-actions.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-relevant-deadlines.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-timesheet-status-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/my-weekly-journey.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/portfolio-costs-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/portfolio-effort-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/portfolio-projects-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/portfolio-risk-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/project-status-overview.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/shared-operations-widget.tsx.ejs +170 -0
- package/hedhog/frontend/widgets/strategic-deadlines.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-approval-queue.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-capacity-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-headcount-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-hours-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-pending-approvals-kpi.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-utilization-overview.tsx.ejs +17 -0
- package/hedhog/frontend/widgets/team-workload-alerts.tsx.ejs +17 -0
- package/hedhog/table/operations_collaborator.yaml +8 -13
- package/hedhog/table/operations_project.yaml +1 -1
- package/hedhog/table/operations_project_file.yaml +23 -0
- package/hedhog/table/operations_task.yaml +76 -69
- package/hedhog/table/operations_task_activity.yaml +51 -0
- package/package.json +7 -6
- package/src/controllers/operations-projects.controller.ts +41 -8
- package/src/controllers/operations-tasks.controller.ts +156 -166
- package/src/dashboard/README.md +214 -0
- package/src/dashboard/components/DashboardLayout.tsx +131 -0
- package/src/dashboard/components/widget-registry.ts +255 -0
- package/src/dashboard/hooks/useDashboardData.ts +29 -0
- package/src/dashboard/types/widgets.types.ts +237 -0
- package/src/dashboard/widgets/CapacityDistribution.tsx +56 -0
- package/src/dashboard/widgets/EffortByProject.tsx +51 -0
- package/src/dashboard/widgets/HeadcountByArea.tsx +57 -0
- package/src/dashboard/widgets/ManagedProjectsStatus.tsx +53 -0
- package/src/dashboard/widgets/MyHoursPeriodKpi.tsx +87 -0
- package/src/dashboard/widgets/MyOpenRequestsKpi.tsx +51 -0
- package/src/dashboard/widgets/MyPendingRequestsList.tsx +63 -0
- package/src/dashboard/widgets/MyProjectAllocationsKpi.tsx +57 -0
- package/src/dashboard/widgets/MyQuickActions.tsx +62 -0
- package/src/dashboard/widgets/MyRelevantDeadlines.tsx +84 -0
- package/src/dashboard/widgets/MyTimesheetStatusKpi.tsx +65 -0
- package/src/dashboard/widgets/MyWeeklyJourney.tsx +57 -0
- package/src/dashboard/widgets/PortfolioCostsKpi.tsx +48 -0
- package/src/dashboard/widgets/PortfolioEffortKpi.tsx +41 -0
- package/src/dashboard/widgets/PortfolioRiskKpi.tsx +50 -0
- package/src/dashboard/widgets/ProjectStatusOverview.tsx +52 -0
- package/src/dashboard/widgets/StrategicDeadlines.tsx +93 -0
- package/src/dashboard/widgets/TeamApprovalQueue.tsx +70 -0
- package/src/dashboard/widgets/TeamCapacityKpi.tsx +50 -0
- package/src/dashboard/widgets/TeamHoursKpi.tsx +51 -0
- package/src/dashboard/widgets/TeamPendingApprovalsKpi.tsx +53 -0
- package/src/dashboard/widgets/TeamUtilizationOverview.tsx +62 -0
- package/src/dashboard/widgets/TeamWorkloadAlerts.tsx +81 -0
- package/src/dashboard/widgets/index.ts +26 -0
- package/src/dto/create-collaborator.dto.ts +4 -11
- package/src/index.ts +3 -0
- package/src/operations.service.spec.ts +988 -764
- package/src/operations.service.ts +4300 -2538
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
TrendingUp,
|
|
40
40
|
UsersRound,
|
|
41
41
|
} from 'lucide-react';
|
|
42
|
+
import { useTranslations } from 'next-intl';
|
|
42
43
|
import { useState } from 'react';
|
|
43
44
|
import { OperationsHeader } from '../../_components/operations-header';
|
|
44
45
|
import { fetchOperations } from '../../_lib/api';
|
|
@@ -49,9 +50,9 @@ import type {
|
|
|
49
50
|
import { formatCurrency, formatHours } from '../../_lib/utils/format';
|
|
50
51
|
|
|
51
52
|
const scenarioLabels: Record<OperationsReportScenario, string> = {
|
|
52
|
-
base: '
|
|
53
|
-
growth: '
|
|
54
|
-
conservative: '
|
|
53
|
+
base: 'scenario.base',
|
|
54
|
+
growth: 'scenario.growth',
|
|
55
|
+
conservative: 'scenario.conservative',
|
|
55
56
|
};
|
|
56
57
|
|
|
57
58
|
function getDefaultRange() {
|
|
@@ -70,23 +71,24 @@ function getTotalCost(row: OperationsCollaboratorsReport['rows'][number]) {
|
|
|
70
71
|
function getAllocationStatus(allocation: number) {
|
|
71
72
|
if (allocation >= 98) {
|
|
72
73
|
return {
|
|
73
|
-
|
|
74
|
+
labelKey: 'allocationStatus.overload',
|
|
74
75
|
className: 'border-rose-200 bg-rose-50 text-rose-700',
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
if (allocation < 75) {
|
|
78
79
|
return {
|
|
79
|
-
|
|
80
|
+
labelKey: 'allocationStatus.idle',
|
|
80
81
|
className: 'border-amber-200 bg-amber-50 text-amber-700',
|
|
81
82
|
};
|
|
82
83
|
}
|
|
83
84
|
return {
|
|
84
|
-
|
|
85
|
+
labelKey: 'allocationStatus.healthy',
|
|
85
86
|
className: 'border-emerald-200 bg-emerald-50 text-emerald-700',
|
|
86
87
|
};
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
export default function OperationsCollaboratorReportsPage() {
|
|
91
|
+
const t = useTranslations('operations.ReportsCollaboratorsPage');
|
|
90
92
|
const defaults = getDefaultRange();
|
|
91
93
|
const { request } = useApp();
|
|
92
94
|
const [startDate, setStartDate] = useState(defaults.from);
|
|
@@ -140,20 +142,22 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
140
142
|
hourlyCost: 0,
|
|
141
143
|
};
|
|
142
144
|
const costHourReferenceLabel =
|
|
143
|
-
summary.allocatedHours > 0
|
|
145
|
+
summary.allocatedHours > 0
|
|
146
|
+
? t('cards.cost.perAllocatedHour')
|
|
147
|
+
: t('cards.cost.perCapacityHour');
|
|
144
148
|
|
|
145
149
|
return (
|
|
146
150
|
<Page>
|
|
147
151
|
<OperationsHeader
|
|
148
|
-
title=
|
|
149
|
-
description=
|
|
150
|
-
current=
|
|
152
|
+
title={t('title')}
|
|
153
|
+
description={t('description')}
|
|
154
|
+
current={t('breadcrumb')}
|
|
151
155
|
/>
|
|
152
156
|
|
|
153
157
|
<div className="grid gap-3 rounded-lg border bg-card p-3 md:grid-cols-[1fr_1fr_180px_160px_180px_auto]">
|
|
154
158
|
<div className="space-y-1">
|
|
155
159
|
<span className="text-xs font-medium text-muted-foreground">
|
|
156
|
-
|
|
160
|
+
{t('filters.start')}
|
|
157
161
|
</span>
|
|
158
162
|
<Input
|
|
159
163
|
type="date"
|
|
@@ -162,7 +166,9 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
162
166
|
/>
|
|
163
167
|
</div>
|
|
164
168
|
<div className="space-y-1">
|
|
165
|
-
<span className="text-xs font-medium text-muted-foreground">
|
|
169
|
+
<span className="text-xs font-medium text-muted-foreground">
|
|
170
|
+
{t('filters.end')}
|
|
171
|
+
</span>
|
|
166
172
|
<Input
|
|
167
173
|
type="date"
|
|
168
174
|
value={endDate}
|
|
@@ -171,14 +177,14 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
171
177
|
</div>
|
|
172
178
|
<div className="space-y-1">
|
|
173
179
|
<span className="text-xs font-medium text-muted-foreground">
|
|
174
|
-
|
|
180
|
+
{t('filters.department')}
|
|
175
181
|
</span>
|
|
176
182
|
<Select value={departmentFilter} onValueChange={setDepartmentFilter}>
|
|
177
183
|
<SelectTrigger className="w-full">
|
|
178
184
|
<SelectValue />
|
|
179
185
|
</SelectTrigger>
|
|
180
186
|
<SelectContent>
|
|
181
|
-
<SelectItem value="all">
|
|
187
|
+
<SelectItem value="all">{t('filters.all')}</SelectItem>
|
|
182
188
|
{(data?.filters.departments ?? []).map((department) => (
|
|
183
189
|
<SelectItem key={department} value={department}>
|
|
184
190
|
{department}
|
|
@@ -189,14 +195,14 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
189
195
|
</div>
|
|
190
196
|
<div className="space-y-1">
|
|
191
197
|
<span className="text-xs font-medium text-muted-foreground">
|
|
192
|
-
|
|
198
|
+
{t('filters.contract')}
|
|
193
199
|
</span>
|
|
194
200
|
<Select value={contractFilter} onValueChange={setContractFilter}>
|
|
195
201
|
<SelectTrigger className="w-full">
|
|
196
202
|
<SelectValue />
|
|
197
203
|
</SelectTrigger>
|
|
198
204
|
<SelectContent>
|
|
199
|
-
<SelectItem value="all">
|
|
205
|
+
<SelectItem value="all">{t('filters.all')}</SelectItem>
|
|
200
206
|
{(data?.filters.contractTypes ?? []).map((contractType) => (
|
|
201
207
|
<SelectItem key={contractType} value={contractType}>
|
|
202
208
|
{contractType}
|
|
@@ -207,7 +213,7 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
207
213
|
</div>
|
|
208
214
|
<div className="space-y-1">
|
|
209
215
|
<span className="text-xs font-medium text-muted-foreground">
|
|
210
|
-
|
|
216
|
+
{t('filters.scenario')}
|
|
211
217
|
</span>
|
|
212
218
|
<Select
|
|
213
219
|
value={scenario}
|
|
@@ -219,9 +225,11 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
219
225
|
<SelectValue />
|
|
220
226
|
</SelectTrigger>
|
|
221
227
|
<SelectContent>
|
|
222
|
-
<SelectItem value="base">
|
|
223
|
-
<SelectItem value="growth">
|
|
224
|
-
<SelectItem value="conservative">
|
|
228
|
+
<SelectItem value="base">{t('scenario.base')}</SelectItem>
|
|
229
|
+
<SelectItem value="growth">{t('scenario.growth')}</SelectItem>
|
|
230
|
+
<SelectItem value="conservative">
|
|
231
|
+
{t('scenario.conservative')}
|
|
232
|
+
</SelectItem>
|
|
225
233
|
</SelectContent>
|
|
226
234
|
</Select>
|
|
227
235
|
</div>
|
|
@@ -237,7 +245,7 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
237
245
|
setScenario('base');
|
|
238
246
|
}}
|
|
239
247
|
>
|
|
240
|
-
|
|
248
|
+
{t('actions.clear')}
|
|
241
249
|
</Button>
|
|
242
250
|
</div>
|
|
243
251
|
</div>
|
|
@@ -247,16 +255,16 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
247
255
|
items={[
|
|
248
256
|
{
|
|
249
257
|
key: 'headcount',
|
|
250
|
-
title: '
|
|
258
|
+
title: t('cards.headcount.title'),
|
|
251
259
|
value: data?.rows.length ?? 0,
|
|
252
|
-
description: '
|
|
260
|
+
description: t('cards.headcount.description'),
|
|
253
261
|
icon: UsersRound,
|
|
254
262
|
accentClassName: 'from-sky-500/20 via-cyan-400/10 to-transparent',
|
|
255
263
|
iconContainerClassName: 'bg-sky-50 text-sky-700',
|
|
256
264
|
},
|
|
257
265
|
{
|
|
258
266
|
key: 'cost',
|
|
259
|
-
title: '
|
|
267
|
+
title: t('cards.cost.title'),
|
|
260
268
|
value: formatCurrency(summary.cost),
|
|
261
269
|
description: `${formatCurrency(summary.hourlyCost)} ${costHourReferenceLabel}`,
|
|
262
270
|
icon: Banknote,
|
|
@@ -265,9 +273,11 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
265
273
|
},
|
|
266
274
|
{
|
|
267
275
|
key: 'revenue',
|
|
268
|
-
title: '
|
|
276
|
+
title: t('cards.revenue.title'),
|
|
269
277
|
value: formatCurrency(summary.billableValue),
|
|
270
|
-
description:
|
|
278
|
+
description: t('cards.revenue.description', {
|
|
279
|
+
hours: formatHours(summary.billableHours),
|
|
280
|
+
}),
|
|
271
281
|
icon: BriefcaseBusiness,
|
|
272
282
|
accentClassName:
|
|
273
283
|
'from-emerald-500/20 via-green-400/10 to-transparent',
|
|
@@ -275,7 +285,7 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
275
285
|
},
|
|
276
286
|
{
|
|
277
287
|
key: 'margin',
|
|
278
|
-
title: '
|
|
288
|
+
title: t('cards.margin.title'),
|
|
279
289
|
value: formatPercent(summary.margin),
|
|
280
290
|
description: formatCurrency(summary.profit),
|
|
281
291
|
icon: Target,
|
|
@@ -285,9 +295,9 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
285
295
|
},
|
|
286
296
|
{
|
|
287
297
|
key: 'utilization',
|
|
288
|
-
title: '
|
|
298
|
+
title: t('cards.utilization.title'),
|
|
289
299
|
value: formatPercent(summary.utilization),
|
|
290
|
-
description: '
|
|
300
|
+
description: t('cards.utilization.description'),
|
|
291
301
|
icon: Clock3,
|
|
292
302
|
layout: 'compact',
|
|
293
303
|
accentClassName: 'from-cyan-500/20 via-blue-400/10 to-transparent',
|
|
@@ -295,9 +305,11 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
295
305
|
},
|
|
296
306
|
{
|
|
297
307
|
key: 'free',
|
|
298
|
-
title: '
|
|
308
|
+
title: t('cards.freeCapacity.title'),
|
|
299
309
|
value: formatHours(summary.freeHours),
|
|
300
|
-
description:
|
|
310
|
+
description: t('cards.freeCapacity.description', {
|
|
311
|
+
percent: formatPercent(Math.max(100 - summary.allocation, 0)),
|
|
312
|
+
}),
|
|
301
313
|
icon: CalendarClock,
|
|
302
314
|
layout: 'compact',
|
|
303
315
|
accentClassName:
|
|
@@ -306,9 +318,11 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
306
318
|
},
|
|
307
319
|
{
|
|
308
320
|
key: 'overtime',
|
|
309
|
-
title: '
|
|
321
|
+
title: t('cards.overtime.title'),
|
|
310
322
|
value: formatHours(summary.overtimeHours),
|
|
311
|
-
description:
|
|
323
|
+
description: t('cards.overtime.description', {
|
|
324
|
+
count: summary.overloadCount,
|
|
325
|
+
}),
|
|
312
326
|
icon: AlertTriangle,
|
|
313
327
|
layout: 'compact',
|
|
314
328
|
accentClassName:
|
|
@@ -317,9 +331,9 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
317
331
|
},
|
|
318
332
|
{
|
|
319
333
|
key: 'scenario',
|
|
320
|
-
title: '
|
|
321
|
-
value: scenarioLabels[scenario],
|
|
322
|
-
description: '
|
|
334
|
+
title: t('cards.scenario.title'),
|
|
335
|
+
value: t(scenarioLabels[scenario]),
|
|
336
|
+
description: t('cards.scenario.description'),
|
|
323
337
|
icon: TrendingUp,
|
|
324
338
|
layout: 'compact',
|
|
325
339
|
accentClassName:
|
|
@@ -331,24 +345,21 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
331
345
|
|
|
332
346
|
<Card>
|
|
333
347
|
<CardHeader>
|
|
334
|
-
<CardTitle>
|
|
335
|
-
<CardDescription>
|
|
336
|
-
Custo fixo do período, valor apontado, lucro, capacidade
|
|
337
|
-
comprometida e recomendação executiva.
|
|
338
|
-
</CardDescription>
|
|
348
|
+
<CardTitle>{t('table.title')}</CardTitle>
|
|
349
|
+
<CardDescription>{t('table.description')}</CardDescription>
|
|
339
350
|
</CardHeader>
|
|
340
351
|
<CardContent className="overflow-x-auto">
|
|
341
352
|
<Table>
|
|
342
353
|
<TableHeader>
|
|
343
354
|
<TableRow>
|
|
344
|
-
<TableHead>
|
|
345
|
-
<TableHead>
|
|
346
|
-
<TableHead>
|
|
347
|
-
<TableHead>
|
|
348
|
-
<TableHead>
|
|
349
|
-
<TableHead>
|
|
350
|
-
<TableHead>
|
|
351
|
-
<TableHead>
|
|
355
|
+
<TableHead>{t('table.headers.collaborator')}</TableHead>
|
|
356
|
+
<TableHead>{t('table.headers.cost')}</TableHead>
|
|
357
|
+
<TableHead>{t('table.headers.generatedValue')}</TableHead>
|
|
358
|
+
<TableHead>{t('table.headers.profit')}</TableHead>
|
|
359
|
+
<TableHead>{t('table.headers.hours')}</TableHead>
|
|
360
|
+
<TableHead>{t('table.headers.allocation')}</TableHead>
|
|
361
|
+
<TableHead>{t('table.headers.risk')}</TableHead>
|
|
362
|
+
<TableHead>{t('table.headers.recommendation')}</TableHead>
|
|
352
363
|
</TableRow>
|
|
353
364
|
</TableHeader>
|
|
354
365
|
<TableBody>
|
|
@@ -392,8 +403,10 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
392
403
|
<div className="min-w-36 space-y-1">
|
|
393
404
|
<div className="flex items-center justify-between text-xs">
|
|
394
405
|
<span>
|
|
395
|
-
{
|
|
396
|
-
|
|
406
|
+
{t('table.hoursBillableOf', {
|
|
407
|
+
billable: formatHours(row.billableHours),
|
|
408
|
+
allocated: formatHours(row.allocatedHours),
|
|
409
|
+
})}
|
|
397
410
|
</span>
|
|
398
411
|
<span>{formatPercent(utilization)}</span>
|
|
399
412
|
</div>
|
|
@@ -404,7 +417,7 @@ export default function OperationsCollaboratorReportsPage() {
|
|
|
404
417
|
<div className="min-w-32 space-y-1">
|
|
405
418
|
<div className="flex items-center justify-between gap-2">
|
|
406
419
|
<Badge variant="outline" className={status.className}>
|
|
407
|
-
{status.
|
|
420
|
+
{t(status.labelKey)}
|
|
408
421
|
</Badge>
|
|
409
422
|
<span className="text-xs">
|
|
410
423
|
{formatPercent(allocation)}
|