{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.afrimo.be/schema/amx/v1.json",
  "title": "AMX — Afrimo Métré eXchange (v1)",
  "description": "Format ouvert et documenté d'échange de métré : postes (code, désignation, unité normalisée, quantité, prix de référence, règle de mesurage) sérialisés dans un JSON versionné et neutre. N'expose pas le cost-buildup interne (matériaux/main-d'œuvre/frais généraux/bénéfice). Spécification : https://www.afrimo.be/fr/metre-ouvert",
  "type": "object",
  "required": [
    "format",
    "version",
    "devise",
    "projet",
    "postes"
  ],
  "additionalProperties": true,
  "properties": {
    "$schema": {
      "type": "string",
      "description": "URL de ce schéma.",
      "format": "uri"
    },
    "format": {
      "const": "afrimo-metre-exchange",
      "description": "Identifiant du format. Doit valoir exactement « afrimo-metre-exchange »."
    },
    "version": {
      "const": 1,
      "description": "Version majeure du format."
    },
    "generatedAt": {
      "type": "string",
      "format": "date-time",
      "description": "Horodatage ISO 8601 de génération du document."
    },
    "generatedBy": {
      "type": "string",
      "description": "Outil ayant produit le document (p. ex. « AFRIMO »)."
    },
    "devise": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "description": "Devise ISO 4217 des prix (p. ex. EUR, CHF). Un document ne mélange jamais plusieurs devises."
    },
    "projet": {
      "type": "object",
      "required": [
        "nom"
      ],
      "additionalProperties": true,
      "properties": {
        "nom": {
          "type": "string",
          "minLength": 1
        },
        "reference": {
          "type": [
            "string",
            "null"
          ]
        },
        "type": {
          "type": [
            "string",
            "null"
          ],
          "description": "Type de projet. Valeurs canoniques Afrimo ; un producteur tiers peut en fournir d'autres.",
          "enum": [
            "MAISON",
            "IMMEUBLE",
            "ENTREPOT",
            "BUREAU",
            "COMMERCE",
            "INDUSTRIE",
            "RENOVATION",
            null
          ]
        },
        "surface": {
          "type": [
            "number",
            "null"
          ],
          "minimum": 0
        },
        "adresseChantier": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "postes": {
      "type": "array",
      "description": "Les postes du métré, dans l'ordre.",
      "items": {
        "type": "object",
        "required": [
          "ordre",
          "designation",
          "unite",
          "quantite",
          "prixUnitaire",
          "montant",
          "tauxTVA"
        ],
        "additionalProperties": true,
        "properties": {
          "ordre": {
            "type": "integer",
            "minimum": 0
          },
          "code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence normalisée du poste dans son référentiel (voir `referentiel`), si disponible. Un code seul est ambigu entre référentiels : le lire sans `referentiel` revient à supposer son origine."
          },
          "referentiel": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référentiel auquel appartient `code` : \"CCTB\" (Wallonie/Bruxelles), \"BBW\" (Flandre), \"CRTIB\" (Grand-Duché de Luxembourg). Optionnel et additif : un fichier antérieur ne le porte pas. Absent ou null = origine non déclarée — à ne PAS interpréter comme du CCTB.",
            "examples": [
              "CCTB",
              "BBW",
              "CRTIB"
            ]
          },
          "designation": {
            "type": "string",
            "minLength": 1
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "unite": {
            "type": "string",
            "description": "Unité de mesure normalisée.",
            "enum": [
              "M",
              "M2",
              "M3",
              "KG",
              "T",
              "PCE",
              "ENS",
              "FFT",
              "H",
              "J",
              "U",
              "L"
            ]
          },
          "quantite": {
            "type": "number",
            "minimum": 0
          },
          "prixUnitaire": {
            "type": "number",
            "minimum": 0,
            "description": "Prix unitaire HT de référence."
          },
          "montant": {
            "type": "number",
            "minimum": 0,
            "description": "Montant HT du poste."
          },
          "tauxTVA": {
            "type": "number",
            "minimum": 0
          },
          "regleMesurage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Règle de mesurage retenue — la clé du langage commun."
          }
        }
      }
    },
    "totaux": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "montantHT": {
          "type": "number"
        },
        "nbPostes": {
          "type": "integer",
          "minimum": 0
        }
      }
    }
  }
}
