Règles et validations
Exprimer les conditions métier sans ajouter de scripts dans les vues.
Déclarer une condition
Les règles expriment des conditions sur les valeurs, relations ou résultats de Queries. Le Model les utilise pour une validation, la disponibilité d’une Action ou une transition. Les vues présentent le résultat de cette décision; elles ne deviennent pas une seconde autorité métier.
| Condition | Valeurs attendues | Usage |
|---|---|---|
| Présence | Référence à un Field | Vérifier qu’une information est fournie |
| Comparaison | Field, opérateur admis et valeur typée | Comparer un montant ou un état |
| Appartenance | Field et valeurs autorisées | Accepter plusieurs états |
| Relation | Type, direction et cardinalité | Exiger un client lié |
| Query | Query déclarée et paramètres admis | Vérifier une collection ou un agrégat |
| Combinaison | Expressions booléennes bornées | Assembler des conditions |
Messages utiles
Une règle refusée doit expliquer ce qui manque et où le corriger. « Sélectionnez un client avant de finaliser » guide l’usager. Un nom de contrat ou une erreur technique ne remplace pas ce message.
Exemple
Pour finaliser une soumission, exigez un client lié, un montant positif et une approbation. La fiche peut montrer les conditions manquantes, mais le service les vérifie à nouveau lors de la confirmation. Un bouton désactivé ne constitue pas un contrôle d’autorisation.
Les arbres d’expressions sont déclaratifs et bornés. Leur référence décrit les variantes admises; une règle n’exécute pas du JavaScript ou du SQL fourni dans une vue.
Exemples appliqués : Vérifier avant de confirmer
Une règle exige une entreprise; une autre interdit un montant négatif ou nul.
Configuration
Fragment à placer dans rules[]. Propriétés et valeurs admises.
{
"contract": "WorkspaceRule@1",
"key": "company-required",
"label": "Entreprise renseignée",
"expression": {
"kind": "present",
"field": {
"definitionPath": "workspace/clients/surface/client",
"fieldKey": "company"
}
}
}
Variante et raccordement
Fragment à placer dans rules[]. Propriétés et valeurs admises.
{
"contract": "WorkspaceRule@1",
"key": "positive-amount",
"label": "Montant positif",
"expression": {
"kind": "compare",
"field": {
"definitionPath": "workspace/quotes/surface/quote",
"fieldKey": "amount"
},
"operator": "gt",
"value": 0
}
}
Exemple de disposition UI
La disposition illustrative ci-dessous situe cette configuration dans l’app Clients/Soumissions. Chaque fragment s’insère à l’emplacement indiqué; ses références aux Fields, Queries et Actions correspondent aux déclarations du Model.
- Entreprise *
- État *
- Notes
- Créer le client
Les notes s’enrichissent dans la fiche après création.