Остатки на складе

Уроки и советы по работе с TSVshop
gregst
Сообщения: 2
Зарегистрирован: 14 сен 2016, 11:26

Остатки на складе

Сообщение gregst » 14 сен 2016, 11:31

Добрый день.

Можно ли добавить доп.поле "остаток на складе" и при переводе заказа в состояние "оплачен" автоматически уменьшать "остатки" на количество купленного товара?

Плюс, можно ли ограничить количество покупаемых товаров остатками на складе? Что бы нельзя было купить 10 товаров при наличие на складе 2-х?


Как можно импортировать товары из 1С? в шопкипере есть свой сниппет для этого, в твшопе можно также?

Спасибо

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Остатки на складе

Сообщение admin » 15 сен 2016, 13:43

Здравствуйте.
1) Можно сделать. Для этого нужно написать небольшой плагин на события TSVshopOnAddItem и TSVshopOnDeleteItem (ссылка на документацию http://tsvshop.xyz/dokumentacziya/dlya- ... itiya.html), который при добавлении товара в корзину сначала проверяет количество товара на складе, потом делает необходимые действия, а также при удалении заказа возвращает товары на склад. Я на скорую набросал плагин (извините за ужасный код, сейчас заболел гриппом, голова не соображает) может не работать, но думаю, что суть понятна. Если что, пишите или спрашивайте.

Код: Выделить всё

/*
Плагин для учета товаров на складе
 
Конфигурация:
&tvinventory=Название TV учета кол-ва товара;string;tvinventory &templateid=ID шаблона карточки товара;string; &errorchunk=Чанк с сообщением, если товара нет в наличии;string;Shop_ItemNull &lesschunk=Чанк с сообщением, если товара меньше, чем надо;string;Shop_ItemLess

События:
TSVshopOnAddItem, TSVshopOnDeleteItem
*/

global $session, $cache;
$e = &$modx->Event;

//Подключаем конфиг и ядро корзины
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/config.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/cart.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/admin/includes/core.inc.php");

// Определяем переменные
$tvinventory = (!empty($tvinventory)) ? $tvinventory : 'inventory';  // название TV для учета количества товара на складе
$templateid = (!empty($templateid)) ? $templateid : '';  // ИД шаблона карточки товара
$eventstatus = (!empty($eventstatus)) ? $eventstatus : 'Оплачено'; // статус, при котором заказ считается выполненным
$errorchunk = (!empty($errorchunk)) ? $errorchunk : '';  // Чанк с сообщением, если товара нету в наличии
$lesschunk = (!empty($lesschunk)) ? $lesschunk : '';  // Чанк с сообщением, если товара в наличии меньше, чем заказали


if (empty($templateid)) return;

$dborders=$modx->getFullTableName('shop_order');
$tvtable = $modx->getFullTableName('site_tmplvar_contentvalues');
$dborders_details=$modx->getFullTableName('shop_order_detail');

if ($e->name == 'TSVshopOnAddItem') {
   // Срабатывает при добавлении товара в корзину
   // Здесь мы будем проверять, есть ли товар в наличии при добавлении в корзину, сколько единиц доступно.
   // Если его кол-во равно 0 или пусто - не даем добавить в корзину и выводим предупреждение
   // Если его кол-во меньше, чем положено в корзину, то уменьшаем на доступное кол-во + алерт
   // Если все ок, то уменьшаем на заказанное кол-во
   // Данные о добавляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'value',$item['url']);
   swith ($count['value']) {
     case '' :
     case 0 :
      unset($_SESSION[$session]['orders'][$item['id']]);
      $modx->webAlert(getTpl($errorchunk));
      // или $e->output(getTpl($errorchunk));
      break;
     default:
      if ($count['value']< $item['qty']) {
        $modx->db->update(array('value'=>0),$tvtable,'contentid = '.$order['url'].' AND tmplvarid='.$templateid);
        $_SESSION[$session]['orders'][$item['id']]['qty'] = $count['value'];
        $modx->webAlert(getTpl($lesschunk));
        // или $e->output(getTpl($lesschunk));
      } else {
        $modx->db->update(array('value'=>floatval($count['value']-$item['qty'])),$tvtable,'contentid = '.$order['url'].' AND tmplvarid='.$templateid);
      }
     break;
   }
}

if ($e->name == 'TSVshopOnDeleteItem') {
   // При удалении товара из корзины
   // Приплюсовываем кол-во товара к общему кол-ву товара на складе
   // Данные об удаляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'value',$item['url']);
   $modx->db->update(array('value'=>floatval($count['value']+$item['qty'])),$tvtable,'contentid = '.$order['url'].' AND tmplvarid='.$templateid);
}




2) Для импорта прекрасно подходит https://yadi.sk/d/Uky1ww-HujR9u . Поскольку это решение уже было написано, не видел необходимости писать что-то новое. Ведь товары - это обычные документы МОДх, а потому можно использовать любое подходящее решение.

