2.2.1
04.09.2026
# Changelog
## 2.2.1
- Исправление: поле количества в строке товара было настолько узким, что видна
оставалась одна цифра. Теперь оно всегда показывает не меньше четырёх знаков и
расширяется прямо во время набора, если число длиннее. Так же ведёт себя поле
цены (минимум семь знаков — «1234.56») и поле количества в попапе.
- Найдена и устранена общая причина: базовое правило полей `#kpos-root input[…]`
(специфичность 1,0,1) перебивало собственную геометрию полей внутри
компонентов — у поля количества вместо своих отступов 2 px применялись общие
12 px, плюс лишние рамка, фон и высота. Из-за этого же поле сканера рисовалось
как «поле внутри поля». Базовые правила теперь применяются только к полям без
собственного класса, а `.kpos-input` перечислен явно.
- Колонка «Сумма» расширена и больше не переносит крупные суммы на вторую строку
(«975 625,00 ₽» помещается в одну).
## 2.2.0
- Новое: кнопка «ОПЛАТА НА КАССЕ» в попапе после оформления самовывоза (видна,
когда активен плагин KnitCat aQsi). Терминал сразу отправляет заказ в кассу —
не через очередь, чтобы чек появился на терминале немедленно — и начинает
опрашивать статус чека каждые 3 секунды. Как только касса отвечает «Оплачен»,
показывается «✓ Успешно оплачено», идёт обратный отсчёт 5 секунд, и заказ
переводится в «Выполнен» с заметкой «Оплата подтверждена кассой aQsi».
Если чек отменён на кассе — продажа не закрывается и об этом сообщается;
если касса молчит 3 минуты — ожидание прекращается с кнопкой «Проверить ещё
раз», заказ при этом остаётся в кассе и не теряется.
- Кнопки НАЛИЧНЫЕ и КАРТА работают как прежде — ручное закрытие продажи, когда
касса недоступна или чек пробит отдельно. Оплата, подтверждённая кассой,
повторно чек туда не отправляет: заказ там уже есть.
- Обмен с кассой идёт через публичные методы самого плагина aQsi
(`KnitCat_Aqsi_Order_Sync`, `KnitCat_Aqsi_Api_Client`, `GET /v2/Orders/simple/{id}`).
Своей копии его логики и своих запросов к API кассы в POS нет.
- Требуется KnitCat aQsi 1.8.0: там появилась настройка, которая запрещает
автоматически отправлять заказы POS в кассу на каждой смене статуса.
## 2.1.0
- Новое: заказ создаётся в WooCommerce сразу, как только в корзину попал первый
товар — в статусе «В ожидании оплаты» и с номером, который виден в шапке
терминала. Дальше он сохраняется в фоне через 10 секунд после последнего
действия кассира: запросы не блокируют интерфейс, не трогают фокус поля
сканера и не мешают продолжать пробивать товар. Рядом с номером видно
состояние — «сохраняем…», «сохранён 14:53» или «не сохранён».
- Автосохранение не создаёт лишних записей в истории заказа: служебные заметки,
комментарий кассира и технический email добавляются один раз — при завершении
продажи. Статус черновика не переключается, поэтому заказ, открытый с
удержания, так и остаётся на удержании, пока продажу не завершат.
- Оформление (САМОВЫВОЗ / ДОСТАВКА / НА УДЕРЖАНИЕ) обновляет уже созданный
заказ, а не заводит в
2.2.0
03.09.2026
# Changelog
## 2.2.0
- Новое: кнопка «ОПЛАТА НА КАССЕ» в попапе после оформления самовывоза (видна,
когда активен плагин KnitCat aQsi). Терминал сразу отправляет заказ в кассу —
не через очередь, чтобы чек появился на терминале немедленно — и начинает
опрашивать статус чека каждые 3 секунды. Как только касса отвечает «Оплачен»,
показывается «✓ Успешно оплачено», идёт обратный отсчёт 5 секунд, и заказ
переводится в «Выполнен» с заметкой «Оплата подтверждена кассой aQsi».
Если чек отменён на кассе — продажа не закрывается и об этом сообщается;
если касса молчит 3 минуты — ожидание прекращается с кнопкой «Проверить ещё
раз», заказ при этом остаётся в кассе и не теряется.
- Кнопки НАЛИЧНЫЕ и КАРТА работают как прежде — ручное закрытие продажи, когда
касса недоступна или чек пробит отдельно. Оплата, подтверждённая кассой,
повторно чек туда не отправляет: заказ там уже есть.
- Обмен с кассой идёт через публичные методы самого плагина aQsi
(`KnitCat_Aqsi_Order_Sync`, `KnitCat_Aqsi_Api_Client`, `GET /v2/Orders/simple/{id}`).
Своей копии его логики и своих запросов к API кассы в POS нет.
- Требуется KnitCat aQsi 1.8.0: там появилась настройка, которая запрещает
автоматически отправлять заказы POS в кассу на каждой смене статуса.
## 2.1.0
- Новое: заказ создаётся в WooCommerce сразу, как только в корзину попал первый
товар — в статусе «В ожидании оплаты» и с номером, который виден в шапке
терминала. Дальше он сохраняется в фоне через 10 секунд после последнего
действия кассира: запросы не блокируют интерфейс, не трогают фокус поля
сканера и не мешают продолжать пробивать товар. Рядом с номером видно
состояние — «сохраняем…», «сохранён 14:53» или «не сохранён».
- Автосохранение не создаёт лишних записей в истории заказа: служебные заметки,
комментарий кассира и технический email добавляются один раз — при завершении
продажи. Статус черновика не переключается, поэтому заказ, открытый с
удержания, так и остаётся на удержании, пока продажу не завершат.
- Оформление (САМОВЫВОЗ / ДОСТАВКА / НА УДЕРЖАНИЕ) обновляет уже созданный
заказ, а не заводит второй: терминал передаёт его номер. На время оформления
фоновое сохранение приостанавливается, чтобы два запроса не пересобирали
состав одного заказа одновременно.
- При закрытии вкладки последние изменения дописываются через `sendBeacon` —
обычный фоновый запрос браузер в этот момент обрывает.
- Пауза автосохранения задана в данных страницы (`autosave.delay`), значение по
умолчанию — 10 секунд.
## 2.0.2
- Исправление (баг-репорт с историей заказа #122174): при переоформлении
отложенного заказа товар списывался со склада дважды — в примере остаток ушёл
с 823 до −111 вместо 356. Причина: WooCommerce помнит списание не флагом на
заказе, а мета-полем `_reduced_stock` на каждой позиции. Терминал при
переоформлении удаляет все позиции и создаёт заново, вместе со старыми
позициями пропадала и эта мета — штатному возврату запаса (он срабатывает при
переходе в
2.1.0
03.09.2026
# Changelog
## 2.1.0
- Новое: заказ создаётся в WooCommerce сразу, как только в корзину попал первый
товар — в статусе «В ожидании оплаты» и с номером, который виден в шапке
терминала. Дальше он сохраняется в фоне через 10 секунд после последнего
действия кассира: запросы не блокируют интерфейс, не трогают фокус поля
сканера и не мешают продолжать пробивать товар. Рядом с номером видно
состояние — «сохраняем…», «сохранён 14:53» или «не сохранён».
- Автосохранение не создаёт лишних записей в истории заказа: служебные заметки,
комментарий кассира и технический email добавляются один раз — при завершении
продажи. Статус черновика не переключается, поэтому заказ, открытый с
удержания, так и остаётся на удержании, пока продажу не завершат.
- Оформление (САМОВЫВОЗ / ДОСТАВКА / НА УДЕРЖАНИЕ) обновляет уже созданный
заказ, а не заводит второй: терминал передаёт его номер. На время оформления
фоновое сохранение приостанавливается, чтобы два запроса не пересобирали
состав одного заказа одновременно.
- При закрытии вкладки последние изменения дописываются через `sendBeacon` —
обычный фоновый запрос браузер в этот момент обрывает.
- Пауза автосохранения задана в данных страницы (`autosave.delay`), значение по
умолчанию — 10 секунд.
## 2.0.2
- Исправление (баг-репорт с историей заказа #122174): при переоформлении
отложенного заказа товар списывался со склада дважды — в примере остаток ушёл
с 823 до −111 вместо 356. Причина: WooCommerce помнит списание не флагом на
заказе, а мета-полем `_reduced_stock` на каждой позиции. Терминал при
переоформлении удаляет все позиции и создаёт заново, вместе со старыми
позициями пропадала и эта мета — штатному возврату запаса (он срабатывает при
переходе в «В ожидании оплаты») возвращать было уже нечего, зато отметка
«запас списан» с заказа снималась, и при переводе в «Выполнен» те же товары
списывались повторно. Теперь запас возвращается явно и ДО пересборки позиций:
в истории заказа появляется запись «Запас увеличен», а списание при оплате
даёт верный итог.
## 2.0.1
- Исправление: у активной вкладки («Терминал» / «Настройки» / «Регистрация») текст
оставался синим на синей пилюле и был нечитаем. Причина — собственное правило
`#kpos-root a` со специфичностью 1,0,1: оно перебивало цвет, заданный классом
вкладки. Базовый цвет ссылок теперь применяется только к ссылкам без своего класса,
а у вкладок цвет задан явным правилом. Тем же правилом раньше перекрашивались и
ссылки-кнопки — например «ПЕРЕЙТИ В ЗАКАЗ» в попапе после оформления.
- UI: в строке товара кнопки «−» и «+» стали заметно крупнее (30×30 у количества),
а поле ввода — уже. В попапе количества кнопки увеличены до 58×58. Попутно нашлась
причина, по которой размеры полей вообще не применялись: базовое правило полей с
`#kpos-root` перебивало размеры компонентов, а кнопки без `flex: 0 0 auto`
сжимались вместе с колонкой таблицы.
- Новое: в списке пунктов выдачи (СДЭК, отделения Почты России, ПВЗ Яндекс.Ма
2.0.1
31.08.2026
# Changelog
## 2.0.1
- Исправление: у активной вкладки («Терминал» / «Настройки» / «Регистрация») текст
оставался синим на синей пилюле и был нечитаем. Причина — собственное правило
`#kpos-root a` со специфичностью 1,0,1: оно перебивало цвет, заданный классом
вкладки. Базовый цвет ссылок теперь применяется только к ссылкам без своего класса,
а у вкладок цвет задан явным правилом. Тем же правилом раньше перекрашивались и
ссылки-кнопки — например «ПЕРЕЙТИ В ЗАКАЗ» в попапе после оформления.
- UI: в строке товара кнопки «−» и «+» стали заметно крупнее (30×30 у количества),
а поле ввода — уже. В попапе количества кнопки увеличены до 58×58. Попутно нашлась
причина, по которой размеры полей вообще не применялись: базовое правило полей с
`#kpos-root` перебивало размеры компонентов, а кнопки без `flex: 0 0 auto`
сжимались вместе с колонкой таблицы.
- Новое: в списке пунктов выдачи (СДЭК, отделения Почты России, ПВЗ Яндекс.Маркета)
появился поиск по названию и адресу — фильтрует уже загруженный список, без
повторных запросов. Такой же поиск добавлен в блок доставки на странице заказа.
- UI: заголовок колонки «Остаток после заказа» сокращён до «Остаток» (полный текст —
во всплывающей подсказке): длинный заголовок не давал колонке сжиматься и вытеснял
остальные за край панели. Ширины колонок пересчитаны, цена помещается вместе с
редактором.
## 2.0.0
Плагин переписан с нуля: новая архитектура, новый интерфейс, новый фронтенд.
Функциональность соответствует версии 1.19.3 — ничего не убрано.
### Архитектура
- Тонкий главный файл + автозагрузка классов. Логика разнесена по слоям:
`KPOS_Plugin` (загрузка), `KPOS_Settings` (опции), `KPOS_Admin_Page` + `KPOS_Assets`
(страница и ассеты), `KPOS_Ajax_Router` (единая точка входа AJAX), контроллеры
в `includes/ajax/`, бизнес-логика в `includes/services/`, доставка в `includes/shipping/`.
- Вместо 27 самостоятельных AJAX-обработчиков — роутер: нонс, права и обработка
ошибок проверяются в одном месте, контроллеры возвращают массив, ошибка — исключение
`KPOS_Ajax_Error`. Формат ответа теперь одинаковый у всех запросов.
- Входные данные читаются только через `KPOS_Request`: у каждого значения гарантированно
есть санитизация нужного типа.
- Разметка терминала вынесена в шаблоны `includes/views/`, из PHP-классов убрана.
- Объявлена совместимость с HPOS (custom order tables).
### Интерфейс
- Терминал переоформлен полностью. Стили написаны заново на дизайн-токенах:
два комплекта переменных (тёмная и светлая тема), переключатель темы в шапке,
выбор запоминается в браузере и применяется до первой отрисовки.
- Всё оформление живёт внутри `#kpos-root`, поэтому конфликты со стилями админки
невозможны — в новом CSS нет ни одного `!important` (в 1.19.x их накопилось
больше двух десятков, включая принудительную перекраску списков через JS).
- Свои компоненты вместо Select2/selectWoo: автокомплит с клавиатурной навигацией,
модальные окна, тосты, степперы. Отсюда же исчез целый клас
2.0.0
31.08.2026
# Changelog
## 2.0.0
Плагин переписан с нуля: новая архитектура, новый интерфейс, новый фронтенд.
Функциональность соответствует версии 1.19.3 — ничего не убрано.
### Архитектура
- Тонкий главный файл + автозагрузка классов. Логика разнесена по слоям:
`KPOS_Plugin` (загрузка), `KPOS_Settings` (опции), `KPOS_Admin_Page` + `KPOS_Assets`
(страница и ассеты), `KPOS_Ajax_Router` (единая точка входа AJAX), контроллеры
в `includes/ajax/`, бизнес-логика в `includes/services/`, доставка в `includes/shipping/`.
- Вместо 27 самостоятельных AJAX-обработчиков — роутер: нонс, права и обработка
ошибок проверяются в одном месте, контроллеры возвращают массив, ошибка — исключение
`KPOS_Ajax_Error`. Формат ответа теперь одинаковый у всех запросов.
- Входные данные читаются только через `KPOS_Request`: у каждого значения гарантированно
есть санитизация нужного типа.
- Разметка терминала вынесена в шаблоны `includes/views/`, из PHP-классов убрана.
- Объявлена совместимость с HPOS (custom order tables).
### Интерфейс
- Терминал переоформлен полностью. Стили написаны заново на дизайн-токенах:
два комплекта переменных (тёмная и светлая тема), переключатель темы в шапке,
выбор запоминается в браузере и применяется до первой отрисовки.
- Всё оформление живёт внутри `#kpos-root`, поэтому конфликты со стилями админки
невозможны — в новом CSS нет ни одного `!important` (в 1.19.x их накопилось
больше двух десятков, включая принудительную перекраску списков через JS).
- Свои компоненты вместо Select2/selectWoo: автокомплит с клавиатурной навигацией,
модальные окна, тосты, степперы. Отсюда же исчез целый класс багов 1.19.x с
нечитаемыми выпадающими списками.
- Попап количества, попап оплаты (наличные со сдачей и быстрыми суммами, карта),
подтверждения — новые, на той же дизайн-системе.
- Сообщения об ошибках больше не показываются через `alert()`.
### Фронтенд
- jQuery и Select2 больше не используются: чистый ES6+, модули `kpos-core`,
`kpos-ui`, `kpos-cart`, `kpos-customer`, `kpos-shipping`, `kpos-checkout`, `kpos-app`
с общим состоянием и подпиской на его изменения.
- Суммы форматируются по настройкам валюты WooCommerce, а не жёстко рублём.
- Состояние терминала по-прежнему переживает переключение вкладок страницы.
### Доставка
- Логика расчёта перенесена без изменения алгоритма — включая обход
`should_send_cart_api_request()` (см. `WOODEV_PATCH.md`), отключение суточного кеша
Woodev на время расчёта, запись локации в user meta, ручную загрузку
`WC_Yandex_Delivery_Checkout` ради `yandex_geo_id`, вызов фильтра
`woocommerce_cart_shipping_packages` и передачу `cart_subtotal` в пакет.
- Подробная диагностика зон и методов теперь запускается только когда тарифов не
нашлось. Раньше она выполнялась при каждом расчёте и дублировала обращения к API
перевозчиков — расчёт был вдвое дороже и медленнее без всякой пользы.
- Сохранение полного объекта тарифа в сессию и сборка позиции доставки из него
(meta_data для экспорта в Почту России и
1.19.3
28.08.2026
# Changelog
## 1.19.3
- Исправление (по присланному пользователем скриншоту: список «Область» в блоке доставки открывался с белым фоном и бледным текстом, хотя «Поиск клиента» после 1.19.2 уже красился верно): найден конкретный баг в самом JS-фиксе 1.19.2 — он находил и красил только ПЕРВЫЙ подходящий элемент на странице (`document.querySelector('.select2-container--open .select2-dropdown')`). Селекты страна→область→город пересоздаются через `.select2('destroy')` при каждой смене (это штатное поведение pos-shipping.js), и после такой пересборки на странице мог остаться «устаревший» узел с тем же классом `.select2-container--open` раньше в DOM, чем реально открытый сейчас дропдаун — красился не тот. Теперь красятся ВСЕ подходящие узлы на странице, а не только первый найденный
- Проверено воспроизведением именно этого сценария локально (Playwright): страна → смена страны (пересоздаёт select2 области, как в реальном коде) → открыть область — список окрашивается корректно (тот же тест содержит те же названия регионов, что были на скриншоте пользователя)
## 1.19.2
- Исправление (по факту — присланный пользователем скриншот реального сайта показал, что фикс 1.19.1 через CSS не сработал: дропдаун «Найти клиента» остался белым с бледно-серым текстом «No results found», хотя в изолированной локальной проверке те же самые правила отрабатывали верно): раз на этом сайте что-то на уровне CSS-каскада всё равно побеждает наши правила способом, который не удалось воспроизвести локально, — тема выпадающего списка select2 теперь принудительно применяется через JS сразу после открытия (`select2:open`), напрямую через `element.style.setProperty(..., 'important')`, что не зависит от каскада/специфичности CSS и должно перекрыть практически любое стороннее правило. Проверено в тесте с намеренно «враждебным» CSS-файлом (тот же трюк — белый фон, серый текст, тоже с !important, подключён ПОСЛЕ pos.css) — JS-принудительная перекраска побеждает и его
- Варианты списка (названия товаров, клиенты) и поле поиска внутри дропдауна тоже красятся тем же способом; новые варианты, подгружаемые ajax-поиском уже после открытия списка, отслеживаются через MutationObserver и красятся сразу при появлении
- Если после этого обновления проблема всё ещё останется — значит источник конфликта не в CSS/JS-каскаде вообще, а в чём-то более необычном (например, в самом select2 переопределяют инлайн-стили после нашего кода, или подключена другая версия jQuery/select2 с конфликтующим неймспейсом) — тогда нужен доступ к консоли разработчика на реальном сайте для дальнейшей диагностики
## 1.19.1
- Исправление (найдено и воспроизведено локально в headless Chromium через Playwright с реальной библиотекой select2 4.0.13 и реальным select2.scss из репозитория WooCommerce — не вслепую): в выпадающем списке «Поиск по названию» название товара было почти нечитаемым — тёмно-серый текст (#1d2327, унаследован из старого светлого дизайна до переоформления в «стекло», см. .kpos-product-option__name) на тёмном
1.18.2
28.08.2026
# Changelog
## 1.18.2
- Исправление (проверено локально в headless Chromium через Playwright — скриншоты + замер geometry/scrollHeight, не вслепую): три бага, внесённые фиксом 1.18.1
- «Срезало левую часть окна» — из-за overflow-x:hidden на новой обёртке #kpos-page-root, которая клипала намеренный отрицательный margin (-20px) у .kpos-wrap. Убрано с #kpos-page-root.
- «Два вертикальных скроллбара» — пара overflow-x:hidden + overflow-y:visible на одном и том же .kpos-wrap по спецификации CSS Overflow вычислялась браузером как overflow-y:auto, превращая .kpos-wrap в реальный скролл-контейнер. Декоративные «блобы» фона вынесены в отдельный слой `.kpos-blob-layer` (свой overflow:hidden), у самого .kpos-wrap оставлен только исходный overflow-x:hidden без объявления overflow-y.
- «0,00 ₽ обрезается снизу» — увеличен line-height и добавлен запас по padding у крупного градиентного текста итоговых сумм, чтобы не задевать overflow:hidden рамку .kpos-order-total (нужен для скруглённых углов).
- Дополнительно: шапка страницы (H1 + вкладки) на вкладке «Терминал» теперь тоже следует пилюле день/ночь (раньше оставалась светлой заплаткой на тёмном фоне) — точечно, через :has(.kpos-wrap), поэтому вкладки «Настройки»/«Регистрация» не затронуты
## 1.18.1
- Исправление: лишние горизонтальный и вертикальный скроллбары после нового визуала вкладки «Терминал» (v1.18.0) — `.kpos-wrap` и новая обёртка `#kpos-page-root` теперь жёстко блокируют горизонтальный overflow (`overflow-x: hidden !important` в обоих местах, `max-width: 100%`, `box-sizing: border-box` на всех вложенных элементах) и явно оставляют вертикальный overflow свободным (`overflow-y: visible`), вместо прежнего `overflow: hidden`, который клипал обе оси разом
## 1.18.0
- UI: вкладка «Терминал» переоформлена по присланному пользователем HTML-макету (NovaPOS) — стеклянные карточки с размытием, градиентные акценты, шрифт Manrope, декоративные размытые «блобы» фона
- UI: добавлена пилюля переключения темы (☀️/🌙) в шапке страницы «POS» — переключает светлую/тёмную тему вкладки «Терминал», выбор запоминается в localStorage браузера и восстанавливается без мигания при перезагрузке
- Примечание: вкладки «Настройки» и «Регистрация» остаются стандартными формами WordPress (Settings API) — макет был прислан именно для терминала, эти вкладки не переоформлялись
## 1.17.1
- Изменение: блок «Заказы клиента» (интеграция с KnitCat Order Info) в POS-терминале теперь управляется отдельным тумблером в настройках POS (по умолчанию включён), доступным только когда плагин Order Info активен
- Изменение: убрана собственная копия логики Order Info (дефолтные статусы/лимит/пороги % выкупа/цвета статусов), которая раньше подставлялась в POS, если плагин был неактивен — теперь при неактивном или выключенном тумблером плагине блок просто не показывается, вся логика остаётся только в самом плагине KnitCat Order Info
- Безопасность/надёжность: серверная проверка тумблера и активности плагина в AJAX-обработчике `kpos_get_customer_
1.18.0
28.08.2026
# Changelog
## 1.18.0
- UI: вкладка «Терминал» переоформлена по присланному пользователем HTML-макету (NovaPOS) — стеклянные карточки с размытием, градиентные акценты, шрифт Manrope, декоративные размытые «блобы» фона
- UI: добавлена пилюля переключения темы (☀️/🌙) в шапке страницы «POS» — переключает светлую/тёмную тему вкладки «Терминал», выбор запоминается в localStorage браузера и восстанавливается без мигания при перезагрузке
- Примечание: вкладки «Настройки» и «Регистрация» остаются стандартными формами WordPress (Settings API) — макет был прислан именно для терминала, эти вкладки не переоформлялись
## 1.17.1
- Изменение: блок «Заказы клиента» (интеграция с KnitCat Order Info) в POS-терминале теперь управляется отдельным тумблером в настройках POS (по умолчанию включён), доступным только когда плагин Order Info активен
- Изменение: убрана собственная копия логики Order Info (дефолтные статусы/лимит/пороги % выкупа/цвета статусов), которая раньше подставлялась в POS, если плагин был неактивен — теперь при неактивном или выключенном тумблером плагине блок просто не показывается, вся логика остаётся только в самом плагине KnitCat Order Info
- Безопасность/надёжность: серверная проверка тумблера и активности плагина в AJAX-обработчике `kpos_get_customer_orders_info`, а не только на фронтенде
## 1.17.0
- Архитектура: жёсткая зависимость от активного knitcat-woo (`knitcat_core_is_active()`) — без него POS не грузит свои модули и показывает admin-уведомление
- Архитектура: функциональные модули (POS-терминал, метабокс расчёта доставки в заказе) теперь требуют регистрации сайта (`knitcat_site_is_registered()`); страница настроек и вкладка «Регистрация» остаются доступны всегда
- UI: вкладка «Регистрация» показывает ✅/❌ статус регистрации сайта
- Безопасность: `class-knitcat-updater.php` обновлён до SDK 1.1.0 — проверка SHA-256 и allowed-host скачиваемого пакета обновления перед установкой (fail-closed)
- Исправление: `class-knitcat-registration.php` — исправлен баг определения версии плагина при регистрации (было `KNITCAT_KNITCAT_POS_VERSION`, стало `KNITCAT_POS_VERSION`)
- Безопасность: у всех булевых опций `register_setting()` добавлен явный `sanitize_callback`
1.17.1
26.08.2026
# Changelog
## 1.17.1
- Изменение: блок «Заказы клиента» (интеграция с KnitCat Order Info) в POS-терминале теперь управляется отдельным тумблером в настройках POS (по умолчанию включён), доступным только когда плагин Order Info активен
- Изменение: убрана собственная копия логики Order Info (дефолтные статусы/лимит/пороги % выкупа/цвета статусов), которая раньше подставлялась в POS, если плагин был неактивен — теперь при неактивном или выключенном тумблером плагине блок просто не показывается, вся логика остаётся только в самом плагине KnitCat Order Info
- Безопасность/надёжность: серверная проверка тумблера и активности плагина в AJAX-обработчике `kpos_get_customer_orders_info`, а не только на фронтенде
## 1.17.0
- Архитектура: жёсткая зависимость от активного knitcat-woo (`knitcat_core_is_active()`) — без него POS не грузит свои модули и показывает admin-уведомление
- Архитектура: функциональные модули (POS-терминал, метабокс расчёта доставки в заказе) теперь требуют регистрации сайта (`knitcat_site_is_registered()`); страница настроек и вкладка «Регистрация» остаются доступны всегда
- UI: вкладка «Регистрация» показывает ✅/❌ статус регистрации сайта
- Безопасность: `class-knitcat-updater.php` обновлён до SDK 1.1.0 — проверка SHA-256 и allowed-host скачиваемого пакета обновления перед установкой (fail-closed)
- Исправление: `class-knitcat-registration.php` — исправлен баг определения версии плагина при регистрации (было `KNITCAT_KNITCAT_POS_VERSION`, стало `KNITCAT_POS_VERSION`)
- Безопасность: у всех булевых опций `register_setting()` добавлен явный `sanitize_callback`
1.17.0
25.08.2026
# Changelog
## 1.17.0
- Архитектура: жёсткая зависимость от активного knitcat-woo (`knitcat_core_is_active()`) — без него POS не грузит свои модули и показывает admin-уведомление
- Архитектура: функциональные модули (POS-терминал, метабокс расчёта доставки в заказе) теперь требуют регистрации сайта (`knitcat_site_is_registered()`); страница настроек и вкладка «Регистрация» остаются доступны всегда
- UI: вкладка «Регистрация» показывает ✅/❌ статус регистрации сайта
- Безопасность: `class-knitcat-updater.php` обновлён до SDK 1.1.0 — проверка SHA-256 и allowed-host скачиваемого пакета обновления перед установкой (fail-closed)
- Исправление: `class-knitcat-registration.php` — исправлен баг определения версии плагина при регистрации (было `KNITCAT_KNITCAT_POS_VERSION`, стало `KNITCAT_POS_VERSION`)
- Безопасность: у всех булевых опций `register_setting()` добавлен явный `sanitize_callback`
1.16.0
21.08.2026