fix(back) : conserver le DSD de la pesée au lieu de le réallouer au save (ERP-189)

Le DSD est l'index de pesée du pont, déjà verrouillé (FOR UPDATE) à l'émission
par l'endpoint de pesée. Le WeighingTicketProcessor ne le réalloue plus à la
création : il conserve la valeur reçue, n'allouant qu'en filet de sécurité si
elle est absente. Supprime le double comptage AUTO, aligne le DSD prévisionnel
sur le DSD enregistré, et reste compatible avec le futur driver matériel
(le DSD viendra du pont et sera persisté à l'identique).
This commit is contained in:
2026-06-23 17:46:43 +02:00
parent 335d2ed207
commit a650fe8132
@@ -84,7 +84,7 @@ final class WeighingTicketProcessor implements ProcessorInterface
// depuis la base. Garde defensive si jamais il manque (ne devrait pas). // depuis la base. Garde defensive si jamais il manque (ne devrait pas).
$site = $data->getSite(); $site = $data->getSite();
if ($site instanceof Site) { if ($site instanceof Site) {
$this->allocateAutoDsd($data, $site, $isNew); $this->allocateAutoDsd($data, $site);
} }
$this->computeNetWeight($data); $this->computeNetWeight($data);
@@ -162,21 +162,25 @@ final class WeighingTicketProcessor implements ProcessorInterface
} }
/** /**
* RG-5.04 : (re)attribution AUTORITAIRE du DSD pour chaque pesee AUTO via * RG-5.04 : le DSD d'une pesee est attribue A LA PESEE (POST /api/weighbridge_readings)
* DsdAllocator (verrou FOR UPDATE). A la creation, le DSD prévisionnel envoye * et CONSERVE tel quel sur le ticket — on ne le reattribue PAS au save. Raison :
* par le client (issu de POST /api/weighbridge_readings) est ecrase. Sur PATCH, * le DSD est l'index de pesee du pont, deja verrouille (FOR UPDATE) a l'emission ;
* on n'alloue que pour une pesee AUTO encore depourvue de DSD (ex. la pesee a * demain il proviendra directement du materiel (driver reel derriere
* plein realisee apres coup) — sinon on churne le compteur a chaque edition. * WeighbridgeReaderInterface) et devra etre persiste a l'identique. Reallouer ici
* Les pesees MANUELLES conservent leur DSD (deja alloue par l'endpoint de * ecraserait cet index (double comptage aujourd'hui, perte de l'index reel demain)
* pesee, « dernier + 1 »). * et ferait diverger le DSD previsionnel affiche du DSD enregistre.
*
* On n'alloue donc qu'en FILET DE SECURITE : pesee AUTO sans DSD (ex. ticket cree
* sans passer par l'endpoint de pesee). Les pesees MANUELLES conservent egalement
* leur DSD (alloue « dernier + 1 » par l'endpoint de pesee).
*/ */
private function allocateAutoDsd(WeighingTicket $data, Site $site, bool $isNew): void private function allocateAutoDsd(WeighingTicket $data, Site $site): void
{ {
if ('AUTO' === $data->getEmptyMode() && ($isNew || null === $data->getEmptyDsd())) { if ('AUTO' === $data->getEmptyMode() && null === $data->getEmptyDsd()) {
$data->setEmptyDsd($this->dsdAllocator->next($site)); $data->setEmptyDsd($this->dsdAllocator->next($site));
} }
if ('AUTO' === $data->getFullMode() && ($isNew || null === $data->getFullDsd())) { if ('AUTO' === $data->getFullMode() && null === $data->getFullDsd()) {
$data->setFullDsd($this->dsdAllocator->next($site)); $data->setFullDsd($this->dsdAllocator->next($site));
} }
} }