@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 schema: <http://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#> .
@prefix skyocean: <https://skyocean.io/ontology/> .
@prefix donation: <https://skyocean.io/ontology/donation/> .
@prefix trade: <https://skyocean.io/ontology/trade/> .

# Ontology Definition
skyocean: a owl:Ontology ;
    dct:title "Skyocean Ontology" ;
    dct:description "A specialized vocabulary for agricultural commodities trading in decentralized knowledge graphs" ;
    dct:creator "Skyocean Team" ;
    dct:issued "2023-10-01" ;
    dct:modified "2026-05-04" ;
    owl:versionInfo "2.1.3" ;
    rdfs:comment "The Skyocean Ontology is designed to facilitate global trade of agricultural commodities and traceable humanitarian donation programs with an emphasis on transparency, traceability, and efficient financing." .

# Classes

skyocean:Trade a rdfs:Class ;
    rdfs:label "Trade" ;
    rdfs:comment "The core class representing a complete trade transaction between parties in the Skyocean ecosystem." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:CommodityTrade a rdfs:Class ;
    rdfs:label "CommodityTrade" ;
    rdfs:comment "A specialized trade of agricultural commodities" ;
    rdfs:subClassOf skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:Commodity a rdfs:Class ;
    rdfs:label "Commodity" ;
    rdfs:comment "Represents physical agricultural goods being traded in the Skyocean ecosystem" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:TradeParty a rdfs:Class ;
    rdfs:label "TradeParty" ;
    rdfs:comment "Entities involved in a trade transaction (buyer, seller, consignee, etc.)" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:Document a rdfs:Class ;
    rdfs:label "Document" ;
    rdfs:comment "Trade-related documentation including their verification status" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:BlockchainTransaction a rdfs:Class ;
    rdfs:label "BlockchainTransaction" ;
    rdfs:comment "Records of trade events recorded on the blockchain" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:FinancingRecord a rdfs:Class ;
    rdfs:label "FinancingRecord" ;
    rdfs:comment "Details of trade financing arrangements and token positions" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:TradePrivateData a rdfs:Class ;
    rdfs:label "TradePrivateData" ;
    rdfs:comment "Private data related to a trade transaction" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:PaymentDetails a rdfs:Class ;
    rdfs:label "PaymentDetails" ;
    rdfs:comment "Details of payment and financing arrangements for a trade" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

# Properties

skyocean:tradeStatus a rdf:Property ;
    rdfs:label "tradeStatus" ;
    rdfs:comment "Current status of the trade transaction" ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:financingStatus a rdf:Property ;
    rdfs:label "financingStatus" ;
    rdfs:comment "Current status of trade financing" ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:documentStatus a rdf:Property ;
    rdfs:label "documentStatus" ;
    rdfs:comment "Status of a trade document" ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:verificationStatus a rdf:Property ;
    rdfs:label "verificationStatus" ;
    rdfs:comment "Verification status of a document" ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:role a rdf:Property ;
    rdfs:label "role" ;
    rdfs:comment "Role of an entity in the trade" ;
    rdfs:domain skyocean:TradeParty ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:walletAddress a rdf:Property ;
    rdfs:label "walletAddress" ;
    rdfs:comment "Blockchain wallet address" ;
    rdfs:domain skyocean:TradeParty ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:financierProfitRate a rdf:Property ;
    rdfs:label "financierProfitRate" ;
    rdfs:comment "Profit rate for the financier" ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:commodity a rdf:Property ;
    rdfs:label "commodity" ;
    rdfs:comment "The commodity being traded" ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:Commodity ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:requiredDocumentTypes a rdf:Property ;
    rdfs:label "requiredDocumentTypes" ;
    rdfs:comment "Types of documents required for the trade" ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:documentStatuses a rdf:Property ;
    rdfs:label "documentStatuses" ;
    rdfs:comment "Status information for required documents" ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:blockchainStatus a rdf:Property ;
    rdfs:label "blockchainStatus" ;
    rdfs:comment "Status of the trade on the blockchain" ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:blockchainTransactionId a rdf:Property ;
    rdfs:label "blockchainTransactionId" ;
    rdfs:comment "Transaction ID on the blockchain" ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:transactionTimeline a rdf:Property ;
    rdfs:label "transactionTimeline" ;
    rdfs:comment "Timeline information for the transaction" ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:referenceId a rdf:Property ;
    rdfs:label "referenceId" ;
    rdfs:comment "Reference to the public section URI" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:range xsd:anyURI ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:consignee a rdf:Property ;
    rdfs:label "consignee" ;
    rdfs:comment "Consignee information" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:notifyParty a rdf:Property ;
    rdfs:label "notifyParty" ;
    rdfs:comment "Party to be notified" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:payment a rdf:Property ;
    rdfs:label "payment" ;
    rdfs:comment "Payment and financing details" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:range skyocean:PaymentDetails ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:documents a rdf:Property ;
    rdfs:label "documents" ;
    rdfs:comment "Detailed document information" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:range skyocean:Document ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:accessPermissions a rdf:Property ;
    rdfs:label "accessPermissions" ;
    rdfs:comment "Access control permissions" ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:grade a rdf:Property ;
    rdfs:label "grade" ;
    rdfs:comment "Quality grade of the commodity" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:certifications a rdf:Property ;
    rdfs:label "certifications" ;
    rdfs:comment "List of certifications or standards the commodity meets" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:specifications a rdf:Property ;
    rdfs:label "specifications" ;
    rdfs:comment "Technical specifications of the commodity" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:packaging a rdf:Property ;
    rdfs:label "packaging" ;
    rdfs:comment "Description of how the commodity is packaged" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:detailedSpecifications a rdf:Property ;
    rdfs:label "detailedSpecifications" ;
    rdfs:comment "Detailed technical specifications with thresholds" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:productionDetails a rdf:Property ;
    rdfs:label "productionDetails" ;
    rdfs:comment "Production method, origin, and other sensitive details" ;
    rdfs:domain skyocean:Commodity ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:paymentMethod a rdf:Property ;
    rdfs:label "paymentMethod" ;
    rdfs:comment "Method of payment (e.g., 'CAD' for Cash Against Documents)" ;
    rdfs:domain skyocean:PaymentDetails ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:paymentTerms a rdf:Property ;
    rdfs:label "paymentTerms" ;
    rdfs:comment "Terms of payment" ;
    rdfs:domain skyocean:PaymentDetails ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:financingRequired a rdf:Property ;
    rdfs:label "financingRequired" ;
    rdfs:comment "Whether financing is required for the trade" ;
    rdfs:domain skyocean:PaymentDetails ;
    rdfs:range xsd:boolean ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

