All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m37s
Pattern 12-bis × 16-bis cookie-cutter cumulative 9× (Smart Friend Implementer catch).
Single page declarative KIND_CONFIG Record + URL `:kind` param + 4 sub-tab mirror
Master/Catalogs/CatalogsPage.tsx 321 LOC pattern. 4 catalog HRM (LeaveTypes/Holidays/
Shifts/OtPolicies) wire BE 16 endpoint /api/hrm-configs/{kind} từ commit `909655c`.
## Scope (Implementer Case 2 ~25K spawn)
- types/hrm-config.ts (NEW 98 LOC × 2 app SHA256 IDENTICAL `228917e5fac2cdc6`)
- HrmConfigsPage.tsx (NEW ~470 LOC × 2 app SHA256 IDENTICAL `6378fbc71ff90260`)
- App.tsx +3 LOC × 2 app (route + Navigate redirect default `/hrm/configs` → `leave-types`)
- Layout.tsx staticMap +6 LOC × 2 app — Pattern 16-bis 4-place enforcement
(em main spec line 24 GAP — Smart Friend Implementer caught + fixed proactive)
## 4 kind FieldDef declarative
- leave-types: code/name/daysPerYear/isPaid/requiresAttachment/description
- holidays: year/date/name/isRecurring/isPaid/description
- shifts: code/name/startTime/endTime/breakMinutes/workDays(multiselect-weekday)/description
- ot-policies: code/name/multiplier×3/maxHours×3/description
## Pattern 16-bis 4-place mirror Pattern 16-bis 6× cumulative
- types/hrm-config.ts (place 1)
- pages/hrm/HrmConfigsPage.tsx (place 2)
- App.tsx routes (place 3)
- Layout.tsx staticMap (place 4 — em main MISS, Implementer caught via gotcha #50 prior knowledge)
## Verify
- npm build × 2 PASS (fe-admin 14.33s + fe-user 744ms, 0 TS error)
- SHA256 IDENTICAL × 2 NEW pair (types + page)
- Reviewer pre-commit PASS Cat A-D clean (5K token tight scope no truncation)
- gotcha #50 silent sidebar drop prevention — Pattern 16-bis discipline reinforced
- Smart Friend 9× clean cumulative S22+S25+S29×2+S33×2+S35×3
## Multi-agent ROI S35 chunk 3 ~30K
- Implementer Case 2 declarative single-page mega + spec gap catch
- Reviewer tight 5K verdict Cat A-D PASS
## State delta S35 cumulative
- 0 mig add (Mig 35 schema S34)
- 0 BE endpoint add (16 endpoint commit `909655c`)
- +1 FE page (HrmConfigsPage) × 2 app routes
- Pattern 12-bis cumulative 3× + Pattern 16-bis 6× + Pattern 12-ter 6× (FE forms)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
102 lines
5.7 KiB
TypeScript
102 lines
5.7 KiB
TypeScript
import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'
|
|
import { Toaster } from 'sonner'
|
|
import { AuthProvider } from '@/contexts/AuthContext'
|
|
import { ProtectedRoute } from '@/components/ProtectedRoute'
|
|
import { Layout } from '@/components/Layout'
|
|
import { LoginPage } from '@/pages/LoginPage'
|
|
import { DashboardPage } from '@/pages/DashboardPage'
|
|
import { SuppliersPage } from '@/pages/master/SuppliersPage'
|
|
import { ProjectsPage } from '@/pages/master/ProjectsPage'
|
|
import { DepartmentsPage } from '@/pages/master/DepartmentsPage'
|
|
import { CatalogsPage } from '@/pages/master/CatalogsPage'
|
|
import { PermissionsPage } from '@/pages/system/PermissionsPage'
|
|
import { MenuVisibilityPage } from '@/pages/system/MenuVisibilityPage'
|
|
import { RolesPage } from '@/pages/system/RolesPage'
|
|
import { WorkflowsPage } from '@/pages/system/WorkflowsPage'
|
|
import { PeWorkflowsPage } from '@/pages/system/PeWorkflowsPage'
|
|
import { ApprovalWorkflowsV2Page } from '@/pages/system/ApprovalWorkflowsV2Page'
|
|
import { FormsPage } from '@/pages/forms/FormsPage'
|
|
import { ContractsListPage } from '@/pages/contracts/ContractsListPage'
|
|
import { ContractDetailPage } from '@/pages/contracts/ContractDetailPage'
|
|
import { ContractCreatePage } from '@/pages/contracts/ContractCreatePage'
|
|
import { ReportsPage } from '@/pages/ReportsPage'
|
|
import { UsersPage } from '@/pages/system/UsersPage'
|
|
import { PurchaseEvaluationsListPage, PurchaseEvaluationDetailPage } from '@/pages/pe/PurchaseEvaluationsListPage'
|
|
import { PurchaseEvaluationCreatePage } from '@/pages/pe/PurchaseEvaluationCreatePage'
|
|
import { PurchaseEvaluationWorkspacePage } from '@/pages/pe/PurchaseEvaluationWorkspacePage'
|
|
import { BudgetsListPage, BudgetDetailPage } from '@/pages/budgets/BudgetsListPage'
|
|
import { BudgetCreatePage } from '@/pages/budgets/BudgetCreatePage'
|
|
import { EmployeesListPage } from '@/pages/hrm/EmployeesListPage'
|
|
import { EmployeeCreatePage } from '@/pages/hrm/EmployeeCreatePage'
|
|
import { HrmConfigsPage } from '@/pages/hrm/HrmConfigsPage'
|
|
import { InternalDirectoryPage } from '@/pages/office/InternalDirectoryPage'
|
|
|
|
function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<AuthProvider>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout />
|
|
</ProtectedRoute>
|
|
}
|
|
>
|
|
<Route path="/dashboard" element={<DashboardPage />} />
|
|
<Route path="/master/suppliers" element={<SuppliersPage />} />
|
|
<Route path="/master/projects" element={<ProjectsPage />} />
|
|
<Route path="/master/departments" element={<DepartmentsPage />} />
|
|
<Route path="/master/catalogs" element={<Navigate to="/master/catalogs/units" replace />} />
|
|
<Route path="/master/catalogs/:kind" element={<CatalogsPage />} />
|
|
<Route path="/system/users" element={<UsersPage />} />
|
|
<Route path="/system/roles" element={<RolesPage />} />
|
|
<Route path="/system/permissions" element={<PermissionsPage />} />
|
|
<Route path="/system/menu-visibility" element={<MenuVisibilityPage />} />
|
|
<Route path="/system/workflows" element={<WorkflowsPage />} />
|
|
<Route path="/system/workflows/:typeCode" element={<WorkflowsPage />} />
|
|
<Route path="/system/pe-workflows" element={<PeWorkflowsPage />} />
|
|
<Route path="/system/pe-workflows/:typeCode" element={<PeWorkflowsPage />} />
|
|
{/* Quy trình duyệt MỚI (Mig 22 — UAT) */}
|
|
<Route path="/system/approval-workflows-v2" element={<ApprovalWorkflowsV2Page />} />
|
|
<Route path="/system/approval-workflows-v2/:typeCode" element={<ApprovalWorkflowsV2Page />} />
|
|
<Route path="/forms" element={<FormsPage />} />
|
|
<Route path="/contracts" element={<ContractsListPage />} />
|
|
<Route path="/contracts/new" element={<ContractCreatePage />} />
|
|
<Route path="/contracts/:id" element={<ContractDetailPage />} />
|
|
<Route path="/purchase-evaluations" element={<PurchaseEvaluationsListPage />} />
|
|
<Route path="/purchase-evaluations/workspace" element={<PurchaseEvaluationWorkspacePage />} />
|
|
<Route path="/purchase-evaluations/new" element={<PurchaseEvaluationCreatePage />} />
|
|
<Route path="/purchase-evaluations/:id" element={<PurchaseEvaluationDetailPage />} />
|
|
<Route path="/budgets" element={<BudgetsListPage />} />
|
|
<Route path="/budgets/new" element={<BudgetCreatePage />} />
|
|
<Route path="/budgets/:id" element={<BudgetDetailPage />} />
|
|
{/* Hồ sơ Nhân sự (Phase 10.1 G-H1 — Mig 34) */}
|
|
<Route path="/employees" element={<EmployeesListPage />} />
|
|
<Route path="/employees/new" element={<EmployeeCreatePage />} />
|
|
{/* Cấu hình HRM (Phase 10.2 G-H2 — Mig 35) */}
|
|
<Route path="/hrm/configs" element={<Navigate to="/hrm/configs/leave-types" replace />} />
|
|
<Route path="/hrm/configs/:kind" element={<HrmConfigsPage />} />
|
|
{/* Văn phòng số — Danh bạ nội bộ (Phase 10.2 G-O1) */}
|
|
<Route path="/directory" element={<InternalDirectoryPage />} />
|
|
<Route path="/reports" element={<ReportsPage />} />
|
|
<Route path="/" element={<Navigate to="/dashboard" replace />} />
|
|
<Route
|
|
path="*"
|
|
element={
|
|
<div className="p-8 text-slate-500">
|
|
Trang này chưa được build — sẽ có ở Phase tiếp theo.
|
|
</div>
|
|
}
|
|
/>
|
|
</Route>
|
|
</Routes>
|
|
<Toaster richColors position="top-right" />
|
|
</AuthProvider>
|
|
</BrowserRouter>
|
|
)
|
|
}
|
|
|
|
export default App
|