Back to ER Diagram
Change Orders & Claims

Change Orders & Claims Logic

Change orders, EOT claims, variations, and arbitration management

PostgreSQL
14 Tables
Schema: change_order, claims
Impact Analysis

Overview

InfraTraq implements a complete change management and claims lifecycle covering the full spectrum from variation requests through arbitration. The system manages variation requests, change orders, engineering change orders (ECOs), delay events, extension of time (EOT) claims, cost claims, and arbitration proceedings — all aligned with Indian construction contract standards (FIDIC / Indian Conditions of Contract).

7
Change Order Tables
7
Claims Tables
14
Total Tables
FIDIC
Contract Standard

Key Principle

  • Change Orders modify the contract scope, cost, and/or time — requiring formal approval before execution
  • Claims arise from events entitling the contractor to additional time or money under the contract
  • Timely notice is critical — most contracts impose strict deadlines for claim notification
  • Contemporaneous records are the foundation of successful claims

Status States

StatusDescriptionAllowed ActionsNext States
DraftVariation request or claim created but not yet submittedEdit, Submit, DeleteSubmitted
SubmittedVariation request or claim submitted for evaluationEvaluate, ReturnEvaluated, Draft
EvaluatedCost and time impact assessment completedCreate CO, RejectPending Approval
Pending ApprovalChange order awaiting multi-level approvalApprove, Reject, ReturnApproved, Rejected
Client ReviewChange order sent to client for approvalClient Approve, Client RejectApproved, Rejected
ApprovedChange order or claim formally approved for executionExecute, Measure, BillIn Execution
In ExecutionChanged work being executed on siteMeasure, Update ProgressMeasured
MeasuredCompleted work measured and verifiedBill, CloseBilled, Closed
BilledVariation amount billed in running accountTrack Payment, CloseClosed
SettledClaim negotiation concluded with agreed settlementUpdate Finance, CloseClosed
ClosedChange order or claim fully resolved and closedView, Audit
RejectedChange order or claim rejected at any approval stageEdit, Resubmit, ArchiveDraft

Change Order & Claims Lifecycles

Change Order Lifecycle


Variation Request

Evaluation

Change Order

Approval

Execution

Measurement

Billing

Claims Lifecycle


Delay Event

Record Event

Serve Notice

Prepare Claim

Submit Claim

Negotiate

Settlement / Arbitration

Notice Discipline

  • Most contracts require notice within 28 days of event occurrence
  • Failure to notify = potential loss of entitlement
  • Always serve notice, even if quantum is unknown — a "holding notice" preserves entitlement

Database Schema

change_order.change_order

  • co_id — PK, master change order record
  • project_id — FK → project.project
  • contract_id — FK → contracts.contract
  • co_number, co_type — Classification (client-instructed, contractor-proposed, regulatory, design-driven)
  • cost_impact, time_impact_days — Assessed impact
  • status — draft, submitted, client_review, approved, rejected

change_order.variation_request

  • vr_id — PK, initial variation request raised from site
  • project_id — FK → project.project
  • vr_number — Auto-generated sequence per project
  • estimated_cost, estimated_time_impact — Preliminary impact estimate
  • status — draft, evaluated, converted

change_order.eco

  • eco_id — PK, engineering change order tracking design changes
  • project_id — FK → project.project
  • eco_number, design_discipline — Discipline classification
  • cost_impact, schedule_impact — Assessed impact on project

claims.delay_event

  • event_id — PK, recorded delay event
  • project_id — FK → project.project
  • event_type, cause_category — Employer risk, contractor risk, neutral event
  • delay_days — Duration of delay in calendar days
  • is_excusable, is_compensable — Entitlement classification flags

claims.eot_claim

  • claim_id — PK, Extension of Time claim
  • project_id — FK → project.project
  • total_delay_days, requested_eot_days — Delay quantum
  • cost_impact — Prolongation and associated costs
  • method_of_analysis — As-Planned vs As-Built, Time Impact, Windows
  • status — draft, submitted, negotiating, settled, arbitration

claims.claim_cost

  • id — PK, cost breakdown per claim
  • claim_id — FK → claims.eot_claim
  • cost_category — Prolongation, disruption, acceleration, direct costs
  • claimed_amount, approved_amount — Claimed vs settled amounts