skyocean:financingAmount a rdf:Property ;
    rdfs:label "financingAmount" ;
    rdfs:comment "Amount of financing required" ;
    rdfs:domain skyocean:PaymentDetails ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "stable" .

# ============================================================
# Convergence & Institutional Attestation (added v2.1.0)
# ============================================================
# Rationale: the on-chain smart contract keeps a minimal PaymentMethod enum
# (CAD, LetterOfCredit, OnChainEscrow). The richer classification of where a
# payment signal came from, and the broader model of independent institutional
# attestations whose convergence establishes trade truth, lives here in the DKG
# rather than in the contract. This keeps the contract simple and lets the
# ontology evolve without contract migrations.

skyocean:InstitutionalAttestation a rdfs:Class ;
    rdfs:label "InstitutionalAttestation" ;
    rdfs:comment "An independent observation by an operational institution (port authority, customs authority, inspection agency, carrier, condition monitor, payment rail, financial institution, or human verifier) about a trade event. Each attestation is recorded as a Knowledge Asset and feeds the convergence record for its trade." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:PaymentSource a rdfs:Class ;
    rdfs:label "PaymentSource" ;
    rdfs:comment "A record of an external signal confirming that payment has occurred, decoupled from the underlying rail. The same class represents signals from mobile money, national payment switches, regional settlement systems, SWIFT, letters of credit, cash-against-documents arrangements, on-chain escrow, and human-attested confirmations. Subclass of InstitutionalAttestation when the source is an institution." ;
    rdfs:subClassOf skyocean:InstitutionalAttestation ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:ConvergenceRecord a rdfs:Class ;
    rdfs:label "ConvergenceRecord" ;
    rdfs:comment "The aggregate cross-validated state of a trade, constructed from the convergence of independent institutional attestations. Used to compute verification strength without a single central validator." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# Attestation properties

skyocean:attestorType a rdf:Property ;
    rdfs:label "attestorType" ;
    rdfs:comment "Category of institution making the attestation. Values: PortAuthority, CustomsAuthority, InspectionAgency, Carrier, ConditionMonitor, PaymentRail, FinancialInstitution, Human." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:attestorIdentity a rdf:Property ;
    rdfs:label "attestorIdentity" ;
    rdfs:comment "Name or identifier of the specific institution (e.g., 'Port of Tema', 'Ghana Revenue Authority', 'SGS', 'MTN MoMo')." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:attestationType a rdf:Property ;
    rdfs:label "attestationType" ;
    rdfs:comment "Nature of the observation. Values: VesselCall, CargoHandling, CustomsClearance, QualityInspection, ConditionReading, Departure, PaymentConfirmation, IncidentReport, ClaimDecision, ComplianceVerification." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:attestationTimestamp a rdf:Property ;
    rdfs:label "attestationTimestamp" ;
    rdfs:comment "Time at which the attesting institution recorded the event." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:dateTime ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:attestationSignature a rdf:Property ;
    rdfs:label "attestationSignature" ;
    rdfs:comment "Cryptographic signature or integrity hash of the attestation payload, used for audit and non-repudiation." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:tradeRef a rdf:Property ;
    rdfs:label "tradeRef" ;
    rdfs:comment "Reference to the Trade KA this attestation contributes to." ;
    rdfs:domain skyocean:InstitutionalAttestation ;
    rdfs:range xsd:anyURI ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# PaymentSource properties

skyocean:sourceType a rdf:Property ;
    rdfs:label "sourceType" ;
    rdfs:comment "Classification of the payment signal source. Values: MobileMoney, NationalSwitch, RegionalSettlement, SWIFT, LetterOfCredit, CashAgainstDocuments, OnChainEscrow, HumanAttested." ;
    rdfs:domain skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:sourceProvider a rdf:Property ;
    rdfs:label "sourceProvider" ;
    rdfs:comment "Specific provider or network that emitted the confirmation (e.g., 'MTN MoMo', 'GhIPSS', 'PAPSS', 'Deutsche Bank AG')." ;
    rdfs:domain skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:confirmationReference a rdf:Property ;
    rdfs:label "confirmationReference" ;
    rdfs:comment "External reference or transaction ID from the payment source (e.g., MoMo txn ID, SWIFT MT103 reference, LC number)." ;
    rdfs:domain skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:confirmedAmount a rdf:Property ;
    rdfs:label "confirmedAmount" ;
    rdfs:comment "Monetary amount the source confirms as settled." ;
    rdfs:domain skyocean:PaymentSource ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ConvergenceRecord properties

skyocean:attestationCount a rdf:Property ;
    rdfs:label "attestationCount" ;
    rdfs:comment "Total number of institutional attestations linked to the trade." ;
    rdfs:domain skyocean:ConvergenceRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:independentAttestorCount a rdf:Property ;
    rdfs:label "independentAttestorCount" ;
    rdfs:comment "Number of distinct attesting institutions, used as a proxy for independence of the convergence record." ;
    rdfs:domain skyocean:ConvergenceRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:verificationStrength a rdf:Property ;
    rdfs:label "verificationStrength" ;
    rdfs:comment "Computed score (0.0–1.0) summarising how strongly the trade is corroborated by independent institutional attestations." ;
    rdfs:domain skyocean:ConvergenceRecord ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:consensusStatus a rdf:Property ;
    rdfs:label "consensusStatus" ;
    rdfs:comment "Qualitative label derived from verificationStrength. Values: Insufficient, Partial, Strong, Full." ;
    rdfs:domain skyocean:ConvergenceRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Insurance & Cargo Incident (added v2.2.0 candidate)
# ============================================================
# Rationale: cargo insurance is a first-class element of every commodity trade.
# Rather than treating insurance certificates as generic Documents, this
# section adds dedicated classes for the insurance policy, the cargo incident
# that may trigger a claim, and the claim itself. This enables the audit trail
# to follow a damaged-cargo scenario from incident → surveyor attestation →
# claim filing → claim approval → payout, and to redeploy payout funds back
# into trade capacity with full transparency.

skyocean:InsurancePolicy a rdfs:Class ;
    rdfs:label "InsurancePolicy" ;
    rdfs:comment "A cargo or marine insurance policy bound to one or more trades. Subclass of Document — the policy is itself a tradeable instrument with status, parties, and references — but carries dedicated insurance-specific properties." ;
    rdfs:subClassOf skyocean:Document ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:CargoIncident a rdfs:Class ;
    rdfs:label "CargoIncident" ;
    rdfs:comment "An event affecting cargo that may trigger an insurance claim — damage, loss, theft, contamination, delay, casualty. The CargoIncident KA captures what happened, where, when, and to what extent, attested by an independent surveyor and/or the responsible custodian (port, carrier)." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:InsuranceClaim a rdfs:Class ;
    rdfs:label "InsuranceClaim" ;
    rdfs:comment "A formal claim filed against an InsurancePolicy in respect of a CargoIncident. Carries claim status, claimed amount, surveyor's loss assessment, insurer's decision, and payout details." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# InsurancePolicy properties

