{
  "$id": "urn:statement",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Énoncés",
  "description": "Tableau d'énoncés.",
  "version": "0.4",
  "type": "array",
  "items": {
    "$ref": "#/$defs/Statement"
  },
  "$defs": {
    "Statement": {
      "title": "Énoncé",
      "description": "Affirmation à propos d'une personne, d'une entité ou d'une relation, formulée à un moment donné.",
      "type": "object",
      "properties": {
        "statementId": {
          "title": "Identifiant d'énoncé",
          "description": "Identifiant global unique persistant de cet énoncé. La longueur DOIT être comprise entre 32 et 64 caractères (inclusive).",
          "type": "string",
          "minLength": 32,
          "maxLength": 64
        },
        "statementDate": {
          "title": "Date de l'énoncé",
          "description": "Date de création de cet énoncé par la source, sous un format de date complète (AAAA-MM-JJ) ou de date-heure (ex. AAAA-MM-JJTHH:MM:SSZ). Voir la norme IETF RFC3339, section 5.6.",
          "type": "string",
          "anyOf": [
            {
              "format": "date"
            },
            {
              "format": "date-time"
            }
          ]
        },
        "annotations": {
          "title": "Annotations",
          "description": "Annotations à propos de cet énoncé ou de parties de cet énoncé.",
          "type": "array",
          "items": {
            "$ref": "#/$defs/Annotation"
          }
        },
        "publicationDetails": {
          "title": "Détails de la publication",
          "description": "Informations concernant la publication de cet énoncé.",
          "type": "object",
          "properties": {
            "publicationDate": {
              "title": "Date de publication",
              "description": "Date de publication de cet énoncé, sous un format de date complète (AAAA-MM-JJ) ou de date-heure (ex. AAAA-MM-JJTHH:MM:SSZ). Voir la norme IETF RFC3339, section 5.6.",
              "type": "string",
              "anyOf": [
                {
                  "format": "date"
                },
                {
                  "format": "date-time"
                }
              ]
            },
            "bodsVersion": {
              "title": "Version de la BODS",
              "description": "Version de la norme relative aux données sur la propriété effective à laquelle cet énoncé se conforme, exprimée comme majeure/mineure (ex. 0.2 ou 1.0). Dans un ensemble de données de la BODS publié, tous les énoncés DOIVENT avoir le même numéro majeur de version.",
              "type": "string",
              "pattern": "^(\\d+\\.)(\\d+)$"
            },
            "license": {
              "title": "URL de la licence",
              "description": "Lien vers la licence qui s'applique à cet énoncé. L'URI canonique de la licence DEVRAIT être utilisé. Les éditeurs sont encouragés à utiliser une licence Public Domain Dedication ou Open Definition Conformant (http://opendefinition.org/licenses/).",
              "type": "string",
              "format": "uri"
            },
            "publisher": {
              "type": "object",
              "title": "Éditeur",
              "description": "Détails de l'organisation ou de la personne qui publie un énoncé.",
              "properties": {
                "name": {
                  "title": "Nom",
                  "description": "Nom de l'éditeur.",
                  "type": "string"
                },
                "url": {
                  "title": "URL",
                  "description": "URL permettant de trouver des précisions sur l'ensemble de données complet ou sur l'éditeur. ",
                  "type": "string",
                  "format": "uri"
                }
              },
              "anyOf": [
                {
                  "required": [
                    "name"
                  ]
                },
                {
                  "required": [
                    "url"
                  ]
                }
              ]
            }
          },
          "required": [
            "publicationDate",
            "bodsVersion",
            "publisher"
          ]
        },
        "source": {
          "title": "Source",
          "description": "Source d'information de cet énoncé. Chaque énoncé DEVRAIT contenir une source d'information.",
          "$ref": "urn:components#/$defs/Source"
        },
        "declaration": {
          "title": "Référence de la déclaration",
          "description": "Identifiant ou référence d'une déclaration dans le système de l'éditeur. Lorsqu'un énoncé est une affirmation d'une déclaration en particulier (faite à un moment donné par une `source` sur un `declarationSubject`), ce champ identifie la déclaration.",
          "type": "string"
        },
        "declarationSubject": {
          "title": "Sujet de la déclaration",
          "description": "Valeur `recordId` pour le sujet d'un réseau de propriété effective (toujours une entité ou une personne).",
          "type": "string"
        },
        "recordId": {
          "title": "Identifiant d'enregistrement",
          "description": "Identifiant unique de l'enregistrement (dans le système de l'éditeur) auquel cet énoncé se rapporte. (Un enregistrement saisit les informations sur une entité, une personne physique ou une relation dans le réseau des bénéficiaires effectifs d'un sujet de déclaration donné.)",
          "type": "string"
        },
        "recordType": {
          "title": "Type d'enregistrement",
          "description": "Type d'enregistrement (dans le système de l'éditeur) auquel se rapporte cet énoncé : entité, personne ou relation.",
          "type": "string",
          "enum": [
            "entity",
            "person",
            "relationship"
          ],
          "codelist": "recordType.csv",
          "openCodelist": false
        },
        "recordStatus": {
          "title": "Statut de l'enregistrement",
          "description": "État du cycle de vie de l'enregistrement (dans le système de l'éditeur) auquel se rapporte cet énoncé, à l'aide de la liste de codes recordStatus.",
          "type": "string",
          "enum": [
            "new",
            "updated",
            "closed"
          ],
          "codelist": "recordStatus.csv",
          "openCodelist": false
        },
        "recordDetails": {
          "title": "Détails de l'enregistrement",
          "description": "Détails de l'entité, de la personne ou de la relation tel que déclaré à la date de l'énoncé.",
          "type": "object"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "recordType": {
                "const": "entity"
              }
            }
          },
          "then": {
            "properties": {
              "recordDetails": {
                "$ref": "urn:entity"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "recordType": {
                "const": "person"
              }
            }
          },
          "then": {
            "properties": {
              "recordDetails": {
                "$ref": "urn:person"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "recordType": {
                "const": "relationship"
              }
            }
          },
          "then": {
            "properties": {
              "recordDetails": {
                "$ref": "urn:relationship"
              }
            }
          }
        }
      ],
      "required": [
        "statementId",
        "declarationSubject",
        "recordId",
        "recordType",
        "recordDetails",
        "statementDate"
      ]
    },
    "Annotation": {
      "title": "Annotation",
      "description": "Informations complémentaires sur les données contenues dans cet énoncé. Les annotations peuvent s'appliquer à l'ensemble de l'énoncé, à un objet ou à un champ. Des propriétés personnalisées peuvent être incluses dans l'objet Annotation pour fournir des données structurées, si nécessaire.",
      "type": "object",
      "properties": {
        "statementPointerTarget": {
          "title": "Pointeur de fragment d'énoncé",
          "description": "Pointeur JSON RFC6901 (https://tools.ietf.org/html/rfc6901) décrivant le fragment cible de l'énoncé auquel s'applique cette annotation, en commençant par la racine de l'énoncé. Une chaîne vide (\"\") indique que l'annotation s'applique à l'ensemble de l'énoncé.",
          "type": "string"
        },
        "creationDate": {
          "title": "Date de création",
          "description": "Date de création de cette annotation, sous un format de date complète (AAAA-MM-JJ) ou date-heure (ex. AAAA-MM-JJTHH:MM:SSZ). Voir la norme IETF RFC3339, section 5.6.",
          "type": "string",
          "anyOf": [
            {
              "format": "date"
            },
            {
              "format": "date-time"
            }
          ]
        },
        "createdBy": {
          "title": "Créée par",
          "description": "Personne, organisation ou agent ayant créé cette annotation.",
          "type": "object",
          "properties": {
            "name": {
              "title": "Nom",
              "description": "Nom de la personne, de l'organisation ou de l'agent ayant créé cette annotation.",
              "type": "string"
            },
            "uri": {
              "title": "URI",
              "description": "URI optionnel pour identifier la personne, l'organisation ou l'agent ayant créé cette annotation.",
              "type": "string",
              "format": "uri"
            }
          }
        },
        "motivation": {
          "title": "Motivation",
          "description": "Motif de cette annotation, à l'aide de la liste de codes annotationMotivation.",
          "type": "string",
          "enum": [
            "commenting",
            "correcting",
            "identifying",
            "linking",
            "transformation"
          ],
          "codelist": "annotationMotivation.csv",
          "openCodelist": false
        },
        "description": {
          "title": "Description",
          "description": "Description sous forme de texte libre fournissant des informations complémentaires sur une partie de cet énoncé.",
          "type": "string"
        },
        "transformedContent": {
          "type": "string",
          "title": "Contenu transformé",
          "description": "Représentation de la cible de l'annotation à la suite de l'application de la transformation dans le champ `description`. Ce champ DOIT être utilisé uniquement si la `motivation` est 'transformation'."
        },
        "url": {
          "title": "URL",
          "description": "Ressource liée qui annote, fournit un contexte ou apporte une amélioration à cet énoncé. Le contenu de la ressource, ou la relation à l'énoncé, PEUT être décrit dans le champ `description`. Ce champ est OBLIGATOIRE si la valeur de la `motivation` est 'lien'.",
          "type": "string",
          "format": "uri"
        }
      },
      "required": [
        "motivation",
        "statementPointerTarget"
      ],
      "allOf": [
        {
          "if": {
            "properties": {
              "motivation": {
                "const": "linking"
              }
            }
          },
          "then": {
            "required": [
              "url"
            ]
          }
        },
        {
          "if": {
            "not": {
              "properties": {
                "motivation": {
                  "const": "transformation"
                }
              }
            }
          },
          "then": {
            "properties": {
              "transformedContent": {
                "const": ""
              }
            }
          }
        }
      ]
    }
  }
}
