/** * @param ShipmentItem $sourceItem * @param $quantity * @return Result * @throws Main\ArgumentException * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException */ private function transferItem2SystemShipment(ShipmentItem $sourceItem, $quantity) { /** @var ShipmentItemCollection $sourceItemCollection */ $sourceItemCollection = $sourceItem->getCollection(); if ($this !== $sourceItemCollection->getShipment()) { throw new Main\ArgumentException("item"); } $quantity = floatval($quantity); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $this->getCollection(); /** @var Shipment $systemShipment */ $systemShipment = $shipmentCollection->getSystemShipment(); /** @var BasketItem $basketItem */ $basketItem = $sourceItem->getBasketItem(); $shipmentItemCode = $sourceItem->getBasketCode(); if ($quantity === 0) { return new Result(); } /** @var ShipmentItemCollection $systemShipmentItemCollection */ $systemShipmentItemCollection = $systemShipment->getShipmentItemCollection(); $systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($shipmentItemCode); if (is_null($systemShipmentItem)) { $systemShipmentItem = $systemShipmentItemCollection->createItem($basketItem); } $newSystemShipmentItemQuantity = $systemShipmentItem->getQuantity() + $quantity; if ($newSystemShipmentItemQuantity < 0) { $result = new Result(); $result->addError(new ResultError(str_replace(array("#NAME#", "#QUANTITY#"), array($sourceItem->getBasketItem()->getField("NAME"), abs($quantity)), Loc::getMessage('SALE_SHIPMENT_QUANTITY_MISMATCH')), 'SALE_SHIPMENT_QUANTITY_MISMATCH')); return $result; } $systemShipmentItem->setFieldNoDemand('QUANTITY', $newSystemShipmentItemQuantity); $affectedQuantity = 0; if ($quantity > 0) { if ($sourceItem->getReservedQuantity() > 0) { $affectedQuantity = $quantity; $originalQuantity = $sourceItem->getQuantity() + $quantity; if ($sourceItem->getReservedQuantity() < $originalQuantity) { $affectedQuantity -= $originalQuantity - $sourceItem->getReservedQuantity(); } } } elseif ($quantity < 0) { if ($systemShipmentItem->getReservedQuantity() > 0) { $affectedQuantity = $quantity; if ($systemShipmentItem->getReservedQuantity() < -$affectedQuantity) { $affectedQuantity = -1 * $systemShipmentItem->getReservedQuantity(); } } } if ($affectedQuantity != 0) { $result = $sourceItem->setField("RESERVED_QUANTITY", $sourceItem->getField('RESERVED_QUANTITY') - $affectedQuantity); // if (!$result->isSuccess(true)) // return $result; $systemShipmentItem->setFieldNoDemand('RESERVED_QUANTITY', $systemShipmentItem->getField('RESERVED_QUANTITY') + $affectedQuantity); } $tryReserveResult = null; if ($quantity > 0) { if ($systemShipment->needReservation()) { /** @var Result $tryReserveResult */ $tryReserveResult = Provider::tryReserveShipmentItem($systemShipmentItem); } else { /** @var Result $tryReserveResult */ $tryReserveResult = Provider::tryUnreserveShipmentItem($systemShipmentItem); } } elseif ($quantity < 0) { if ($sourceItemCollection->getShipment()->needReservation()) { /** @var Result $tryReserveResult */ $tryReserveResult = Provider::tryReserveShipmentItem($sourceItem); } } $canReserve = false; if ($tryReserveResult === null) { $canReserve = true; } if ($tryReserveResult !== null && ($tryReserveResult->isSuccess() && ($tryReserveResultData = $tryReserveResult->getData()))) { if (array_key_exists('CAN_RESERVE', $tryReserveResultData)) { $canReserve = $tryReserveResultData['CAN_RESERVE']; } } if ($systemShipment->needReservation() && $canReserve) { $systemShipment->updateReservedFlag(); } return new Result(); }
/** * @param ShipmentItem $shipmentItem * @return float|int|null * @throws NotSupportedException * @throws SystemException */ public static function tryUnreserveShipmentItem(ShipmentItem $shipmentItem) { if (Configuration::isEnabledReservation() && $shipmentItem->getReservedQuantity() == 0) { return new Result(); } $result = new Result(); /** @var BasketItem $basketItem */ $basketItem = $shipmentItem->getBasketItem(); if ($basketItem->isBundleParent()) { return $result; } /** @var ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $shipmentItem->getCollection(); $shipment = $shipmentItemCollection->getShipment(); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); $order = $shipmentCollection->getOrder(); if (Configuration::isEnabledReservation()) { $quantity = $shipmentItem->getReservedQuantity(); } else { $quantity = $shipmentItem->getQuantity(); } $canReserve = false; /** @var Result $r */ $r = static::tryReserveBasketItem($shipmentItem->getBasketItem(), -1 * $quantity); if ($r->isSuccess()) { $availableQuantityData = $r->getData(); if (array_key_exists('AVAILABLE_QUANTITY', $availableQuantityData)) { $availableQuantity = $availableQuantityData['AVAILABLE_QUANTITY']; } else { $result->addError(new ResultError(Loc::getMessage('PROVIDER_UNRESERVE_SHIPMENT_ITEM_WRONG_AVAILABLE_QUANTITY'), 'PROVIDER_UNRESERVE_SHIPMENT_ITEM_WRONG_AVAILABLE_QUANTITY')); return $result; } if (array_key_exists('HAS_PROVIDER', $availableQuantityData)) { $canReserve = $availableQuantityData['HAS_PROVIDER']; } if ($canReserve && array_key_exists('QUANTITY_TRACE', $availableQuantityData)) { $canReserve = $availableQuantityData['QUANTITY_TRACE']; } } else { $result->addErrors($r->getErrors()); return $result; } if ($canReserve) { if ($availableQuantity > 0) { // throw new SystemException("availableQuantity"); $result->addError(new ResultError(Loc::getMessage("SALE_PROVIDER_RESERVE_SHIPMENT_ITEM_QUANTITY_NOT_ENOUGH"), "SALE_PROVIDER_RESERVE_SHIPMENT_ITEM_QUANTITY_NOT_ENOUGH")); return $result; } static::addReservationPoolItem($order->getInternalId(), $shipmentItem->getBasketItem(), $availableQuantity); if (Configuration::isEnabledReservation()) { $shipmentItem->setField('RESERVED_QUANTITY', $shipmentItem->getReservedQuantity() + $availableQuantity); } } $result->addData(array('CAN_RESERVE' => $canReserve)); return $result; }