Project Accounting and Project Systems
A project is a temporary cost and revenue object with a structure, a budget, a schedule, and a settlement rule. Used for capital projects, construction, engineer-to-order manufacturing, R&D, IT programmes, and professional services delivery.
The project structure
Project: PRJ-2026-014 New Dhaka Warehouse
│
├── WBS 1 Design & permits budget 4,000,000
│ ├── WBS 1.1 Architectural design
│ └── WBS 1.2 Permits and approvals
├── WBS 2 Civil works budget 42,000,000
│ ├── WBS 2.1 Foundation
│ ├── WBS 2.2 Structure
│ └── WBS 2.3 Roofing
├── WBS 3 MEP budget 18,000,000
├── WBS 4 Racking & equipment budget 25,000,000
└── WBS 5 Commissioning budget 3,000,000
WBS = Work Breakdown Structure. Each element can:
- Carry a budget
- Collect actual costs
- Be billed
- Be planned in time
- Settle to a receiver (asset, cost centre, P&L)
WBS element properties
wbs_element(
id, project_id, parent_id, wbs_code, description, level,
responsible_person, company_id, profit_center_id,
planning_element BOOLEAN, -- can hold a plan/budget
account_assignment BOOLEAN, -- can receive actual postings
billing_element BOOLEAN, -- can be invoiced
start_date, finish_date,
status, -- CREATED | RELEASED | TECHNICALLY_COMPLETE | CLOSED
settlement_rule_id
)
Design rule: only leaf elements should be account-assignment elements. If costs can post at both a parent and its children, your rollup double-counts and nobody can reconcile the project.
Networks and activities (scheduling)
Beneath the WBS, a network models the schedule:
Activity 0010 Excavation 10 days ──┐
Activity 0020 Foundation pour 5 days ──┤ FS
Activity 0030 Curing 14 days ──┤ FS
Activity 0040 Steel erection 20 days ──┘
Relationships: FS (finish-start), SS (start-start), FF (finish-finish), SF, each with optional lead/lag.
Activity types:
- Internal — uses your own work centres and labour
- External — subcontracted, generates a purchase requisition
- Cost activity — a lump-sum cost with no resource
- Material component — parts required, generating reservations or requisitions
Critical path = the longest chain of dependent activities; its length is the project duration. Activities on it have zero float. This is what a delay on the critical path means, and why “we’re only two days late on foundations” can move the go-live by two days while a two-week delay elsewhere changes nothing.
Budgeting and availability control
Original budget 42,000,000
+ Supplements 3,500,000
− Returns (500,000)
= Current budget 45,000,000
− Actual costs 28,400,000
− Commitments 9,200,000 (open POs, contracts)
─────────────────────────────────
= Available 7,400,000
Availability control blocks a purchase order that would exceed the budget. Top-down budgeting means a child WBS cannot exceed its parent’s budget. See Budgeting and Commitments.
Cost collection
Everything that can post, posts to a WBS element:
| Source | Posting |
|---|---|
| Purchase order / invoice | Materials and services |
| Goods issue | Materials from stock |
| Timesheet | Internal labour × cost rate |
| Production/service order settlement | Manufactured items |
| Travel expenses | Direct project cost |
| Overhead surcharge | Applied per the costing sheet |
| Internal allocations | Shared services |
| Depreciation | Project-dedicated equipment |
Revenue recognition on projects
See Revenue Recognition for the accounting standard. The project system provides the measurement.
Percentage of completion (cost-to-cost)
Contract value 80,000,000
Total estimated cost 62,000,000
Actual cost to date 28,400,000
─────────────────────────────────────────
POC 45.8%
Revenue to recognise 36,645,000
Cost recognised 28,400,000
Gross profit 8,245,000
Invoiced to date 32,000,000
Contract asset (unbilled) 4,645,000
The estimate at completion (EAC) is the critical number. If total estimated cost rises, POC falls, and revenue already recognised may need a cumulative catch-up adjustment in the current period. Regular, disciplined EAC review is a control, and a project manager who never revises the estimate upward is a red flag.
Onerous contracts
If EAC exceeds contract value, the entire expected loss is recognised immediately, not spread. IAS 37. This surprises project managers every time.
Milestone billing
Milestone % Amount Status
Contract signature 10% 8,000,000 Invoiced
Design approval 15% 12,000,000 Invoiced
Foundation complete 20% 16,000,000 Invoiced
Structure complete 25% 20,000,000 Pending
Commissioning 20% 16,000,000 Pending
Final acceptance (retention) 10% 8,000,000 Pending
Billing milestones and revenue recognition are independent. You can invoice 40% and recognise 45.8%, or invoice 60% and recognise 45.8%. The difference is the contract asset or liability.
Retention (a percentage held back until final acceptance, often 5–10%) is a receivable with a much later due date. It must be tracked separately from ordinary AR or your DSO and ageing reports are misleading.
Earned value management (EVM)
The standard technique for answering “are we on time and on budget?” with one consistent framework.
PV Planned Value budgeted cost of work scheduled 30,000,000
EV Earned Value budgeted cost of work performed 27,000,000
AC Actual Cost actual cost of work performed 28,400,000
SV Schedule Variance = EV − PV = −3,000,000 (behind schedule)
CV Cost Variance = EV − AC = −1,400,000 (over budget)
SPI Schedule Perf Idx = EV / PV = 0.90 (10% behind)
CPI Cost Perf Index = EV / AC = 0.95 (5% over)
EAC Estimate at Completion = BAC / CPI = 62,000,000 / 0.95 = 65,263,000
ETC Estimate to Complete = EAC − AC = 36,863,000
VAC Variance at Completion = BAC − EAC = −3,263,000
This is the standard reporting pack for capital projects, defence contracts, and government work — and CPI-based EAC is empirically a better predictor of final cost than the project manager’s own estimate. Building an EVM report is high-value; the hard part is measuring EV honestly (percent complete by physical progress, not by cost spent).
Settlement
At completion, project costs move to their final destination:
settlement_rule(
wbs_element_id,
receiver_type, -- ASSET | COST_CENTER | GL_ACCOUNT | ORDER | PROFITABILITY_SEGMENT
receiver_id,
percentage or equivalence_number,
settlement_type, -- PERIODIC | FULL
valid_from
)
Common patterns:
| Project type | Settles to |
|---|---|
| Capital project | Asset under construction → fixed asset at go-live |
| Customer project | COGS / profitability segment as revenue is recognised |
| R&D | Expense, or a capitalised intangible if IAS 38 criteria are met |
| Internal IT project | Software asset if capitalisable, otherwise expense |
| Cost-only project | Cost centre |
A capital project usually settles to several assets with different useful lives — building structure 40 years, HVAC 15, racking 10. Line-item settlement splits the AuC accordingly. See Fixed Assets.
Project status and lifecycle
CREATED → RELEASED → (execution) → TECHNICALLY COMPLETE → CLOSED
│
no new commitments,
late costs still allowed
Same distinction as production orders: TECO stops new work but allows trailing invoices; CLSD stops everything. Projects closed too early strand costs; projects never closed distort WIP and keep budget locked.
Reporting
- Project cost report — plan / budget / commitment / actual / available, by WBS
- Cost element breakdown — where the money went
- EVM dashboard — SPI, CPI, EAC, VAC with trend
- Milestone and billing status
- Cash flow forecast — cost outflow vs billing inflow over time
- Resource loading — who is committed to what, and where the conflicts are
- Portfolio view — all projects, RAG status, total capital commitment
- Contract asset/liability roll-forward — for the auditors
Developer notes
- Only leaf WBS elements receive postings. Enforce it.
- Commitments matter more here than anywhere — projects commit far ahead of spending.
- The EAC is master data that must be revised, with an audit trail of who changed it and when. A frozen EAC hides losses.
- Revenue recognition and billing are independent schedules.
- Retention is a distinct receivable class with its own ageing.
- Settlement rules are configuration, and a project with no settlement rule will silently hold its cost forever. Add a validation.
- Project hierarchy queries are recursive — use a closure table if the tree is deep and read-heavy.
- Never delete a WBS element with postings. Block and mark.