@prefix pc: <https://ontology.inferal.com/modules/commerce-purchase-classification/> .
@prefix ctx: <https://ontology.inferal.com/modules/commerce-transaction/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@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 sh: <http://www.w3.org/ns/shacl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

pc:ClassificationShape a sh:NodeShape; sh:targetClass pc:PurchaseClassification; sh:nodeKind sh:IRI; sh:property [ sh:path pc:context; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:order; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:buyer; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:merchant; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:policy; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:history; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:basis; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:reason; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:eligibilityStanding; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:monetaryStanding; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:monetaryBasis; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI ],
    [ sh:path pc:status; sh:minCount 1; sh:maxCount 1; sh:nodeKind sh:IRI; sh:in (ctx:firstTimeBuyer ctx:returningBuyer pc:Unknown pc:Excluded) ],
    [ sh:path pc:asOf; sh:minCount 1; sh:maxCount 1; sh:datatype xsd:dateTimeStamp ],
    [ sh:path pc:sourceDigest; sh:minCount 1; sh:maxCount 1; sh:datatype xsd:string; sh:pattern "^[0-9a-f]{64}$" ],
    [ sh:path pc:contextDigest; sh:minCount 1; sh:maxCount 1; sh:datatype xsd:string; sh:pattern "^[0-9a-f]{64}$" ],
    [ sh:path pc:interpretationDigest; sh:minCount 1; sh:maxCount 1; sh:datatype xsd:string; sh:pattern "^[0-9a-f]{64}$" ],
    [ sh:path pc:amountValue; sh:minCount 0; sh:maxCount 1; sh:datatype xsd:decimal; sh:minInclusive 0 ],
    [ sh:path pc:currency; sh:minCount 0; sh:maxCount 1; sh:datatype xsd:string; sh:minLength 1 ];
    sh:sparql [ sh:message "Qualified monetary observations require an amount and currency; unresolved values cannot retain them."; sh:select """PREFIX pc: <https://ontology.inferal.com/modules/commerce-purchase-classification/> SELECT $this WHERE { $this pc:monetaryStanding ?standing . FILTER((?standing = pc:Qualified && (!EXISTS {$this pc:amountValue ?v} || !EXISTS {$this pc:currency ?c})) || (?standing != pc:Qualified && (EXISTS {$this pc:amountValue ?v} || EXISTS {$this pc:currency ?c}))) }""" ] .
