From db5b3d39f9b2904d56d79f1db3cb0fc14ec5ac7f Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 19 Mar 2026 16:42:00 +0100 Subject: [PATCH] fix : detect isFinal transition using Doctrine UnitOfWork original entity data The previous approach read $data->getStatus() which already had the NEW status after API Platform deserialization, making wasAlreadyFinal always true when transitioning to a final status. Now we read the original status from UnitOfWork snapshot. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/State/TaskCalendarProcessor.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/State/TaskCalendarProcessor.php b/src/State/TaskCalendarProcessor.php index fd612d4..5e3013e 100644 --- a/src/State/TaskCalendarProcessor.php +++ b/src/State/TaskCalendarProcessor.php @@ -8,6 +8,7 @@ use ApiPlatform\Metadata\Delete; use ApiPlatform\Metadata\Operation; use ApiPlatform\State\ProcessorInterface; use App\Entity\Task; +use App\Entity\TaskStatus; use App\Service\CalDavService; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\DependencyInjection\Attribute\Autowire; @@ -49,9 +50,16 @@ final readonly class TaskCalendarProcessor implements ProcessorInterface return $result; } - // CRITICAL: Store original status BEFORE persist to detect isFinal transition - $originalStatus = $data->getStatus(); - $wasAlreadyFinal = $originalStatus?->getIsFinal() ?? false; + // Detect isFinal transition using Doctrine UnitOfWork. + // $data already has the NEW values (API Platform deserialized the PATCH). + // UnitOfWork originalEntityData stores the DB snapshot with entity references for relations. + $uow = $this->entityManager->getUnitOfWork(); + $originalData = $uow->getOriginalEntityData($data); + $wasAlreadyFinal = false; + + if (isset($originalData['status']) && $originalData['status'] instanceof TaskStatus) { + $wasAlreadyFinal = $originalData['status']->getIsFinal(); + } $result = $this->persistProcessor->process($data, $operation, $uriVariables, $context);