{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://federatief.datastelsel.nl/kennisbank/dqv/kwaliteitsregistratie.json",
  "title": "Gegevenskwaliteitsregistratie",
  "description": "JSON Schema voor de export/import van de Gegevenskwaliteitsregistratie.",
  "type": "object",
  "required": ["datasets"],
  "properties": {
    "datasets": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/DatasetEntry"
      }
    }
  },
  "definitions": {
    "DatasetEntry": {
      "type": "object",
      "required": ["dataset"],
      "properties": {
        "dataset": { "$ref": "#/definitions/Dataset" },
        "dimensieToelichtingen": {
          "type": "object",
          "additionalProperties": { "type": "string" }
        },
        "kwaliteitsregels": {
          "type": "array",
          "items": { "$ref": "#/definitions/Kwaliteitsregel" }
        },
        "metingen": {
          "type": "array",
          "items": { "$ref": "#/definitions/Meting" }
        }
      }
    },
    "Dataset": {
      "description": "Een verzameling kwaliteitsmetingen die betrekking hebben op een specifieke dataset. Naam is verplicht; overige velden zijn optioneel.",
      "type": "object",
      "required": ["naam"],
      "properties": {
        "naam": {
          "description": "Naam van de gemeten dataset (verplicht).",
          "type": "string"
        },
        "toelichting": {
          "description": "Algemene toelichting op de dataset (optioneel).",
          "type": "string"
        },
        "meetjaar": {
          "description": "Jaar waarop de metingen betrekking hebben (optioneel).",
          "type": ["integer", "string"]
        },
        "dcatUri": {
          "description": "URI van het DCAT-record van de gemeten dataset (optioneel).",
          "type": "string",
          "format": "uri"
        },
        "dqvPrefix": {
          "description": "Prefix voor de URI van de kwaliteitsmetingendataset (alleen voor intern gebruik).",
          "type": "string"
        },
        "aantalGebeurtenissen": {
          "description": "Aantal gebeurtenissen/mutaties (optioneel).",
          "type": ["integer", "string"]
        },
        "gebeurtenissenToelichting": {
          "description": "Toelichting bij het aantal gebeurtenissen (optioneel).",
          "type": "string"
        },
        "aantalWijzigingen": {
          "description": "Aantal wijzigingen (optioneel).",
          "type": ["integer", "string"]
        },
        "wijzigingenToelichting": {
          "description": "Toelichting bij het aantal wijzigingen (optioneel).",
          "type": "string"
        },
        "aantalTerugmeldingen": {
          "description": "Aantal terugmeldingen (optioneel).",
          "type": ["integer", "string"]
        },
        "terugmeldingenToelichting": {
          "description": "Toelichting bij het aantal terugmeldingen (optioneel).",
          "type": "string"
        },
        "objecttypen": {
          "description": "Objecttype-statistieken (optioneel).",
          "type": "array",
          "items": { "$ref": "#/definitions/Objecttype" }
        }
      }
    },
    "Objecttype": {
      "description": "Statistiek van een objecttype binnen de gemeten dataset. Naam en aantal zijn beide verplicht.",
      "type": "object",
      "required": ["naam", "aantal"],
      "properties": {
        "naam": {
          "description": "Naam van het objecttype (verplicht).",
          "type": "string"
        },
        "aantal": {
          "description": "Aantal objecten van dit type (verplicht).",
          "type": ["integer", "string"]
        }
      }
    },
    "Kwaliteitsregel": {
      "description": "Een formele specificatie van een kwaliteitseis. Naam, specificatie en objecttype zijn verplicht.",
      "type": "object",
      "required": ["naam", "specificatie", "objecttype"],
      "properties": {
        "naam": {
          "description": "Unieke naam van de kwaliteitsregel (verplicht).",
          "type": "string"
        },
        "omschrijving": {
          "description": "Korte omschrijving van de regel (optioneel).",
          "type": "string"
        },
        "melding": {
          "description": "Melding bij overtreding van de regel (optioneel).",
          "type": "string"
        },
        "ernst": {
          "description": "Ernst van de regel: fout of waarschuwing.",
          "type": "string",
          "enum": ["fout", "waarschuwing"]
        },
        "specificatie": {
          "description": "De regel in de gekozen taal (verplicht).",
          "type": "string"
        },
        "taal": {
          "description": "Taal van de specificatie (optioneel; bij Kwaliteitsregeltaal weggelaten).",
          "type": "string"
        },
        "populatie": {
          "description": "Geeft aan of de regel op populatieniveau geldt (optioneel).",
          "type": "boolean"
        },
        "objecttype": {
          "description": "Objecttype waarop de regel van toepassing is (verplicht).",
          "type": "string"
        },
        "metriek": {
          "description": "URI van de kwaliteitsmetriek (optioneel).",
          "type": "string",
          "format": "uri"
        }
      }
    },
    "Meting": {
      "description": "Een meting van de kwaliteit van een dataset op basis van een specifieke kwaliteitsmetriek. Kwaliteitsattribuut en kwaliteitsmetriek zijn verplicht.",
      "type": "object",
      "required": ["kwaliteitsattribuut", "kwaliteitsmetriek"],
      "properties": {
        "kwaliteitsattribuut": {
          "description": "URI van het kwaliteitsattribuut (verplicht).",
          "type": "string",
          "format": "uri"
        },
        "kwaliteitsmetriek": {
          "description": "URI van de kwaliteitsmetriek (verplicht).",
          "type": "string",
          "format": "uri"
        },
        "variabelen": {
          "description": "Sleutel-waardeparen van variabelen uit het zinsjabloon. Bijvoorbeeld PERCENTAGE, AANTAL, ATTRIBUUT of OBJECTTYPE.",
          "type": "object",
          "patternProperties": {
            "^[A-Z_]+$": { "type": ["string", "number"] }
          }
        },
        "normwaarde": {
          "description": "Normwaarde waartegen de meting wordt afgezet (optioneel).",
          "type": ["string", "number"]
        },
        "toelichting": {
          "description": "Vrije tekst toelichting bij de meting (optioneel).",
          "type": "string"
        }
      }
    }
  }
}
