All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 2m52s
User request: anh trỏ 3 subdomain mới về VPS IP 103.124.94.38:
- api.huypham.vn → api.solutions.com.vn
- admin.huypham.vn → admin.solutions.com.vn
- user.huypham.vn → eoffice.solutions.com.vn
Verified DNS: cả 3 resolve 103.124.94.38 ✓
Update 17 file repo:
FE (4): fe-admin/.env.production + fe-user/.env.production
(VITE_API_BASE_URL → https://api.solutions.com.vn)
fe-admin/src/lib/{api,realtime}.ts + fe-user equivalents (comment)
BE (1): appsettings.Production.json.example — CORS AllowedOrigins
CI/CD (1): .gitea/workflows/deploy.yml — smoke test URL
Scripts (3): setup-iis-sites (DomainApi/Admin/User), setup-ssl (3 host),
deploy-all (verify curls)
Docs (5): STATUS, HANDOFF, PROJECT-MAP, vps-setup, gotchas
Skill (1): iis-deploy-runbook — 3 site table + description
Email admin@huypham.vn giữ nguyên (Let's Encrypt contact — không phải
domain serve).
Thêm scripts/migrate-domains.ps1 — 1-shot VPS migration:
1. Pre-flight: resolve DNS 3 domain → verify IP VPS khớp
2. Add HTTP binding mới cho 3 IIS site (giữ binding cũ làm fallback)
3. Run win-acme xin 3 cert Let's Encrypt qua HTTP-01 challenge
(auto add HTTPS binding + http→https redirect)
4. Verify /health/live + /health/ready + 2 FE endpoint
5. (Optional -RemoveOld) xóa binding huypham.vn sau verify OK
Rollback: nếu fail, binding cũ vẫn active → site serve qua huypham.vn.
Anh chạy trên VPS:
cd C:\solution-erp\scripts ; .\migrate-domains.ps1
# Sau 1-2 ngày verify stable:
.\migrate-domains.ps1 -RemoveOld -SkipCert
26 KiB
26 KiB
STATUS — Snapshot hiện tại
Update rule: trước khi bắt đầu 1 task → ghi row vào
🔥 In Progress. Xong → chuyển sang✅ Recently Done.
Last updated: 2026-04-23 tối (Phase 6 — PE module skeleton E2E + G-084 hardening, CÒN CHỈNH NHIỀU)
📍 Phase hiện tại: Module Duyệt NCC (tiền-HĐ) — skeleton deployed, refinement WIP — 46 DB tables (+10 PE), ~110 endpoints (+17 PE), 12 migrations, 6 commits PE push Gitea (2c6f0ca..3990066). Skeleton BE + FE + kế thừa HĐ hoạt động; còn nhiều polish + feature thiếu (designer UI, attachments, details mapping, export PDF).
🌐 Production URLs
- https://api.solutions.com.vn — API (Let's Encrypt, auto-renew via win-acme)
- https://admin.solutions.com.vn — Admin FE (HTTP→HTTPS auto-redirect)
- https://eoffice.solutions.com.vn — User FE (HTTP→HTTPS auto-redirect)
- https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp — Gitea repo + Actions
- Default admin:
admin@solutionerp.local/Admin@123456⚠️ RE-ROTATE sau login đầu
🔥 In Progress — PE module chưa xong (session tiếp xử lý)
User feedback (2026-04-23 tối session 2): "phần Duyệt NCC chưa xong đâu đấy nhé, còn chỉnh nhiều".
A. Chức năng MISSING trong MVP (phải làm)
- PE Workflow admin designer UI
/system/pe-workflows/:typeCode— framework versioned WF đã có (3 bảng + policyFromDefinition). Chỉ thiếu:- BE
PeWorkflowAdminFeatures.cs(mirrorWorkflowAdminFeatures.cs— GetOverview + CreateNewVersion) PeWorkflowsController.cs— GET overview + POST create-version- FE
PeWorkflowsPage.tsx+PeWorkflowDesigner.tsx(mirrorWorkflowsPage.tsx+WorkflowDesigner.tsx) - Menu leaf
PeWf_*đã seed rồi, resolver Layout.tsx đã map/system/pe-workflows/:code
- BE
- PE Attachments upload — pattern copy từ
ContractAttachmentFeatures.cs+ FEContractAttachmentsSection.tsx. Entity +PurchaseEvaluationAttachmentPurposeenum đã sẵn (QuoteDocument/RequirementSpec/DecisionExport). - Auto-map PE Details → Contract 7 per-type Details khi gen HĐ — hiện
CreateContractFromEvaluationCommandchỉ copy header + GiaTri, KHÔNG copy Details. Cần mapping per ContractType (PE Detail schema flat ≠ 7 Contract Details schemas). - Demo PE data seed — chưa có
[DEMO]PE nào. Cần 2-3 phiếu seed (1 NccOnly đã DaDuyet chưa tạo HĐ, 1 NccWithPlan ở phase ChoCCM giữa chừng, 1 TuChoi) cho UAT + screenshot. - MaPhieu format chính thức — hiện
PE-YYYYMM-XXXXrandom 4-digit. User said "tính sau". Cần confirm format:{ProjectCode}/PE/{seq:D3}hoặc atomic sequence bảng nhưContractCodeSequences. - Section "Ý kiến các phòng ban" (Phê duyệt/P.CCM/P.MuaHàng/SM-PM) ở tab Thông tin — Excel form mẫu có, entity hiện chưa map. Cần thêm 4-8 text field + signoff date (hoặc dùng Approvals row như ContractApprovals).
B. UX / Polish cần chỉnh
- Payment terms chi tiết — hiện JSON blob. UX tách field riêng (Tạm ứng / TT tạm / Quyết toán / Bảo hành / Hạn mức / Đánh giá) theo Excel section D.
- Matrix Quotes bulk paste — click cell → popup: OK. Nhưng bulk paste column giá từ Excel chưa có (power user feature).
- Export phiếu PDF/Excel — user cần bản in ký. Tái dùng
IDocumentConverter+ templatePE-TrinhDuyet.docx. - Permission grant Pe_ cho non-admin role* — admin thấy menu Pe_*, non-admin chưa. Cần vào
/system/permissionstickPurchaseEvaluations.Readcho role Drafter/Procurement/CostControl/Director. - fe-user Inbox — hiện chỉ HĐ. Cần thêm section "Phiếu Duyệt NCC chờ tôi" (hoặc route
/pe-inboxriêng). - Sidebar accordion fe-user — test
Pe_DuyetNccgroup vớiCt_*accordion context (Layout.tsx fe-user accordion hiện chỉ trackCt_<code>, có thể cần extend coverPe_<code>).
C. Edge case chưa test
- Reject path E2E: DangSoanThao → ChoPurchasing → (CCM reject) → DangSoanThao — verify approval row vẫn log
- Xóa phiếu khi đã có Contract kế thừa (PE.ContractId set) — cascade delete child OK, Contract standalone không break, nhưng nên warning dialog
- Admin tạo PE workflow v02 sau khi có phiếu pin v01 — invariant "phiếu cũ giữ cũ" chưa test (pattern giống HĐ, nên pass)
- Change EvaluationType (A ↔ B) sau create — form hiện disable, đúng. User có đổi nhầm → phải xóa + tạo lại.
D. Deploy / Ops
- Verify CI/CD apply commit
3990066lên prod — hiện/api/purchase-evaluationstrả 404 (phiên bản cũ). Check runner status:Sau đó recheckGet-Service *gitea-runner* ; & "C:\nssm\nssm.exe" status gitea-runner # Nếu Stopped → Start-Service gitea-runnercurl https://api.solutions.com.vn/api/purchase-evaluations→ 401 = deploy OK.
✅ Recently Done (newest on top)
✅ Recently Done (newest on top)
| Ngày | Ai | Task | Commit |
|---|---|---|---|
| 2026-04-23 | Claude | G-084 hardening — localhost → 127.0.0.1 trong deploy-iis.ps1 + skill iis-deploy-runbook. Thêm gotcha #33 (IPv4/IPv6 port hijack) ref VietReport incident + 3 rules (reverse-proxy IP literal / backend loopback IPv4 explicit / service dependency). SOLUTION_ERP risk thấp (API in-process IIS, no ARR proxy) nhưng chuẩn hóa cho tương lai. |
3990066 |
| 2026-04-23 | Claude | Kế thừa HĐ từ phiếu PE — CreateContractFromEvaluationCommand guard DaDuyet + SelectedSupplier + ContractId=null → tạo Contract draft với SupplierId/ProjectId/GiaTri kế thừa. Link 2 chiều PE.ContractId. 2 endpoint mới (approved-pending-contract + create-contract). FE PeDetailTabs InfoTab banner emerald + CreateContractDialog pick ContractType 7 loại. |
a385d70 |
| 2026-04-23 | Claude | PE FE — 2 app pages (List/Create/Detail 3-panel) — Types + PurchaseEvaluationsListPage 3-panel + PurchaseEvaluationCreatePage + PeDetailTabs (5 tab: Thông tin/NCC/Hạng mục+Quote matrix/Duyệt/Lịch sử) + PeWorkflowPanel timeline. Menu resolver Pe_* → /purchase-evaluations?type=N. fe-user mirror. TS build pass cả 2 app. | commit Phase 3 |
| 2026-04-23 | Claude | PE App+Api CQRS — ~900 dòng: Create/UpdateDraft/Transition/List/Inbox/GetDetail bundle/Delete + Supplier CRUD + Detail CRUD + Quote Upsert + SelectWinner + Changelog list. PurchaseEvaluationWorkflowService policy-based guard + notification push. PurchaseEvaluationsController ~15 endpoint. | commit Phase 2 BE |
| 2026-04-23 | Claude | PurchaseEvaluation module — Domain+Infra (migration 12) — 10 bảng mới (7 core: Header+Suppliers+Details+Quotes+Approvals+Changelogs+Attachments + 3 workflow config: Definitions/Steps/StepApprovers). 2 enum (PEType A/B, PEPhase 7 state + TuChoi). PurchaseEvaluationPolicy + Registry + FromDefinition. Seed 13 menu Pe_/PeWf_ + 2 WorkflowDefinition v01 (QT-DN-A 3-step, QT-DN-B 5-step). | 2c6f0ca |
| 2026-04-23 | Claude | Mở rộng master data + backfill demo HĐ — SeedDemoMasterDataAsync per-Code idempotent (5→15 NCC + 3→8 Project). DemoSupplierByType/DemoProjectByType maps đa dạng theo loại HĐ. BackfillDemoContractsSupplierProjectAsync update [DEMO] HĐ supplier+project nếu mismatch. Match business: ThauPhu↔NTP, NCC↔NCC, DV↔DV. | bcdc007 |
| 2026-04-23 | Claude | Edit detail row inline + deps audit script — 7 typed UpdateXxxDetailCommand BE (ChangelogAction.Update log) + 7 PUT endpoints. FE ContractDetailsTab: ActionBtns (Pencil + Trash) + EditRowDialog reuse FIELDS_BY_TYPE config + buildPayload + populate form từ row data. Mirror fe-admin. scripts/deps-audit.ps1 chạy dotnet+npm scan, color output, -FailOnHigh CI gate. |
e53cd3a |
| 2026-04-23 | Claude | User-kind approver runtime guard + Warning 20% SLA — WorkflowPolicy +UserTransitions parallel dict (default null cho Standard/SkipCcm, populated qua FromDefinition khi WorkflowStepApprover Kind=User). IsTransitionAllowed signature update accept actorUserId, fallback User-kind nếu Role không match. SlaExpiryJob.ProcessWarningsAsync mới — pull HĐ !SlaWarningSent && remaining ≤ 20% × default SLA → notify Drafter via NotificationType.SlaWarning + set flag tránh spam. | 4edcd58 |
| 2026-04-23 | Claude | SeedDemoContractsAsync — 7 demo HĐ varied phases — Idempotent (skip nếu [DEMO] tồn tại). 7 HĐ covering 7 ContractType + final phases (DangSoanThao/DangGopY/DangInKy/DangTrinhKy/DaPhatHanh) + 14 Details rows + ~30 Approvals workflow history + 2 Comments demo. ApproverUserId mapping đúng role (CCM→ccm.tran, BOD→bod.huynh, HRA→hra.dang). Mã HĐ auto gen RG-001. | 8bc9565 |
| 2026-04-23 | Claude | RolesPage CRUD /system/roles — BE: CreateRole regex Name validation, UpdateRole CHỈ ShortName/Description (Name FK không đổi), DeleteRole block AppRoles.All + count UserRoles > 0. 3 endpoint POST/PUT/DELETE Authorize Admin. FE: 5-column table + Loại badge (Mặc định/Tùy chỉnh) + Edit dialog Name disabled + Delete with HARDCODED_ROLES guard + Banner amber FK warning + Create dialog regex pattern HTML5. |
072ad6d |
| 2026-04-23 | Claude | Roles VN labels (ShortName) + Users dept/position + 13 demo users — Migration 11 AddRoleShortNameAndUserDepartment. Role thêm ShortName max 50 (QTV/BOD/CCM/PRO/FIN/...) + Description full VN. User thêm DepartmentId FK Restrict + Position. Idempotent backfill 12 roles VN labels. Seed 13 demo users (bod/pm/ccm/pro/fin/act/equ/hra TPB + 4 Drafter), pwd User@123456. FE UsersPage column Phòng ban + Chức vụ + edit dialog mới + roles checkbox "ShortName — Full". PermissionsPage Panel 1 2-line per role. |
330d529 + ae59cfe |
| 2026-04-23 | Claude | 4 master catalogs cho Details + datalist autocomplete — Migration 10 AddMasterCatalogs: UnitsOfMeasure (20 seed) + MaterialItems (15) + ServiceItems (10) + WorkItems (15). CQRS CRUD 13 endpoint, Admin role POST/PUT/DELETE. Menu mới Catalogs group + 4 leaves dưới Master. FE Admin CatalogsPage generic 4-tab CRUD /master/catalogs/:kind. FE Details Add form HTML5 <datalist> per field + smart-fill (pick code → autofill name + defaultUnit). DB 32→36 bảng. |
e27c547 + 16e24ed |
| 2026-04-23 | Claude | Mã HĐ gen ngay tại CreateContract + backfill HĐ legacy — CreateContractCommandHandler call codeGenerator.GenerateAsync trước db.Contracts.Add. TransitionAsync giữ defensive if MaHopDong null gen cho legacy. BackfillContractCodesAsync trong DbInitializer chạy startup, idempotent (NULL count → skip nếu 0). Trade-off: gap sequence khi reject nhưng user có mã ngay đầu để reference giấy tờ. |
51449d6 |
| 2026-04-23 | Claude | "Thao tác" 2-panel + Edit/Xóa hover + Detail preview — ContractCreatePage rewrite: Panel 1 List HĐ theo type + button "+ Thêm mới" cuối. Panel 2 ContractHeaderForm (new) hoặc ContractEditForm (edit) + Chi tiết section. URL state ?type/?id/?mode=new. Action buttons row Panel 1: Edit ✏ + Xóa 🗑 luôn hiện, mờ + disabled khi Phase != DangSoanThao. ContractDetailsPreview cho create mode show table headers + lock icon. |
8c4b4da + ec0c983 + 501b4de + 7f26ff9 + 39031ca |
| 2026-04-23 | Claude | Panel 2 layout: tabs → 7/3 grid (UX iter 2) — Bỏ tabs Tổng quan/Chi tiết/Lịch sử. Render flat: Tổng quan (Info+Comments+Attachments) ở trên, dưới grid lg:grid-cols-10 (Chi tiết 7 cột + Lịch sử Changelog 3 cột). | b3762af (tabs) → ad0652d (grid) |
| 2026-04-23 | Claude | 4-bảng data model overhaul (Header+Details+Workflow+Changelog) — Migration 9 AddContractDetailsAndChangelog: 7 ContractType-specific Details bảng + 1 ContractChangelog unified audit log. IChangelogService 5 method, wired vào CreateContract+UpdateDraft+AddComment+Upload/Delete/Transition. CQRS 9 endpoint mới (GetBundle+7 Add+Delete+ListChangelogs). FE ContractDetailsTab + ContractChangelogsTab. DB 24→32 bảng. |
70810e1 + 71c035d + e684455 |
| 2026-04-23 | Claude | 3-panel layout HĐ (List/Detail/Workflow) + Inbox + sidebar accordion + UserDashboard fix — MyContractsPage + ContractsListPage + InboxPage 3-panel lg:grid-cols-[320px_1fr_360px], ?id= URL state, mobile fallback fullpage. Sidebar accordion qua AccordionContext (chỉ 1 Ct_ expand). Tách "Tổng quan" → /dashboard riêng (fix bug trùng /inbox), UserDashboardPage 5-card "Của tôi" + recent contracts. |
b75448e + 89c7e88 + 7ea3957 + d326e80 |
| 2026-04-23 | Claude | Skill governance + audit định kỳ — docs/rules.md §9 mới (6 skill bảng, nguyên tắc tạo project-specific, format SKILL.md bắt buộc, workflow audit 7 bước, 4 anti-patterns). Cron task solution-erp-skill-audit-monthly fire 9:00 AM ngày 1 mỗi tháng (next 2026-05-01) — self-contained prompt cold-start, auto-refresh stale nhỏ + đề xuất add/archive cho human approve, log vào docs/changelog/skill-audit-{YYYY-MM}.md, ABORT nếu repo dirty. Touch-points: CLAUDE.md callout + HANDOFF A1 + migration-todos checkbox + skill scope commit |
b904a25 |
| 2026-04-23 | Claude | 3 skill ops project-specific — Khảo sát alirezarezvani/claude-skills, quyết định KHÔNG bulk-clone (skill global đã cover phần generic, repo còn lại doc-dump không có when-to-use). Viết 3 skill mới encode SOLUTION_ERP-only: dependency-audit-erp (npm/dotnet CVE scan respect MediatR 12.4.1 + Swashbuckle 6.9.0 pin), ef-core-migration (8 migration history + 3-file rule + DesignTimeDbContextFactory + 6 pitfalls cụ thể), iis-deploy-runbook (3 IIS site + win-acme + NSSM gitea-runner + LibreOffice + debug playbook 500/502/SignalR). Total skill project-level = 6 (3 domain + 3 ops) |
661f859 |
| 2026-04-22 | Claude | PermissionsPage 3-panel layout — Grid lg:grid-cols-[280px_1fr_300px]: Panel 1 Role list click-to-select (active ring-brand), Panel 2 Menu×CRUD matrix sticky thead + search + column bulk-toggle + brand-tinted hover, Panel 3 Granted progress bar + CRUD breakdown color badges (slate/emerald/amber/red) + Tip |
91b2da1 |
| 2026-04-22 | Claude | Admin Workflows tabs → sidebar menu items — Seed 7 Wf_<Code> leaf dưới group Workflows. Layout resolvePath Wf_<Code> → /system/workflows/<code>. WorkflowsPage bỏ tab bar, URL param drives type selection. Landing 7-card grid khi click top-level Quy trình HĐ. Inheritance: Workflows.Read perm → tất cả 7 leaves auto-visible. |
f216169 |
| 2026-04-22 | Claude | Versioned workflow per ContractType — 3 entity mới: WorkflowDefinition (Code+Version+IsActive+ContractType), WorkflowStep (Order+Phase+Name+SlaDays), WorkflowStepApprover (Role/User + AssignmentValue). Contract.WorkflowDefinitionId nullable FK pin tại create. Migration AddVersionedWorkflows. Seed v01 per 7 ContractType. WorkflowPolicyRegistry.FromDefinition() build runtime policy từ DB. ContractWorkflowService load pinned definition. Admin /system/workflows/:typeCode Designer modal (create new version, clone, add/remove step, +Role/+User approvers). POST /api/workflows auto-increment Version + deactivate old. Invariant: HĐ cũ pin v01 giữ nguyên khi v02 active. E2E verified: QT-MB-v02 active, HĐ cũ vẫn chạy v01. |
e7e5f2d + 355bbe3 |
| 2026-04-21 | Claude | Nested sidebar menu fe-user — 7 ContractType × 3 actions (Danh sách/Thao tác/Duyệt), nested 3-level. Admin hide Ct_*. Layout recursive MenuNodeRenderer. MyContracts + Inbox filter ?type=X |
5e0f380 + 48e91fe |
| 2026-04-21 | Claude | Seed master data + MyDashboard widgets — DbInitializer seed 9 departments (PM/QS/CCM/PRO/FIN/ACT/EQU/HRA/BOD) + 5 demo suppliers + 3 demo projects idempotent. MyDashboard endpoint role-aware: DraftsInProgress / PendingMyApproval / DueSoon / Overdue / DraftsTotalValue. FE "Của tôi" row 4 card hover-interactive, admin auto-hide nếu = 0 | 6197c84 |
| 2026-04-21 | Claude | Dynamic workflow policy per ContractType — Domain WorkflowPolicy record + registry (Standard 8-phase cho Thầu phụ/Giao khoán/NCC; SkipCcm 7-phase cho Dịch vụ/Mua bán/Nguyên tắc). ContractWorkflowService dùng policy.ForContract(c). FE xóa NEXT_PHASES hardcoded, dùng contract.workflow.nextPhases BE trả. WorkflowSummaryCard timeline visual. Gotcha #21 resolved | cae4d84 |
| 2026-04-21 | Claude | PDF export + .doc/.xls auto-convert + DynamicForm — LibreOffice 25.8.6 VPS, IDocumentConverter shell soffice --convert-to pdf/docx/xlsx timeout+temp isolation. Admin upload .doc auto-convert .docx. DynamicForm parse FieldSpec JSON render inputs (text/textarea/number/date/currency/select). Form↔JSON toggle. E2E verified PDF 488KB/126 pages |
e459097 + 6bbd894 |
| 2026-04-21 | Claude | Form template builder CRUD — Admin tự upload .docx/.xlsx qua UI (không cần dev). BE multipart + FormCode regex unique + FieldSpec JSON validation + soft delete via IsActive. FE FormsPage upload dialog + row actions render/edit/delete. E2E verified |
166d26c |
| 2026-04-21 | Claude | Fix Gitea 500 sau Install Web-WebSockets — appcmd unlock section webSocket. Gotcha #25 | c52186b |
| 2026-04-21 | Claude | SignalR realtime notifications E2E — 3-project clean-arch: IRealtimeNotifier (App) + SignalRNotifier (Api) + NotificationPushInterceptor (Infra SaveChanges hook). Hub /hubs/notifications JWT ?access_token= query (WebSocket headers limit). FE singleton lib/realtime.ts auto-reconnect + toast + query invalidation. IIS WebSocket module enabled |
ea9ab5e |
| 2026-04-21 | Claude | Attachment upload E2E — IFileStorage + LocalFileStorage (path-traversal guard) + CQRS Upload/Download/Delete + 3 endpoint (multipart, stream, DELETE) + FE ContractAttachmentsSection drag-drop + purpose selector + icon-per-MIME + auth-blob download + confirm delete. Wired 2 ContractDetailPage | c8d0070 + dc3f09b |
| 2026-04-21 | Claude | Content polish — typography 14px + leading 1.55 + tracking-tight + PageHeader border-b + Button shadow+active + Input inset shadow + DataTable rounded-xl UPPERCASE header brand hover | 346bd5d |
| 2026-04-21 | Claude | Brand identity từ Solutions logo — pixel-sampled #1F7DC1 → palette brand-50..900 + accent red + Be Vietnam Pro (Vietnamese-first) + favicon 'S' crop + apple-touch-icon + login gradient brand | 4abb559 + bf1fbe3 |
| 2026-04-21 | Claude | Fix login Network Error — SPA web.config HTTP→HTTPS redirect rule (CORS chỉ https) | 397eb36 |
| 2026-04-21 | Claude | Notifications module E2E — Domain entity + EF migration + Infra service + CQRS + API controller + FE bells wire real endpoint + ContractWorkflowService emit notification cho Drafter khi phase transition | 49c0ddc |
| 2026-04-21 | Claude | PermissionsPage iter 1 — search, stats badge, bulk column toggle, empty state | 6c0e206 |
| 2026-04-21 | Claude | ERP shell — TopBar + NotificationBell + UserMenu (avatar + role badges). Layout [sidebar] [topbar + content] |
2b6f91c |
| 2026-04-21 | Claude | Tier 1 UI polish — SlaTimer (inline + full variant, 5 chỗ), Inbox stat cards, DataTable skeleton rows, EmptyState | 290936a..2e43799 |
| 2026-04-21 | Claude | CI/CD deploy xanh E2E — self-hosted Windows runner, single job build+deploy, fresh node_modules (Vite 8 rolldown binding), appsettings từ secrets, /health/live 200 sau deploy | b40da1e |
| 2026-04-21 | Claude | VPS prod setup — SQL DB (SQLEXPRESS), IIS sites (SolutionErp-Api/Admin/User), win-acme 3 Let's Encrypt + auto-renew, shared gitea-runner với VIETREPORT | 169e268..519ba85 |
| 2026-04-21 | Claude | IDOR + SLA Job + Admin warning — ContractsController filter theo role. SlaExpiryJob BackgroundService 15min auto-approve Decision=AutoApprove. DbInitializer warn khi admin vẫn default | fba0754 |
| 2026-04-21 | Claude | Phase 5.1 Security + Users Mgmt — Security headers + Identity lockout + LoginHandler check + Users CQRS + UsersController + FE /system/users |
11e61c9 |
| 2026-04-21 | Claude | Phase 5 Prep — BE rate limit + health check + Serilog file + HSTS + scripts deploy-iis/backup-sql + .gitea/workflows/deploy.yml + 4 guides + FE refresh token queue pattern | 46a2cab |
| 2026-04-21 | Claude | Phase 4 Report MVP — Dashboard KPI + Excel export + rules.md + architecture.md + schema-diagram.md + gotchas 26 pitfalls | fe7ad8e |
| 2026-04-21 | Claude | Phase 3 Workflow MVP — 9 phase state machine + gen mã HĐ RG-001 | 7e957a7 |
| 2026-04-21 | Claude | Phase 2 Form Engine MVP | 5113e4c |
| 2026-04-21 | Claude | Phase 1.2 — CRUD Master + Permission Matrix | 54d6c9b |
| 2026-04-21 | Claude | Phase 1 foundation + Docs addition | 702411f + 49a5f57 |
| 2026-04-21 | Claude | Phase 0 | 25dad7f |
Session logs: P0 · P1f · P1.2 · P2 · P3 · P4 · P5prep · Tier 3 · Skill gov · Toolkit+4-bảng+Roles VN · Roles+Demo+Pending
Docs entry points:
rules.md·architecture.md·HANDOFF.mdworkflow-contract.md·forms-spec.mddatabase/database-guide.md·database/schema-diagram.mdflows/(7 file) ·guides/(4 file) ·gotchas.mdchangelog/migration-todos.md·changelog/sessions/(14 file).claude/skills/README.md— 6 skill (3 domain + 3 ops) · audit định kỳ 1/tháng (cronsolution-erp-skill-audit-monthlynext 2026-05-01)
🎯 Next up
Hard blockers (chờ user / ops)
- UAT 1 tuần 2-3 user thật — hard requirement từ roadmap Phase 5
- Email outbox — MailKit + SMTP (BLOCKED chờ user cấp SMTP host/user/pass)
- Rotate credentials — SA, vrapp, JWT secret, runner token (đã post chat)
- SQL backup daily — Task Scheduler (script
scripts/backup-sql.ps1đã có, chưa schedule)
Optional polish (khi rảnh / UAT phát sinh)
- Roles CRUD — admin tạo custom role ngoài 12 hardcoded (schema sẵn, chỉ cần CQRS + FE)
- User-level approver targeting runtime — data model đã có (
WorkflowStepApprover.Kind=User), chỉ cần wire User-kind vàoContractWorkflowService.TransitionAsyncguard - PermissionsPage: grant
Workflows.Readcho non-admin role → menu Wf_* visible - Warning notification khi còn 20% SLA (
SlaWarningSentflag đã có, chỉ thiếu job emit) - E2E test reject → quay về DangSoanThao (multi-role)
- Dependencies scan CI (
dotnet list package --vulnerable,npm audit)
Tier 3 ERP roadmap ✓ (close)
- Attachment upload BE + FE ✓
- SignalR real-time push ✓
- Form template builder CRUD + DynamicForm ✓
- PDF export qua LibreOffice headless ✓
- .doc/.xls → .docx/.xlsx auto-conversion ✓
- Dynamic workflow policy per ContractType ✓
- Versioned workflow (WorkflowDefinition pinned per Contract) ✓
- Admin workflow designer UI (per-type, per-step approvers) ✓
- Nested sidebar menu per ContractType (fe-user) + menu split admin/user ✓
- PermissionsPage 3-panel layout ✓
- Email outbox for Notification (blocked — SMTP config)
📊 Thông số cumulative
| P0 | P1f | P1.2 | P2 | P3 | P4 | P5prep | Tier3 | +Toolkit | +RolesPg+Demo | +PE module | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| BE LOC | 0 | ~400 | ~1500 | ~1900 | ~2700 | ~3100 | ~3300 | ~4800 | ~7800 | ~8800 | ~11100 |
| DB tables | 0 | 7 | 12 | 14 | 19 | 19 | 19 | 24 | 36 | 36 | 46 (+10 PE) |
| API endpoints | 0 | 4 | 20 | 23 | 31 | 33 | 35 | ~50 | ~80 | ~93 | ~110 (+17 PE) |
| Migrations | 0 | 1 | 3 | 4 | 5 | 5 | 5 | 8 | 11 | 11 | 12 |
| FE pages | 0 | 2 | 6 | 7 | 14 | 16 | 16 | ~20 | ~22 | ~23 | ~26 (+3 PE pages × 2 app) |
| FE components | — | — | — | — | — | — | — | many | many+ | +EditRowDialog (refactor ActionBtns) | |
| Scripts PS | 0 | 0 | 0 | 1 | 1 | 1 | 3 | 4 | 4 | 5 (+deps-audit.ps1) | |
| CI/CD workflow | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | |
| Docs | 10 | 13 | 14 | 24 | 26 | 30 | 35 | ~40 | ~42 | ~44 (+session log) | |
| Demo data | 0 | 0 | seed empty | 0 | 0 | 0 | 0 | 0 | 5+3 | 15+8+7+13+4 (NCC/Project/HĐ/User/Catalogs) | |
| Commits | 1 | 2 | 3 | 5 | 6 | 7 | 8 | ~25 | ~47 | ~52 |
🚨 Blockers / risks
- ⚠️ Email SMTP chưa có — blocker cho notification outbound
- ⚠️ UAT real user chưa chạy — risk phát sinh bug edge-case quan trọng
- ⚠️ Credentials leaked trong chat — cần rotate trước go-live thật
- ⚠️ SQL backup không auto — risk data loss nếu VPS crash
- ⚠️ Permission
Workflows.Readcho non-admin — cần grant để họ thấy menu Wf_* (hiện chỉ admin thấy) - ⚠️ User-kind approver chưa enable runtime — designer cho chọn User nhưng guard fall back DeptManager
Credentials + URLs
admin@solutionerp.local / Admin@123456
- API prod: https://api.solutions.com.vn — Health
/health/live+/health/ready - API dev: http://localhost:5443 — Swagger
/swagger - Admin FE prod: https://admin.solutions.com.vn · dev
http://localhost:8082 - User FE prod: https://eoffice.solutions.com.vn · dev
http://localhost:8080 - SQL prod:
.\SQLEXPRESS/SolutionErp/vrapp - SQL dev:
(localdb)\MSSQLLocalDB/SolutionErp_Dev