До нормализации ситуации в Украине, модули для Украины не продаются (касается также и технической поддержки). Как ситуация нормализуется, продажи и техническая поддержка восстановятся. Не касается ХО, ЗО, ЛНР, ДНР.
Обращаю ваше внимание, что в моих модулях нет каких-то "вшитых гадостей". Ключи не требуют подключения к интернету. Поэтому у тех, кто приобрел модуль ранее, проблем с лицензией (и т.п.) не возникнет.
-------------------------------------------------------------------------------
IMStock (OC 3) — Товароучёт (Складской учёт)
Версия для OpenCart 2.3 (ocStore) находится тут:
https://liveopencart.ru/opencart-moduli-shablony/moduli/imstock-oc-2-3-%E2%80%94-tovarouchyot-skladskoy-uchyot
Что даёт владельцу интернет-магазина возможность вести учёт поступления и списания товара в купе с их закупочной ценой (себестоимостью)? Возможность вести собственными силами учёт товара в одном месте.
Вам не нужно где-то отдельно хранить накладные и списания (сервисы, специальные программы и т.п.), а потом ещё настраивать импорт, ну или выполнять ручную корректировку количества товаров. С модулем IMStock вы можете вести учёт прямо в опенкарте.
В текущий момент модуль относительно небольшой, но если будет интерес, то и модуль будет расти.
-------------------------------------------------------------------------------
Так же вам может быть интересен модуль IMReport (OC 3) - Расширенная отчетность продаж и заказов:
https://liveopencart.ru/opencart-moduli-shablony/moduli/otchety/imreport-oc-3-rasshirennaya-otchetnost-prodaj-i-zakazov
-------------------------------------------------------------------------------
Демо OpenCart 3 (demo / demo).
Ссылка - http://oc3020rs.im-cloud.ru/admin/index.php?route=extension/module/IMStock
Возможности модуля
1.
Накладные и Списания товара.
2.
Учёт себестоимости (закупочной цены) товаров. Также себестоимость сохраняется в заказах. В текущей версии без опций.
Накладные
У накладных существует два статуса:
1.
Создано. Присваивается при создании накладной. Такие накладные можно смотреть, редактировать, удалять и переводить в статус «Завершено»
2.
Завершено. Такие накладные можно только смотреть.
ВАЖНО! Накладную из статуса «Завершено» нельзя обратно вернуть в статус «Создано» или удалить. Для вычета товара необходимо воспользоваться Списанием товара.
При изменении статуса из «Создано» в «Завершено» происходит применение товарных позиций, указанных в накладной, в соответствии с формулами.
Формула для количества:
Qact = Qreal + Qpos
Qact – актуальное количество товара.
Qreal – текущее количество товара.
Qpos – количество товара, указанное в позиции накладной.
Формула для закупочной цены (себестоимости):
Вариант 1. Если количество товара в карточке было положительным
PPact = (Qreal * PPreal + Qpos * PPpos) / (Qreal + Qpos)
PPact – актуальная закупочная цена (себестоимость).
Qreal – текущее количество товара.
PPreal – текущая закупочная цена товара.
Qpos – количество товара, указанное в позиции накладной.
PPpos – закупочная цена товара, указанная в позиции накладной.
Вариант 2. Если количество товара в карточке было меньше или равно нулю
PPact = PPpos
PPact – актуальная закупочная цена (себестоимость).
PPpos – закупочная цена товара, указанная в позиции накладной.
Примечание: Закупочная цена выставляется из позиции потому, что физически товаров по текущей себестоимости нет, они восполняются из позиции накладной по указанной закупочной цене.
Дополнительные моменты:
1. Цена товара, указанная в позиции накладной, не может быть отрицательной, но может быть равной 0 (скажем, если товар в качестве акции был предоставлен).
2. Количество товара, указанное в позиции накладной, должно быть положительным (не может быть нулевым или отрицательным).
3. Учитывайте, что модуль в текущей версии не рассчитан на полноценный учёт предзаказа (так как это требует достаточно много времени). Т.е. формула-то корректная при отрицательном количестве, но, например, если закупочная цена при пополнении из накладной будет отличаться от той, что была в предзаказе, и заказ уже помечен как выполненный (соответственно, количество товара на складе стало отрицательное), то необходим перерасчёт себестоимости заказа, так как у части товара физически иная закупочная цена. Поэтому в текущей версии подразумевается, что реальное списание товара из заказа происходит только в тот момент, когда товара на складе достаточно (как вариант, учтите это при настройке статусов в магазине). И тому подобные моменты.
Пример для понимания. Скажем, купили 100 шт. с закупочной ценой 50 руб, а на складе было всего 50 шт. Но заказ перешёл в статус «Сделка завершена» и товар был списан (в карточке стало -50 шт.). Потом добавили ещё 100 шт., но с закупочной ценой 75 руб. В такой ситуации реальная себестоимость заказа выше, так как 50 шт. было с ЗЦ 50 руб (те, что были в карточке), а недостающие 50 шт. уже с ЗЦ 75 руб. (те, что из накладной).
Списания
У списаний существует два статуса:
1.
Создано. Присваивается при создании списания. Такие списания можно смотреть, редактировать, удалять и переводить в статус «Завершено»
2.
Завершено. Такие списания можно смотреть и переводить обратно в статус «Создано».
При изменении статуса из «Создано» в «Завершено» происходит применение товарных позиций, указанных в списании, в соответствии с формулами.
Формула для количества:
Qact = Qreal - Qpos
Qact – актуальное количество.
Qreal – текущее количество товара.
Qpos – количество товара, указанное в позиции списания.
Формула для закупочной цены (себестоимости):
PPact = PPreal
PPact – актуальная закупочная цена (себестоимость)
PPreal – текущая закупочная цена товара
При изменении статуса из «Завершено» в «Создано» происходит применение товарных позиций, указанных в списании, в соответствии с формулами.
Формула для количества:
Qact = Qreal + Qpos
Qact – актуальное количество.
Qreal – текущее количество товара.
Qpos – количество товара, указанное в позиции списания.
Формула для закупочной цены (себестоимости):
Вариант 1. Если количество товара в карточке было положительным
PPact = (Qreal * PPreal + Qpos * PPpos) / (Qreal + Qpos)
PPact – актуальная закупочная цена (себестоимость).
Qreal – текущее количество товара.
PPreal – текущая закупочная цена товара.
Qpos – количество товара, указанное в позиции списания.
PPpos – закупочная цена товара, указанная в позиции списания.
Вариант 2. Если количество товара в карточке было меньше или равно нулю
PPact = PPpos
PPact – актуальная закупочная цена (себестоимость).
PPpos – закупочная цена товара, указанная в позиции списания.
Примечание: Закупочная цена выставляется из позиции потому, что физически товаров по текущей себестоимости нет, они восполняются из позиции списания по указанной закупочной цене.
Дополнительные моменты:
1. Цена товара в позиции сохраняется из карточки товара.
2. Количество товара в позиции должно быть положительным (не может быть нулевым или отрицательным).
3. Чтобы было удобнее редактировать Списание, позиции, в которых количество товара больше, чем реальное количество, подкрашиваются красненьким. Позиции, в которых количество товара равно реальному количеству, подкрашиваются жёлтеньким.
4. Если статус списания «Создано», то отображаются актуальные количество товара, его закупочная цена, обычная цена и наименование. Если статус списания «Завершено», то отображаются значения, которые были сохранены в момент изменения статуса списания (перед его применением). Скажем, было 10 шт. товара, списывается 5 шт. В сохраненном виде будет 5 шт. списано и 10 шт., которые были перед списанием, хотя реально стало 5 шт. товара. Это специально сделано, чтобы в последующем было проще анализировать списание.
5. Учитывайте, что модуль в текущей версии не рассчитан на полноценный учёт предзаказа (так как это требует достаточно много времени). Т.е. формула-то корректная при отрицательном количестве, но, например, если закупочная цена при возврате из списания будет отличаться от той, что была в предзаказе, а заказ уже помечен как выполненный (соответственно, количество товара на складе стало отрицательное), то необходим перерасчёт себестоимости заказа, так как у части товара физически иная закупочная цена. Поэтому в текущей версии подразумевается, что реальное списание товара из заказа происходит только в тот момент, когда товара на складе достаточно (как вариант, учтите это при настройке статусов в магазине). И тому подобные моменты.
Пример для понимания. Скажем, купили 100 шт. с закупочной ценой 50 руб, а на складе было всего 50 шт. Но заказ перешёл в статус «Сделка завершена» и товар был списан (в карточке стало -50 шт.). Потом вернули из списания ещё 100 шт., но с закупочной ценой 75 руб. В такой ситуации реальная себестоимость заказа выше, так как 50 шт. было с ЗЦ 50 руб (те, что были в карточке), а недостающие 50 шт. уже с ЗЦ 75 руб. (те, что были возвращены).
Учёт закупочной цены (себестоимости) в заказах
Закупочная цена (себестоимость) сохраняется как для отдельных товаров в заказе, так и в самом заказе (суммарная).
Сохранение закупочной цены товаров в заказе происходит в четырёх случаях. В момент стандартных создания или редактирования заказа. В момент, когда товар списывается из карточки (при соответствующем изменении статуса заказа). В момент, когда товар возвращается в карточку (при соответствующем изменении статуса заказа).
Пересчёт закупочной цены заказа происходит, когда сохраняется закупочная цена товаров этого заказа, а так же при любом изменении статуса заказа. Пересчёт в данном случае это суммирование того, что указано в позициях товаров.
При изменении статуса заказа в тот, при котором происходит списание товара стандартным механизмом опенкарта, количество товара корректируется стандартным образом, а закупочная цена товара остаётся неизменной.
При изменении статуса заказа в тот, при котором происходит возврат товара стандартным механизмом опенкарта, количество товара корректируется стандартным образом, а закупочная цена товара рассчитывается по формуле.
Формула для закупочной цены (себестоимости):
Вариант 1. Если количество товара в карточке было положительным
PPact = (Qreal * PPreal + Qporder * PPporder) / (Qreal + Qporder)
PPact – актуальная закупочная цена (себестоимость).
Qreal – текущее количество товара.
PPreal – текущая закупочная цена товара.
Qporder – количество товара, указанное в позиции заказа.
PPporder – закупочная цена товара, указанная в позиции заказа.
Вариант 2. Если количество товара в карточке было меньше или равно нулю
PPact = PPporder
PPact – актуальная закупочная цена (себестоимость).
PPporder – закупочная цена товара, указанная в позиции заказа.
Примечание: Закупочная цена выставляется из позиции потому, что физически товаров по текущей себестоимости нет, они восполняются из позиции заказа по указанной закупочной цене.
Дополнительные моменты:
1. Если товар не вычитается (в карточке товара указано не вычитать со склада), то количество товара и закупочная цена (себестоимость) остаются неизменными.
2. Учитывайте, что модуль в текущей версии не рассчитан на полноценный учёт предзаказа (так как это требует достаточно много времени). Т.е. формула-то корректная при отрицательном количестве, но, например, не происходит учёта предыдущих заказов.
Пример для понимания. Заказали 100 шт. с закупочной ценой 50 руб. На складе было 100 шт., т.е. они и списались. Потом поставили товар с ценой 75 руб, ещё 50 шт. На складе стало 50 шт. с ЗЦ 75 рублей. Потом оформили второй заказ с 100 шт. товара с закупочной ценой 75 руб. В карточке товара стало -50 шт. Потом первый заказ полностью вернули и из этого товара в реальности пополнили второй заказ. В такой ситуации себестоимость второго заказа не 100 шт. * 75 руб, а (50 шт. * 75 руб + 50 шт. * 50 руб).
3. Учитывайте, что стандартное редактирование заказа в админке может приводить к возврату и, соответственно, перерасчёту закупочной цены (себестоимости). Пример того, почему это важно. Скажем, вы установили модуль, но в старых-то заказах закупочной цены не было и поэтому у товаров нулевые значения себестоимости (модуль-то не знает какая в то время была себестоимость товаров). Соответственно, при возврате модуль будет считать, что у товаров в заказе была нулевая закупочная цена, и это повлияет на закупочную цену в карточке товаров.
Как перенести данные закупочной цены (себестоимости) из других полей - инструкция
В момент установки модуля к таблице product добавляется поле purchase_price с типом DECIMAL (15, 4) .
Если у вас ранее было аналогичное поле с сохранёнными закупочными ценами (себестоимостью), то ничего делать не нужно (модуль не заменит поле). Единственно, важно убедиться, что тип поля DECIMAL (15, 4) — это важно для точности расчётов.
Если у вас ранее было поле с закупочной ценой, но с другим названием, то для переноса необходимо выполнить следующий SQL-запрос (
но обязательно прочтите инструкцию полностью):
------------------------
update `oc_product` set `purchase_price` = `[Field]`
------------------------
Вместо
[Field] вставьте то поле, которое вы использовали ранее.
Например, для поля
cost запрос будет следующим:
------------------------
update `oc_product` set `purchase_price` = `cost`
------------------------
Как видите, это очень просто,
но обязательно прочтите дальше!
Несколько важных моментов:
1. Обязательно сделайте бэкап (стандартная практика для любых случаев)!
2. Если товаров много, то может потребоваться соответствующее время. Учитывайте это.
3. Учтите, что в запросе нужно заменить префикс, если при установке вы изменили стандартный префикс "oc_".
Примечание: Данный инструмент специально не добавлен в модуль, чтобы обычный пользователь не мог случайно перезатереть данные.
Особенности
1. Важно! Чтобы осуществлялся корректный подсчёт закупочной цены (себестоимости) в заказе, лицензия модуля должна быть активной, т.е. введены ключи или действует период 5 дней для ввода ключей после установки модуля (не демо, не триал и т.п.). Иначе при включенных модификаторах модуля сохраняются нулевые значения закупочной цены (себестоимости) заказа и его товаров (в те моменты, когда это предусмотрено модулем). Сделано так по той причине, что иначе может возникать некорректный расчёт (как при частичном, так и при полном отключении расчётов). Ну или вы можете отключить модификаторы модуля (ocmod), тогда никаких расчётов модуль не будет осуществлять.
2. Если вы планируете указывать много позиций в накладных и списаниях, то необходимо увеличить php параметр max_input_vars, так как при действиях с накладными и списаниями передаётся большое количество полей. Когда тестировал, то для порядка 1500 позиций значения в 10000 было вполне достаточно.
3. Учитывайте, что в накладных и списаниях сохраняются актуальные данные только при действиях (например, сохранить и завершить). В частности, в списках списаний может отображаться неактуальная сумма закупочной цены. Происходит это потому, что количество элементов в накладных и списаниях может быть большим и, соответственно, отображение списка накладных и списаний с полноценным пересчётом приводило бы к достаточно большой нагрузке на базу данных.
4. В текущей версии модуль не подразумевает закупочную цену у опций, учитывайте это.
5. Модуль подразумевает, что у товаров должно быть выставлено поле «Вычитать со склада» (Включено вычитание).
6. В случае если у товара не выставлено поле «Вычитать со склада» (Отключено вычитание), то накладные и списания нельзя использовать для такого товара. Однако поле «Закупочная цена» все равно сохраняется в заказе. Но при этом не корректируется закупочная цена товара в те моменты, когда происходит возврат товара на склад (изменение статуса заказа, при котором товар с включенным вычитанием был бы возвращен и была бы пересчитана закупочная цена).
7. Требуется, чтобы в настройках сайта было выставлено mbstring.func_overload 0. Если вы не знаете как это сделать , то уточните в вашем хостинге. В большинстве случаев по умолчанию это значение 0 (вам, как клиенту, ничего не нужно делать), но в некоторых хостингах выставляют значение 2. Это актуально в тех случаях, если у вас возникли проблемы с ключами и активацией модуля.
8. Требуется boostrap и jquery
Установка, переустановка и использование
0. Сделайте бэкап сайта — это стандартная рекомендация для любых ситуаций, когда вы меняете или корректируете что-либо в сайте, которая позволяет в случае чего экономить кучу времени, сил и нервов.
1. Распакуйте архив и скопируйте в корень сайта каталоги «admin» и «system». Не волнуйтесь, никакие файлы не будут заменены.
2. Откройте админку и установите модуль (переустановите). Это обязательно нужно сделать, чтобы были созданы необходимые таблицы модуля и добавлены необходимые поля в стандартные таблицы опенкарта.
3. Откройте Установку расширений и последовательно загрузите файлы "imstock_menu_fast_link.ocmod.zip" и "imstock_purchase_price.ocmod.zip". После чего обновите модификаторы. Если переустанавливаете модуль (следующие версии), то необходимо удалить предыдущие модификаторы перед установкой.
4. Очистите кэш твига.
5. Откройте в админке модуль (редактирование) и пользуйтесь.
Лицензия и использование
Сделано для версий OpenCart 3.0.1.1, 3.0.2.0, 3.0.3.0-3.0.3.8, ocStore 3.0.2.0, 3.0.3.7
Лицензия распространяется только для одного сайта (одного интернет-магазина). Т.е. 1 домен + все поддомены = 1 оплата. Лицензия не выписывается для TLD и прочих доменов, которые подразумевают, что пользователи могут создавать поддомены. Например, нельзя в качестве домена указать RU или COM.RU.
Лицензия для тестового домена выписывается только в том случае, когда видно, что данный тестовый домен не может быть использован для реального сайта (интернет-магазина).
Купив модуль, вы автоматически соглашаетесь с текстом лицензии.
Модуль имеет принцип распространения "as is" ("Как есть").
Ввод лицензионного ключа необходимо осуществить в течение 5 дней после установки модуля. Лицензионный ключ состоит из двух частей.
Ключи необходимо вводить так, как они были присланы, без лишних пробелов и символов.
Запрещается несанкционированное использование, копирование, перепродажа, передача модуля третьим лицам, а также иные способы распространения, в том числе в ознакомительных целях.
Если у вас русский домен, то необходимо указывать то имя, которое указано в config.php в корне сайта.
У нас решил несколько проблем:
1. Реализация закупочных цен.
С помощью модуля ImReport от этого же автора есть возможность в любой момент посмотреть, сколько у вас товара на складе, как по цене закупки, так и по цене реализации.
А с помощью ещё одного модуля есть возможность посмотреть объём продаж за месяц как валовый, так и прибыль (продажи - стоимость всех товаров по закупочной цене).
Очень помогает отслеживать все необходимые финансовые показатели.
2. Накладные.
Когда ждём товар, заранее подготавливаем накладную.
Пришел товар, пересчитали, нажимаем одну кнопку - и товар уже на сайте. Очень удобно и никаких лишних интеграций/синхронизаций! Не говоря уже про то, чтобы вручную менять количество у каждого товара.
3. Списания.
Не хотел давать доступ сотрудникам на изменение количества товара непосредственно на странице редактирования товара, т.к. эти изменения нигде не сохраняются и не отслеживаются - есть риск злоупотреблений (уменьшил количество, товар в карман).
Здесь отлично реализованы списания. Если товар ушел в брак или ещё что-то, сотрудник может его списать. Все списания видны и легко можно сопоставить наличие брака и соответствующее списание. Очень удобно!
Игорю спасибо за работу!