gregst
Сообщения: 2
Зарегистрирован: 14 сен 2016, 11:26

Re: Остатки на складе

Сообщение gregst » 15 сен 2016, 19:05

Окей, спасибо!

Буду пробовать

Genapi
Сообщения: 3
Зарегистрирован: 13 апр 2017, 12:17

Остатки на складе

Сообщение Genapi » 18 апр 2017, 10:57

Вроде все так,проверила.А остатки на начало года,мы заносили в ручную,может там что-то не так?А у вас есть пошаговая интрукция как в этом складе работать?

admin
Администратор
Сообщения: 148
Зарегистрирован: 08 фев 2013, 13:53

Re: Остатки на складе

Сообщение admin » 28 апр 2017, 16:53

Пошаговой инструкции нету.
Просто устанавливаете плагин и потом вручную прописываете остатки на складе. Или каким-то другим способом. А далее плангин сам будет считать. Если есть какие-то вопросы по настройкам, пишите.

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Остатки на складе

Сообщение ekcreate » 15 июн 2018, 12:42

добрый день, использую такой код
вычитает при добавлении и возвращает при удалении из корзины
но получается если клиент добавил в корзину и ушел с сайта то тоже списало..
можете подсказать как реализовать задачу, заранее спасибо

Код: Выделить всё

/*
Плагин для учета товаров
 
Конфигурация:
&customtv=Список добавляемых TV через запятую;string; &tvinventory=Название TV учета кол-ва товара;string;tvinventory &templateid=ID шаблона карточки товара;string; &errorchunk=Чанк с сообщением, если товара нет в наличии;string;Shop_ItemNull &lesschunk=Чанк с сообщением, если товара меньше, чем надо;string;Shop_ItemLess

События:
TSVshopOnAddItem, TSVshopOnDeleteItem
*/

global $session, $cache;
$e = &$modx->Event;

//Подключаем конфиг и ядро корзины
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/config.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/cart.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/admin/includes/core.inc.php");

// Определяем переменные
$tvinventory = (!empty($tvinventory)) ? $tvinventory : 'inventory';  // название TV для учета количества товара на складе
$templateid = (!empty($templateid)) ? $templateid : '6';  // ИД шаблона карточки товара
$errorchunk = (!empty($errorchunk)) ? $errorchunk : 'soob';  // Чанк с сообщением, если товара нету в наличии
$lesschunk = (!empty($lesschunk)) ? $lesschunk : 'soob';  // Чанк с сообщением, если товара в наличии меньше, чем заказали


if (!function_exists('setTemplateVar')) {
  function setTemplateVar($value, $docID, $tplVarName) {
    global $modx;

    //-- get tmplvar id
    $tplName = $modx->getFullTableName('site_tmplvars');
    $tplRS = $modx->db->select('id', $tplName, 'name="' . $tplVarName . '"');
    $tplRow = $modx->db->getRow($tplRS);

    $tblName = $modx->getFullTableName('site_tmplvar_contentvalues');

    $selectQuery = $modx->db->select('*', $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);

    $updFields = array (
      'value' => $value
    );
    $insFields = array (
      'tmplvarid' => $tplRow['id'],
      'contentid' => $docID,
      'value' => $value
    );

    if ($modx->db->getRecordCount($selectQuery) < 1) {
      $modx->db->insert($insFields, $tblName);
    } else {
      $modx->db->update($updFields, $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);
    }
  }
}


if (empty($templateid)) return;

$dborders=$modx->getFullTableName('shop_order');
$tvtable = $modx->getFullTableName('site_tmplvar_contentvalues');
$dborders_details=$modx->getFullTableName('shop_order_detail');

