Добрый день.
Можно ли добавить доп.поле "остаток на складе" и при переводе заказа в состояние "оплачен" автоматически уменьшать "остатки" на количество купленного товара?
Плюс, можно ли ограничить количество покупаемых товаров остатками на складе? Что бы нельзя было купить 10 товаров при наличие на складе 2-х?
Как можно импортировать товары из 1С? в шопкипере есть свой сниппет для этого, в твшопе можно также?
Спасибо
Остатки на складе
Re: Остатки на складе
Здравствуйте.
1) Можно сделать. Для этого нужно написать небольшой плагин на события TSVshopOnAddItem и TSVshopOnDeleteItem (ссылка на документацию http://tsvshop.xyz/dokumentacziya/dlya- ... itiya.html), который при добавлении товара в корзину сначала проверяет количество товара на складе, потом делает необходимые действия, а также при удалении заказа возвращает товары на склад. Я на скорую набросал плагин (извините за ужасный код, сейчас заболел гриппом, голова не соображает) может не работать, но думаю, что суть понятна. Если что, пишите или спрашивайте.
2) Для импорта прекрасно подходит https://yadi.sk/d/Uky1ww-HujR9u . Поскольку это решение уже было написано, не видел необходимости писать что-то новое. Ведь товары - это обычные документы МОДх, а потому можно использовать любое подходящее решение.
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 . Поскольку это решение уже было написано, не видел необходимости писать что-то новое. Ведь товары - это обычные документы МОДх, а потому можно использовать любое подходящее решение.
Re: Остатки на складе
Окей, спасибо!
Буду пробовать
Буду пробовать
Остатки на складе
Вроде все так,проверила.А остатки на начало года,мы заносили в ручную,может там что-то не так?А у вас есть пошаговая интрукция как в этом складе работать?
Re: Остатки на складе
Пошаговой инструкции нету.
Просто устанавливаете плагин и потом вручную прописываете остатки на складе. Или каким-то другим способом. А далее плангин сам будет считать. Если есть какие-то вопросы по настройкам, пишите.
Просто устанавливаете плагин и потом вручную прописываете остатки на складе. Или каким-то другим способом. А далее плангин сам будет считать. Если есть какие-то вопросы по настройкам, пишите.
Re: Остатки на складе
добрый день, использую такой код
вычитает при добавлении и возвращает при удалении из корзины
но получается если клиент добавил в корзину и ушел с сайта то тоже списало..
можете подсказать как реализовать задачу, заранее спасибо
вычитает при добавлении и возвращает при удалении из корзины
но получается если клиент добавил в корзину и ушел с сайта то тоже списало..
можете подсказать как реализовать задачу, заранее спасибо
Код: Выделить всё
/*
Плагин для учета товаров
Конфигурация:
&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);
}
Re: Остатки на складе
если кому пригодиться вот решение:
Нужно отметить еще одно событие к плагину TSVshopOnOrderSuccess
Теперь при добавлении в корзину кол-во не меняется, а только проверяется наличие и выводит предупреждение, если товара нет/меньше чем есть.
А уже при завершении заказа кол-во списывается. Это будет работать, если заказов не очень много и одновременно не делается несколько заказов.
Если же будет много заказов одновременно, то нужно будет доработать плагин, чтобы велся учет в реальном времени.
Нужно отметить еще одно событие к плагину 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);
}
}
}
Вернуться в «Как сделать ... ?»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость