Subcontractor Items
Overview
Subcontractor items represent external services (pumps, drilling, sawing, rodbusting, etc.) with configurable buffer markup for risk adjustment.
Endpoints
List Subcontractor Items
- Request
- Response
GET /api/subcontractor/scope/:scopeId
Cookie: sAccessToken=...; sRefreshToken=...
[
{
"id": "uuid",
"scopeId": "uuid",
"service": "Pumping",
"quantity": 45.5,
"wastePercent": 5.0,
"adjustedQuantity": 47.775,
"ratePerUnit": 8.50,
"unit": "CY",
"buffer": 15.0,
"subtotal": 406.09,
"totalCost": 467.00,
"details": {
"vendor": "Alamo City Concrete Pumping",
"pumpSize": "32 Meter",
"travelFee": 225.00
}
},
...
]
Roles: ADMIN, ESTIMATOR, PM
Create Subcontractor Item
- Request
- Response
POST /api/subcontractor
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json
{
"scopeId": "uuid",
"service": "Pumping",
"quantity": 45.5,
"wastePercent": 5.0,
"ratePerUnit": 8.50,
"unit": "CY",
"buffer": 15.0,
"details": {
"vendor": "Alamo City Concrete Pumping",
"pumpSize": "32 Meter",
"travelFee": 225.00
}
}
{
"id": "uuid",
"subtotal": 406.09,
"totalCost": 467.00,
"message": "Subcontractor item created successfully"
}
Roles: ADMIN, ESTIMATOR
Required Fields:
scopeId(string, UUID) - Parent scopeservice(string) - Service typequantity(number) - Base quantityratePerUnit(number) - Cost per unitunit(string) - Unit of measure
Optional Fields:
wastePercent(number, default: 0) - Waste factorbuffer(number, default: 0) - Risk buffer percentagedetails(object) - Additional metadata (vendor, pump size, etc.)
Update Subcontractor Item
- Request
- Response
PUT /api/subcontractor/:id
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json
{
"quantity": 50.0,
"buffer": 20.0
}
{
"id": "uuid",
"totalCost": 540.00,
"message": "Subcontractor item updated successfully"
}
Roles: ADMIN, ESTIMATOR
Delete Subcontractor Item
- Request
- Response
DELETE /api/subcontractor/:id
Cookie: sAccessToken=...; sRefreshToken=...
{
"message": "Subcontractor item deleted successfully"
}
Roles: ADMIN, ESTIMATOR
Pump Catalog
Get Pump Catalog
- Request
- Response
GET /api/subcontractor/pump-catalog
Cookie: sAccessToken=...; sRefreshToken=...
[
{
"vendor": "Alamo City Concrete Pumping",
"pumps": [
{
"name": "32 Meter",
"volumeRate": 8.5,
"hourRate": 225.0,
"travelFee": 225.0,
"minimumHours": 4,
"reach": 32
},
{
"name": "42 Meter",
"volumeRate": 9.5,
"hourRate": 275.0,
"travelFee": 275.0,
"minimumHours": 4,
"reach": 42
}
]
},
{
"vendor": "Another Pump Company",
"pumps": [...]
}
]
Roles: ADMIN, ESTIMATOR, PM
Catalog Size: 122 pump configurations across multiple vendors
Pump Fields:
vendor(string) - Company namename(string) - Pump size/modelvolumeRate(number) - Cost per cubic yardhourRate(number) - Cost per hourtravelFee(number) - One-time travel chargeminimumHours(number) - Minimum billable hoursreach(number) - Reach in meters
Cost Calculation
// Waste calculation
adjustedQuantity = quantity × (1 + wastePercent/100)
// Base cost
subtotal = adjustedQuantity × ratePerUnit
// Buffer markup
totalCost = subtotal × (1 + buffer/100)
Buffer Markup
The buffer field applies a percentage markup to account for:
- Risk/uncertainty
- Schedule delays
- Change orders
- Market volatility
Common Buffer Values:
- Low risk: 5-10%
- Medium risk: 10-20%
- High risk: 20-30%
Service Types
Common subcontractor services:
| Service | Typical Unit | Description |
|---|---|---|
| Pumping | CY | Concrete pumping |
| Pier Drilling | LF | Drilled piers |
| Sub Labor | HR | Subcontracted labor |
| Crane Rental | HR | Crane services |
| Surveying | DAY | Survey work |
| Rodbusting | TON | Rebar fabrication/installation |
| Saw Cutting | LF | Concrete cutting |
Details Object
The details field is a flexible JSON object for service-specific metadata:
Pumping Example
{
"vendor": "Alamo City Concrete Pumping",
"pumpSize": "32 Meter",
"travelFee": 225.00,
"minimumHours": 4
}
Drilling Example
{
"vendor": "ABC Drilling",
"pierDiameter": 24,
"depthRange": "10-30 feet"
}
Data Model
interface SubcontractorItem {
id: string // UUID
scopeId: string // Parent scope UUID
service: string // Service type
quantity: number // Base quantity
wastePercent: number // Waste factor (%)
adjustedQuantity: number // With waste applied (read-only)
ratePerUnit: number // Cost per unit
unit: string // Unit of measure
buffer: number // Risk buffer (%)
subtotal: number // Before buffer (read-only)
totalCost: number // Final cost (read-only)
details: object | null // Service-specific metadata
// Relations
scope: Scope
}
Units of Measure
Common units:
- CY - Cubic yards
- LF - Linear feet
- SF - Square feet
- HR - Hours
- DAY - Days
- EA - Each
- TON - Tons
Example: Concrete Pumping
{
"service": "Pumping",
"quantity": 45.5,
"wastePercent": 5.0,
"ratePerUnit": 8.50,
"unit": "CY",
"buffer": 15.0,
"details": {
"vendor": "Alamo City Concrete Pumping",
"pumpSize": "32 Meter",
"travelFee": 225.00
}
}
Calculation:
- Adjusted quantity: 45.5 × 1.05 = 47.775 CY
- Subtotal: 47.775 × $8.50 = $406.09
- Buffer: $406.09 × 1.15 = $467.00
- Total: $467.00