/** * Выбросить один или несколько предметов * @param User $user * @param Item|Item[] $items * @param int $quantityToDrop Сколько предметов выбросить * @return bool * @throws ItemNotFound * @throws NotEnoughItems */ public function dropItems(User $user, $items, int $quantityToDrop) : bool { $items = $this->prepareItemsArray($items); $inventoryItems = $this->inventoryItemRepository->findByUser($user); $inventoryItemCollection = new ArrayCollection($inventoryItems); foreach ($items as $item) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('item', $item)); $collectedInventoryItem = $inventoryItemCollection->matching($criteria); if ($collectedInventoryItem->isEmpty()) { throw new ItemNotFound(); } $inventoryItem = $collectedInventoryItem->first(); $itemQuantity = $inventoryItem->getQuantity(); $itemQuantityAfterDrop = $itemQuantity - $quantityToDrop; if ($itemQuantityAfterDrop == 0) { $this->inventoryItemRepository->remove($inventoryItem); } elseif ($itemQuantityAfterDrop > 0) { $inventoryItem->setQuantity($itemQuantityAfterDrop); } else { throw new NotEnoughItems(); } } $this->inventoryItemRepository->flush(); $this->logDroppedItems($user, $items, $quantityToDrop); return true; }
/** * Выбросить предмет * @param User $user * @param Item $item * @param int $quantityToDrop Сколько предметов выбросить * @return int Количество оставшихся предметов * @throws ItemNotFound * @throws NotEnoughItems */ public function dropItem(User $user, Item $item, $quantityToDrop) { $inventoryItem = $this->inventoryItemRepository->findOneByUserAndItemId($user, $item->getId()); if (!$inventoryItem) { throw new ItemNotFound(); } $itemQuantity = $inventoryItem->getQuantity(); $itemQuantityAfterDrop = $itemQuantity - $quantityToDrop; if ($itemQuantityAfterDrop == 0) { $this->inventoryItemRepository->remove($inventoryItem); } elseif ($itemQuantityAfterDrop > 0) { $inventoryItem->setQuantity($itemQuantityAfterDrop); } else { throw new NotEnoughItems(); } $this->inventoryItemRepository->flush($inventoryItem); $this->logger->info(sprintf('[%d]%s выбросил предмет: [%d]%s x %d шт. (осталось %d)', $user->getId(), $user->getName(), $item->getId(), $item->getName(), $quantityToDrop, $itemQuantityAfterDrop)); return $itemQuantityAfterDrop; }