@prefix : <https://ontology.inferal.com/modules/commerce-margin-evidence/> .
@prefix ctx: <https://ontology.inferal.com/modules/commerce-transaction/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix cmi: <https://ontology.inferal.com/modules/commercial-intelligence/> .
@prefix rng: <https://ontology.inferal.com/modules/range/> .
@prefix time: <http://www.w3.org/2006/time#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix mod: <https://w3id.org/mod#> .
@prefix pubacc: <https://ontology.inferal.com/modules/publication-access/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
:CohortShape a sh:NodeShape ; sh:targetClass :Cohort ; sh:closed true ;
sh:property [ sh:path rdf:type ; sh:minCount 1 ; sh:maxCount 1 ; sh:hasValue :Cohort ] ;
sh:property [ sh:path :merchantScope ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :policy ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; sh:node :PolicyShape ] ;
sh:property [ sh:path :placementWindow ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; sh:node :WindowShape ] ;
sh:property [ sh:path :selectionEvidence ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :selectedOrder ; sh:minCount 0 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :sourceCompleteness ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Unassessed :DeclaredPartial :DeclaredComplete) ] ;
sh:property [ sh:path :historyCompleteness ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Unassessed :DeclaredPartial :DeclaredComplete) ] ;
sh:nodeKind sh:IRI .
:PolicyShape a sh:NodeShape ; sh:targetClass :EligibilityPolicy ; sh:closed true ;
sh:property [ sh:path rdf:type ; sh:minCount 1 ; sh:maxCount 1 ; sh:hasValue :EligibilityPolicy ] ;
sh:property [ sh:path :policyVersion ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:minLength 1 ] ;
sh:property [ sh:path :policyEvidence ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :currencySupportEvidence ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :signedValueEvidence ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :recognisedPayment ; sh:minCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :recognisedLifecycle ; sh:minCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :admittedPayment ; sh:minCount 0 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :admittedLifecycle ; sh:minCount 0 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :supportedCurrency ; sh:minCount 1 ; sh:datatype xsd:string ; sh:pattern "^[A-Z]{3}$" ] ;
sh:property [ sh:path :allowSigned ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:boolean ] ;
sh:sparql [ sh:message "Admitted states must be recognised by this policy" ; sh:select "PREFIX me: <https://ontology.inferal.com/modules/commerce-margin-evidence/> SELECT $this WHERE { $this me:admittedPayment ?state . FILTER NOT EXISTS { $this me:recognisedPayment ?state } }" ] ;
sh:sparql [ sh:message "Admitted states must be recognised by this policy" ; sh:select "PREFIX me: <https://ontology.inferal.com/modules/commerce-margin-evidence/> SELECT $this WHERE { $this me:admittedLifecycle ?state . FILTER NOT EXISTS { $this me:recognisedLifecycle ?state } }" ] ;
sh:nodeKind sh:IRI .
:WindowShape a sh:NodeShape ; sh:targetClass rng:Range ; sh:closed true ;
sh:property [ sh:path rdf:type ; sh:minCount 1 ; sh:maxCount 1 ; sh:hasValue rng:Range ] ;
sh:property [ sh:path rng:lowerBound ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; sh:node :InstantShape ] ;
sh:property [ sh:path rng:upperBound ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; sh:node :InstantShape ] ;
sh:property [ sh:path rng:lowerInclusive ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:boolean ] ;
sh:property [ sh:path rng:upperInclusive ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:boolean ] ;
sh:sparql [ sh:message "Placement window lower bound exceeds upper bound" ; sh:select "PREFIX rng: <https://ontology.inferal.com/modules/range/> PREFIX time: <http://www.w3.org/2006/time#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT $this WHERE { $this rng:lowerBound/time:inXSDDateTimeStamp ?lower ; rng:upperBound/time:inXSDDateTimeStamp ?upper . FILTER(xsd:dateTime(STR(?lower)) > xsd:dateTime(STR(?upper))) }" ] ; sh:nodeKind sh:IRI .
:InstantShape a sh:NodeShape ; sh:targetClass time:Instant ; sh:closed true ;
sh:property [ sh:path rdf:type ; sh:minCount 1 ; sh:maxCount 1 ; sh:hasValue time:Instant ] ;
sh:property [ sh:path time:inXSDDateTimeStamp ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:dateTimeStamp ; sh:pattern "^[0-9]{4}-[0-9]{2}-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,6}0*)?(Z|[+-](0[0-9]|1[0-3]):[0-5][0-9]|[+-]14:00)$" ; sh:not [ sh:pattern "^0000-" ] ] ;
sh:nodeKind sh:IRI .
:OrderAssessmentShape a sh:NodeShape ; sh:targetClass :OrderAssessment ;
sh:property [ sh:path :cohort ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :sourceGraph ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :policy ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :sourceRecord ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:BlankNodeOrIRI ] ;
sh:property [ sh:path :sourceDigest ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:pattern "^[0-9a-f]{64}$" ] ;
sh:property [ sh:path :packageDigest ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:pattern "^[0-9a-f]{64}$" ] ;
sh:property [ sh:path :orderEligibility ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Eligible :Excluded :Unassessed :OutsideCohort) ] ;
sh:property [ sh:path :foundOrder ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:boolean ] ;
sh:nodeKind sh:IRI .
:LineAssessmentShape a sh:NodeShape ; sh:targetClass :LineAssessment ;
sh:property [ sh:path :cohort ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :sourceGraph ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :policy ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ] ;
sh:property [ sh:path :sourceRecord ; sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:BlankNodeOrIRI ] ;
sh:property [ sh:path :sourceDigest ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:pattern "^[0-9a-f]{64}$" ] ;
sh:property [ sh:path :packageDigest ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:pattern "^[0-9a-f]{64}$" ] ;
sh:property [ sh:path :orderEligibility ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Eligible :Excluded :Unassessed :OutsideCohort) ] ;
sh:property [ sh:path :ownerCount ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:integer ; sh:minInclusive 0 ] ;
sh:property [ sh:path :selectedOwnerCount ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:integer ; sh:minInclusive 0 ] ;
sh:property [ sh:path :moneyStanding ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Comparable :Unassessed) ] ;
sh:property [ sh:path :productStanding ; sh:minCount 1 ; sh:maxCount 1 ; sh:in (:Assigned :Unassessed) ] ;
sh:nodeKind sh:IRI .