claims.notice

  • notice_id — PK, contractual notice served
  • project_id — FK → project.project
  • notice_type — Delay, variation, claim, general
  • clause_reference — Contract clause (e.g., FIDIC Sub-Clause 20.1)
  • response_due_date — Deadline for client response

claims.arbitration

  • arb_id — PK, arbitration proceedings record
  • project_id — FK → project.project
  • claim_amount — Total amount in dispute
  • arbitrator — Appointed arbitrator details
  • award_amount — Final arbitral award
  • status — initiated, arbitrator_appointed, hearing, award, enforcement

Process Flow

(A) Change Order Flow


Site Identifies
Variation

Variation
Request Raised

Cost/Time
Impact Assessed

Change Order
Created

Client
Approval

Execute
Changed Work

Measure
Completed Work

Bill
Variation Amount

(B) Claims Flow


Delay Event
Occurs

Record
Delay Event

Serve Notice
(within time bar)

Prepare Claim
(delay + cost)

Submit
Claim

Negotiate
with Client

If Unresolved:
Arbitration / Dispute

Step-by-Step Logic

1

Variation Identification

Site team identifies a potential variation from the original contract scope. This may arise from client instruction, design changes, differing site conditions, or regulatory requirements. A variation_request is raised with preliminary description and estimated impacts.

2

Impact Assessment (Cost + Time + Scope)

The commercial team evaluates the variation request for cost impact (re-rate existing items or new rates per Indian Schedule of Rates), time impact (critical path analysis), and scope definition. The variation_request.estimated_cost and estimated_time_impact are updated with the assessment results.

3

Change Order Creation

Once assessed, a formal change_order is created linking to the variation request. The CO includes approved scope, cost breakdown, revised BOQ items, time impact in days, and contract clause references. The co_type classifies it (client-instructed, contractor-proposed, regulatory, design-driven).

4

Multi-Level Approval

Change orders route through approval workflows based on value thresholds: Site PM (up to ₹5L), Project Director (up to ₹25L), Regional Head (up to ₹1Cr), MD/Board (above ₹1Cr). Client-side approval is tracked separately. Status transitions: draft → submitted → client_review → approved/rejected.

5

Delay Event Recording

When a delay occurs, the site team records it in claims.delay_event with contemporaneous evidence (photos, correspondence, weather data, labour records). Each event is classified by cause_category (employer risk, contractor risk, neutral event) and flagged as is_excusable and/or is_compensable.

6

Contractual Notice Requirements

Upon identifying a potential claim event, a formal claims.notice is served referencing the specific contract clause (e.g., FIDIC Sub-Clause 20.1). The system tracks response_due_date and auto-reminds if no response is received. Notice must be served within the contractual time bar (typically 28 days).

7

Delay Analysis Methods

The system supports multiple delay analysis methodologies: As-Planned vs As-Built (simple comparison), Time Impact Analysis (prospective, event-by-event insertion into schedule), and Windows Analysis (retrospective, period-by-period). The eot_claim.method_of_analysis records the chosen approach.

8

Cost Claim Preparation

Cost claims are built in claims.claim_cost with categories: prolongation costs (site overheads, staff, equipment), disruption costs (loss of productivity), acceleration costs (overtime, additional resources), and direct costs (material price escalation). Each line has claimed_amount supported by documentation.

9

Negotiation Process

After claim submission, the system tracks negotiation rounds. Each round records the client's position, contractor's counter, and agreed items. The claims.claim_cost.approved_amount is updated as items are agreed. If parties reach settlement, the claim status moves to settled and financial records are updated.

10

Arbitration / Dispute Resolution

If negotiation fails, claims.arbitration is initiated. The system tracks arbitrator appointment, hearing dates, submissions, and the final award_amount. Status flow: initiated → arbitrator_appointed → hearing → award → enforcement. Legal team is auto-notified and all claim documentation is packaged for the proceedings.

Code Implementation

class ChangeClaimService {

  /** Raise a new variation request from site */
  async createVariationRequest(projectId, description, estimatedImpact) {
    const vr = await VariationRequest.create({
      project_id: projectId,
      vr_number: await this.generateVRNumber(projectId),
      description,
      estimated_cost: estimatedImpact.cost,
      estimated_time_impact: estimatedImpact.days,
      status: 'draft'
    });
    await NotificationService.notify('PM', 'COMMERCIAL', {
      type: 'variation_request_raised', vr_id: vr.vr_id
    });
    return vr;
  }

