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 ProgressorReviewed). 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_dateper 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:
- Estimator selects one Subcontractor’s return as the winner.
- 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).
- For each Item in the Package, system creates / updates a Worksheet Resource on the Item’s Worksheet linking to the corresponding Subcontract Resource.
- Item status derivation re-runs: Items that were Unpriced / Plugged may transition to Priced.
- Adjudication status transitions
Draft → Adjudicated. system_generated_price_book_idis 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
| Aspect | Price Book Adjudication | Subcontract Package Adjudication |
|---|---|---|
| Scope | Resources from existing Price Books | Items bundled in a Subcontract Package |
| Output on award | Replaces rates on scoped Resources in place | Creates / updates a system-generated Price Book; writes Subcontract Resources; wires Worksheet Resources to Items |
| Persistent scope object | No (scope lives on each Adjudication) | Yes — Subcontract Package persists across rounds |
| Multiple rounds | Yes | Yes |
| Resource lineage to Adjudication | No (Resources predate the PBA) | Yes (system-generated Price Book points to producing SPA) |
| Competing Companies role | Supplier | Subcontractor |
| UI layout | Shared six-step scaffold | Shared six-step scaffold |
7. Anomalies & edge cases
| Situation | Handling |
|---|---|
| Package contains 0 Items | Create / Save blocked (Subcontract Package invariant §5.2: non-empty Item set) |
| Subcontractor quotes a lump sum only | Normalise step decomposes proportionally across in-scope Items |
| Lump sum + per-item rates mixed across Subcontractors | Normalise step puts both on equal footing (convert lump sum to per-item) |
| Item membership change attempted while Adjudicated | Rejected; estimator must re-open first |
| Round 2 adds Items | Export to all participating Subcontractors must include the new Items |
| Round 2 removes Items | Their Subcontract Resources persist (orphaned) in the system-generated Price Book |
| System-generated Price Book rate change via direct edit | Not allowed — read-only via Price Book UI; updated only by re-adjudication |
| Estimate transitions to Submitted mid-SPA | Adjudication frozen; re-open blocked |
| Items in the Package that were Unpriced / Plugged | On award, Items gain Worksheet Resources → status transitions to Priced |
| Subcontract Resource appearing in Worksheet Resource but Item flagged Inactive | Item excludes itself from cost roll-up; Resource remains linked |
8. Roles
Same as PBA — all three roles can run the full workflow.
| Capability | Admin | Lead Estimator | Estimator |
|---|---|---|---|
| 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)