skyocean:policyNumber a rdf:Property ;
    rdfs:label "policyNumber" ;
    rdfs:comment "Insurer-issued policy reference (private layer — typically PII-adjacent)." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:insurer a rdf:Property ;
    rdfs:label "insurer" ;
    rdfs:comment "Insurer or syndicate underwriting the policy (e.g., 'Lloyd's of London correspondent', 'Munich Re')." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:coverageType a rdf:Property ;
    rdfs:label "coverageType" ;
    rdfs:comment "Type of insurance coverage. Values: Cargo, WarRisk, AllRisk, NamedPerils, Strike, ContingencyAndDelay." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:sumInsured a rdf:Property ;
    rdfs:label "sumInsured" ;
    rdfs:comment "Maximum insured value under the policy." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:deductible a rdf:Property ;
    rdfs:label "deductible" ;
    rdfs:comment "Self-insured retention before the policy responds." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:effectiveDate a rdf:Property ;
    rdfs:label "effectiveDate" ;
    rdfs:comment "Policy inception date." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:expiryDate a rdf:Property ;
    rdfs:label "expiryDate" ;
    rdfs:comment "Policy expiry date." ;
    rdfs:domain skyocean:InsurancePolicy ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# CargoIncident properties

skyocean:incidentType a rdf:Property ;
    rdfs:label "incidentType" ;
    rdfs:comment "Nature of the incident. Values: Damage, Loss, Theft, Contamination, Delay, Casualty, GeneralAverage, Quarantine." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:incidentLocation a rdf:Property ;
    rdfs:label "incidentLocation" ;
    rdfs:comment "Where the incident occurred (UN/LOCODE port code, lat/long for in-transit, or place name)." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:incidentDate a rdf:Property ;
    rdfs:label "incidentDate" ;
    rdfs:comment "Date and time the incident was reported or discovered." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range xsd:dateTime ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:incidentDescription a rdf:Property ;
    rdfs:label "incidentDescription" ;
    rdfs:comment "Short descriptor of what happened (the private layer carries the full surveyor report text)." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:affectedQuantity a rdf:Property ;
    rdfs:label "affectedQuantity" ;
    rdfs:comment "Quantity of cargo affected (with unit code)." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range schema:QuantitativeValue ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:lossExtent a rdf:Property ;
    rdfs:label "lossExtent" ;
    rdfs:comment "Severity of loss. Values: Total, Partial, Constructive, Salvage, Marginal." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:surveyorRef a rdf:Property ;
    rdfs:label "surveyorRef" ;
    rdfs:comment "Reference to the InstitutionalAttestation issued by the independent loss adjuster / surveyor (attestorType: InspectionAgency, attestationType: IncidentReport)." ;
    rdfs:domain skyocean:CargoIncident ;
    rdfs:range skyocean:InstitutionalAttestation ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# InsuranceClaim properties

skyocean:claimNumber a rdf:Property ;
    rdfs:label "claimNumber" ;
    rdfs:comment "Insurer-issued claim reference (private layer)." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:policyRef a rdf:Property ;
    rdfs:label "policyRef" ;
    rdfs:comment "Reference to the InsurancePolicy under which this claim is filed." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range skyocean:InsurancePolicy ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:incidentRef a rdf:Property ;
    rdfs:label "incidentRef" ;
    rdfs:comment "Reference to the CargoIncident triggering the claim." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range skyocean:CargoIncident ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:claimStatus a rdf:Property ;
    rdfs:label "claimStatus" ;
    rdfs:comment "Status of the claim. Values: Filed, Acknowledged, UnderInvestigation, Approved, PartiallyApproved, Denied, Settled, Withdrawn." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:claimAmount a rdf:Property ;
    rdfs:label "claimAmount" ;
    rdfs:comment "Amount claimed by the policyholder." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:payoutAmount a rdf:Property ;
    rdfs:label "payoutAmount" ;
    rdfs:comment "Amount paid by the insurer (may differ from claim amount after surveyor adjustment and deductible)." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:payoutDate a rdf:Property ;
    rdfs:label "payoutDate" ;
    rdfs:comment "Date funds were credited to the policyholder." ;
    rdfs:domain skyocean:InsuranceClaim ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Logistics Module (added v2.1.2 candidate)
# ============================================================
# Rationale: a commodity trade is incomplete without its logistics record.
# The properties below capture the vessel, voyage, carrier, ports, BL number,
# and container count/type that every shipping leg carries. Semantics align
# with GS1 EPCIS and DCSA shipping vocabularies; the canonical mapping to
# those external IRIs is reserved for a future major version. Until then,
# Skyocean publishes these as its own terms.

skyocean:LogisticsRecord a rdfs:Class ;
    rdfs:label "LogisticsRecord" ;
    rdfs:comment "A summary of the logistics for a shipping leg of a trade — vessel, voyage, carrier, loading and discharge ports, BL reference, and container details. Attaches to a Trade via skyocean:logistics." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:logistics a rdf:Property ;
    rdfs:label "logistics" ;
    rdfs:comment "Reference from a Trade to its LogisticsRecord." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:LogisticsRecord ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:vessel a rdf:Property ;
    rdfs:label "vessel" ;
    rdfs:comment "Vessel name (semantics align with GS1/DCSA vessel reference)." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:vesselIMO a rdf:Property ;
    rdfs:label "vesselIMO" ;
    rdfs:comment "IMO ship identification number (7 digits) under the IMO ship-identification scheme." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:voyage a rdf:Property ;
    rdfs:label "voyage" ;
    rdfs:comment "Voyage reference issued by the carrier." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:carrier a rdf:Property ;
    rdfs:label "carrier" ;
    rdfs:comment "Carrier (shipping line) legal name." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:loadingPort a rdf:Property ;
    rdfs:label "loadingPort" ;
    rdfs:comment "Port of loading (UN/LOCODE plus place name)." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:dischargePort a rdf:Property ;
    rdfs:label "dischargePort" ;
    rdfs:comment "Port of discharge (UN/LOCODE plus place name)." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:billOfLading a rdf:Property ;
    rdfs:label "billOfLading" ;
    rdfs:comment "Bill of Lading reference number issued by the carrier." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:containerCount a rdf:Property ;
    rdfs:label "containerCount" ;
    rdfs:comment "Total container count for the shipping leg." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:containerType a rdf:Property ;
    rdfs:label "containerType" ;
    rdfs:comment "Container type description (e.g., '40-ft HC', 'flexitank-equipped 20-ft')." ;
    rdfs:domain skyocean:LogisticsRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Trade-level Extensions (added v2.1.2 candidate)
