Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Перемещение товара осуществляется документом «Перемещение» (documents.changes).
В документе есть 2 поля склада: «Склад из», «Склад в». В момент добавления товара в табличную часть «Номенклатура» документа «Перемещения» Система проверяет наличие товара на «Складе из» и перемещает товар в «Складском регистре».
Для этого используется форма:
/configurator/documents.changes/?formname=changes/products/edit
Добавление товара в «Перемещение»:
if ($this->isAddForm()) { $resultFrom = []; $storehouseFrom = $this->structure->owner->storehouse_from->id; if (Stock::checkControl($this->structure->product->id, $storehouseFrom, $this->structure->number)) { $number = $this->structure->number; $storehouseTo = $this->structure->owner->storehouse_to->id; $data = Stock::getFIFOLines($this->structure->product->id, $storehouseFrom, $number); $toDispatch = $number; $break = false; foreach($data as $value) { if(!$toDispatch) break; if($toDispatch >= $value["number"]) { $toDispatch -= $value["number"]; $number = $value["number"]; } else { $number = $toDispatch; $toDispatch = 0; } $this->createPosition($this->structure, $storehouseFrom, $storehouseTo, $number, $value["gtd"], $value['price']); } } else { $this->structure->wipe(); $this->resultError("Не хватает товара на складе!"); } if (isset($resultFrom["status"]) && $resultFrom["status"] == "error") { $this->structure->wipe(); $this->resultError($result["message"]); } }
Содержание метода createPosition()
/** * создает позиции в перемещении и на складе */ protected function createPosition($position, $storehouseFrom, $storehouseTo, $number, $gtd = 0, $price = 0){ $positionDocument = $this->Data->{"documents.changes.products"}->create() ->owner($this->structure->owner->id) ->name($position->name) ->product($position->product->id) ->number($number) ->gtd($gtd) ->price_nds($position->price_nds) ->total($position->price_nds * $number) ->restore()->sync(); $resultFrom = Stock::decrease($positionDocument, $positionDocument->product->id, $storehouseFrom, $number, $price, $positionDocument->gtd->id); $resultTo = Stock::increase($positionDocument, $positionDocument->product->id, $storehouseTo, $number, $price, $positionDocument->gtd->id); }
Удаление товара из «Перемещения»:
public static function onWipe($object) { if (!Stock::checkControl($object->product->id, $object->owner->storehouse_to->id, $object->number, $object->gtd->id)) { throw new \Exception("Данный товар нельзя удалить, иначе он уйдет в минус"); } Stock::delete($object); }
При удалении документа необходимо проверить, есть ли товары на «Складе в» в методах onWipe(), onDelete():
private static function stockControl($object) { foreach ($object->products as $product) { $gtd = $product->gtd->id ? $product->gtd->id : null; if(!Stock::checkControl($product->product->id, $object->storehouse_to->id, $product->number, $gtd)) { throw new \Exception("Нельзя удалить перемещение, так как одного или нескольких товаров не хватает на складе"); } } foreach ($object->products as $product) { Stock::delete($product); } }