Skip to main content

Equipment Items

Overview

Equipment items represent rental equipment with two bidding modes:

  1. TRADITIONAL - Equipment assigned to individual scopes
  2. GANTT - Equipment tracked at bid level with timeline-based allocation

Traditional Mode

List Equipment Items

GET /api/equipment/scope/:scopeId
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


Create Equipment Item

POST /api/equipment
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"scopeId": "uuid",
"equipmentType": "Skid Steer",
"subcategory": "Daily",
"quantity": 1,
"durationValue": 5,
"durationUnit": "days",
"pricingItemId": "uuid",
"deliveryFee": 150.00
}

Roles: ADMIN, ESTIMATOR

Required Fields:

  • scopeId (string, UUID) - Parent scope
  • equipmentType (string) - Equipment name
  • subcategory (string) - Rental period (Daily, Weekly, Monthly)
  • quantity (number) - Number of units
  • durationValue (number) - Duration amount
  • durationUnit (string) - "days", "weeks", "months"
  • pricingItemId (string, UUID) - Equipment pricing reference

Optional Fields:

  • deliveryFee (number) - One-time delivery charge
  • fuelCharge (number) - Fuel costs
  • trucksCost (number) - Hauling costs

Update Equipment Item

PUT /api/equipment/:id
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"durationValue": 7,
"quantity": 2
}

Roles: ADMIN, ESTIMATOR


Delete Equipment Item

DELETE /api/equipment/:id
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR

Gantt Mode

When bid.equipmentBiddingMode = "GANTT", equipment is tracked at bid level with timeline-based allocation.

List Bid Equipment

GET /api/bids/:bidId/equipment
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


Create Gantt Equipment

POST /api/bids/:bidId/equipment
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"equipmentType": "Skid Steer",
"description": "Skid Steer - Daily",
"pricingItemId": "uuid",
"quantity": 1,
"startDay": 5,
"durationDays": 10,
"dailyRate": 450.00,
"deliveryFee": 150.00
}

Roles: ADMIN, ESTIMATOR

Required Fields:

  • equipmentType (string) - Equipment name
  • description (string) - Full description
  • pricingItemId (string, UUID) - Pricing reference
  • quantity (number) - Number of units
  • startDay (number) - Start day (1-based)
  • durationDays (number) - Duration in days
  • dailyRate (number) - Daily rental rate

Optional Fields:

  • deliveryFee (number) - One-time delivery charge

Update Gantt Equipment

PATCH /api/bids/:bidId/equipment/:id
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"startDay": 10,
"durationDays": 5
}

Roles: ADMIN, ESTIMATOR


Delete Gantt Equipment

DELETE /api/bids/:bidId/equipment/:id
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR


Batch Update Equipment

POST /api/bids/:bidId/equipment/batch
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"create": [
{
"equipmentType": "Excavator",
"startDay": 1,
"durationDays": 5,
"dailyRate": 800.00,
"pricingItemId": "uuid"
}
],
"update": [
{
"id": "uuid",
"startDay": 10,
"durationDays": 5
}
],
"delete": ["uuid1", "uuid2"]
}

Roles: ADMIN, ESTIMATOR


Switch Equipment Bidding Mode

PATCH /api/bids/:bidId/equipment/mode
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"equipmentBiddingMode": "GANTT"
}

Roles: ADMIN, ESTIMATOR

warning

Switching modes will clear all existing equipment items. Use /mode/confirm to proceed.


Confirm Mode Switch

POST /api/bids/:bidId/equipment/mode/confirm
Cookie: sAccessToken=...; sRefreshToken=...
Content-Type: application/json

{
"equipmentBiddingMode": "GANTT"
}

Roles: ADMIN, ESTIMATOR


Get Cost Distributions

GET /api/bids/:bidId/equipment/distributions
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


Get Scope Equipment Allocations

GET /api/bids/:bidId/equipment/scope/:scopeId
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


Get Equipment Coverage Details

GET /api/bids/:bidId/equipment/:id/coverage
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR, PM


Recalculate Distributions

POST /api/bids/:bidId/equipment/recalculate
Cookie: sAccessToken=...; sRefreshToken=...

Roles: ADMIN, ESTIMATOR

Cost Calculations

Traditional Mode

// Base rental cost
baseRentalCost = quantity × durationValue × ratePerUnit

// Tax (if not tax exempt)
rentalTaxAmount = taxExempt ? 0 : baseRentalCost × rentalTaxRate
rentalCost = baseRentalCost + rentalTaxAmount

// Additional charges
fuelCharge = quantity × days × fuelChargePerDay
deliveryFee = onPrevious ? 0 : deliveryFee
trucksCost = truckCount × truckHaulCost

// Total
totalCost = rentalCost + fuelCharge + deliveryFee + trucksCost

Gantt Mode

// Base cost
rentalCost = dailyRate × durationDays
fuelCharge = calculateFuelCharge(equipment)
totalCost = rentalCost + fuelCharge + deliveryFee

// Distribute across scopes based on timeline overlap
for each scope {
overlapDays = calculateOverlap(equipment.startDay, equipment.durationDays, scope.timeline)
percentage = overlapDays / totalOverlapDays
allocatedCost = totalCost × percentage
allocatedFuel = fuelCharge × percentage
allocatedDelivery = deliveryFee × percentage
}
info

Fuel & Delivery Tracking (BM-88): As of February 2026, fuel charges and delivery fees are tracked separately in distributions for visibility in timeline tooltips and scope cost breakdowns.

Data Models

// Traditional Mode
interface EquipmentItem {
id: string
scopeId: string
equipmentType: string
subcategory: string
quantity: number
durationValue: number
durationUnit: string
baseRentalCost: number
rentalTaxAmount: number
rentalCost: number
fuelCharge: number
deliveryFee: number
trucksCost: number
totalCost: number
pricingItemId: string
}

// Gantt Mode
interface BidEquipment {
id: string
bidId: string
equipmentType: string
description: string
pricingItemId: string
quantity: number
startDay: number
durationDays: number
dailyRate: number
deliveryFee: number
totalCost: number
distributions: EquipmentDistribution[]
}

interface EquipmentDistribution {
scopeId: string
scopeName: string
overlapDays: number
percentage: number
allocatedCost: number
fuelCharge: number // Proportional fuel charge for this scope
deliveryFee: number // Proportional delivery fee for this scope
}