"""Modèle Frappe/ERPNext v15 : DocType natif `Custom Block` (carrier du Chat OTOIA). Pourquoi un `Custom Block` (et pas un widget externe) ----------------------------------------------------- La roadmap Sprint 6 demande « Chat OTOIA embedded dans CHAQUE portail ». Contrainte #1 « ERPNext natif = priorité absolue avant tout outil externe » : dans ERPNext v15, un bloc de contenu réutilisable inséré dans un `Workspace` EST le DocType `Custom Block` (`frappe/desk/doctype/custom_block`). Le desk référence un Custom Block depuis le `content` (editor.js) d'un Workspace via un bloc de type `custom_block`. On produit donc un `Custom Block` par portail — aucun framework de chat externe côté worker. Champs `Custom Block` utilisés (v15) : - `block_name` (Data, unique, requis) : identifiant lisible du bloc. - `html` (HTML) : le markup rendu. Ici, UNIQUEMENT un `