diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 46f954d..c9a7958 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -121,7 +121,7 @@ Plans: | 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 | | 10-14 | v2.2 | 14/14 | Shipped | 2026-04-09 | | 15. Consolidation Data Model | v2.3 | 2/2 | Complete | 2026-04-09 | -| 16. Report Consolidation Toggle | 2/2 | Complete | 2026-04-09 | — | +| 16. Report Consolidation Toggle | 2/2 | Complete | 2026-04-09 | — | | 17. Group Expansion in HTML Reports | v2.3 | 0/? | Not started | — | | 18. Auto-Take Ownership | v2.3 | 0/? | Not started | — | | 19. App Registration & Removal | v2.3 | 0/? | Not started | — | diff --git a/.planning/STATE.md b/.planning/STATE.md index 74b5dba..57e5976 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -4,7 +4,7 @@ milestone: v2.3 milestone_name: Tenant Management & Report Enhancements status: planning stopped_at: Completed 16-02-PLAN.md -last_updated: "2026-04-09T10:39:46.925Z" +last_updated: "2026-04-09T10:43:01.998Z" last_activity: 2026-04-09 — Roadmap created for v2.3 (phases 15-19) progress: total_phases: 5 diff --git a/.planning/phases/16-report-consolidation-toggle/16-VERIFICATION.md b/.planning/phases/16-report-consolidation-toggle/16-VERIFICATION.md new file mode 100644 index 0000000..6391cbe --- /dev/null +++ b/.planning/phases/16-report-consolidation-toggle/16-VERIFICATION.md @@ -0,0 +1,119 @@ +--- +phase: 16-report-consolidation-toggle +verified: 2026-04-09T00:00:00Z +status: passed +score: 11/11 must-haves verified +re_verification: false +--- + +# Phase 16: Report Consolidation Toggle Verification Report + +**Phase Goal:** Add a "Merge duplicate permissions" toggle to User Access Audit and Permissions tabs that consolidates identical permissions across sites into single rows with expandable location sub-lists. +**Verified:** 2026-04-09 +**Status:** PASSED +**Re-verification:** No — initial verification + +--- + +## Goal Achievement + +### Observable Truths + +| # | Truth | Status | Evidence | +|---|-------|--------|----------| +| 1 | MergePermissions property exists on UserAccessAuditViewModel and defaults to false | VERIFIED | `[ObservableProperty] private bool _mergePermissions;` at line 106 of UserAccessAuditViewModel.cs | +| 2 | MergePermissions property exists on PermissionsViewModel and defaults to false (no-op placeholder) | VERIFIED | `[ObservableProperty] private bool _mergePermissions;` at line 42 of PermissionsViewModel.cs | +| 3 | Export Options GroupBox with 'Merge duplicate permissions' checkbox is visible in both XAML tabs | VERIFIED | GroupBox at line 213 of UserAccessAuditView.xaml; GroupBox at line 87 of PermissionsView.xaml; both bind `chk.merge.permissions` and `IsChecked="{Binding MergePermissions}"` | +| 4 | CSV export with mergePermissions=false produces byte-identical output to current behavior | VERIFIED | Test `WriteSingleFileAsync_mergePermissionsfalse_produces_identical_output` passes; early-return branch at line 100-102 of UserAccessCsvExportService.cs leaves existing code path untouched | +| 5 | CSV export with mergePermissions=true writes consolidated rows with Locations column | VERIFIED | Test `WriteSingleFileAsync_mergePermissionstrue_writes_consolidated_rows` passes; consolidated header `"User","User Login","Permission Level","Access Type","Granted Through","Locations","Location Count"` confirmed | +| 6 | HTML export with mergePermissions=false produces byte-identical output to pre-Phase-16 behavior | VERIFIED | Test `BuildHtml_mergePermissionsFalse_identical_to_default` passes; early-return branch at line 23 of UserAccessHtmlExportService.cs leaves existing code path untouched | +| 7 | HTML export with mergePermissions=true renders consolidated by-user rows with Sites column | VERIFIED | Test `BuildHtml_mergePermissionsTrue_contains_sites_column` passes; `BuildConsolidatedHtml` private method at line 343 emits Sites column header | +| 8 | Consolidated rows with 2+ locations show clickable [N sites] badge that expands sub-list | VERIFIED | Test `BuildHtml_mergePermissionsTrue_multiLocation_has_badge_and_subrows` passes; `onclick="toggleGroup('loc..."` and `data-group="loc..."` patterns confirmed at lines 517-523 of UserAccessHtmlExportService.cs | +| 9 | By-site view toggle is omitted from HTML when consolidation is ON | VERIFIED | Test `BuildHtml_mergePermissionsTrue_omits_bysite_view` passes; `BuildConsolidatedHtml` renders only `