b8dc3cb696
Auto Tag Develop / tag (push) Successful in 7s
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>
78 lines
2.7 KiB
PHP
78 lines
2.7 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 (spec-front § Onglet Comptabilite) : a la soumission complete
|
|
* de l'onglet Comptabilite, les six champs scalaires obligatoires doivent etre
|
|
* renseignes (SIREN, Numero de compte, Mode de TVA, N de TVA, Delai de reglement,
|
|
* Type de reglement). La banque reste conditionnelle (RG-1.12) et les RIB aussi
|
|
* (RG-1.13) : ils ne sont pas couverts ici.
|
|
*
|
|
* Parti pris : colonnes nullable en base + validateur contextuel, plutot qu'un
|
|
* Assert\NotBlank sur l'entite (qui casserait le POST de l'onglet principal,
|
|
* lequel n'envoie aucun champ comptable).
|
|
*
|
|
* Invoque par le ClientProcessor uniquement quand le payload porte les six champs
|
|
* (= une validation d'onglet), jamais sur un PATCH ciblant un seul champ comptable.
|
|
*
|
|
* Leve une ValidationException (HTTP 422) listant chaque champ manquant, par
|
|
* coherence avec les violations Symfony rendues par API Platform (mapping inline
|
|
* front via useFormErrors, ERP-101).
|
|
*/
|
|
final class ClientAccountingCompletenessValidator
|
|
{
|
|
public function validate(Client $client): void
|
|
{
|
|
// Map champ -> valeur courante des champs obligatoires de l'onglet.
|
|
$fields = [
|
|
'siren' => $client->getSiren(),
|
|
'accountNumber' => $client->getAccountNumber(),
|
|
'tvaMode' => $client->getTvaMode(),
|
|
'nTva' => $client->getNTva(),
|
|
'paymentDelay' => $client->getPaymentDelay(),
|
|
'paymentType' => $client->getPaymentType(),
|
|
];
|
|
|
|
$violations = new ConstraintViolationList();
|
|
|
|
foreach ($fields as $property => $value) {
|
|
if ($this->isMissing($value)) {
|
|
$violations->add(new ConstraintViolation(
|
|
'Ce champ est obligatoire.',
|
|
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
|
|
* references (TvaMode / PaymentDelay / PaymentType) ne sont manquantes que
|
|
* lorsqu'elles valent null.
|
|
*/
|
|
private function isMissing(mixed $value): bool
|
|
{
|
|
if (null === $value) {
|
|
return true;
|
|
}
|
|
|
|
return is_string($value) && '' === trim($value);
|
|
}
|
|
}
|