Lot de correctifs sur l'écran Client (M1), + un retrait de règle métier et une petite fonctionnalité. ## Formulaire client (création / édition) - Boutons « ajouter un bloc » (Adresse, RIB) désactivés tant que le dernier bloc n'est pas valide. - Onglet Information : bouton Valider désactivé si aucun champ rempli (création) ; onglet Contact accessible dès la création (Information facultatif). - Champs « Relation » (Distributeur/Courtier) et « Prestation de triage » masqués par défaut, révélés seulement si une catégorie ordinaire (≠ Distributeur/Courtier) est sélectionnée. - Bloc RIB affiché uniquement si le type de règlement est LCR (création, édition, consultation) ; plus de RIB fantôme soumis. - Alignement du bas du textarea « Description » sur les autres champs. ## Recherche d'adresse (BAN) - Une erreur de l'API ne bloque plus définitivement la recherche : chaque frappe réessaie (le mode dégradé restait verrouillé). - Garde minimum 3 caractères avant l'appel à l'API. ## Répertoire client - Titres de colonne en noir 16px, corps + tags de site en 14px. ## Navigation - L'onglet actif est conservé au passage consultation ↔ édition (via history.state, hors URL). ## Règle métier - Retrait de RG-1.04 : l'onglet Information n'est plus obligatoire pour le rôle Commerciale — facultatif pour tous (back + tests + docs). Tests : suites front (Vitest) et back (PHPUnit) vertes hormis flakes d'infra connus. Reviewed-on: #76 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #76.
This commit is contained in:
@@ -10,7 +10,6 @@ namespace App\Shared\Domain\Contract;
|
||||
* App\Shared\Domain\Security\BusinessRoles).
|
||||
*
|
||||
* Implementee par App\Module\Core\Domain\Entity\User. Permet a un module tiers
|
||||
* (ex: Commercial — RG-1.04, completude Information pour le role Commerciale)
|
||||
* de raisonner sur les roles metier via Security::getUser() sans importer User
|
||||
* (regle ABSOLUE n°1 : pas d'import inter-modules).
|
||||
*
|
||||
|
||||
@@ -10,9 +10,11 @@ namespace App\Shared\Domain\Security;
|
||||
* Distincts des roles SYSTEME (cf. App\Module\Core\Domain\Security\SystemRoles :
|
||||
* `admin` / `user`). Un role metier porte une intention fonctionnelle (poste de
|
||||
* travail) et conditionne certaines regles de gestion au-dela des permissions
|
||||
* RBAC pures — ex : RG-1.04 du M1 Clients rend l'onglet Information obligatoire
|
||||
* pour le seul role Commerciale, alors que Commerciale et Bureau partagent les
|
||||
* memes permissions (commercial.clients.view + manage, cf. spec-back M1 § 5.2).
|
||||
* RBAC pures (Commerciale et Bureau partagent par ex. les memes permissions
|
||||
* commercial.clients.view + manage mais peuvent porter des regles de gestion
|
||||
* propres au poste). NB : l'ancienne RG-1.04 du M1 (« Information obligatoire
|
||||
* pour Commerciale ») a ete retiree — l'onglet Information est facultatif pour
|
||||
* tous ; la machinerie de role metier reste disponible pour de futures regles.
|
||||
*
|
||||
* Ces constantes vivent dans Shared (et non dans un module) pour que :
|
||||
* - le seed des roles cote Core (ERP-74) reference le meme code sans importer
|
||||
@@ -24,14 +26,14 @@ namespace App\Shared\Domain\Security;
|
||||
* Coordination stack M1 :
|
||||
* - ERP-74 seede le role `commerciale` avec ce code exact.
|
||||
* - ERP-59 / ERP-60 (declaration RBAC + tests personas) le reutilisent.
|
||||
* - ERP-55 (ici) ne fait que le REFERENCER : tant qu'aucun user ne porte le
|
||||
* role `commerciale`, la validation de completude Information reste dormante.
|
||||
* - ERP-55 le referencait pour la completude Information (M1 RG-1.04), regle
|
||||
* depuis retiree ; le code reste utilise par le seed RBAC et les personas.
|
||||
*/
|
||||
final class BusinessRoles
|
||||
{
|
||||
/**
|
||||
* Role metier « Commerciale » — code de Role RBAC (champ Role::code,
|
||||
* snake_case impose par la regex Role). Conditionne RG-1.04.
|
||||
* snake_case impose par la regex Role).
|
||||
*/
|
||||
public const string COMMERCIALE = 'commerciale';
|
||||
|
||||
|
||||
@@ -180,13 +180,13 @@ final class ColumnCommentsCatalog
|
||||
'distributor_id' => 'FK auto-referente vers un client porteur de la categorie DISTRIBUTEUR — exclusive avec broker_id (RG-1.03, chk_client_distrib_or_broker). FK -> client.id, ON DELETE SET NULL.',
|
||||
'broker_id' => 'FK auto-referente vers un client porteur de la categorie COURTIER — exclusive avec distributor_id (RG-1.03). FK -> client.id, ON DELETE SET NULL.',
|
||||
'triage_service' => 'Drapeau service triage active pour le client. Faux par defaut.',
|
||||
'description' => 'Onglet Information : description libre. Obligatoire pour le role Commerciale (RG-1.04), optionnel sinon.',
|
||||
'competitors' => 'Onglet Information : concurrents identifies (texte libre ≤ 255). Obligatoire role Commerciale (RG-1.04).',
|
||||
'founded_at' => 'Onglet Information : date de creation de l entreprise. Obligatoire role Commerciale (RG-1.04).',
|
||||
'employees_count' => 'Onglet Information : effectif (entier >= 0). Obligatoire role Commerciale (RG-1.04).',
|
||||
'revenue_amount' => 'Onglet Information : chiffre d affaires (NUMERIC 15,2). Obligatoire role Commerciale (RG-1.04).',
|
||||
'director_name' => 'Onglet Information : nom du dirigeant. Obligatoire role Commerciale (RG-1.04).',
|
||||
'profit_amount' => 'Onglet Information : resultat / benefice (NUMERIC 15,2). Obligatoire role Commerciale (RG-1.04).',
|
||||
'description' => 'Onglet Information : description libre. Facultatif.',
|
||||
'competitors' => 'Onglet Information : concurrents identifies (texte libre ≤ 255). Facultatif.',
|
||||
'founded_at' => 'Onglet Information : date de creation de l entreprise. Facultatif.',
|
||||
'employees_count' => 'Onglet Information : effectif (entier >= 0). Facultatif.',
|
||||
'revenue_amount' => 'Onglet Information : chiffre d affaires (NUMERIC 15,2). Facultatif.',
|
||||
'director_name' => 'Onglet Information : nom du dirigeant. Facultatif.',
|
||||
'profit_amount' => 'Onglet Information : resultat / benefice (NUMERIC 15,2). Facultatif.',
|
||||
'siren' => 'Onglet Comptabilite : SIREN (9 chiffres attendus). NON unique — peut etre partage entre etablissements (RG-1.15 supprimee, Q4).',
|
||||
'account_number' => 'Onglet Comptabilite : numero de compte comptable du client.',
|
||||
'tva_mode_id' => 'Onglet Comptabilite : mode de TVA applique — FK -> tva_mode.id, ON DELETE RESTRICT.',
|
||||
|
||||
Reference in New Issue
Block a user