diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index 301557b7..f8f6c0e9 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -400,6 +400,7 @@ class PartController extends AbstractController $amount = (float) $request->request->get('amount'); $comment = $request->request->get('comment'); $action = $request->request->get('action'); + $delete_lot_if_empty = $request->request->getBoolean('delete_lot_if_empty', false); $timestamp = null; $timestamp_str = $request->request->getString('timestamp', ''); @@ -418,7 +419,7 @@ class PartController extends AbstractController case "withdraw": case "remove": $this->denyAccessUnlessGranted('withdraw', $partLot); - $withdrawAddHelper->withdraw($partLot, $amount, $comment, $timestamp); + $withdrawAddHelper->withdraw($partLot, $amount, $comment, $timestamp, $delete_lot_if_empty); break; case "add": $this->denyAccessUnlessGranted('add', $partLot); @@ -427,7 +428,7 @@ class PartController extends AbstractController case "move": $this->denyAccessUnlessGranted('move', $partLot); $this->denyAccessUnlessGranted('move', $targetLot); - $withdrawAddHelper->move($partLot, $targetLot, $amount, $comment, $timestamp); + $withdrawAddHelper->move($partLot, $targetLot, $amount, $comment, $timestamp, $delete_lot_if_empty); break; default: throw new \RuntimeException("Unknown action!"); diff --git a/src/Services/Parts/PartLotWithdrawAddHelper.php b/src/Services/Parts/PartLotWithdrawAddHelper.php index a838beea..bcc4f057 100644 --- a/src/Services/Parts/PartLotWithdrawAddHelper.php +++ b/src/Services/Parts/PartLotWithdrawAddHelper.php @@ -9,13 +9,15 @@ use App\Entity\LogSystem\PartStockChangedLogEntry; use App\Entity\Parts\PartLot; use App\Services\LogSystem\EventCommentHelper; use App\Services\LogSystem\EventLogger; +use Doctrine\ORM\EntityManagerInterface; /** * @see \App\Tests\Services\Parts\PartLotWithdrawAddHelperTest */ final class PartLotWithdrawAddHelper { - public function __construct(private readonly EventLogger $eventLogger, private readonly EventCommentHelper $eventCommentHelper) + public function __construct(private readonly EventLogger $eventLogger, + private readonly EventCommentHelper $eventCommentHelper, private EntityManagerInterface $entityManager) { } @@ -54,9 +56,9 @@ final class PartLotWithdrawAddHelper * @param float $amount The amount of parts that should be taken from the part lot * @param string|null $comment The optional comment describing the reason for the withdrawal * @param \DateTimeInterface|null $action_timestamp The optional timestamp, where the action happened. Useful if the action happened in the past, and the log entry is created afterwards. - * @return PartLot The modified part lot + * @param bool $delete_lot_if_empty If true, the part lot will be deleted if the amount is 0 after the withdrawal. */ - public function withdraw(PartLot $partLot, float $amount, ?string $comment = null, ?\DateTimeInterface $action_timestamp = null): PartLot + public function withdraw(PartLot $partLot, float $amount, ?string $comment = null, ?\DateTimeInterface $action_timestamp = null, bool $delete_lot_if_empty = false): void { //Ensure that amount is positive if ($amount <= 0) { @@ -92,7 +94,9 @@ final class PartLotWithdrawAddHelper $this->eventCommentHelper->setMessage($comment); } - return $partLot; + if ($delete_lot_if_empty && $partLot->getAmount() === 0.0) { + $this->entityManager->remove($partLot); + } } /** @@ -144,8 +148,9 @@ final class PartLotWithdrawAddHelper * @param float $amount The amount of parts that should be moved * @param string|null $comment A comment describing the reason for the move * @param \DateTimeInterface|null $action_timestamp The optional timestamp, where the action happened. Useful if the action happened in the past, and the log entry is created afterwards. + * @param bool $delete_lot_if_empty If true, the part lot will be deleted if the amount is 0 after the withdrawal. */ - public function move(PartLot $origin, PartLot $target, float $amount, ?string $comment = null, ?\DateTimeInterface $action_timestamp = null): void + public function move(PartLot $origin, PartLot $target, float $amount, ?string $comment = null, ?\DateTimeInterface $action_timestamp = null, bool $delete_lot_if_empty = false): void { if ($amount <= 0) { throw new \InvalidArgumentException('Amount must be positive'); @@ -187,5 +192,9 @@ final class PartLotWithdrawAddHelper if (!$this->eventCommentHelper->isMessageSet() && ($comment !== null && $comment !== '')) { $this->eventCommentHelper->setMessage($comment); } + + if ($delete_lot_if_empty && $origin->getAmount() === 0.0) { + $this->entityManager->remove($origin); + } } } diff --git a/templates/parts/info/_withdraw_modal.html.twig b/templates/parts/info/_withdraw_modal.html.twig index b5c4308f..fae6a8e8 100644 --- a/templates/parts/info/_withdraw_modal.html.twig +++ b/templates/parts/info/_withdraw_modal.html.twig @@ -62,6 +62,18 @@
{% trans %}part.info.withdraw_modal.timestamp.hint{% endtrans %}
+ +
+
+ {# The timestamp must be between a year ago and 1 hour in the future #} +
+ + +
+
+