The six-step workflow for adjudicating subcontractor pricing across an Item bundle. On award, the system creates (or updates) a system-generated Price Book holding one Subcontract Resource per Item in the Package.

Primary view: Subcontract Package Adjudication (view 12) Related entities: Adjudication · Subcontract Package · Price Book · Item · Company

1. When to use

Run a Subcontract Package Adjudication (SPA) when:

  • A group of Items will be delivered by a single subcontractor (e.g., all electrical work, all structural steel).
  • You want fresh competing quotes at the package level (lump sum or line-by-line).
  • On award, you want the system to create or update Subcontract Resources representing the awarded work.

SPA is distinct from PBA in that the scope is Items (not Resources), and the output creates a system-generated Price Book rather than replacing rates on existing Resources.


2. Preconditions

  • Estimate is in an editable state (In Progress or Reviewed). SPAs cannot be re-opened once Estimate is Submitted.
  • A Subcontract Package exists (or is created as part of Step 1). Each Package has ≥1 Item, belongs to exactly one Estimate, and is created atomically with its first Adjudication round (Subcontract Package spec §5).
  • Competing subcontractors are Companies with the Subcontractor role.
  • The Package does NOT carry a pre-qualified Subcontractor list — Subcontractor selection lives inside the Adjudication workflow, Step 1.

3. The six steps

Same structure as Price Book Adjudication, but operating over an Item bundle.

 ┌─────────┐ ┌────────┐ ┌────────┐ ┌─────────┐ ┌───────────┐ ┌──────────┐
 │1. │ │2. │ │3. │ │4. │ │5. │ │6. │
 │Generate │ → │Export │ → │Import │ → │Compare │ → │Normalise │ → │Transfer │
 └─────────┘ └────────┘ └────────┘ └─────────┘ └───────────┘ └──────────┘
 (Draft throughout) (Adjudicated)

Step 1 — Generate

Goal: assemble the scope — an Item bundle and a competing-Subcontractor list.

  • Estimator creates (or opens) a Subcontract Package: name, scope description, Item membership.
  • Adjudication round 1 is created atomically with the Package.
  • Estimator picks competing Subcontractors (Companies with Subcontractor role; role gate validated at first-gate).
  • System snapshots the Item scope (descriptions, quantities, units) as the baseline.

Item membership: editable while the current round is Draft. Once Adjudicated, Item membership is frozen until a re-open creates a new Draft round.

State: Draft.

Step 2 — Export

Goal: package the scope for competing Subcontractors.

  • Format: Excel or PDF with the Item list (descriptions, quantities, units, optional notes).
  • Distribution: manual (email) in v1.
  • Tracking: return_received_date per Subcontractor on import.

State: Draft.

Step 3 — Import

Goal: bring competing returns in.

  • Estimator uploads each Subcontractor’s Excel via the Import Wizard.
  • Wizard handles column mapping, preview validation, error detection.
  • Returns may be per-item rates, lump sums, or mixed. Stored as an Adjudication Return per Subcontractor.

Role gate: first-gate validation — the first of (adding the Company to the Adjudication as a competing Subcontractor) or (importing their return) requires Subcontractor role.

State: Draft.

Step 4 — Compare

Goal: side-by-side view of competing quotes.

  • Per Item × per Subcontractor: quoted rate (or proportional share of a lump sum), variance vs baseline / each other.
  • Variance, inclusion, exclusion notes → saved as Content Block instances on affected Items’ Worksheets. Persist on Items after award.
  • Read-only exploration.

State: Draft.

Step 5 — Normalise

Goal: fill in missing rates for like-for-like comparison.

  • If Sub B quoted a lump sum only, estimator can decompose proportionally across the 12 Items for comparison.
  • If Sub A missed an item, estimator adds a normalisation row (e.g., “use Sub C’s rate for that line”).
  • Normalisation rows are transient to the Adjudication. They only matter for the selected winner’s final Transfer step.

State: Draft.

Step 6 — Transfer (Award)

Goal: apply the award. Create / update the system-generated Price Book and wire Items to the new Resources.

On award:

  1. Estimator selects one Subcontractor’s return as the winner.
  2. System creates or updates the Package’s system-generated Price Book:
  • One system-generated Price Book per Subcontract Package (stable ID across rounds, lineage to SPA).
  • Supplier = the winning Subcontractor (Company).
  • Resources: one Subcontract Resource per Item in the Package, each with the awarded rate (and any normalisation rates that applied).
  1. For each Item in the Package, system creates / updates a Worksheet Resource on the Item’s Worksheet linking to the corresponding Subcontract Resource.
  2. Item status derivation re-runs: Items that were Unpriced / Plugged may transition to Priced.
  3. Adjudication status transitions Draft → Adjudicated.
  4. system_generated_price_book_id is populated on the Adjudication.

Lineage: the system-generated Price Book retains adjudication_id pointing back to the SPA that created / last updated it. Estimators can trace a Subcontract Resource’s cost to its award.


4. Multiple rounds

Same pattern as PBA — each re-open creates a new Draft round. Difference: the system-generated Price Book persists across all rounds (same ID, contents updated in place).

Re-open use case: scope change (Items added / removed by the client), new Subcontractors in market, re-test of pricing.

Re-open semantics: on Adjudicated → Draft:

  • Resources in the system-generated Price Book persist with last-awarded rates.
  • New round scopes the current Item set (now editable again — membership gate).
  • Worksheet Resources still reference the system-generated Price Book; rates held until new award.

On re-award:

  • System updates the Price Book in place.
  • Items kept in scope: Resources re-priced.
  • Items newly added: new Resources created.
  • Items removed from the Package: their Resources remain in the Price Book but are no longer referenced by an Item’s Worksheet (orphan; visible in the Price Book).

