{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","additionalProperties":false,"required":["letter","employer","employee","seniority","signature"],"properties":{"letter":{"type":"object","additionalProperties":false,"required":["place","date","language"],"properties":{"place":{"type":"string"},"date":{"type":"string","format":"date"},"language":{"type":"string","enum":["fr","nl","de","en"]},"reference":{"type":"string"},"purpose":{"type":"string","description":"Finalité de l'attestation (ex. mobilité interne, changement d'employeur, dossier CP, pension complémentaire)."}}},"employer":{"type":"object","additionalProperties":false,"required":["name","address","bce_number","vat_number","onss_number","joint_committee"],"properties":{"name":{"type":"string"},"legal_form":{"type":"string"},"address":{"type":"string"},"bce_number":{"type":"string","description":"Numéro BCE/KBO (format 0xxx.xxx.xxx)."},"vat_number":{"type":"string","description":"Numéro TVA/BTW (format BE0xxxxxxxxx)."},"onss_number":{"type":"string","description":"Numéro d'immatriculation ONSS/RSZ."},"joint_committee":{"type":"string","description":"Commission paritaire / paritair comité (ex. CP 200, CP 218)."},"social_secretariat":{"type":"object","additionalProperties":false,"required":["name","approval_number"],"properties":{"name":{"type":"string"},"approval_number":{"type":"string"}}},"represented_by":{"type":"object","additionalProperties":false,"required":["name","title"],"properties":{"name":{"type":"string"},"title":{"type":"string"}}},"seat_region":{"type":"string","enum":["nl_region","fr_region","brussels","de_region"],"description":"Linguistic region of the operating seat of the employer (Flemish decree of 19 July 1973, decree of the French Community of 30 June 1982, coordinated laws of 18 July 1966, art. 52). Optional; the language of the document is compared with it and a mismatch only warns."}}},"employee":{"type":"object","additionalProperties":false,"required":["given_name","surname","national_register_number","function_title","contract_type"],"properties":{"given_name":{"type":"string"},"surname":{"type":"string"},"national_register_number":{"type":"string","description":"NISS / Rijksregisternummer (format YY.MM.DD-NNN.CC)."},"function_title":{"type":"string"},"contract_type":{"type":"string","enum":["cdi","cdd","student","interim","other"],"description":"Type de contrat de travail au moment de la référence."}}},"seniority":{"type":"object","additionalProperties":false,"required":["entry_date","reference_date","total_years","total_months"],"properties":{"entry_date":{"type":"string","format":"date","description":"Date d'entrée en service (date d'engagement)."},"reference_date":{"type":"string","format":"date","description":"Date de référence pour le calcul de l'ancienneté."},"total_years":{"type":"integer","minimum":0,"description":"Nombre d'années d'ancienneté à la date de référence."},"total_months":{"type":"integer","minimum":0,"maximum":11,"description":"Mois résiduels (0–11) après les années complètes."},"seniority_for_notice_weeks":{"type":"integer","minimum":0,"description":"Délai de préavis, en semaines, correspondant à l'ancienneté."},"seniority_for_sectoral_bonus":{"type":"number","minimum":0,"description":"Ancienneté retenue pour les primes d'ancienneté sectorielles (peut différer de l'ancienneté légale)."},"assimilated_periods":{"type":"array","description":"Périodes assimilées incluses dans le calcul (maladie, congé de maternité, chômage temporaire, crédit-temps, etc.).","items":{"type":"object","additionalProperties":false,"required":["type","from_date","to_date"],"properties":{"type":{"type":"string","enum":["sick_leave","maternity_leave","paternity_leave","temporary_unemployment","time_credit","military_service","parental_leave","other"],"description":"Nature de la période assimilée."},"from_date":{"type":"string","format":"date"},"to_date":{"type":"string","format":"date"},"description":{"type":"string"}}}},"neutralised_periods":{"type":"array","description":"Périodes neutralisées exclues du calcul (congé sans solde au-delà du seuil CP, etc.).","items":{"type":"object","additionalProperties":false,"required":["type","from_date","to_date"],"properties":{"type":{"type":"string","enum":["unpaid_leave","suspension_disciplinary","force_majeure","other"]},"from_date":{"type":"string","format":"date"},"to_date":{"type":"string","format":"date"},"description":{"type":"string"}}}}}},"signature":{"type":"object","additionalProperties":false,"required":["signatory_name","signatory_title","date"],"properties":{"signatory_name":{"type":"string"},"signatory_title":{"type":"string"},"date":{"type":"string","format":"date"}}}}}