From a650fe81320f2e2533ac6cff4b07d55eac6f8218 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 23 Jun 2026 17:46:43 +0200 Subject: [PATCH] =?UTF-8?q?fix(back)=20:=20conserver=20le=20DSD=20de=20la?= =?UTF-8?q?=20pes=C3=A9e=20au=20lieu=20de=20le=20r=C3=A9allouer=20au=20sav?= =?UTF-8?q?e=20(ERP-189)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- .../Processor/WeighingTicketProcessor.php | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Module/Logistique/Infrastructure/ApiPlatform/State/Processor/WeighingTicketProcessor.php b/src/Module/Logistique/Infrastructure/ApiPlatform/State/Processor/WeighingTicketProcessor.php index 1476af0..984a298 100644 --- a/src/Module/Logistique/Infrastructure/ApiPlatform/State/Processor/WeighingTicketProcessor.php +++ b/src/Module/Logistique/Infrastructure/ApiPlatform/State/Processor/WeighingTicketProcessor.php @@ -84,7 +84,7 @@ final class WeighingTicketProcessor implements ProcessorInterface // depuis la base. Garde defensive si jamais il manque (ne devrait pas). $site = $data->getSite(); if ($site instanceof Site) { - $this->allocateAutoDsd($data, $site, $isNew); + $this->allocateAutoDsd($data, $site); } $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 - * DsdAllocator (verrou FOR UPDATE). A la creation, le DSD prévisionnel envoye - * par le client (issu de POST /api/weighbridge_readings) est ecrase. Sur PATCH, - * on n'alloue que pour une pesee AUTO encore depourvue de DSD (ex. la pesee a - * plein realisee apres coup) — sinon on churne le compteur a chaque edition. - * Les pesees MANUELLES conservent leur DSD (deja alloue par l'endpoint de - * pesee, « dernier + 1 »). + * RG-5.04 : le DSD d'une pesee est attribue A LA PESEE (POST /api/weighbridge_readings) + * et CONSERVE tel quel sur le ticket — on ne le reattribue PAS au save. Raison : + * le DSD est l'index de pesee du pont, deja verrouille (FOR UPDATE) a l'emission ; + * demain il proviendra directement du materiel (driver reel derriere + * WeighbridgeReaderInterface) et devra etre persiste a l'identique. Reallouer ici + * ecraserait cet index (double comptage aujourd'hui, perte de l'index reel demain) + * 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)); } - if ('AUTO' === $data->getFullMode() && ($isNew || null === $data->getFullDsd())) { + if ('AUTO' === $data->getFullMode() && null === $data->getFullDsd()) { $data->setFullDsd($this->dsdAllocator->next($site)); } }