# ============================================================
# Self-consignment, corridor, cycle, funding-branch, payment-trigger, and
# inter-KA reference properties that every Skyocean trade carries. These
# are Skyocean-specific platform concepts (no schema.org equivalent).

skyocean:PublicTradeOverview a rdfs:Class ;
    rdfs:label "PublicTradeOverview" ;
    rdfs:comment "A typeable marker class indicating that a Trade KA is intended as a public-overview assertion (paired with a private TradePrivateData KA). Used as a secondary @type alongside skyocean:CommodityTrade." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:shipper a rdf:Property ;
    rdfs:label "shipper" ;
    rdfs:comment "Skyocean operating entity in the country of origin (Bill of Lading 'From'). Distinct from the legal Seller and from the fund-receiving entity." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:fundReceivingEntity a rdf:Property ;
    rdfs:label "fundReceivingEntity" ;
    rdfs:comment "Skyocean operating entity that receives institutional capital under the trade-finance facility (e.g., Skyocean DOOEL, Skyocean Lithuania UAB)." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:corridor a rdf:Property ;
    rdfs:label "corridor" ;
    rdfs:comment "Trade corridor classification (e.g., 'Sudan', 'Ghana', 'EU')." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:tradeType a rdf:Property ;
    rdfs:label "tradeType" ;
    rdfs:comment "Trade-structure classification (e.g., 'self-consignment-CAD', 'EXW-then-CFR-twoLeg')." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:cycleDays a rdf:Property ;
    rdfs:label "cycleDays" ;
    rdfs:comment "Total cycle length in days (origination to settlement)." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:tradeLegs a rdf:Property ;
    rdfs:label "tradeLegs" ;
    rdfs:comment "Ordered list of leg identifiers for a multi-leg trade (e.g., ['origin', 'export'] for an EXW-then-CFR cocoa-style structure). Single-leg trades typically omit this property." ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:timeline a rdf:Property ;
    rdfs:label "timeline" ;
    rdfs:comment "Trade-level timeline block carrying expected dates (origination, shipment, arrival, settlement). Properties are typically drawn from the trade: sub-namespace." ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:fundingBranch a rdf:Property ;
    rdfs:label "fundingBranch" ;
    rdfs:comment "Funding-branch classification per full-trade-flow.md. Values: 'A' (retail-only on-chain), 'B' (mixed institutional + retail on-chain), 'C' (institutional-only off-chain, no smart contract)." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:paymentTrigger a rdf:Property ;
    rdfs:label "paymentTrigger" ;
    rdfs:comment "Payment-trigger classification used by the smart contract's _checkPaymentConditions evaluator. Values: 'OnDocumentsVerified', 'OnArrival', 'OnLoading', 'Manual'." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:relatedTrade a rdf:Property ;
    rdfs:label "relatedTrade" ;
    rdfs:comment "Reference from a child KA (FinancingRecord, Document, etc.) back to its parent Trade KA." ;
    rdfs:range skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:financingRecords a rdf:Property ;
    rdfs:label "financingRecords" ;
    rdfs:comment "Reference from a Trade to one or more FinancingRecord KAs (institutional + retail per-holder)." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:FinancingRecord ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:paymentSource a rdf:Property ;
    rdfs:label "paymentSource" ;
    rdfs:comment "Reference from a Trade to one or more PaymentSource KAs that confirm settlement on this trade." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:PaymentSource ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:convergenceRecord a rdf:Property ;
    rdfs:label "convergenceRecord" ;
    rdfs:comment "Reference from a Trade to its ConvergenceRecord (or records, when multiple convergence events occur in a trade's lifecycle)." ;
    rdfs:domain skyocean:Trade ;
    rdfs:range skyocean:ConvergenceRecord ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# On-chain anchoring properties (used in samples to optionally embed a richer
# anchor block; complements skyocean:blockchainTransactionId which carries the
# bytes32 tradeId on its own.)

skyocean:onChainAnchor a rdf:Property ;
    rdfs:label "onChainAnchor" ;
    rdfs:comment "Composite block on a Trade describing its on-chain anchor — network, contract address, transaction hash. Optional and additive to skyocean:blockchainTransactionId." ;
    rdfs:domain skyocean:Trade ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:network a rdf:Property ;
    rdfs:label "network" ;
    rdfs:comment "Blockchain network identifier (e.g., 'polygon', 'polygon-mumbai')." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:contract a rdf:Property ;
    rdfs:label "contract" ;
    rdfs:comment "Smart-contract address that issued the on-chain anchor (e.g., the SkyoceanTradeCore deployment)." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:txHash a rdf:Property ;
    rdfs:label "txHash" ;
    rdfs:comment "Transaction hash of the createTrade call that issued the bytes32 tradeId. Distinct from skyocean:blockchainTransactionId, which is the tradeId itself." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Financing Extensions (added v2.1.2 candidate)
# ============================================================
# Detail properties on FinancingRecord — source descriptor, participant
# identity, capital amount, share, locked-token detail for retail.

skyocean:source a rdf:Property ;
    rdfs:label "source" ;
    rdfs:comment "Financing-source descriptor on a FinancingRecord. Values: 'institutional-trade-finance-facility', 'retail-skyt-capacity-activation', 'mixed-pool', 'institutional-tfa' (Branch C)." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:participant a rdf:Property ;
    rdfs:label "participant" ;
    rdfs:comment "DID of the participant in this FinancingRecord — institutional facility DID or retail-holder DID." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:anyURI ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:participantLEI a rdf:Property ;
    rdfs:label "participantLEI" ;
    rdfs:comment "ISO 17442 Legal Entity Identifier for an institutional participant (where applicable)." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:participantCount a rdf:Property ;
    rdfs:label "participantCount" ;
    rdfs:comment "Number of distinct participants (used on retail-pool FinancingRecord roll-ups)." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:capitalProvided a rdf:Property ;
    rdfs:label "capitalProvided" ;
    rdfs:comment "Capital amount provided by this participant (or retail-pool aggregate)." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:percentageOfTotal a rdf:Property ;
    rdfs:label "percentageOfTotal" ;
    rdfs:comment "Share of total trade financing as a decimal (0.0–1.0)." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:totalSKYTLocked a rdf:Property ;
    rdfs:label "totalSKYTLocked" ;
    rdfs:comment "Aggregate SKYT amount locked in a retail-pool FinancingRecord." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:indicativeCycleMargin a rdf:Property ;
    rdfs:label "indicativeCycleMargin" ;
    rdfs:comment "Indicative trade-cycle margin descriptor (string with explicit not-guaranteed framing) — e.g., '~3.8% per ~55-day cycle (Sudan corridor; not guaranteed)'." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:lockedSKYT a rdf:Property ;
    rdfs:label "lockedSKYT" ;
    rdfs:comment "SKYT amount locked by an individual retail holder for this trade." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:lockedValue a rdf:Property ;
    rdfs:label "lockedValue" ;
    rdfs:comment "USD-equivalent value of the SKYT locked by an individual retail holder." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:tier a rdf:Property ;
    rdfs:label "tier" ;
    rdfs:comment "Retail holder tier classification per Skyocean's tier model." ;
    rdfs:domain skyocean:FinancingRecord ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Private-layer wrappers and KYC references (added v2.1.2 candidate)