Re-open gate: same as PBA — blocked once parent Estimate is Submitted.


5. Workflow diagram

 Estimate (In Progress or Reviewed)
 │
 ▼
 Create Subcontract Package
 (name, Item set, scope description)
 │
 ▼
 Atomic: create first Adjudication
 (Package + SPA round 1 together)
 │
 ▼
 ┌────────────── Draft state (membership editable) ────────────┐
 │ │
 │ 1. Generate — Items + competing Subcontractors │
 │ │ │
 │ ▼ │
 │ 2. Export — Excel / PDF package │
 │ │ │
 │ ▼ │
 │ 3. Import — returns via Import Wizard (role gate) │
 │ │ │
 │ ▼ │
 │ 4. Compare — side-by-side matrix │
 │ │ (variance notes → Content Blocks on Items) │
 │ ▼ │
 │ 5. Normalise — transient fill-ins / lump-sum decomposition │
 │ │ │
 │ ▼ │
 │ 6. Transfer — select Subcontractor; system creates/updates │
 │ system-generated Price Book + WR per Item │
 │ │
 └──────────────────────────┬───────────────────────────────────┘
 │
 ▼
 Adjudicated state
 (Item membership frozen)
 │
 ▼
 Items pull cost from system-generated
 Price Book via their new Worksheet Resources
 │
 ┌────────────────┴────────────────┐
 ▼ ▼
 Estimator continues Re-open (scope change
 Estimate work or market refresh)
 │
 ▼
 New Draft round
 (round_number++)
 Item membership editable
 System-gen PB persists

6. Key distinctions vs Price Book Adjudication

AspectPrice Book AdjudicationSubcontract Package Adjudication
ScopeResources from existing Price BooksItems bundled in a Subcontract Package
Output on awardReplaces rates on scoped Resources in placeCreates / updates a system-generated Price Book; writes Subcontract Resources; wires Worksheet Resources to Items
Persistent scope objectNo (scope lives on each Adjudication)Yes — Subcontract Package persists across rounds
Multiple roundsYesYes
Resource lineage to AdjudicationNo (Resources predate the PBA)Yes (system-generated Price Book points to producing SPA)
Competing Companies roleSupplierSubcontractor
UI layoutShared six-step scaffoldShared six-step scaffold

7. Anomalies & edge cases

SituationHandling
Package contains 0 ItemsCreate / Save blocked (Subcontract Package invariant §5.2: non-empty Item set)
Subcontractor quotes a lump sum onlyNormalise step decomposes proportionally across in-scope Items
Lump sum + per-item rates mixed across SubcontractorsNormalise step puts both on equal footing (convert lump sum to per-item)
Item membership change attempted while AdjudicatedRejected; estimator must re-open first
Round 2 adds ItemsExport to all participating Subcontractors must include the new Items
Round 2 removes ItemsTheir Subcontract Resources persist (orphaned) in the system-generated Price Book
System-generated Price Book rate change via direct editNot allowed — read-only via Price Book UI; updated only by re-adjudication
Estimate transitions to Submitted mid-SPAAdjudication frozen; re-open blocked
Items in the Package that were Unpriced / PluggedOn award, Items gain Worksheet Resources → status transitions to Priced
Subcontract Resource appearing in Worksheet Resource but Item flagged InactiveItem excludes itself from cost roll-up; Resource remains linked

8. Roles

Same as PBA — all three roles can run the full workflow.

CapabilityAdminLead EstimatorEstimator
Create Subcontract Package
Edit Package Items (while Draft)
Run SPA (Draft → Adjudicated)
Re-open SPA

9. Worked example

Electrical package, round 1:

Setup:
 Estimate for office fitout.
 Subcontract Package "Electrical" — 12 Items (panel install, wiring, testing, etc.)
 Total estimated baseline: ~$85K

Generate:
 Package Items: 12
 Competing Subcontractors: ABC Electric, XYZ Electrical, Local Sparks

Export:
 PDF / Excel sent showing 12 line items (name, qty, unit)

Import:
 ABC Electric — per-item fixed prices; rates vary by complexity
 XYZ Electrical — single lump sum $285K plus variance notes
 Local Sparks — per-hour unit rates per item type

Compare:
 Side-by-side matrix; XYZ's lump sum needs decomposition
 Variance notes captured → Content Block instances on Items

Normalise:
 XYZ's lump sum decomposed proportionally across 12 Items
 Now all three comparable on per-item basis

Transfer:
 Estimator selects ABC Electric (best value, clear breakdown)
 System creates:
 System-generated Price Book "SPA Electrical — Round 1" (supplier: ABC Electric)
 12 Subcontract Resources, one per Item in Package, each with ABC's quoted rate
 12 Worksheet Resources (one per Item), linking to the new Resources
 Adjudication status: Adjudicated
 Package state (derived): Adjudicated; Item membership frozen

Result:
 Estimate cost reflects ABC's pricing
 Items cascade Unpriced/Plugged → Priced
 Lineage: each Subcontract Resource traces back to the SPA

And the re-open on scope change:

Re-open:
 Client adds 2 new Items (E13, E14), removes 1 (E7)
 Estimator clicks Re-open on SPA → status: Draft, round_number: 2
 Item membership editable again — adds E13, E14; removes E7

New Generate:
 Scope = Items 1-6, 8-12 (keep) + 13, 14 (new)

Re-export, Re-import, Re-compare, Re-normalise:
 Invite ABC, plus two new Subcontractors
 Select winner — assume ABC again

Transfer:
 System updates PB in place:
 Items 1-6, 8-12: Resources re-priced
 Items 13, 14: new Resources created
 Item 7: Resource remains (orphan; no Worksheet Resource references it)
 Status: Adjudicated (round 2)