Concrete Items
Overview
Concrete items represent concrete pours with integrated rebar estimation. The system automatically calculates cubic yards, rebar pounds, and costs based on dimensions and mix designs.
Endpoints
List Concrete Items
- Request
- Response
GET /api/concrete-items/scope/:scopeId
Cookie: sAccessToken=...; sRefreshToken=...
[
{
"id": "uuid",
"scopeId": "uuid",
"name": "Foundation Pour",
"quantity": 1,
"shape": "RECTANGLE",
"length": 100.0,
"width": 50.0,
"depthIn": 24.0,
"slabRebarSize": "#4",
"slabRebarOC": 12.0,
"transRebarSize": "#4",
"transRebarOC": 18.0,
"cubicYards": 37.04,
"totalRebarPounds": 1250.0,
"rebarPoundsWithWaste": 1375.0,
"concreteCost": 5556.00,
"rebarCost": 1512.50,
"totalCost": 7068.50,
"mixPricingItemId": "uuid",
"rebarPricingItemId": "uuid"
},
...
]
Roles: ADMIN, ESTIMATOR, PM
Create Concrete Item
- Request
- Response
POST /api/concrete-items
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json
{
"scopeId": "uuid",
"name": "Slab Pour",
"quantity": 1,
"shape": "RECTANGLE",
"length": 80.0,
"width": 40.0,
"depthIn": 6.0,
"slabRebarSize": "#4",
"slabRebarOC": 12.0,
"transRebarSize": "#4",
"transRebarOC": 18.0,
"mixPricingItemId": "uuid",
"rebarPricingItemId": "uuid"
}
{
"id": "uuid",
"cubicYards": 5.93,
"totalRebarPounds": 425.0,
"totalCost": 1250.00,
"message": "Concrete item created successfully"
}
Roles: ADMIN, ESTIMATOR
Required Fields:
scopeId(string, UUID) - Parent scopename(string) - Item descriptionquantity(number) - Typically 1shape(string) - RECTANGLE, CIRCULAR, etc.- Dimensions:
length,width,depthIn(ordiameterfor circular) mixPricingItemId(string, UUID) - Concrete mix referencerebarPricingItemId(string, UUID) - Rebar pricing reference
Optional Fields:
slabRebarSize(string) - Rebar size (e.g., "#4", "#5")slabRebarOC(number) - On-center spacing in inchestransRebarSize(string) - Transverse rebar sizetransRebarOC(number) - Transverse spacingperimeter(number) - Optional perimeter in linear feetsecondLengthDirRebarSize(string) - Second mat length-direction bar sizesecondLengthDirOcIn(number) - Second mat length-direction OC spacingsecondWidthDirRebarSize(string) - Second mat width-direction bar sizesecondWidthDirOcIn(number) - Second mat width-direction OC spacing
Update Concrete Item
- Request
- Response
PUT /api/concrete-items/:id
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json
{
"length": 90.0,
"width": 45.0,
"depthIn": 8.0
}
{
"id": "uuid",
"cubicYards": 10.0,
"totalCost": 1850.00,
"message": "Concrete item updated successfully"
}
Roles: ADMIN, ESTIMATOR
info
Cubic yards and costs are automatically recalculated when dimensions or pricing changes.
Delete Concrete Item
- Request
- Response
DELETE /api/concrete-items/:id
Cookie: sAccessToken=...; sRefreshToken=...
{
"message": "Concrete item deleted successfully"
}
Roles: ADMIN, ESTIMATOR
Duplicate Concrete Item
- Request
- Response
POST /api/concrete-items/:id/duplicate
Cookie: sAccessToken=...; sRefreshToken=...
{
"id": "uuid",
"message": "Concrete item duplicated successfully"
}
Roles: ADMIN, ESTIMATOR
Automatic Calculations
Cubic Yards (SLAB Shape)
sf = length × width
cubicYards = (length × width × depth) / 27
Rebar Calculation
// From rebar rates table based on size and on-center spacing
rebarPoundsPerSF = lookupRebarRate(slabRebarSize, slabRebarOC)
// Total pounds
totalRebarPounds = sf × rebarPoundsPerSF
// Apply waste factor (10%)
rebarPoundsWithWaste = totalRebarPounds × 1.10
Cost Calculation
// Concrete cost
concreteBaseCost = cubicYards × mixPricePerCY
concreteTaxAmount = taxExempt ? 0 : concreteBaseCost × concreteTaxRate
concreteCost = concreteBaseCost + concreteTaxAmount
// Rebar cost
rebarBaseCost = rebarPoundsWithWaste × rebarPricePerPound
rebarTaxAmount = taxExempt ? 0 : rebarBaseCost × rebarTaxRate
rebarCost = rebarBaseCost + rebarTaxAmount
// Total
totalCost = concreteCost + rebarCost
Material Item Generation
warning
Concrete items automatically generate two material items:
- Concrete Mix - Linked with
sourceConcreteItemId - Rebar - Linked with
sourceConcreteItemId
These generated material items are excluded from material cost rollup to prevent double-counting (BM-32).
Data Model
interface ConcreteItem {
id: string // UUID
scopeId: string // Parent scope UUID
name: string // Description
quantity: number // Typically 1
// Dimensions
shape: string // RECTANGLE, CIRCULAR, etc.
length: number | null
width: number | null
depthIn: number | null // Depth in inches
diameter: number | null
// Rebar Configuration
slabRebarSize: string | null // "#4", "#5", etc.
slabRebarOC: number | null // On-center spacing (inches)
transRebarSize: string | null
transRebarOC: number | null
// Calculated Values (read-only)
sf: number // Square feet
cubicYards: number // Cubic yards
totalRebarPounds: number // Pre-waste
rebarPoundsWithWaste: number // With 10% waste
concreteCost: number
rebarCost: number
totalCost: number
// Pricing References
mixPricingItemId: string // Concrete mix
rebarPricingItemId: string // Rebar pricing
// Relations
scope: Scope
mixPricingItem: PricingItem
rebarPricingItem: PricingItem
generatedMaterialItems: MaterialItem[]
}
Shapes
Supported shape types:
RECTANGLE- length × width × depthCIRCULAR- diameter × depthCUSTOM- User-defined dimensions
Tax Exemption
Tax calculation respects the Bid.taxExempt flag:
taxExempt = false→ Tax applied to concrete and rebartaxExempt = true→ No tax
Related Endpoints
- Scopes
- Materials - Auto-generated material items
- Rebar Rates
- Pricing Items
- Cost Rollup