  /** Evaluate a variation request for cost/time/scope impact */
  async evaluateChangeOrder(vrId) {
    const vr = await VariationRequest.findById(vrId);
    const costAnalysis = await BOQService.priceVariation(vr);
    const scheduleImpact = await ScheduleService.assessTimeImpact(vr);
    const scopeDefinition = await ScopeService.defineChangedScope(vr);
    await vr.update({
      estimated_cost: costAnalysis.totalCost,
      estimated_time_impact: scheduleImpact.criticalPathDays,
      status: 'evaluated'
    });
    return { costAnalysis, scheduleImpact, scopeDefinition };
  }

  /** Create formal change order from evaluated variation request */
  async createChangeOrder(vrId, approvedScope) {
    const vr = await VariationRequest.findById(vrId);
    if (vr.status !== 'evaluated') throw new Error('VR must be evaluated first');
    const co = await ChangeOrder.create({
      project_id: vr.project_id,
      contract_id: approvedScope.contractId,
      co_number: await this.generateCONumber(vr.project_id),
      co_type: approvedScope.type,
      cost_impact: approvedScope.costImpact,
      time_impact_days: approvedScope.timeImpactDays,
      status: 'pending_approval'
    });
    await ApprovalService.initiate('change_order', co.co_id, co.cost_impact);
    return co;
  }

  /** Record a delay event with contemporaneous evidence */
  async recordDelayEvent(projectId, eventDetails) {
    const event = await DelayEvent.create({
      project_id: projectId,
      event_type: eventDetails.type,
      cause_category: eventDetails.causeCategory,
      delay_days: eventDetails.delayDays,
      is_excusable: eventDetails.isExcusable,
      is_compensable: eventDetails.isCompensable,
      description: eventDetails.description,
      evidence_refs: eventDetails.evidenceDocIds
    });
    // Check if notice is required under the contract
    const contract = await ContractService.getNoticeRequirements(projectId);
    if (contract.requiresNotice) {
      await this.promptNoticeServing(projectId, event.event_id, contract.noticePeriodDays);
    }
    return event;
  }

  /** Serve contractual notice referencing specific clause */
  async serveNotice(projectId, noticeType, clauseRef) {
    const contract = await ContractService.getByProject(projectId);
    const responseDue = new Date();
    responseDue.setDate(responseDue.getDate() + contract.response_period_days);
    const notice = await Notice.create({
      project_id: projectId,
      notice_type: noticeType,
      clause_reference: clauseRef,
      response_due_date: responseDue,
      status: 'served'
    });
    await DocumentService.generateNoticeLetter(notice);
    return notice;
  }

  /** Prepare an EOT claim linking delay events with analysis method */
  async prepareEOTClaim(projectId, delayEventIds, analysisMethod) {
    const events = await DelayEvent.findByIds(delayEventIds);
    const totalDelay = events.reduce(function(sum, e) { return sum + e.delay_days; }, 0);
    const analysis = await DelayAnalysisService.run(analysisMethod, events);
    const claim = await EOTClaim.create({
      project_id: projectId,
      total_delay_days: totalDelay,
      requested_eot_days: analysis.entitledDays,
      cost_impact: analysis.prolongationCost,
      method_of_analysis: analysisMethod,
      status: 'draft'
    });
    return claim;
  }

  /** Submit a prepared claim for review */
  async submitClaim(claimId) {
    const claim = await EOTClaim.findById(claimId);
    const costs = await ClaimCost.findByClaimId(claimId);
    if (!costs.length) throw new Error('Claim must have cost breakdown before submission');
    await claim.update({ status: 'submitted', submitted_at: new Date() });
    await ApprovalService.initiate('eot_claim', claimId, claim.cost_impact);
    return claim;
  }

  /** Track negotiation rounds between contractor and client */
  async trackNegotiation(claimId, rounds) {
    for (const round of rounds) {
      await NegotiationRound.create({
        claim_id: claimId, round_number: round.number,
        contractor_position: round.contractorAmount,
        client_position: round.clientAmount,
        agreed_items: round.agreedItems, notes: round.notes
      });
    }
    const latestRound = rounds[rounds.length - 1];
    if (latestRound.settled) {
      await EOTClaim.update(claimId, { status: 'settled' });
      await FinanceService.updateRevisedBudget(claimId, latestRound.agreedAmount);
    }
  }

