Skip to main content

Data Model

This page maps the Smart EPD entity hierarchy and explains how the core objects relate to each other. Understanding this model is essential for API integrators and anyone working with Smart EPD data programmatically.

Entity hierarchy​

Smart EPD organizes data through a strict containment hierarchy. Each level constrains the next:

EPD type progression​

EPDs under a project can follow one of two paths. Every EPD begins life as a standard draft. From there, it can be submitted and approved on its own (standalone path), or it can be morphed into a reference EPD, which locks a modeling envelope and then serves as the parent for zero or more variant EPDs.

The standalone and reference paths are mutually exclusive per EPD: once an EPD is morphed to reference, it cannot become standard again, and variants always belong to exactly one reference.

Platform layer​

Organization​

A company or entity on the platform. Every user belongs to exactly one organization, and every action traces back to one.

AttributeDescription
NameCompany name
Typemanufacturing_group, tool_provider, consultant, or verifier
MembersUsers with roles (admin or user)
Parent orgSelf-referential link for corporate hierarchy (e.g., subsidiaries under a parent group)
Partner orgsExplicit one-way links to other organizations for collaboration, tracked via a PartnerOrganization record with its own active / revoked status

Organizations can also receive scoped OrgAccessGrant records, which grant a partner organization access to a specific workspace, PCC, or project.

Workspace​

A collaboration space where organizations work together. One workspace per engagement.

AttributeDescription
NameEngagement name (e.g., "Acme 2025 EPDs")
Primary organizationThe reporting org this workspace was created for
Statusdraft → active → archived
Organization membershipsEach org has a role: reporting_organization, tool_provider, or member
User membershipsIndividual users get workspace-level roles: admin, editor, or viewer
PCCsProduct Category Configurations within this workspace

When an organization joins a workspace, all of its current members automatically receive viewer-level access. Users added to the org later are not auto-enrolled — they must be invited explicitly. Individual users can be elevated to editor or admin.

note

Consultant and verifier relationships are expressed at the organization type level (org_type), not as workspace roles. Workspace membership only distinguishes the reporting org, the tool provider, and general members for access-control purposes.

PCC (Product Category Configuration)​

The governance layer, defining how a product category's EPDs are created and verified. Exposed in the UI as a "Category" and in frontend routes as /category/:id, but the backend model is named PCC.

AttributeDescription
NameProduct category label (e.g., "Ready-Mixed Concrete")
PCR SpecWhich Product Category Rules specification governs this PCC
ToolFor tool-based modes, the selected LCA tool. The tool's allows_reference_epds flag determines whether projects under this PCC can create reference/variant EPDs.
Tool versionVersion string of the selected tool
Statusdraft → active → archived

Product layer​

Project​

A concrete product assessment. The central hub for all EPD work.

AttributeDescription
NameProduct being assessed
PCCParent Product Category Configuration (governs rules, tool, verifier)
Statusdraft → retired
Sequence IDAuto-incremented identifier assigned on first EPD publish, used in declaration numbers
Reporting owner metadataOptional declaration-owner details (name, phone, address, website, email) captured at the project level
TeamIndividual users with per-project permissions
Revision chainSelf-referential link (previous_revision) pointing to a prior project. A unique constraint ensures each revision has at most one successor.

A project contains EPDs, LCA versions, zero or more ResolvedTemplate instances (one per approved spec version that applies here), and submittal packages.

EPD (Environmental Product Declaration)​

The core deliverable: a structured environmental impact report for a product. Every EPD stores its content in a document JSONField — a structured blob keyed by the project's resolved spec.

EPD types:

TypeDescription
standardStandalone EPD, individually reviewed. Does not use a locked template.
referenceA verification artifact bound to a locked ResolvedTemplate. The template defines the modeling envelope variants must stay within; the reference EPD is the populated instance that proves it. Produced by morphing a standard draft — see the EPD type progression diagram above.
variantDerived from an approved reference EPD via the VariantEpd junction. Inherits the reference's template and is validated against its constraints on generation.

