@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix gs1: <https://ref.gs1.org/voc/> .
@prefix oec: <https://ref.openepcis.io/extensions/common/core/> .
@prefix eucpr: <https://ref.openepcis.io/extensions/eu/cpr/> .
@prefix cpr-sh: <https://ref.openepcis.io/extensions/eu/cpr/shapes/> .
@prefix dcterms: <http://purl.org/dc/terms/> .

<https://ref.openepcis.io/extensions/eu/cpr/shapes/>
    a sh:ShapesGraph ;
    dcterms:title "OpenEPCIS CPR SHACL Shapes"@en ;
    dcterms:description "SHACL validation shapes for the CPR vocabulary (EU Regulation 2024/3110)."@en ;
    dcterms:created "2026-05-01"^^xsd:date ;
    dcterms:modified "2026-06-18"^^xsd:date .

cpr-sh:ConstructionProductShape
    a sh:NodeShape ;
    sh:targetClass eucpr:ConstructionProduct ;
    rdfs:label "CPR Construction Product Shape"@en ;
    sh:property [
        sh:path eucpr:constructionProductType ;
        sh:minCount 1 ;
        sh:maxCount 1 ;
        sh:message "eucpr:ConstructionProduct must declare exactly one constructionProductType (Annex III family)"@en
    ] ;
    sh:property [
        sh:path eucpr:declarationOfPerformanceUrl ;
        sh:datatype xsd:anyURI ;
        sh:minCount 1 ;
        sh:message "eucpr:ConstructionProduct must reference a Declaration of Performance per CPR Article 12"@en
    ] ;
    sh:property [
        sh:path eucpr:reactionToFireClass ;
        sh:nodeKind sh:IRI ;
        sh:in ( eucpr:FireClassA1 eucpr:FireClassA2 eucpr:FireClassB eucpr:FireClassC eucpr:FireClassD eucpr:FireClassE eucpr:FireClassF ) ;
        sh:maxCount 1 ;
        sh:message "eucpr:reactionToFireClass must be A1, A2, B, C, D, E, or F (EN 13501-1)"@en
    ] ;
    sh:property [
        sh:path eucpr:essentialCharacteristic ;
        sh:minCount 1 ;
        sh:node cpr-sh:EssentialCharacteristicShape ;
        sh:message "A CPR Declaration of Performance must declare at least one essential characteristic, each conforming to EssentialCharacteristicShape (CPR Article 12 / Annex III)"@en
    ] .

cpr-sh:EssentialCharacteristicShape
    a sh:NodeShape ;
    sh:targetClass eucpr:EssentialCharacteristic ;
    rdfs:label "CPR Essential Characteristic Shape"@en ;
    sh:property [
        sh:path eucpr:characteristicName ;
        sh:datatype xsd:string ;
        sh:minCount 1 ;
        sh:maxCount 1
    ] ;
    sh:property [
        sh:path eucpr:characteristicValue ;
        sh:nodeKind sh:BlankNodeOrIRI ;
        sh:minCount 1 ;
        sh:maxCount 1 ;
        sh:message "Each essential characteristic must carry a structured characteristicValue (gs1:QuantitativeValue: value + unitCode)"@en
    ] ;
    sh:property [
        sh:path eucpr:harmonisedStandard ;
        sh:datatype xsd:anyURI ;
        sh:maxCount 1
    ] .
