Merge develop into feature/ERP-62-page-repertoire-clients
Résolution du conflit de contrat de sérialisation (Client.php) après merge du fix #45 (ERP-80/81/82/83) dans develop : - GetCollection : ajout category:read + site:read + accesseur getSites() (delta nécessaire à ERP-62, absent du contrat mergé) — un seul endroit. - Get : client_rib:read NON réintroduit (fix sécu #45 conservé : contenu RIB gaté par client:read:accounting, plus de fuite IBAN/BIC). - getSites() conservé en sus du gating RIB de develop. - Repository : fetch-joins categories/addresses/sites conservés (anti N+1 liste).
This commit is contained in:
@@ -68,15 +68,21 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||
),
|
||||
new Get(
|
||||
security: "is_granted('commercial.clients.view')",
|
||||
// Detail : client + sous-collections embarquees. Le groupe
|
||||
// client:read:accounting est ajoute par le context builder selon la
|
||||
// permission, donc absent ici volontairement.
|
||||
// Detail : client + sous-collections embarquees.
|
||||
// - client:read:accounting est ajoute par le context builder selon la
|
||||
// permission (gate les scalaires comptables ET les RIB embarques),
|
||||
// donc absent ici volontairement.
|
||||
// - client_rib:read N'EST PLUS dans le contexte : le contenu des RIB
|
||||
// embarques est desormais porte par client:read:accounting (gate),
|
||||
// ce qui retire la fuite IBAN/BIC vers les users sans accounting.view.
|
||||
// - category:read et site:read sont indispensables pour embarquer le
|
||||
// code/libelle des categories et des sites (sinon stub IRI nu) :
|
||||
// Category.code/name vivent sous category:read, Site.name sous site:read.
|
||||
normalizationContext: ['groups' => [
|
||||
'client:read',
|
||||
'client:item:read',
|
||||
'client_contact:read',
|
||||
'client_address:read',
|
||||
'client_rib:read',
|
||||
'category:read',
|
||||
'site:read',
|
||||
'default:read',
|
||||
@@ -682,8 +688,14 @@ class Client implements TimestampableInterface, BlamableInterface
|
||||
return array_values($sites);
|
||||
}
|
||||
|
||||
// Embed gate sur le groupe COMPTABLE (et non client:item:read comme contacts/
|
||||
// adresses) : client:read:accounting n'est ajoute au contexte que si l'user a
|
||||
// accounting.view (ClientReadGroupContextBuilder). Resultat : la cle `ribs` est
|
||||
// TOTALEMENT ABSENTE du detail pour un user sans accounting.view (ex. Commerciale),
|
||||
// au meme titre que les scalaires comptables — corrige la fuite de RIB ou la
|
||||
// Commerciale recevait IBAN/BIC en clair.
|
||||
/** @return Collection<int, ClientRib> */
|
||||
#[Groups(['client:item:read'])]
|
||||
#[Groups(['client:read:accounting'])]
|
||||
public function getRibs(): Collection
|
||||
{
|
||||
return $this->ribs;
|
||||
|
||||
Reference in New Issue
Block a user