# ============================================================
# Wrapper objects and identifier-reference properties used inside
# skyocean:TradePrivateData and the paired private FinancingRecord KAs.
# Their content is typically drawn from schema.org (legalName, address,
# taxID, etc.); the wrappers themselves are Skyocean-specific groupings.

skyocean:supplierDetails a rdf:Property ;
    rdfs:label "supplierDetails" ;
    rdfs:comment "Wrapper carrying full supplier identification (schema:legalName, schema:address, schema:taxID, contact)." ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:buyerDetails a rdf:Property ;
    rdfs:label "buyerDetails" ;
    rdfs:comment "Wrapper carrying full buyer identification." ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:participantDetails a rdf:Property ;
    rdfs:label "participantDetails" ;
    rdfs:comment "Wrapper carrying full participant identification on a private FinancingRecord (institutional or retail)." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:bankingDetails a rdf:Property ;
    rdfs:label "bankingDetails" ;
    rdfs:comment "Wrapper carrying banking detail (schema:bankName, BIC/SWIFT identifier, schema:accountId)." ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:settlementAccount a rdf:Property ;
    rdfs:label "settlementAccount" ;
    rdfs:comment "Wrapper carrying the institutional financier's settlement account detail on the private FinancingRecord." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:exactPricing a rdf:Property ;
    rdfs:label "exactPricing" ;
    rdfs:comment "Wrapper carrying exact contract pricing (unit price + total contract value) on the private trade KA." ;
    rdfs:domain skyocean:TradePrivateData ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:totalContractValue a rdf:Property ;
    rdfs:label "totalContractValue" ;
    rdfs:comment "Total contract value (private layer)." ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:facilityTermsRef a rdf:Property ;
    rdfs:label "facilityTermsRef" ;
    rdfs:comment "Reference to the executed Trade Finance Agreement governing an institutional FinancingRecord." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:beneficialOwnershipKYCRef a rdf:Property ;
    rdfs:label "beneficialOwnershipKYCRef" ;
    rdfs:comment "Internal Skyocean reference to the beneficial-ownership KYC dossier for an institutional financier." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:signingOfficer a rdf:Property ;
    rdfs:label "signingOfficer" ;
    rdfs:comment "Authorized signing officer for an institutional counterparty (name + role + DID)." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:walletProvenance a rdf:Property ;
    rdfs:label "walletProvenance" ;
    rdfs:comment "Internal reference to a verified-wallet KYC linkage record for a retail holder." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:amlCheckRef a rdf:Property ;
    rdfs:label "amlCheckRef" ;
    rdfs:comment "Internal reference to the AML clearance record for a retail or institutional financier." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:sanctionsCheckRef a rdf:Property ;
    rdfs:label "sanctionsCheckRef" ;
    rdfs:comment "Internal reference to the sanctions screening record for a retail or institutional financier." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:governmentIdType a rdf:Property ;
    rdfs:label "governmentIdType" ;
    rdfs:comment "Type of government ID document on file for a retail holder. Values: 'passport', 'national-id', 'driver-licence'." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:governmentIdRef a rdf:Property ;
    rdfs:label "governmentIdRef" ;
    rdfs:comment "Internal Skyocean reference to the government-ID document record on file (the ID number itself is not stored as a literal)." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:jurisdictionOfResidence a rdf:Property ;
    rdfs:label "jurisdictionOfResidence" ;
    rdfs:comment "ISO 3166 country code of a retail holder's jurisdiction of residence." ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# trade: sub-namespace (added v2.1.2 candidate)
# ============================================================
# Trade-domain properties under the trade: sub-namespace
# (https://skyocean.io/ontology/trade/), used for high-level commodity
# attributes and timeline dates that don't have a clean schema.org or
# external equivalent.

trade:quantity a rdf:Property ;
    rdfs:label "quantity" ;
    rdfs:comment "Quantity of the commodity (with schema:unitCode)." ;
    rdfs:domain skyocean:Commodity ;
    rdfs:range schema:QuantitativeValue ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:origin a rdf:Property ;
    rdfs:label "origin" ;
    rdfs:comment "Country of origin of the commodity (ISO 3166 country name or code)." ;
    rdfs:domain skyocean:Commodity ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:destination a rdf:Property ;
    rdfs:label "destination" ;
    rdfs:comment "Country of destination of the commodity." ;
    rdfs:domain skyocean:Commodity ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:originatedAt a rdf:Property ;
    rdfs:label "originatedAt" ;
    rdfs:comment "Date the trade was originated in the Skyocean platform." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:expectedShipmentDate a rdf:Property ;
    rdfs:label "expectedShipmentDate" ;
    rdfs:comment "Expected shipment date." ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:expectedArrivalDate a rdf:Property ;
    rdfs:label "expectedArrivalDate" ;
    rdfs:comment "Expected arrival date at discharge port." ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

trade:expectedSettlementDate a rdf:Property ;
    rdfs:label "expectedSettlementDate" ;
    rdfs:comment "Expected settlement (trade-completion) date." ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# Donation Extension (donation: namespace)
# ============================================================

# Classes

donation:DonationCampaign a rdfs:Class ;
    rdfs:label "DonationCampaign" ;
    rdfs:comment "A bounded humanitarian-aid campaign with a packing list, target amount, and delivery timeline. Identified by a backend-issued donation:campaignId (e.g. CMP-2026-SUD-001). Funding sources (wallets and/or bank accounts) are attached to the campaign and do not serve as its anchor." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:DonationContribution a rdfs:Class ;
    rdfs:label "DonationContribution" ;
    rdfs:comment "A single donor contribution to a campaign, via stablecoin or bank transfer" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:DonationDistribution a rdfs:Class ;
    rdfs:label "DonationDistribution" ;
    rdfs:comment "A delivery event recording kits distributed to beneficiaries, verified by state officials" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:DonationCampaignPrivate a rdfs:Class ;
    rdfs:label "DonationCampaignPrivate" ;
    rdfs:comment "Private assertion data for a campaign: supplier details, distribution plan, bank account, and access permissions" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:SupplyChainSignal a rdfs:Class ;
    rdfs:label "SupplyChainSignal" ;
    rdfs:comment "Real-time signals from IoT sensors, partner confirmations, or field reports linked to a campaign" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:DonationKit a rdfs:Class ;
    rdfs:label "DonationKit" ;
    rdfs:comment "Specification of a kit's contents — food, medicine, prevention items — with quantities and sourcing details" ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# Properties

