All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m55s
Phase 10.2 G-O2 Phòng họp BookingCalendar — Mig 36 schema + BE CQRS + FE 2 app mirror cookie-cutter G-H2 HrmConfig pattern. Standalone không depend workflow. BE schema (Mig 36 — em main solo Step 4): - 4 Domain new: MeetingRoom catalog + MeetingBooking header + MeetingBookingAttendee join table N-to-N (NOT JSON per Investigator verdict) + Enums (MeetingBookingStatus 3-state: Confirmed/Cancelled/Completed) - 3 EF Config: UNIQUE Code + composite index (RoomId, StartAt) range query + UNIQUE composite (BookingId, UserId) join - FK strategy: Room→Restrict (preserve history) + Booking→Cascade attendees + User→Restrict (denorm FullName+Email tránh cascade wipe) - Mig 36 3-file rule + ApplicationDbContextModelSnapshot updated + apply Dev+Design DB BE CQRS (~584 LOC — Implementer Case 2): - MeetingFeatures.cs 479 LOC 9 handler: 4 Room CRUD + 5 Booking (List + GetById + Create + Update + Cancel) - SERIALIZABLE transaction overlap check via EXISTS query — throw 409 Conflict "Phòng đã được đặt trong khoảng thời gian này" - MeetingRoomsController 49 LOC + MeetingBookingsController 56 LOC — class-level [Authorize] + Roles="Admin" for write - Application.csproj +Microsoft.EntityFrameworkCore.Relational package (em main fix IsolationLevel overload — Implementer gotcha #53 4th truncation diagnose mid-task) - MenuKeys.cs +4 const (Off_PhongHop sub-group + View/Manage/Book leaf) - DbInitializer +SeedMeetingRoomsAsync 4 sample (PH-A Phòng họp lớn cap=20 + PH-B cap=8 + PHG-501 Giám đốc cap=6 + ONL-1 Online Zoom cap=50) — NOT gated DemoSeed per gotcha #51 INFRASTRUCTURE seed FE 2 app (~1770 LOC × 2 — Implementer Case 2): - types/meeting.ts × 2 SHA256 IDENTICAL (ce0ad9c6d017cde2) — DTO interface mirror - MeetingCalendarPage.tsx × 2 SHA256 IDENTICAL (d6d160ae1e4f2285) ~530 LOC — custom HTML 7-day grid 8h-20h slot, NO FullCalendar dep (~80 KB bundle saved per Investigator verdict alternative) - MeetingRoomsPage.tsx × 2 SHA256 IDENTICAL (ba35a7ef379a5e9c) ~270 LOC — admin catalog CRUD table + Dialog - 4-place mirror Pattern 16-bis 7× cumulative: types + page + App.tsx route + menuKeys + Layout staticMap 3 entry (gotcha #50 silent sidebar drop prevention) Verify: - dotnet build SolutionErp.slnx PASS 0 error 2 pre-existing DocxRenderer warning - dotnet test 130/130 PASS baseline preserve (58 Domain + 72 Infra) - npm build × 2 app PASS 0 TS error (fe-admin 16.91s bundle 1490 KB / fe-user 8.56s bundle 1404 KB, +23 KB gzip both) Pattern reinforced cumulative S36: - Pattern 12-bis cross-module mirror 10× (PE → Contract V2 → Hrm → Office) - Pattern 16-bis 4-place mirror cross-app 7× - Smart Friend Implementer truncation gotcha #53 4th — mitigation tight brief WORK (FE 2 app no truncation, BE truncate diagnose mid only) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.0 KiB
TypeScript
55 lines
2.0 KiB
TypeScript
// Đồng bộ tay với BE SolutionErp.Domain.Identity.MenuKeys
|
|
export const MenuKeys = {
|
|
Dashboard: 'Dashboard',
|
|
Master: 'Master',
|
|
Suppliers: 'Suppliers',
|
|
Projects: 'Projects',
|
|
Departments: 'Departments',
|
|
// 4 master catalogs cho Details add form autocomplete (Plan CA S29 — UI sang fe-user)
|
|
Catalogs: 'Catalogs',
|
|
CatalogUnits: 'CatalogUnits',
|
|
CatalogMaterials: 'CatalogMaterials',
|
|
CatalogServices: 'CatalogServices',
|
|
CatalogWorkItems: 'CatalogWorkItems',
|
|
Contracts: 'Contracts',
|
|
Forms: 'Forms',
|
|
Reports: 'Reports',
|
|
System: 'System',
|
|
Users: 'Users',
|
|
Roles: 'Roles',
|
|
Permissions: 'Permissions',
|
|
MenuVisibility: 'MenuVisibility',
|
|
Workflows: 'Workflows',
|
|
PurchaseEvaluations: 'PurchaseEvaluations',
|
|
PeWorkflows: 'PeWorkflows',
|
|
// Quy trình duyệt MỚI (Mig 22 — Session 17, 2026-05-08)
|
|
ApprovalWorkflowsV2: 'ApprovalWorkflowsV2',
|
|
AwV2_DuyetNcc: 'AwV2_DuyetNcc',
|
|
AwV2_DuyetNccPhuongAn: 'AwV2_DuyetNccPhuongAn',
|
|
// Module Ngân sách (Phase 7)
|
|
Budgets: 'Budgets',
|
|
Bg_List: 'Bg_List',
|
|
Bg_Create: 'Bg_Create',
|
|
Bg_Pending: 'Bg_Pending',
|
|
// Module Hồ sơ Nhân sự (Mig 34 — Phase 10.1 G-H1 Session 33, 2026-05-26)
|
|
Hrm: 'Hrm',
|
|
HrmHoSo: 'Hrm_HoSo',
|
|
// Cấu hình HRM (Mig 35 — Phase 10.2 G-H2 Session 34, 2026-05-27)
|
|
HrmConfig: 'Hrm_Config',
|
|
HrmConfigLeaveTypes: 'Hrm_Config_LeaveTypes',
|
|
HrmConfigHolidays: 'Hrm_Config_Holidays',
|
|
HrmConfigShifts: 'Hrm_Config_Shifts',
|
|
HrmConfigOtPolicies: 'Hrm_Config_OtPolicies',
|
|
// Module Văn phòng số — Danh bạ nội bộ (Phase 10.2 G-O1 Session 34, 2026-05-27)
|
|
Off: 'Off',
|
|
OffDanhBa: 'Off_DanhBa',
|
|
// Văn phòng số — Phòng họp (Phase 10.2 G-O2 — Mig 36 Session 36, 2026-05-28)
|
|
OffPhongHop: 'Off_PhongHop',
|
|
OffPhongHopView: 'Off_PhongHop_View',
|
|
OffPhongHopManage: 'Off_PhongHop_Manage',
|
|
OffPhongHopBook: 'Off_PhongHop_Book',
|
|
} as const
|
|
|
|
export type MenuKey = typeof MenuKeys[keyof typeof MenuKeys]
|
|
export type CrudAction = 'Read' | 'Create' | 'Update' | 'Delete'
|