8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

Документация разработчика

РосБизнесСофт CRM > База знаний > Разработчикам > Создание перемещения товара

Создание перемещения товара

Перемещение товара осуществляется документом «Перемещение» (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);
    }
}

Как проверить, что товар перемещен на склад корректно?

  • Зайти в в раздел «Номенклатура» (/products/). Найти нужный товар и выбрать склад (по умолчанию «Основной»), в столбце «Количество» будет показано количество товара.  Если оно изменилось в большую сторону, то добавления товара на склад прошло успешно. Соответственно на другом складе товар должен быть уйти.
  • Зайти в отчет «По движению товаров по складам» (/olap/products_movement/) и построить отчет по выбранному товару и складу. В отчете в таблице будут показаны документы движения. Если новый документ “Перемещение”  присутствует в списке, то товар был перемещен на другой склад успешно.