donation:status a rdf:Property ;
    rdfs:label "status" ;
    rdfs:comment "Campaign status (Active, Funded, Procuring, Shipping, Delivered, Cancelled)" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:targetAmount a rdf:Property ;
    rdfs:label "targetAmount" ;
    rdfs:comment "Funding goal for the campaign" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:currentAmount a rdf:Property ;
    rdfs:label "currentAmount" ;
    rdfs:comment "Current funds received" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:campaignId a rdf:Property ;
    rdfs:label "campaignId" ;
    rdfs:comment "Canonical anchor identifier for the campaign, issued by the Skyocean backend (e.g. CMP-2026-SUD-001). Stable across on-chain and off-chain campaigns." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:fundingSource a rdf:Property ;
    rdfs:label "fundingSource" ;
    rdfs:comment "One or more funding sources attached to the campaign — a wallet, bank account, or rail (Revolut, SEPA, SWIFT, stablecoin). Reuses skyocean:PaymentSource." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range skyocean:PaymentSource ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:campaignWallet a rdf:Property ;
    rdfs:label "campaignWallet" ;
    rdfs:comment "Optional EVM wallet address (e.g. Polygon) when the campaign has an on-chain funding source. Not the anchor identifier — some campaigns are fully off-chain." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:consignedTo a rdf:Property ;
    rdfs:label "consignedTo" ;
    rdfs:comment "Skyocean in-region entity that receives the goods on consignment (e.g. Skyocean Sudan for the Sudan pilot)" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range skyocean:Party ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:packingList a rdf:Property ;
    rdfs:label "packingList" ;
    rdfs:comment "Campaign packing list (kits, quantities, specifications). Functional analog of a trade agreement in the core trading flow." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range donation:DonationKit ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:costSummary a rdf:Property ;
    rdfs:label "costSummary" ;
    rdfs:comment "Public top-level cost summary surfaced to donors (e.g. kits vs operations)" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:operationalCostBreakdown a rdf:Property ;
    rdfs:label "operationalCostBreakdown" ;
    rdfs:comment "Private detailed operational cost breakdown (freight, customs, insurance, last-mile logistics, platform & ops)" ;
    rdfs:domain donation:DonationCampaignPrivate ;
    rdfs:range schema:MonetaryAmount ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:contributorCount a rdf:Property ;
    rdfs:label "contributorCount" ;
    rdfs:comment "Number of contributors to the campaign" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:targetBeneficiaries a rdf:Property ;
    rdfs:label "targetBeneficiaries" ;
    rdfs:comment "Target number of families to be served" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:region a rdf:Property ;
    rdfs:label "region" ;
    rdfs:comment "Target distribution region" ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:campaignRef a rdf:Property ;
    rdfs:label "campaignRef" ;
    rdfs:comment "Reference to the parent campaign by donation:campaignId (and optionally KA UAL). Applies to contributions, distributions and supply-chain signals." ;
    rdfs:domain donation:DonationContribution, donation:DonationDistribution, donation:SupplyChainSignal ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:method a rdf:Property ;
    rdfs:label "method" ;
    rdfs:comment "Payment rail: stablecoin, revolut, sepa, swift, other" ;
    rdfs:domain donation:DonationContribution ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:paymentSource a rdf:Property ;
    rdfs:label "paymentSource" ;
    rdfs:comment "Rail-specific payment record (provider, reference, institutional flag) reused from the core Skyocean payments module" ;
    rdfs:domain donation:DonationContribution ;
    rdfs:range skyocean:PaymentSource ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:onChainTxHash a rdf:Property ;
    rdfs:label "onChainTxHash" ;
    rdfs:comment "On-chain transaction hash for stablecoin contributions" ;
    rdfs:domain donation:DonationContribution ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:kycRef a rdf:Property ;
    rdfs:label "kycRef" ;
    rdfs:comment "KYC attestation reference for the donor. Required for every contribution — no anonymous donations." ;
    rdfs:domain donation:DonationContribution ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:deliveryStatus a rdf:Property ;
    rdfs:label "deliveryStatus" ;
    rdfs:comment "Public delivery outcome: delivered, partially-delivered, not-delivered, plus recipient category" ;
    rdfs:domain donation:DonationDistribution ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:familiesServed a rdf:Property ;
    rdfs:label "familiesServed" ;
    rdfs:comment "Private. Number of families who received kits in a distribution event" ;
    rdfs:domain donation:DonationDistribution ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:kitsDistributed a rdf:Property ;
    rdfs:label "kitsDistributed" ;
    rdfs:comment "Private. Number of kits delivered in a distribution event" ;
    rdfs:domain donation:DonationDistribution ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:verifiedBy a rdf:Property ;
    rdfs:label "verifiedBy" ;
    rdfs:comment "State official, NGO or partner witness who confirmed distribution" ;
    rdfs:domain donation:DonationDistribution ;
    rdfs:range skyocean:Party ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:attestationRef a rdf:Property ;
    rdfs:label "attestationRef" ;
    rdfs:comment "Reference to an independent institutional attestation (customs, inspection, partner NGO) that feeds the convergence evaluator" ;
    rdfs:domain donation:DonationDistribution ;
    rdfs:range skyocean:InstitutionalAttestation ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:signalType a rdf:Property ;
    rdfs:label "signalType" ;
    rdfs:comment "Type of supply chain signal (IoT-Temperature, IoT-GPS, PartnerConfirmation, FieldReport, Verification)" ;
    rdfs:domain donation:SupplyChainSignal ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# ============================================================
# v2.1.3 — Document-level enrichment (added 2026-05-04)
# ============================================================
# Properties needed to express the rich private-tier data on Document KAs:
# container/seal/lot/vessel cross-document identifiers, EDIFACT trail, SWIFT
# detail, EUDR DDS, cold-chain telemetry, AIS positions, document URLs, and
# donation-specific aggregate receipts/distribution observations.
#
# Where schema.org or GS1 already covers a concept, prefer those — these
# Skyocean terms are added only where no standard fits or where Skyocean
# semantics extend the standard meaningfully.

# --- Cross-document logistics identifiers ---

