Scope changes, price adjustments, and dispute mediation — inspired by Procore, BuilderTrend, and ServiceNow approval workflows
changeOrders // Per change order
jobId: v.id("jobs")
requestedBy: v.id("posterUsers") | v.id("contractorUsers")
type: "scope" | "price" | "timeline"
status: "pending" | "approved" | "declined" | "negotiating"
originalScope: string
proposedScope: string
originalAmount: number
proposedAmount: number
originalTimeline: number // days
proposedTimeline: number
justification: string
photoIds: v.array(v.id("_storage"))
riskLevel: "low" | "medium" | "high"
conditions: v.optional(v.string())
reviewedBy: v.optional(v.id("adminUsers"))
escrow // Existing table
adjustments: v.array({ changeOrderId, delta, feesDelta })
changeOrderMessages // Thread
changeOrderId: v.id("changeOrders")
senderId: string
senderRole: "poster" | "contractor" | "admin"
message: string
counterOfferAmount: v.optional(v.number())
changeOrderAuditLog // Immutable
changeOrderId: v.id("changeOrders")
action: string
performedBy: string
details: object
timestamp: number
listPending // Queue with KPIs
filters: status, type, urgency, amountRange
returns: items[], kpis{}
getById // Full detail + comparisons
returns: original{}, proposed{}, impact{}
getThread // Negotiation messages
returns: messages[], counterOffers[]
getAnalytics // Dashboard data
returns: rates, trends[], categories{}
getAuditLog // Timeline entries
returns: events[], filterable
decide
args: changeOrderId, decision, conditions?, amount?
// Approve, decline, or negotiate
mediate
args: changeOrderId, mediatedAmount, message
// Admin mediates between parties
bulkDecide
args: changeOrderIds[], decision
// Batch approve/decline
adjustEscrow
args: changeOrderId, escrowId
// Process payment adjustment
updateRules
args: autoApproveThreshold, flagThreshold
// Configure automation rules
useChangeOrders // List + filters
useChangeOrderDetail // Single CO
useNegotiationThread // Messages
useEscrowAdjustment // Escrow calc
useChangeOrderAnalytics // Dashboard
useChangeOrderAudit // Trail
// Components
ChangeOrderQueue
ChangeOrderDetail
ChangeOrderActions
NegotiationThread
ChangeOrderAnalytics
BulkReview
EscrowAdjustment
AuditTrail