Skip to content

Import projects & estimates from SharePoint

StageBuilding
StatusPartial
Design statusIn review
EstimateS
ConfidenceHigh
LinearPIN-501 ↗ PIN-508 ↗ PIN-506 ↗
Linear statusDone · +1 planned
CycleC14-C15
DesignDesign ↗
Linear epicRuntime, Delivery & Operations
ModuleRuntime & Ops ↗

Design — backend-only, no canon needed

Backend import job (SharePoint → Azure Blob via Microsoft Graph); no design canon applies and this is not a design gap. The user-facing browse / stage / review UI is the separate Smart Import SharePoint page.

Priority: High · Route: /settings/sharepoint

Scope

Out-of-band importer walks Pinley's SharePoint libraries via Microsoft Graph and streams every file into Azure Blob — the permanent, versioned source of truth — preserving the folder tree into bids, projects, and documents. Scoped to Conor's active-projects list (2024/25 plus all 2026) and Estimating content from 2023/24 onward, not the full archive; estimates land as browsable document archives first, with AI parsing into structured line items as later work. (Source: PIN-501, PIN-508, PIN-506.)

Acceptance criteria

  • Importer authenticates against SharePoint and lists the Estimating, Projects, and Takeoffs drives
  • Project import restricted to the active-projects list; Estimating import restricted to 2023/24-onward folders
  • Files stream to Azure Blob; folder tree preserved and mapped into bids, projects, and documents
  • Bid/project metadata populated from the Master Bid List; a folder missing a metadata row still imports as a name-only invite, never a hard failure
  • Re-running the import is idempotent — no duplicate files or records
  • Runs as an explicit one-off job, never as part of normal app boot/seeding
  • Dedicated runner sized for the filtered import volume, with egress to both SharePoint and Blob

Conor's comments

Needs to be properly testings and trained before mass import. How are estimate values assigned to cost codes.

Notes

Run in prod

Open question for Conor

-