skyocean:containerNumber a rdf:Property ;
    rdfs:label "containerNumber" ;
    rdfs:comment "ISO 6346 container identifier (e.g., 'MEDU 4471001'). Per-container — distinct from skyocean:containerCount which counts the set. Cross-document join key for graph linkage between BL, Packing List, Phyto, SGS, Customs etc." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:sealNumber a rdf:Property ;
    rdfs:label "sealNumber" ;
    rdfs:comment "Tamper-evident seal number affixed to a container at loading. One per container. Cross-document join key." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:lotReference a rdf:Property ;
    rdfs:label "lotReference" ;
    rdfs:comment "Production lot reference (e.g., 'AR-LOT-2026-00471'). Cross-document join key linking supplier invoice, packing list, phytosanitary, and quality cert." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:imoNumber a rdf:Property ;
    rdfs:label "imoNumber" ;
    rdfs:comment "IMO (International Maritime Organization) number — globally-unique 7-digit vessel identifier." ;
    rdfs:domain skyocean:LogisticsRecord, skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:mmsiNumber a rdf:Property ;
    rdfs:label "mmsiNumber" ;
    rdfs:comment "MMSI (Maritime Mobile Service Identity) — 9-digit vessel radio identifier used by AIS feeds." ;
    rdfs:domain skyocean:LogisticsRecord, skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:vesselName a rdf:Property ;
    rdfs:label "vesselName" ;
    rdfs:comment "Vessel name (e.g., 'MV BALTIC TRADER'). Use schema:name on a schema:Vehicle subclass when expressing in JSON-LD with schema.org context." ;
    rdfs:domain skyocean:LogisticsRecord, skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:bookingReference a rdf:Property ;
    rdfs:label "bookingReference" ;
    rdfs:comment "Carrier booking reference (e.g., 'MSCU-BK-2026-00471'). Cross-document join key linking BL to PO and IOM consolidation manifest." ;
    rdfs:domain skyocean:LogisticsRecord, skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Cargo physical attributes ---

skyocean:grossWeight a rdf:Property ;
    rdfs:label "grossWeight" ;
    rdfs:comment "Gross weight including packaging and pallets/dunnage, in kilograms. For cargo measurement; for full quantity context use schema:weight with QuantitativeValue." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:netWeight a rdf:Property ;
    rdfs:label "netWeight" ;
    rdfs:comment "Net weight of the cargo itself, excluding packaging, in kilograms." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:hsCode a rdf:Property ;
    rdfs:label "hsCode" ;
    rdfs:comment "Harmonized System (HS) commodity classification code, used in customs declarations. Format like '0713.40.00'." ;
    rdfs:domain skyocean:Document, skyocean:Commodity ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Treatment / inspection methodology ---

skyocean:treatmentMethod a rdf:Property ;
    rdfs:label "treatmentMethod" ;
    rdfs:comment "Phytosanitary / disinfestation treatment method applied to the cargo (e.g., 'Methyl bromide fumigation, 48 mg/L for 24 h at 21°C')." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:treatmentDate a rdf:Property ;
    rdfs:label "treatmentDate" ;
    rdfs:comment "Date the phytosanitary / disinfestation treatment was applied." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:date ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:samplingMethod a rdf:Property ;
    rdfs:label "samplingMethod" ;
    rdfs:comment "Sampling method used by the inspection agency (e.g., 'ISO 24333:2009, composite sample of 30 incremental samples per container')." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:qualityParameters a rdf:Property ;
    rdfs:label "qualityParameters" ;
    rdfs:comment "Composite quality test results (parameter, measured value, spec, pass/fail). Free-form string in v2.1.3; future versions may model as a structured assertion." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- EDIFACT customs trail ---

skyocean:edifactMessageType a rdf:Property ;
    rdfs:label "edifactMessageType" ;
    rdfs:comment "EDIFACT message type used in the customs filing (e.g., 'CUSDEC', 'CUSRES', 'CUSCAR', 'IFTSTA', 'COARRI', 'COPRAR', 'CODECO')." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:edifactStatus a rdf:Property ;
    rdfs:label "edifactStatus" ;
    rdfs:comment "Outcome reference of the EDIFACT exchange (e.g., the response message ID or 'CUSRES accepted')." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- SWIFT MT103 inbound payment fields ---

skyocean:swiftUETR a rdf:Property ;
    rdfs:label "swiftUETR" ;
    rdfs:comment "Unique End-to-end Transaction Reference (UETR) from a SWIFT MT103 message — UUID format. Cross-document join key linking inbound payment confirmation to invoice and PO." ;
    rdfs:domain skyocean:Document, skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:senderReference a rdf:Property ;
    rdfs:label "senderReference" ;
    rdfs:comment "SWIFT MT103 Field 20 — sender's transaction reference. Often carries the buyer's PO number." ;
    rdfs:domain skyocean:Document, skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:beneficiaryReference a rdf:Property ;
    rdfs:label "beneficiaryReference" ;
    rdfs:comment "SWIFT MT103 Field 70 — reference for the beneficiary. Typically carries the trade ID + invoice reference." ;
    rdfs:domain skyocean:Document, skyocean:PaymentSource ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Insurance fields (deductible already exists; adding the rest) ---

skyocean:insuredValue a rdf:Property ;
    rdfs:label "insuredValue" ;
    rdfs:comment "Insured value declared on the marine cargo / war-risk policy, typically 110% of CIF/CFR per ICC(A) standard. Use schema:price with currency for the JSON-LD value object." ;
    rdfs:domain skyocean:InsurancePolicy, skyocean:Document ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:premiumAmount a rdf:Property ;
    rdfs:label "premiumAmount" ;
    rdfs:comment "Premium paid to bind the policy. Use schema:price with currency for the JSON-LD value object." ;
    rdfs:domain skyocean:InsurancePolicy, skyocean:Document ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- AIS vessel position (composite) ---

skyocean:VesselPosition a rdfs:Class ;
    rdfs:label "VesselPosition" ;
    rdfs:comment "A single AIS position report from a vessel during a tracked voyage. A continuous AIS feed comprises many VesselPosition assertions." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:positionLat a rdf:Property ;
    rdfs:label "positionLat" ;
    rdfs:comment "Latitude in decimal degrees, WGS84." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:positionLon a rdf:Property ;
    rdfs:label "positionLon" ;
    rdfs:comment "Longitude in decimal degrees, WGS84." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:positionTimestamp a rdf:Property ;
    rdfs:label "positionTimestamp" ;
    rdfs:comment "Timestamp of the AIS position report (ISO 8601 UTC)." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:dateTime ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:speedOverGround a rdf:Property ;
    rdfs:label "speedOverGround" ;
    rdfs:comment "Speed over ground in knots (SOG)." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:courseOverGround a rdf:Property ;
    rdfs:label "courseOverGround" ;
    rdfs:comment "Course over ground in degrees (COG, 0–359°)." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:navStatus a rdf:Property ;
    rdfs:label "navStatus" ;
    rdfs:comment "AIS navigational status (e.g., 'Underway using engine', 'At anchor', 'Moored')." ;
    rdfs:domain skyocean:VesselPosition ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:positionPingCount a rdf:Property ;
    rdfs:label "positionPingCount" ;
    rdfs:comment "Total number of AIS position pings captured for a tracked voyage. Used in the AIS feed Document KA to summarize feed density." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- EUDR (EU Deforestation Regulation) ---

