M365 ● Sealed v1.0

ProjectOnline

Discovers Microsoft Project Online projects via Microsoft Graph API.

What it does

Uses app-only authentication (client_credentials flow) to call: - Graph site resolution (PWA / Project Web App / projectserver paths) - projectData / Projects lists on resolved PWA sites - Graph /beta/projects (when available) - SharePoint ProjectData OData REST (_api/ProjectData/Projects) with SPO token Enumerates Project Online projects with migration-useful columns: ProjectId, ProjectName, Description, Owner/OwnerId/OwnerEmail, dates, SiteId/SiteUrl/SiteName, WorkspaceUrl, ParentProjectId, TenantId, etc. Honest EMPTY: when the tenant has no Project Online PWA / projects, writes header-only CSV and Success=true (does not invent rows). Fail loud on AUTH (missing credentials / token / 401/403). Pure functions (TDD-enabled): - ConvertFrom-ProjectOnlineItem: Converts OData/Graph project item to discovery record - Get-ProjectOnlineCsvHeader: Canonical header list for header-only exports - Resolve-ProjectPersonField: Person/lookup extraction for list/Graph owner fields

How the app exposes it

The module runs through the ACQI discovery orchestrator and writes its rows into a dedicated results view. From there, conflicts, dependencies, and readiness scores feed the deal-wide consolidation layer.

Route in app:
/discovered/project-online

Outputs

Each module emits a normalised CSV keyed by entity ID with readiness and risk scores, evidence-source counts, and last-seen timestamps. The exact column set varies by module — the app's results view shows the live schema.