09e1d7884a
- RG-1.04 durcie : pour une Commerciale, la completude de l'onglet Information est
exigee sur POST et sur tout PATCH, independamment des champs envoyes (suppression
de la condition d'intersection dans validateInformationCompleteness).
- Onglet Comptabilite editable par Compta : security du Patch /clients/{id} elargie
a `manage` OU `accounting.manage` ; nouveau guardManage (ClientProcessor, mode
strict RG-1.28) qui refuse a un porteur non-`manage` de modifier les onglets
principal / Information -> 403. Compta reste donc cantonne a la Comptabilite.
- Spec § 7 RG-1.04 amendee (+ consequence POST 422) + docblock du validator.
- Tests unitaires ClientProcessor : guardManage (Compta accounting-only -> 200,
champ metier -> 403) + RG-1.04 durcie hors onglet Information.
75 lines
2.6 KiB
PHP
75 lines
2.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Module\Commercial\Application\Validator;
|
|
|
|
use ApiPlatform\Validator\Exception\ValidationException;
|
|
use App\Module\Commercial\Domain\Entity\Client;
|
|
use Symfony\Component\Validator\ConstraintViolation;
|
|
use Symfony\Component\Validator\ConstraintViolationList;
|
|
|
|
/**
|
|
* Validator metier RG-1.04 (durcie ERP-74) : pour un utilisateur portant le
|
|
* role metier Commerciale, TOUS les champs de l'onglet Information sont
|
|
* obligatoires sur POST comme sur tout PATCH, independamment des champs
|
|
* reellement envoyes.
|
|
*
|
|
* Invoque par le ClientProcessor des que l'utilisateur courant porte le role
|
|
* Commerciale (plus de condition d'intersection avec l'onglet Information).
|
|
* Pour les autres roles, ces champs restent optionnels — le validator n'est
|
|
* pas appele.
|
|
*
|
|
* Leve une ValidationException (HTTP 422) listant chaque champ manquant, par
|
|
* coherence avec les violations Symfony rendues par API Platform.
|
|
*/
|
|
final class ClientInformationCompletenessValidator
|
|
{
|
|
public function validate(Client $client): void
|
|
{
|
|
// Map champ -> valeur courante de l'onglet Information.
|
|
$fields = [
|
|
'description' => $client->getDescription(),
|
|
'competitors' => $client->getCompetitors(),
|
|
'foundedAt' => $client->getFoundedAt(),
|
|
'employeesCount' => $client->getEmployeesCount(),
|
|
'revenueAmount' => $client->getRevenueAmount(),
|
|
'directorName' => $client->getDirectorName(),
|
|
'profitAmount' => $client->getProfitAmount(),
|
|
];
|
|
|
|
$violations = new ConstraintViolationList();
|
|
|
|
foreach ($fields as $property => $value) {
|
|
if ($this->isMissing($value)) {
|
|
$violations->add(new ConstraintViolation(
|
|
sprintf('Ce champ est obligatoire pour le role Commerciale (champ "%s").', $property),
|
|
null,
|
|
[],
|
|
$client,
|
|
$property,
|
|
$value,
|
|
));
|
|
}
|
|
}
|
|
|
|
if (count($violations) > 0) {
|
|
throw new ValidationException($violations);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Une valeur est manquante si null ou, pour une chaine, vide apres trim.
|
|
* Les zeros numeriques (employeesCount = 0, profitAmount = "0.00") sont des
|
|
* valeurs valides : on ne les considere pas manquants.
|
|
*/
|
|
private function isMissing(mixed $value): bool
|
|
{
|
|
if (null === $value) {
|
|
return true;
|
|
}
|
|
|
|
return is_string($value) && '' === trim($value);
|
|
}
|
|
}
|