skyocean:eudrOperator a rdf:Property ;
    rdfs:label "eudrOperator" ;
    rdfs:comment "Legal entity acting as the EUDR Operator that places the relevant commodity on the EU market and submits the Due Diligence Statement under Regulation (EU) 2023/1115." ;
    rdfs:domain skyocean:Document ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:eudrDDSReference a rdf:Property ;
    rdfs:label "eudrDDSReference" ;
    rdfs:comment "EU Information System reference number for the submitted EUDR Due Diligence Statement." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:ProductionPlot a rdfs:Class ;
    rdfs:label "ProductionPlot" ;
    rdfs:comment "A geolocated plot of land where a regulated commodity (e.g., cocoa, coffee, palm oil, soy) was produced. Required under EUDR for parcel-level traceability. Geometry expressed via GeoJSON polygon and centroid." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:plotGeometry a rdf:Property ;
    rdfs:label "plotGeometry" ;
    rdfs:comment "GeoJSON polygon or multipolygon describing the plot boundary." ;
    rdfs:domain skyocean:ProductionPlot ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:plotCentroid a rdf:Property ;
    rdfs:label "plotCentroid" ;
    rdfs:comment "Centroid latitude/longitude of the plot, WGS84 — convenience field for indexing." ;
    rdfs:domain skyocean:ProductionPlot ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:cutoffCompliance a rdf:Property ;
    rdfs:label "cutoffCompliance" ;
    rdfs:comment "Verification that a production plot was deforestation-free as of the EUDR cut-off date (31 December 2020) per remote-sensing analysis. Values: 'Verified', 'NotVerified', 'AtRisk'." ;
    rdfs:domain skyocean:ProductionPlot ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Cold-chain telemetry ---

skyocean:ColdChainLog a rdfs:Class ;
    rdfs:label "ColdChainLog" ;
    rdfs:comment "Container-level temperature + humidity telemetry log captured by an in-container data logger across a voyage." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:loggerSerial a rdf:Property ;
    rdfs:label "loggerSerial" ;
    rdfs:comment "Serial number of the temperature/humidity logger device (e.g., 'STM-44511-A')." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:loggerModel a rdf:Property ;
    rdfs:label "loggerModel" ;
    rdfs:comment "Model designation of the data logger device (e.g., 'Sensitech TempTale GEO 4')." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:readingInterval a rdf:Property ;
    rdfs:label "readingInterval" ;
    rdfs:comment "Logger sampling interval as ISO 8601 duration (e.g., 'PT15M' = 15 minutes)." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:duration ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:temperatureRange a rdf:Property ;
    rdfs:label "temperatureRange" ;
    rdfs:comment "Min–max temperature range observed across the voyage, in degrees Celsius." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:humidityRange a rdf:Property ;
    rdfs:label "humidityRange" ;
    rdfs:comment "Min–max relative humidity range observed across the voyage (% RH)." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

skyocean:temperatureExcursion a rdf:Property ;
    rdfs:label "temperatureExcursion" ;
    rdfs:comment "Number of temperature excursion events outside spec tolerance during the voyage. 0 = within tolerance." ;
    rdfs:domain skyocean:ColdChainLog ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Document URL (private) ---

skyocean:documentURL a rdf:Property ;
    rdfs:label "documentURL" ;
    rdfs:comment "Pointer to the original document file in private storage (e.g., S3 signed URL). Always private-tier — never appears in a Document KA's public assertion. Equivalent to schema:url qualified with skyocean:visibility 'private'." ;
    rdfs:domain skyocean:Document ;
    rdfs:range xsd:anyURI ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

# --- Donation v2.1.3 additions ---

donation:DonorAggregateReceipt a rdfs:Class ;
    rdfs:label "DonorAggregateReceipt" ;
    rdfs:comment "Per-rail aggregate of donor contributions for a campaign (e.g., total stablecoin / SEPA / SWIFT for CMP-2026-SUD-001). Issued continuously as contributions arrive; final aggregate at campaign close. Public-tier shows totals; private-tier links per-contribution detail." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:contributionRail a rdf:Property ;
    rdfs:label "contributionRail" ;
    rdfs:comment "The receiving rail used for an aggregate or single contribution: 'stablecoin', 'sepa', 'swift', 'revolut'." ;
    rdfs:domain donation:DonorAggregateReceipt, donation:DonationContribution ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:aggregateAmount a rdf:Property ;
    rdfs:label "aggregateAmount" ;
    rdfs:comment "Total contribution amount across the rail at the time of receipt issuance." ;
    rdfs:domain donation:DonorAggregateReceipt ;
    rdfs:range xsd:decimal ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:contributorCount a rdf:Property ;
    rdfs:label "contributorCount" ;
    rdfs:comment "Number of distinct contributors on the rail at the time of receipt issuance. Private-tier — donor identities never surface; counts may." ;
    rdfs:domain donation:DonorAggregateReceipt ;
    rdfs:range xsd:integer ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:DistributionObservation a rdfs:Class ;
    rdfs:label "DistributionObservation" ;
    rdfs:comment "Independent observation of a donation distribution event by an external NGO or partner agency (e.g., IOM Sudan country office). Distinct from donation:DonationDistribution which is the operational delivery record; this class captures the third-party witness." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:LastMileAcknowledgment a rdfs:Class ;
    rdfs:label "LastMileAcknowledgment" ;
    rdfs:comment "Distribution acknowledgment from the in-region last-mile coordinator (e.g., Khartoum State Ministry of Social Welfare). State-authority sign-off on receipt and onward distribution to identified beneficiary households." ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:campaignOperator a rdf:Property ;
    rdfs:label "campaignOperator" ;
    rdfs:comment "Skyocean operating entity that operates the donation campaign (e.g., Skyocean DOOEL — campaign operator and fund-receiving entity). Distinct from the consignee that takes title in the destination country." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range skyocean:TradeParty ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .

donation:sourceOfFunds a rdf:Property ;
    rdfs:label "sourceOfFunds" ;
    rdfs:comment "Public-tier description of which receiving rails the campaign accepts (e.g., 'Stablecoin receiving wallet (USDC/USDT) · SEPA donation account · SWIFT correspondent'). Reveals channels, not donor identities." ;
    rdfs:domain donation:DonationCampaign ;
    rdfs:range xsd:string ;
    rdfs:isDefinedBy skyocean: ;
    vs:term_status "testing" .