An EPD carries tracking metadata through its lifecycle: submitted_at/by, approved_at/by, flagged_at/by, published_at/by, declaration_number and expiration_date, and pdf_file_key/pdf_generated_at for the rendered PDF.

Status lifecycle:

Variant-specific models layer on top of this: OutlierFlag tracks statistical outliers on variant indicator values, and RepublishingRequest (with child RepublishingSection records) drives the approval flow when a previously-published EPD needs to be updated.

LCA Version​

Life Cycle Assessment documentation for a project. The LCA must be approved before EPDs can be approved.

Status lifecycle: draft → submitted → in_review → approved (or rejected → reopened)

LCA versions contain uploaded documents staged as either LCA submittal documents or supporting documentation. Each LCADocument also carries a document_type categorization (LCA report, supporting data, data-quality assessment, methodology notes, other) and supports soft deprecation via deprecated_at / deprecated_by rather than hard deletion, preserving the audit trail. LCA versions also track submission and review metadata (submitted_by, reviewed_by, reviewed_at, review_notes) and an optional tool_url for linking to the external LCA tool.

Specification & Template layer​

Specification (Spec)​

A structured definition of rules, requirements, and form configurations. Specifications exist at two levels and cascade downward through inheritance:

LevelExampleWhat it defines
StandardISO 21930 / EN 15804Baseline structural requirements
PCREN 15804+A2 for ConcreteCategory-specific rules, impact categories, input constraints, field configurations

Specifications are versioned using semantic versioning. Each version contains requirements (with validation checks), field group definitions, and section structures.

For a deep dive, see Specifications & Validation.

EPD Template​

The output when the full specification chain is evaluated for a specific project. Backed by the ResolvedTemplate model. An EPD Template locks field values, applies constraints, and defines the form that manufacturers interact with when authoring EPDs that are bound to it.

Status lifecycle: draft → in_review → approved (or rejected)

Templates are immutable after approval. Template versions are tracked via semantic versioning: minor updates auto-apply to existing projects, major updates do not.

How each EPD type uses (or doesn't use) a template:

EPD typeTemplate relationshipWhat the template does
standardNo template required (template FK is null)The EPD is authored free-form against the PCC's spec. Validation comes from the spec itself, not from a locked envelope.
referenceRequired — a ResolvedTemplate is auto-created when a standard draft is morphed to referenceLocks the verified modeling envelope (locked field values + constraint ranges). The reference EPD proves the tool-and-spec combination works at these setpoints.
variantInherits the template from its parent reference EPD (via the VariantEpd junction)Every variant is validated against the same constraints the reference was approved under. Out-of-bounds inputs block variant generation — see EPD Templating for the full out-of-bounds flow.

In short: standard EPDs are the free-form path, and reference/variant EPDs are the templated path. A project can contain both — standard EPDs for one-off products, reference EPDs (each with its own variant family) for tool-driven product lines.

For a deep dive, see EPD Templating.

Verification layer​

Submittal Package​

A bundle submitted by a manufacturer for third-party verification. Groups together the items a verifier needs to review as a unit.

Status lifecycle: draft → submitted (locked) → in_review → approved (or rejected / feedback)

Each package contains submittal items, each independently reviewable:

Item typeReview scope
LCA versionLCA documentation completeness
Standard EPDFull section-by-section review
Reference EPDTemplate + tool compliance review
Variant EPDAutomated validation + spot checks

Dependency gates enforce approval order: LCA → EPDs → Reference EPD → Variant EPDs.

Verification mechanics​

Verification assignments are created per-EPD, per-PCF, or per-LCA version — not at the Category or project level. The verification system then operates at the section level within each assigned item:

ComponentPurpose
Verifier assignmentsPer-EPD, per-PCF, or per-LCA, with status tracking
Verification commentsPer-section threaded discussions with author replies
AI conformance hintsAutomated suggestions with confidence levels
Verifier checklistsPer-requirement compliance tracking (Y/N/OFI/N/A)

For the full verification process, see Verification Workflow.