if ($e->name == 'TSVshopOnAddItem') {
   // Срабатывает при добавлении товара в корзину
   // Здесь мы будем проверять, есть ли товар в наличии при добавлении в корзину, сколько единиц доступно.
   // Если его кол-во равно 0 или пусто - не даем добавить в корзину и выводим предупреждение
   // Если его кол-во меньше, чем положено в корзину, то уменьшаем на доступное кол-во + алерт
   // Если все ок, то уменьшаем на заказанное кол-во
   // Данные о добавляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);

      if ($count['value']< $_SESSION[$session]['orders'][$item]['qty']) {
        //$modx->db->update(array('value'=>0),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
        setTemplateVar(0, $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
        $_SESSION[$session]['orders'][$item]['qty'] = $count['value'];
        $modx->webAlert(getTpl($lesschunk));
        // или $e->output(getTpl($lesschunk));
      } else {
        //$modx->db->update(array('value'=>floatval($count['value']-$_SESSION[$session]['orders'][$item]['qty'])),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
        setTemplateVar(floatval($count['value']-$_SESSION[$session]['orders'][$item]['qty']), $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
      }

   }


if ($e->name == 'TSVshopOnDeleteItem') {
   // При удалении товара из корзины
   // Приплюсовываем кол-во товара к общему кол-ву товара на складе
   // Данные об удаляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);
   //$modx->db->update(array('value'=>floatval($count['value']+$_SESSION[$session]['orders'][$item]['qty'])),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
   setTemplateVar(floatval($count['value']+$_SESSION[$session]['orders'][$item]['qty']), $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
}

ekcreate
Сообщения: 76
Зарегистрирован: 04 мар 2016, 12:08

Re: Остатки на складе

Сообщение ekcreate » 19 июн 2018, 13:36

если кому пригодиться вот решение:
Нужно отметить еще одно событие к плагину TSVshopOnOrderSuccess
Теперь при добавлении в корзину кол-во не меняется, а только проверяется наличие и выводит предупреждение, если товара нет/меньше чем есть.
А уже при завершении заказа кол-во списывается. Это будет работать, если заказов не очень много и одновременно не делается несколько заказов.
Если же будет много заказов одновременно, то нужно будет доработать плагин, чтобы велся учет в реальном времени.

Код: Выделить всё

/*
Плагин для учета товаров
 
Конфигурация:
&customtv=Список добавляемых TV через запятую;string; &tvinventory=Название TV учета кол-ва товара;string;tvinventory &templateid=ID шаблона карточки товара;string; &errorchunk=Чанк с сообщением, если товара нет в наличии;string;Shop_ItemNull &lesschunk=Чанк с сообщением, если товара меньше, чем надо;string;Shop_ItemLess

События:
TSVshopOnOrderSuccess, TSVshopOnDeleteItem
*/

global $session, $cache;
$e = &$modx->Event;

//Подключаем конфиг и ядро корзины
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/config.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/cart.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/admin/includes/core.inc.php");

// Определяем переменные
$tvinventory = (!empty($tvinventory)) ? $tvinventory : 'inventory';  // название TV для учета количества товара на складе
$templateid = (!empty($templateid)) ? $templateid : '6';  // ИД шаблона карточки товара
$errorchunk = (!empty($errorchunk)) ? $errorchunk : 'soob';  // Чанк с сообщением, если товара нету в наличии
$lesschunk = (!empty($lesschunk)) ? $lesschunk : 'soob';  // Чанк с сообщением, если товара в наличии меньше, чем заказали


if (!function_exists('setTemplateVar')) {
  function setTemplateVar($value, $docID, $tplVarName) {
    global $modx;

    //-- get tmplvar id
    $tplName = $modx->getFullTableName('site_tmplvars');
    $tplRS = $modx->db->select('id', $tplName, 'name="' . $tplVarName . '"');
    $tplRow = $modx->db->getRow($tplRS);

    $tblName = $modx->getFullTableName('site_tmplvar_contentvalues');

    $selectQuery = $modx->db->select('*', $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);

    $updFields = array (
      'value' => $value
    );
    $insFields = array (
      'tmplvarid' => $tplRow['id'],
      'contentid' => $docID,
      'value' => $value
    );

    if ($modx->db->getRecordCount($selectQuery) < 1) {
      $modx->db->insert($insFields, $tblName);
    } else {
      $modx->db->update($updFields, $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);
    }
  }
}


if (empty($templateid)) return;

$dborders=$modx->getFullTableName('shop_order');
$tvtable = $modx->getFullTableName('site_tmplvar_contentvalues');
$dborders_details=$modx->getFullTableName('shop_order_detail');


if ($e->name == 'TSVshopOnAddItem') {
   // Срабатывает при добавлении товара в корзину
   // Здесь мы будем проверять, есть ли товар в наличии при добавлении в корзину, сколько единиц доступно.
   // Если его кол-во равно 0 или пусто - не даем добавить в корзину и выводим предупреждение
   // Если его кол-во меньше, чем положено в корзину, то уменьшаем на доступное кол-во + алерт
   // Если все ок, то уменьшаем на заказанное кол-во
   // Данные о добавляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);

      if ($count['value']< $_SESSION[$session]['orders'][$item]['qty']) {
        //setTemplateVar(0, $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
        $_SESSION[$session]['orders'][$item]['qty'] = $count['value'];
        $modx->webAlert(getTpl($lesschunk));
      }

   }


if ($e->name == 'TSVshopOnOrderSuccess') {
 
   $orders = $_SESSION['tsvshopfin']['orders'];
   
   foreach ($orders as $k=>$item) {
      $count = $modx->getTemplateVar($tvinventory,'*',$item['url']);
      if ($count['value']< $item['qty']) {
        setTemplateVar(0, $item['url'], $tvinventory);
      } else {
        setTemplateVar(floatval($count['value']-$item['qty']), $item['url'], $tvinventory);
      }
   }
}


Вернуться в «Как сделать ... ?»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя