Закажите бесплатную презентацию продуктов РосБизнесСофт прямо сейчас!
Перемещение товара осуществляется документом «Перемещение» (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);
}
}