fix : brouillon à contrepartie incomplète enregistrable sans erreur 500 (ERP-193)
Un brouillon dont le type de contrepartie est choisi sans son champ associé (client/fournisseur null, ou libellé « Autre » vide) violait chk_wt_*_branch et levait une 500 : le callback de cohérence RG-5.03 ne joue qu'au groupe finalize, laissant passer l'incohérence à l'enregistrement du brouillon. - back : WeighingTicketProcessor retire la contrepartie entière quand le champ de branche est absent (clearCounterparty) au lieu de persister un état incohérent. N'affecte que le brouillon (à la validation, le callback finalize lève déjà une 422 avant le processor). - front : buildDraftPayload n'émet le type que si son champ associé est rempli ; la validation continue d'envoyer toujours le type pour la 422 métier. - tests : 2 cas back (CLIENT sans client, AUTRE libellé vide) + 2 cas front.
This commit is contained in:
+43
-6
@@ -121,36 +121,73 @@ final class WeighingTicketProcessor implements ProcessorInterface
|
||||
|
||||
/**
|
||||
* RG-5.03 : garantit l'exclusivite de la contrepartie en forcant a null les
|
||||
* champs hors-branche selon counterpartyType. La PRESENCE du champ requis est
|
||||
* deja validee en amont (Assert\Callback de l'entite) ; ici on evite qu'un
|
||||
* payload portant a la fois client_id ET supplier_id ne fasse echouer les CHECK
|
||||
* Postgres (500 generique au lieu d'une donnee coherente). otherLabel est
|
||||
* normalise (trim) dans la branche AUTRE.
|
||||
* champs hors-branche selon counterpartyType. La PRESENCE du champ requis n'est
|
||||
* validee qu'a la VALIDATION (Assert\Callback groupe finalize, ERP-193) : un
|
||||
* BROUILLON peut donc arriver ici avec un type choisi mais SANS son champ associe
|
||||
* (l'operateur a ouvert le menu avant de selectionner). On retire alors la
|
||||
* contrepartie entiere (clearCounterparty) au lieu de persister un etat
|
||||
* incoherent qui violerait les CHECK Postgres chk_wt_*_branch (500 generique).
|
||||
* Ne concerne que le brouillon : a la validation, le Callback finalize a deja
|
||||
* leve une 422 AVANT ce Processor. otherLabel est normalise (trim) en branche
|
||||
* AUTRE ; un libelle vide vaut « champ associe absent » -> contrepartie retiree.
|
||||
*/
|
||||
private function applyCounterpartyExclusivity(WeighingTicket $data): void
|
||||
{
|
||||
switch ($data->getCounterpartyType()) {
|
||||
case 'CLIENT':
|
||||
if (null === $data->getClient()) {
|
||||
$this->clearCounterparty($data);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$data->setSupplier(null);
|
||||
$data->setOtherLabel(null);
|
||||
|
||||
break;
|
||||
|
||||
case 'FOURNISSEUR':
|
||||
if (null === $data->getSupplier()) {
|
||||
$this->clearCounterparty($data);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$data->setClient(null);
|
||||
$data->setOtherLabel(null);
|
||||
|
||||
break;
|
||||
|
||||
case 'AUTRE':
|
||||
$label = $this->normalizer->normalizeOtherLabel($data->getOtherLabel());
|
||||
if (null === $label) {
|
||||
$this->clearCounterparty($data);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$data->setClient(null);
|
||||
$data->setSupplier(null);
|
||||
$data->setOtherLabel($this->normalizer->normalizeOtherLabel($data->getOtherLabel()));
|
||||
$data->setOtherLabel($label);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retire toute la contrepartie d'un brouillon a la selection incomplete (type
|
||||
* sans champ associe) : on ne persiste pas une contrepartie a moitie (qui
|
||||
* violerait chk_wt_*_branch). Le brouillon reste enregistrable sans contrepartie
|
||||
* (ERP-193) ; la coherence est exigee a la validation.
|
||||
*/
|
||||
private function clearCounterparty(WeighingTicket $data): void
|
||||
{
|
||||
$data->setCounterpartyType(null);
|
||||
$data->setClient(null);
|
||||
$data->setSupplier(null);
|
||||
$data->setOtherLabel(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* RG-5.01 / RG-5.10 : normalisation serveur de l'immatriculation (trim + UPPER
|
||||
* + masque XX-000-XX hors « Tout format »). Un format invalide est traduit en
|
||||
|
||||
Reference in New Issue
Block a user