@prefix : <https://ontology.inferal.com/modules/advertising-budget/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix mod: <https://w3id.org/mod#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix pubacc: <https://ontology.inferal.com/modules/publication-access/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix vann: <http://purl.org/vocab/vann/> .

<https://ontology.inferal.com/modules/advertising-budget/owl>
    a owl:Ontology, pubacc:PublicationManagedOntology ;
    dcterms:accessRights pubacc:PublicAccess ;
    owl:imports : , adm:owl ;
    dcterms:title "Advertising Budget Ontology - OWL Addendum" ;
    dcterms:description "OWL class, property, key, and disjointness axioms layered on the RDFS Advertising Budget Ontology." ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    dcterms:source : ;
    vann:preferredNamespacePrefix "abg" ;
    vann:preferredNamespaceUri "https://ontology.inferal.com/modules/advertising-budget/" ;
    mod:status "draft" ;
    rdfs:comment "This addendum states what makes two budgets the same budget, and that a ceiling is not a target. Consumers that load only the RDFS base see the vocabulary without these entailments." ;
    owl:versionInfo "0.1.0" .


# --- Classes -----------------------------------------------------------------

:Budget a owl:Class .
:BudgetPeriod a owl:Class .
:DeliveryMethod a owl:Class .
:BudgetScope a owl:Class .
:SpendCap a owl:Class .


# --- Object properties -------------------------------------------------------

:budgetAmount a owl:ObjectProperty , owl:FunctionalProperty .
:budgetPeriod a owl:ObjectProperty , owl:FunctionalProperty .
:budgetDeliveryMethod a owl:ObjectProperty , owl:FunctionalProperty .
:appliesToScope a owl:ObjectProperty , owl:FunctionalProperty .
:capAmount a owl:ObjectProperty , owl:FunctionalProperty .
:capPeriod a owl:ObjectProperty , owl:FunctionalProperty .
:constrainsScope a owl:ObjectProperty , owl:FunctionalProperty .
:effectiveWindow a owl:ObjectProperty , owl:FunctionalProperty .

# Deliberately not functional: a scope covers as many entities as the budget is
# shared across, and that count is the signal a consumer needs.
:coversEntity a owl:ObjectProperty .


# --- Datatype properties -----------------------------------------------------

:sharedAcrossEntities a owl:DatatypeProperty , owl:FunctionalProperty .
:coveredEntityCount a owl:DatatypeProperty , owl:FunctionalProperty .


# --- Identity ----------------------------------------------------------------

# What makes two budgets the same budget. Amount is excluded: two budgets
# agreeing on scope, period, and pacing but differing in amount are a restatement
# conflict to surface, not two budgets.
:Budget
    owl:hasKey ( :appliesToScope :budgetPeriod :budgetDeliveryMethod ) .

:SpendCap
    owl:hasKey ( :constrainsScope :capPeriod ) .


# --- Incompatibility ---------------------------------------------------------

# A ceiling is not a target. Pacing spends toward a budget and stops at a cap, so
# a reasoner that conflates them reports a capped account as underspending.
:Budget owl:disjointWith :SpendCap .

# Neither is the scope they apply to, nor the vocabulary values that qualify them.
:BudgetScope owl:disjointWith :Budget , :SpendCap .
:BudgetPeriod owl:disjointWith :DeliveryMethod .