  /** Initiate arbitration when negotiation fails */
  async initiateArbitration(projectId, disputeDetails) {
    const arb = await Arbitration.create({
      project_id: projectId,
      claim_amount: disputeDetails.claimAmount,
      arbitrator: disputeDetails.proposedArbitrator,
      award_amount: null,
      status: 'initiated'
    });
    await NotificationService.notify('LEGAL_TEAM', {
      type: 'arbitration_initiated', arb_id: arb.arb_id
    });
    await DocumentService.packageClaimDocuments(projectId, arb.arb_id);
    return arb;
  }
}

Validation Rules

RuleConditionAction
Notice Time BarNotice not served within contractual time limit (e.g., 28 days)Block claim submission, warn of potential entitlement loss
Contemporaneous RecordsDelay event created more than 7 days after occurrenceFlag as late recording, require justification
Contract Variation LimitChange order cost exceeds contract variation limit %Require additional approval level (Board/MD)
Claim DocumentationClaim amounts not supported by uploaded evidenceBlock submission until supporting documents attached
ECO Drawing ReferenceECO does not reference affected drawingsReject ECO, require drawing list
Duplicate VariationVariation request already exists for same scope itemShow existing VR, prevent duplicate creation
Delay ClassificationDelay event marked compensable but cause is contractor riskWarn and require commercial team review

Automated Actions & Triggers

EventSource TableAuto Action
Variation Request Raisedchange_order.variation_requestNotify PM and commercial team for evaluation
Change Order Approvedchange_order.change_orderUpdate BOQ line items and commitment records
Delay Event Recordedclaims.delay_eventCheck notice requirements, prompt notice serving if applicable
Notice Deadline Approachingclaims.noticeAuto-reminder at 7 days, 3 days, and 1 day before response_due_date
Claim Submittedclaims.eot_claimCreate approval workflow, notify client representative
Arbitration Initiatedclaims.arbitrationNotify legal team, package all claim documentation
ECO Createdchange_order.ecoNotify design team, flag affected drawings for revision
Claim Settledclaims.eot_claimUpdate revised budget, adjust EVM baseline, close related notices

Integration Points

Upstream (Data Sources)

  • Contracts — Contract clauses define entitlement basis and notice requirements
  • Project Schedule — Baseline and updated schedules for delay analysis
  • BOQ / Estimation — Pricing variations using existing rates or new rate build-up
  • Document Management — Correspondence, photos, and records as claim evidence

Downstream (Consumers)

  • Finance — Revised budgets and forecasts after approved change orders
  • EVM — Baseline updates when change orders modify scope/cost/time
  • Risk Register — Claim contingency provisions and risk quantification
  • Reporting — Management dashboards for change order and claims visibility

Best Practices

Implementation Guidelines

  • Contemporaneous record keeping — Record delay events daily in real-time; retrospective claims are significantly weaker
  • Notice discipline — Always serve notice within the contractual time bar, even if the full quantum is unknown; a "holding notice" preserves entitlement
  • Delay analysis methodology — Select the method appropriate to the contract and available data: Time Impact Analysis for prospective claims, Windows Analysis for retrospective
  • Claim presentation — Structure claims with clear narrative, cause-and-effect linkage, supporting documents, and quantum calculation; follow SCL Delay and Disruption Protocol
  • Negotiation strategies — Prepare fall-back positions, identify items for trade-off, and maintain professional relationships; document all discussions
  • Index claims.delay_event on (project_id, event_type, cause_category) for fast claim assembly queries
  • Use database-level constraints: CHECK (approved_amount ≤ claimed_amount) on claim_cost
  • Maintain audit trail via audit.audit_trail for all change order and claim state transitions

Common Pitfalls

  • Missing the contractual notice deadline — renders the entire claim time-barred regardless of merit
  • Failing to maintain contemporaneous records — weakens even legitimate claims in arbitration
  • Not linking delay events to critical path activities — float consumption does not create entitlement
  • Submitting global claims without cause-and-effect analysis — likely to be rejected under FIDIC and Indian law
  • Approving change orders without updating the project baseline — corrupts EVM metrics and forecasting
  • Conflating excusable delays with compensable delays — EOT entitlement does not automatically mean cost recovery