EPC Business Materials Management — Specification
Product overview
An enterprise, multi-tenant materials management and bidirectional traceability SaaS platform for EPC (Engineering, Procurement, Construction) capital projects. It connects engineering definitions, procurement packages, vendor fabrication, international logistics, laydown warehousing, and field construction into an unbroken immutable lineage graph, providing real-time shortage forecasting and closeout reconciliation.
Problem statement
In large-scale EPC projects, material data is fragmented across engineering MTO spreadsheets, ERP modules, logistics spreadsheets, and field logs. This causes severe lack of visibility, undetected supply chain delays, unaccounted material surpluses or shortages, costly engineering change ripple effects, and inaccurate closeout reconciliations.
Target users & roles
- Engineering Lead / Material Coordinator — Defines material catalogs, specifications, imports and validates MTO revisions, tracks engineering design quantities, and initiates procurement requisitions.
- Procurement Specialist / Buyer — Structures RFQ inquiry packages, evaluates technical and commercial supplier bids, issues purchase orders, and monitors commitment values.
- Expeditor & Quality Inspector — Monitors supplier manufacturing milestones, tracks vendor document approval cycles, conducts inspections, issues quality findings, and grants release-for-shipment.
- Logistics Coordinator & Warehouse Manager — Tracks shipping consignments, manages customs clearance, performs goods receipts, records over/short/damaged items, and manages storage bin placement.
- Construction & Commissioning Lead — Reserves materials against work packages and systems, issues items to the field with mobile barcode scanning, handles returns, and tracks shortage alerts.
- Project Controls Lead — Supervises project-wide material reconciliation, performs surplus disposition, monitors KPIs, and authorizes closeout reports.
- Supplier Representative — External vendor responding to RFQs, submitting quotations, acknowledging POs, uploading manufacturing progress, and submitting shipping transmittals via isolated portal.
- Governance & Compliance Auditor — Inspects immutable audit trails, verifies approval thresholds and delegation chains, and reviews regulatory compliance across all project entities.
User journeys
MTO Import to Purchase Order Issuance
- Engineering Lead uploads an MTO CSV/Excel revision file to the MTO Import screen.
- The system validates catalog codes against the Material Master, computes revision delta compared to baseline, and highlights quantity differences.
- Engineering Lead creates a Material Requisition for delta quantities and submits it through multi-tier approval.
- Upon requisition approval, Procurement Specialist bundles lines into an RFQ package and issues inquiry invitations to approved vendors via the Supplier Portal.
- Suppliers submit commercial and technical bids via their secure isolated portal view.
- Procurement Specialist performs automated bid comparison, records deviations, enters award recommendation, and gains procurement approval.
- System generates a Purchase Order with line-level traceability to original MTO items, issuing an acknowledgement request to the awarded supplier.
Supplier Progress, Quality Inspection, and Site Receipt
- Supplier acknowledges PO, updates fabrication milestone progress, and submits required vendor documents.
- Expeditor reviews document review cycles and receives an Inspection Notification from the supplier.
- Quality Inspector conducts surveillance, logs inspection findings and non-conformities, and issues a formal Release for Shipment.
- Supplier inputs packing list dimensions and consignment details; Logistics Coordinator assigns freight forwarder and tracks transit milestones.
- Consignment arrives at site; Warehouse Operator scans barcode/QR tags on packages via mobile responsive view.
- Operator records Goods Receipt, performs visual condition checks, logs an Over/Short/Damaged (OS&D) report if discrepancies exist, and assigns bin locations creating immutable Material Movement ledger records.
Work Package Reservation, Field Issue, and Project Closeout
- Construction Lead checks real-time material availability for Work Package WP-102 and creates a reservation.
- System confirms reserved stock and generates a digital pick-list for warehouse crew.
- Warehouse crew picks material, scans item QR/heat tags, captures field supervisor digital signature, and posts an Issue Transaction.
- System automatically updates inventory balance and recalculates live continuous shortage/excess analytics.
- At project commissioning completion, Project Controls Lead launches Closeout Reconciliation.
- System matches engineering MTO quantities, ordered quantities, received quantities, issued quantities, and scrap/returns.
- Project Controls Lead records surplus disposition actions (transfer, return to vendor, scrap, sale) and exports signed closeout reconciliation audit reports.
Functional requirements
FR-001: Bidirectional Lineage and Traceability Graph
The system shall maintain a persistent graph relationship from engineering MTO items through Requisitions, RFQs, Bids, POs, Expediting Milestones, Inspections, Shipments, Warehouse Stock, Reservations, and Field Issues, enabling instant two-way lookup.
Acceptance criteria:
- Given a physical inventory item serial or heat number, when a user queries the Traceability Graph, then the system renders the entire upstream lineage back to the originating MTO item and engineering revision in less than 3 seconds.
- Given an engineering MTO item, when navigated forward, then the system displays real-time status across procurement, shipment, warehousing, and field installation.
FR-002: MTO Import, Delta Comparison, and Requisition Generation
The system shall import tabular MTO data, validate commodity specs against the hybrid Material Master, compare revisions to detect additions/deletions/quantity shifts, and generate requisitions for procurement.
Acceptance criteria:
- Given a newly imported MTO revision file, when compared against the approved revision, then the system calculates line-level deltas and prevents duplicate requisitioning of previously ordered quantities.
- Given invalid commodity codes or missing mandatory engineering tags in the import file, when processed, then the system halts import with granular line-level validation errors.
FR-003: Procurement RFQ, Commercial Bid Evaluation, and PO Management
The system shall support inquiry packaging, supplier bidding, technical/commercial evaluation with deviations, approval workflows by monetary threshold, and PO creation with revision versioning.
Acceptance criteria:
- Given an approved Requisition, when a Buyer builds an RFQ, then only suppliers listed on the Approved Vendor List (AVL) for that commodity class can be selected.
- Given multiple vendor quotes, when the Buyer opens Commercial Bid Evaluation, then the system standardizes currencies using project exchange rates and displays normalized cost comparison tables.
- Given a PO value exceeding $250,000 (ASSUMED: default project threshold), when submitted for award, then the system routes approval to Project Manager and Finance Approver before issuance.
FR-004: Isolated Supplier Portal
The system shall provide an isolated supplier workspace enforcing strict row-level security where external vendors manage RFQs, quotes, PO acknowledgements, progress updates, document uploads, and shipment releases.
Acceptance criteria:
- Given an authenticated Supplier user, when accessing the RFQ or PO register, then only records associated with that supplier's organization ID are queryable.
- Given an active PO, when the supplier submits a Vendor Document revision, then a transmittal notification is dispatched to the assigned engineering document reviewer.
FR-005: Logistics Consignment and Multi-Leg Shipment Tracking
The system shall track shipping releases, freight forwarders, carriers, transport legs, customs clearance statuses, container/package packing lists, and forecast vs actual arrival dates.
Acceptance criteria:
- Given a PO line with issued Release for Shipment, when a Shipment record is created, then multiple PO lines across different POs can be consolidated into a single consignment with package-level line mappings.
- Given customs clearance status update to 'Cleared', when recorded, then the system updates the consignment status and triggers an expected site receipt notification.
FR-006: Warehouse Goods Receipt, OS&D Logging, and Bin Management
The system shall manage site warehouses, laydown storage zones, bin locations, goods receipts with barcode/QR scanning, quarantine holds, and over/short/damaged exception logging.
Acceptance criteria:
- Given an incoming shipment, when a Warehouse Operator scans package QR codes, then the system verifies received items against the packing list and highlights any discrepancy.
- Given a damaged crate, when marked as OS&D, then the system flags items as 'Quarantined', prevents reservation, and creates an OS&D inspection report with photo attachments.
FR-007: Work Package Reservation, Picking, and Mobile Field Issue
The system shall enable construction teams to reserve materials against hierarchical Work Packages and systems, perform pick-lists, record mobile digital signatures, and execute material issue/return transactions.
Acceptance criteria:
- Given an approved Material Request for Work Package WP-01, when warehouse stock is confirmed, then the system transitions stock status from 'Available' to 'Reserved' preventing double allocation.
- Given a field material issue on a mobile device, when the receiver signs and the transaction is committed, then the physical stock is decremented and an immutable Material Movement entry is written.
FR-008: Continuous Shortage Analysis and Impact Evaluation
The system shall continuously calculate material shortages and excesses by comparing engineering required quantities with ordered, received, reserved, and issued quantities across all project hierarchy nodes.
Acceptance criteria:
- Given an engineering MTO revision increase or delivery delay, when the shortage engine computes balance, then affected downstream work packages and turnover packages are flagged with critical shortage alerts.
- Given a detected shortage, when a user opens the recovery action drawer, then the system suggests options for stock substitution, PO expediting, or surplus re-allocation.
FR-009: Project Closeout Reconciliation and Surplus Disposition
The system shall perform multi-variable quantitative reconciliation at project completion and orchestrate surplus asset disposition workflows.
Acceptance criteria:
- Given a project closeout initiation, when reconciliation executes, then the system outputs a complete matrix of MTO Required vs Ordered vs Shipped vs Received vs Issued vs Damaged vs Scrap vs Remaining Stock.
- Given remaining surplus inventory, when disposition is set to 'Transfer to Project B', then the system creates an outbound inter-project transfer and updates tenant asset registers.
FR-010: Immutable Audit Trail and Compliance Governance
The system shall record all status transitions, approval authorizations, quantity overrides, and critical configuration changes in an append-only, tamper-evident audit ledger.
Acceptance criteria:
- Given any update or soft-deletion of a requisition, PO, or inventory balance, when executed, then an AuditLog record is created containing actor_id, timestamp, previous_state, new_state, and client IP.
- Given an audit log query by a Governance Auditor, when filtered by entity and date range, then the system exports an unalterable chronological audit transmittal.
Screen / page inventory
- Traceability Graph Explorer — Provides interactive bidirectional visual graph navigation and timeline tracking for any material tag, MTO item, PO line, or physical asset.
- Elements: Global Search & Scan Bar (Tag, Heat Number, MTO Code, PO Number), Interactive Lineage Node Diagram (MTO -> REQ -> RFQ -> PO -> EXP -> SHP -> WHS -> ISS), Node Detail Inspector Drawer with real-time milestone timestamps, Blocker & Exception Warning Badges (Overdue, OS&D, Quality Hold), Action Toolbar (Expedite, Initiate Substitution, View Document Transmittal)
- Role-Aware Operations Dashboard — Personalized landing surface aggregating pending work queues, critical shortage alerts, approval bottlenecks, and operational KPIs.
- Elements: Summary KPI Cards (Traceability Coverage, Shortage Count, Procurement Cycle Time, Supplier OTD), My Pending Approvals & Action Queue Table, Critical Path Shortage Alert Widget grouped by Work Package, Expediting Risk & Milestone Exception Heatmap, Quick Navigation Shortcuts to MTO Import, PO Creation, and Warehouse Receipt
- Engineering MTO Import & Delta Comparison — Enables engineering leads to upload, map, validate, and compare MTO revisions against existing project baselines.
- Elements: File Dropzone (Excel/CSV) with auto-column mapping, Validation Error & Warning Grid with in-line correction, Revision Delta Comparison Matrix (Added, Removed, Modified quantities), Discipline & Work Package Filtering Facets, Create Requisition Action Button for verified deltas
- Procurement & Commercial Bid Evaluation — Allows buyers to manage RFQ inquiry packages, review vendor responses, and perform commercial bid comparisons.
- Elements: Inquiry Package Summary & Approved Vendor Selector, Multi-Supplier Bid Comparison Grid with normalized currency conversion, Technical Deviation & Commercial Exception Table, Award Recommendation Form with threshold approval routing, PO Generation & Direct Supplier Transmittal Trigger
- Supplier Collaboration Portal — External secure vendor workspace for quoting RFQs, acknowledging POs, uploading progress milestones, and submitting documents.
- Elements: My Active RFQs & Open Purchase Orders Table, Quotation Submission & Milestone Update Form, Vendor Document Transmittal Upload with Revision Tracker, Inspection Notification Dispatcher, Packing List Builder & Shipping Readiness Notice
- Warehouse Goods Receipt & OS&D Inspection — Mobile-optimized interface for warehouse operators to scan incoming consignments, verify packing lists, and record discrepancies.
- Elements: Expected Deliveries Register & Barcode/QR Camera Scanner, Package Verification Checklist (Dimensions, Weight, Heat Numbers), Bin Location Selector & Laydown Yard Storage Map, OS&D (Over, Short, Damaged) Exception Logger with camera photo upload, Goods Receipt Note (GRN) Finalization and Print Label Action
- Construction Reservation & Mobile Material Issue — Field interface for checking availability, creating work package reservations, and executing digital sign-off material issues.
- Elements: Work Package & System Material Availability Browser, Reservation Cart & Approval Request Submission, Digital Pick-List with storage bin guidance, Mobile Barcode Tag Scanner for physical issue validation, Digital Signature Pad & Issue Confirmation Transaction Logger
- Project Closeout & Surplus Reconciliation — Management tool for Project Controls to reconcile total project materials and execute surplus asset disposition.
- Elements: Full-Lifecycle Reconciliation Matrix (Engineered vs Ordered vs Received vs Installed vs Remaining), Discrepancy & Scrap Ledger Table, Surplus Disposition Workflow Panel (Transfer, Resale, Return, Scrap), Closeout Sign-off Authorization Routing, Comprehensive Audit Package Export Button (PDF/Excel)
Data model
Tenant
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID format |
name |
string | Corporate entity name, max length 255 |
slug |
string | Unique URL identifier, indexed |
created_at |
datetime | Timestamp ISO8601 |
updated_at |
datetime | Timestamp ISO8601 |
User
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant isolation key, indexed |
email |
string | User email, unique per tenant |
full_name |
string | User display name |
supplier_id |
foreign_key->Supplier | Nullable, set only if external supplier user |
status |
enum(active, suspended, invited) | Account status |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Role
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant isolation key |
name |
string | Role name e.g. EngineeringLead, Buyer, Expeditor, WarehouseOp |
description |
string | Role responsibility summary |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Permission
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
role_id |
foreign_key->Role | Associated role |
action |
enum(create, read, update, delete, approve, export, issue, reconcile) | Allowed action verb |
resource |
string | Domain resource e.g. MTO, Requisition, PurchaseOrder, Inventory |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
UserRole
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
user_id |
foreign_key->User | Assigned user |
role_id |
foreign_key->Role | Assigned role |
project_id |
foreign_key->Project | Nullable project scope override |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Project
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant isolation key |
code |
string | Project code e.g. PRJ-LNG-2026, unique per tenant |
name |
string | Project name |
base_currency |
string | Base currency code ISO 4217 e.g. USD, EUR |
status |
enum(active, on_hold, completed, closed) | Lifecycle status |
start_date |
datetime | Project start date |
end_date |
datetime | Project target completion date |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
Area
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Belongs to Project |
code |
string | Area code e.g. AREA-100 |
name |
string | Area name e.g. Liquefaction Train 1 |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Discipline
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant reference |
code |
string | Discipline code e.g. PIPING, ELECTRICAL, CIVIL, INSTRUMENTATION |
name |
string | Discipline name |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
WorkPackage
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Belongs to Project |
area_id |
foreign_key->Area | Associated Area |
discipline_id |
foreign_key->Discipline | Associated Discipline |
code |
string | CWP/IWP code e.g. WP-PIP-101 |
name |
string | Work package description |
status |
enum(planned, in_progress, completed, turned_over) | Execution status |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Commodity
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Global or tenant commodity |
code |
string | Commodity code e.g. VALVE-BALL, PIPE-CS |
name |
string | Commodity descriptive title |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
MaterialClass
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
commodity_id |
foreign_key->Commodity | Belongs to Commodity |
class_name |
string | Class classification e.g. Class 1500 Flanged |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Manufacturer
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant reference |
name |
string | Manufacturer name |
country |
string | Country of origin ISO code |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
MaterialSpecification
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant reference |
code |
string | Engineering specification code e.g. ASME-B16.34 |
description |
string | Technical specification details |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Material
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant isolation |
project_id |
foreign_key->Project | Project reference for project extensions |
material_class_id |
foreign_key->MaterialClass | Classification |
specification_id |
foreign_key->MaterialSpecification | Engineering spec |
manufacturer_id |
foreign_key->Manufacturer | Nullable approved manufacturer |
code |
string | Material catalog code, indexed |
description |
string | Full descriptive title |
uom |
string | Unit of measure e.g. EA, M, KG |
material_type |
enum(tagged, bulk) | Distinguishes serialized tags from bulk quantities |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
MaterialTag
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
material_id |
foreign_key->Material | Belongs to Material |
project_id |
foreign_key->Project | Associated project |
tag_number |
string | Unique tag identifier e.g. 10-HV-0012, indexed |
serial_number |
string | Manufacturer serial number |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
MTORevision
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
revision_number |
string | Revision identifier e.g. Rev A, Rev 0, Rev 1 |
source_system |
string | Originating engineering tool e.g. Aveva, SmartPlant |
status |
enum(draft, validated, approved, superseded) | Revision lifecycle state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
MTOItem
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
mto_revision_id |
foreign_key->MTORevision | Belongs to MTO Revision |
material_id |
foreign_key->Material | Material reference |
work_package_id |
foreign_key->WorkPackage | Target work package |
quantity |
integer | Base engineering quantity (supports decimal scaling via UOM) |
allowance_percentage |
integer | Engineering scrap/contingency allowance percentage |
required_on_site_date |
datetime | Target construction need date |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Requisition
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
created_by_user_id |
foreign_key->User | Author |
requisition_number |
string | Project-formatted requisition code, unique per project |
status |
enum(draft, in_review, approved, rejected, on_hold, cancelled) | Approval state |
required_date |
datetime | Requested material need date |
technical_requirements |
string | Engineering technical specifications summary |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
RequisitionLine
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
requisition_id |
foreign_key->Requisition | Belongs to Requisition |
mto_item_id |
foreign_key->MTOItem | Source MTO item for complete lineage |
material_id |
foreign_key->Material | Material reference |
quantity |
integer | Quantity to procure |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Supplier
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant reference |
supplier_code |
string | Unique vendor identifier e.g. SUP-9001 |
name |
string | Supplier corporate legal name |
qualification_status |
enum(approved, conditional, disqualified, pending_review) | AVL status |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
SupplierEvaluation
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
supplier_id |
foreign_key->Supplier | Evaluated supplier |
project_id |
foreign_key->Project | Evaluating project |
score |
integer | Score from 0 to 100 |
evaluator_user_id |
foreign_key->User | Evaluating inspector/buyer |
evaluation_date |
datetime | Evaluation date |
notes |
string | Evaluation notes and observations |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
RFQ
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
requisition_id |
foreign_key->Requisition | Source requisition |
rfq_number |
string | RFQ package code, unique per project |
title |
string | Inquiry title |
status |
enum(draft, issued, evaluation, awarded, cancelled) | Procurement stage |
due_date |
datetime | Bid submission deadline |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
RFQBidder
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
rfq_id |
foreign_key->RFQ | Associated RFQ |
supplier_id |
foreign_key->Supplier | Invited supplier |
invited_at |
datetime | Invitation timestamp |
status |
enum(invited, acknowledged, submitted, declined) | Supplier response state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Quote
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
rfq_id |
foreign_key->RFQ | Belongs to RFQ |
supplier_id |
foreign_key->Supplier | Submitting supplier |
quote_number |
string | Supplier commercial reference |
currency |
string | Quotation currency ISO code e.g. USD, EUR |
total_price |
integer | Monetary total in quote currency |
status |
enum(submitted, under_review, shortlisted, awarded, rejected) | Commercial evaluation state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
QuoteLine
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
quote_id |
foreign_key->Quote | Belongs to Quote |
requisition_line_id |
foreign_key->RequisitionLine | Requisition item reference |
unit_price |
integer | Quoted unit price |
offered_lead_time_days |
integer | Manufacturing lead time in days |
technical_deviation |
string | Recorded engineering deviations |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
BidEvaluation
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
rfq_id |
foreign_key->RFQ | Evaluated RFQ |
awarded_quote_id |
foreign_key->Quote | Winning supplier quote |
evaluator_user_id |
foreign_key->User | Lead Buyer |
recommendation_rationale |
string | Commercial and technical justification |
approved_by_user_id |
foreign_key->User | Approving authority |
status |
enum(pending_approval, approved, rejected) | Evaluation approval status |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
PurchaseOrder
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
supplier_id |
foreign_key->Supplier | Awarded supplier |
quote_id |
foreign_key->Quote | Source commercial quote |
po_number |
string | PO code e.g. PO-88001, unique per project |
currency |
string | PO commercial currency |
total_amount |
integer | Total contractual value |
incoterms |
string | Incoterms e.g. FOB, CIF, DDP |
payment_terms |
string | Commercial payment terms e.g. Net 45 |
status |
enum(draft, issued, acknowledged, in_progress, partially_received, completed, cancelled) | Order state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
POLine
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
purchase_order_id |
foreign_key->PurchaseOrder | Belongs to Purchase Order |
requisition_line_id |
foreign_key->RequisitionLine | Link back to requisition and MTO line |
material_id |
foreign_key->Material | Material reference |
quantity |
integer | Contracted purchase quantity |
unit_price |
integer | Agreed line unit price |
promised_delivery_date |
datetime | Contractual delivery date |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
VendorDocument
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
purchase_order_id |
foreign_key->PurchaseOrder | Associated PO |
supplier_id |
foreign_key->Supplier | Supplier author |
document_number |
string | Vendor document register number |
document_type |
enum(drawing, calculation, test_certificate, welding_book, quality_plan) | Document category |
revision_number |
string | Vendor revision e.g. Rev 1 |
status |
enum(submitted, in_review, approved, approved_with_comments, rejected, overdue) | Review status |
submission_date |
datetime | Submission timestamp |
file_url |
string | Storage blob URL or external DMS link |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
DocumentReview
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
vendor_document_id |
foreign_key->VendorDocument | Reviewed document |
reviewer_user_id |
foreign_key->User | Engineering lead reviewer |
approval_code |
enum(code_1_approved, code_2_approved_with_comments, code_3_rejected, code_4_for_information) | Standard EPC approval code |
comments |
string | Engineering review markup comments |
reviewed_at |
datetime | Review completion date |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
InspectionRequest
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
purchase_order_id |
foreign_key->PurchaseOrder | Target PO |
supplier_id |
foreign_key->Supplier | Requesting supplier |
inspection_type |
enum(factory_acceptance_test, pre_shipment, raw_material, hydrostatic_test) | Inspection gate |
proposed_date |
datetime | Scheduled inspection date |
status |
enum(requested, scheduled, completed, waived) | Inspection state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
InspectionRecord
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
inspection_request_id |
foreign_key->InspectionRequest | Belongs to Inspection Request |
inspector_user_id |
foreign_key->User | Quality Inspector |
result |
enum(passed, passed_with_punch_list, failed) | Surveillance result |
punch_list_items |
string | Recorded non-conformities and remediation requirements |
release_for_shipment |
boolean | True if formal Release for Shipment is granted |
certificate_number |
string | Quality release certificate number |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Shipment
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Destination project |
supplier_id |
foreign_key->Supplier | Originating supplier |
shipment_number |
string | Consignment code e.g. SHP-0044 |
freight_forwarder |
string | Logistics service provider name |
transport_mode |
enum(ocean_freight, air_freight, road_truck, rail) | Transit mode |
etd |
datetime | Estimated time of departure |
eta |
datetime | Estimated time of arrival at destination site |
actual_arrival_date |
datetime | Actual arrival date |
status |
enum(planned, departed, in_transit, customs_hold, customs_cleared, delivered) | Logistics state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
ShipmentPackage
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
shipment_id |
foreign_key->Shipment | Belongs to Shipment |
po_line_id |
foreign_key->POLine | Source PO line |
package_number |
string | Crate/Container/Pallet tag code |
quantity |
integer | Packed quantity |
weight_kg |
integer | Gross weight in kg |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
Warehouse
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
code |
string | Warehouse/Yard code e.g. WHS-MAIN, YARD-02 |
name |
string | Facility title e.g. Main Laydown Yard |
location_address |
string | Site coordinates or address |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
StorageLocation
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
warehouse_id |
foreign_key->Warehouse | Belongs to Warehouse |
zone |
string | Zone e.g. Zone A, Rack 04 |
bin_number |
string | Bin identifier e.g. BIN-A4-12 |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
InventoryItem
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
material_id |
foreign_key->Material | Material reference |
warehouse_id |
foreign_key->Warehouse | Current warehouse location |
storage_location_id |
foreign_key->StorageLocation | Exact bin location |
po_line_id |
foreign_key->POLine | Originating purchase order line |
quantity |
integer | Current physical stock quantity |
serial_number |
string | Item serial number if tagged |
heat_number |
string | Mill certificate heat/batch number for metallurgy |
status |
enum(available, reserved, quarantined, damaged, issued) | Stock status |
received_date |
datetime | Site goods receipt timestamp |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
deleted_at |
datetime | Soft delete timestamp |
MaterialMovement
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
inventory_item_id |
foreign_key->InventoryItem | Affected stock item |
actor_user_id |
foreign_key->User | User performing transaction |
movement_type |
enum(receipt, transfer, issue, return, adjustment, scrap) | Movement transaction type |
from_location_id |
foreign_key->StorageLocation | Source bin location |
to_location_id |
foreign_key->StorageLocation | Destination bin location |
quantity |
integer | Transacted quantity |
reference_document_type |
string | Reference entity e.g. Shipment, Reservation, OS&D |
reference_document_id |
string | Reference UUID |
timestamp |
datetime | Immutable ledger timestamp |
created_at |
datetime | Creation timestamp |
Reservation
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
work_package_id |
foreign_key->WorkPackage | Target Work Package |
inventory_item_id |
foreign_key->InventoryItem | Reserved physical stock item |
reserved_by_user_id |
foreign_key->User | Construction requester |
quantity |
integer | Reserved quantity |
status |
enum(active, issued, cancelled) | Reservation state |
created_at |
datetime | Creation timestamp |
updated_at |
datetime | Update timestamp |
IssueTransaction
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
reservation_id |
foreign_key->Reservation | Associated reservation |
issued_by_user_id |
foreign_key->User | Warehouse operator issuing stock |
received_by_name |
string | Field supervisor name receiving material |
signature_image_url |
string | Captured digital signature blob URL |
quantity |
integer | Issued quantity |
issued_at |
datetime | Issue execution timestamp |
created_at |
datetime | Creation timestamp |
ShortageRecord
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
work_package_id |
foreign_key->WorkPackage | Impacted work package |
material_id |
foreign_key->Material | Shortage material reference |
required_quantity |
integer | Engineering requirement |
available_quantity |
integer | Current available unreserved stock |
shortage_quantity |
integer | Calculated deficit (required - available) |
required_date |
datetime | Construction need date |
status |
enum(open, under_expediting, substituted, resolved) | Shortage resolution state |
created_at |
datetime | Calculation timestamp |
updated_at |
datetime | Update timestamp |
ReconciliationRecord
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
project_id |
foreign_key->Project | Associated project |
material_id |
foreign_key->Material | Reconciled material |
engineered_quantity |
integer | Total approved MTO quantity |
purchased_quantity |
integer | Total PO ordered quantity |
shipped_quantity |
integer | Total supplier dispatched quantity |
received_quantity |
integer | Total warehouse received quantity |
issued_quantity |
integer | Total field issued quantity |
damaged_quantity |
integer | Total OS&D scrap/damaged quantity |
surplus_quantity |
integer | Remaining physical inventory (received - issued - damaged) |
disposition_action |
enum(none, transfer_project, return_to_supplier, sell, scrap) | Closeout surplus action |
created_at |
datetime | Reconciliation timestamp |
updated_at |
datetime | Update timestamp |
CurrencyExchangeRate
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant reference |
from_currency |
string | Source ISO currency e.g. EUR |
to_currency |
string | Target base ISO currency e.g. USD |
rate_multiplier |
integer | Fixed point multiplier rate (e.g., 10850 for 1.0850) |
effective_date |
datetime | Effective date |
created_at |
datetime | Creation timestamp |
AuditLog
| Field | Type | Notes |
|---|---|---|
id |
string | Primary Key, UUID |
tenant_id |
foreign_key->Tenant | Tenant isolation |
actor_user_id |
foreign_key->User | User triggering modification |
entity_type |
string | Target entity name e.g. PurchaseOrder, InventoryItem |
entity_id |
string | UUID of modified entity |
action |
string | Action description e.g. STATUS_CHANGE, APPROVAL, DELETE |
previous_values |
string | JSON serialized previous state |
new_values |
string | JSON serialized new state |
ip_address |
string | Client network address |
created_at |
datetime | Immutable record timestamp |
Business rules
- BR-001: Shortage Calculation — The net shortage for any Material M in WorkPackage WP is computed as: shortage = max(0, MTO_required_qty - (ordered_qty + available_inventory_qty - reserved_other_qty)). If shortage > 0, an active ShortageRecord is maintained.
- BR-002: Approval Authority Thresholds — Purchase Orders with total_amount <= $50,000 require Lead Buyer approval; orders between $50,001 and $250,000 require Procurement Manager approval; orders > $250,000 require Project Director and Finance Lead approval.
- BR-003: Immutable Material Movements — No MaterialMovement record can be updated or deleted via API or UI. Stock corrections must be executed by creating an offsetting MaterialMovement transaction of type 'adjustment' referencing the original transaction.
- BR-004: Release for Shipment Gate — A ShipmentPackage can only be associated with PO lines whose linked InspectionRecord has release_for_shipment=true, or where the inspection requirement for that commodity class was explicitly waived by Quality Lead.
- BR-005: Soft Delete Lifecycle — All user-facing entities (Project, Material, Requisition, PurchaseOrder, Supplier, Shipment, InventoryItem) must use soft deletion by setting deleted_at. Queries for active business operations must filter by deleted_at IS NULL.
- BR-006: Supplier Portal Data Boundary — Any database query initiated by a user with a non-null supplier_id must strictly enforce supplier_id equality in WHERE clauses, preventing cross-supplier RFQ/PO inspection.
Permissions
| Role | Capabilities |
|---|---|
| Engineering Lead | create:MTORevision; update:MTORevision; approve:MTORevision; create:Requisition; update:Requisition; read:Material; read:TraceabilityGraph; read:ShortageRecord |
| Buyer / Procurement Specialist | read:Requisition; create:RFQ; update:RFQ; create:BidEvaluation; approve:BidEvaluation; create:PurchaseOrder; update:PurchaseOrder; approve:PurchaseOrder; read:Supplier; read:TraceabilityGraph |
| Expeditor & Quality Inspector | read:PurchaseOrder; update:VendorDocument; create:DocumentReview; create:InspectionRequest; update:InspectionRequest; create:InspectionRecord; update:InspectionRecord; read:TraceabilityGraph |
| Logistics & Warehouse Manager | create:Shipment; update:Shipment; create:InventoryItem; update:InventoryItem; create:MaterialMovement; read:PurchaseOrder; read:StorageLocation; read:TraceabilityGraph |
| Construction & Commissioning Lead | create:Reservation; update:Reservation; create:IssueTransaction; read:InventoryItem; read:WorkPackage; read:ShortageRecord; read:TraceabilityGraph |
| Project Controls Lead | read:Project; read:ReconciliationRecord; update:ReconciliationRecord; export:ReconciliationRecord; read:ShortageRecord; read:TraceabilityGraph; read:AuditLog |
| Supplier Representative | read:RFQ (own organization only); create:Quote; update:Quote; read:PurchaseOrder (own organization only); create:VendorDocument; create:InspectionRequest; create:ShipmentPackage |
| Governance & Compliance Auditor | read:AuditLog; export:AuditLog; read:Tenant; read:Project; read:TraceabilityGraph |
Integrations
- Engineering Design Tools (Aveva E3D, Hexagon SmartPlant 3D): CSV/Excel and REST API MTO import adapter for automated material revision ingests.
- Enterprise ERP & Finance Systems (SAP S/4HANA, Oracle ERP Cloud): Two-way webhook and REST interface synchronizing Purchase Orders, commitments, payment terms, and actual invoices.
- Project Scheduling Tools (Primavera P6, MS Project): REST synchronization of Work Package milestone required-on-site dates.
- Document Management Platforms (OpenText, Bentley ProjectWise): Document linking adapters for supplier technical data books and cert packages.
Non-functional requirements
- NFR-001 (Scalability): The data model and query engine shall support 1,000,000+ active Material records, 50,000+ Purchase Orders, and 2,000 concurrent active users per tenant without degradation.
- NFR-002 (Performance): Bidirectional traceability graph visual queries and MTO delta calculations shall render within 3.0 seconds at p95 under standard load.
- NFR-003 (Security & Multi-tenancy): Enforce strict row-level security (RLS) isolating tenant data and supplier partitions; all data in transit must use TLS 1.3 and data at rest encrypted via AES-256.
- NFR-004 (Graceful Mobile Degradation): The mobile warehouse and field interfaces shall maintain local cached read states and graceful reconnect queueing when network connectivity fluctuates on job sites.
- NFR-005 (Auditability): AuditLog events are immutable and must be preserved for the statutory project retention duration (minimum 10 years for industrial EPC).
Edge cases
- EC-001: MTO Revision Decreases Quantity for already Ordered/Shipped Lines — The system halts auto-reduction of PO quantities, creates a 'Surplus / Engineering Cancel Warning' notification, and prompts the Buyer to negotiate a PO variation order or divert surplus stock to other work packages.
- EC-002: Supplier Submits Partial Shipment with Mixed Purchase Orders — The system accepts multi-PO package consolidation, creating distinct ShipmentPackage records linked to individual POLines while maintaining a single customs transport consignment.
- EC-003: Over-Receipt at Laydown Yard (Received Qty > PO Qty) — The system logs an OS&D discrepancy report, flags excess material into 'Quarantined - Over-Receipt' status, and dispatches an approval request to the Buyer before allowing bin placement.
- EC-004: Intermittent Field Connectivity during Mobile Barcode Issue — The mobile web app caches scanned item IDs and signatures in browser local storage, updating local stock counters visually, and syncs the immutable IssueTransaction payload automatically once site Wi-Fi/cellular connection is restored.
Out of scope
- OOS-001: General-purpose financial ledger, general payroll, corporate HR, and corporate double-entry accounting (delegated to integrated ERP like SAP/Oracle).
- OOS-002: Standalone 3D CAD/BIM model viewer or direct 3D engineering authoring tools (delegated to native engineering design systems).
- OOS-003: Native Critical Path Method (CPM) project scheduling and Gantt resource leveling (delegated to Primavera P6 / MS Project).
- OOS-004: Enterprise-wide generic document management system (vendor documents are managed strictly in connection with project transactions and external DMS links).
Assumptions & open items
Assumed:
- Multi-currency calculations will use standard project-level fixed exchange rates recorded in CurrencyExchangeRate rather than real-time forex streaming.
- Project-specific numbering schemes (e.g. PO-PRJ-XXXX) will follow configurable string format templates with project-scoped sequential integer auto-increment counters.
- Mobile warehouse and field workflows will be delivered as an offline-tolerant responsive web application optimized for ruggedized handheld barcode scanners and tablets.
- Default PO monetary approval thresholds ($50,000 / $250,000) are configured at tenant initiation and can be adjusted per project configuration.
Coverage notes
- Functional requirements: 10 (with acceptance criteria: 10)
- Open assumptions: 4 (unresolved/conflicted: 0)
- Entities in data model: 44
- Screens: 8, Roles: 8, Journeys: 3