--------------------
PraisovedSync — приёмник praisoved для MODX 3 + miniShop3
--------------------
Author: Ivan K.
--------------------

Для MODX Revolution 3.x и miniShop3.

ЧТО ДЕЛАЕТ
Сайт САМ приходит в praisoved за файлом обмена по постоянной ссылке
и применяет его к своим товарам. Обратной дороги нет: praisoved в базу
магазина не пишет и ключей от неё не имеет.

Из файла применяются:
  - цена и остаток;
  - перечёркнутая (старая) цена, если владелец её включил;
  - характеристики товара и дополнительные поля — только те, что владелец
    отметил в praisoved, и только если он разрешил их менять.

ЧЕГО НЕ ДЕЛАЕТ НИ ПРИ КАКОЙ НАСТРОЙКЕ
  - не удаляет товары;
  - не трогает названия, описания и картинки;
  - не создаёт характеристики и доп. поля, которых на сайте нет;
  - не заполняет характеристики с несколькими значениями сразу;
  - не применяет оборванный файл (нет отметки конца — нет обмена);
  - не трогает товар, чей артикул совпал с двумя карточками.

КАК ПИШЕТСЯ ТОВАР
Процессором самого miniShop3 — тем же, которым сохраняет карточку менеджер
в админке. Это медленнее прямой записи в базу, зато срабатывают плагины
других компонентов (OnBeforeDocFormSave / OnDocFormSave): пересчёты,
индексация поиска, свои хуки. Иначе магазин тихо расходится сам с собой.

Отсюда три следствия:
  - ЗАМКИ СНИМАЮТСЯ ЦЕЛИКОМ, до записи и после неё, — тем же процессором
    MODX, что и пункт меню «Снять все замки». Товар, открытый в админке,
    обмен не пропускает и не ждёт. Обратная сторона названа честно: замок
    теряет и тот, кто правит карточку прямо сейчас, — нажав «Сохранить»,
    он вернёт старую цену из формы, загруженной до обмена. Сметаем разом,
    потому что свой замок процессор снимает только на успешном пути:
    отказавший товар оставляет замок висеть lock_ttl (6 минут);
  - падение на одном товаре не обрывает обмен. Мы разбудили плагины чужих
    компонентов, и исключение из любого из них оставило бы весь остаток
    каталога со старой ценой. Такой товар назван в отчёте вместе
    с причиной, подробности — в журнале ошибок MODX;
  - процессору нужно право msproduct_save, а в кроне пользователя нет.
    Обмен встаёт под первого администратора; кого именно — можно задать
    настройкой praisovedsync.processor_user (её имя видно в журнале MODX).

Характеристики кладёт сервис ms3, а не процессор: процессор считает
присланный набор ПОЛНЫМ и стёр бы у товара все остальные значения.
Процессор вызывается следом — чтобы чужие плагины увидели готовый товар.

ПРЕДЕЛЫ
Порог «на сколько процентов может измениться цена» задаёт владелец
в praisoved, в настройках направления «Сайт на MODX3». Считает его коннектор —
прежнюю цену знает только сайт. Вышли за предел — обмен останавливается
целиком и в магазин не пишется ничего. Настройка praisovedsync.dry_run
тут ни при чём: она про предпросмотр.

ЧТО УХОДИТ В praisoved
Каталог сайта — по расписанию и только если владелец включил его приём
на странице «Эталон». По умолчанию уезжает весь магазин; настройка
praisovedsync.catalog_parents ограничивает выгрузку выбранными разделами:
номера ресурсов через запятую, берутся сами разделы и все их подразделы.
Пусто или 0 — весь ассортимент.

Граница действует в обе стороны: товары вне выбранных разделов обмен
не отдаёт и обратным проходом не трогает — правило «чего нет в каталоге
praisoved, тому обнулить остаток» считает своими только те товары,
которые сайт сам и выгружал. Проверить номера разделов и увидеть,
сколько товаров осталось за границей: php cron/sync.php --targets.

НАСТРОЙКА
  1. praisovedsync.feed_url — ссылка обмена с карточки «Сайт на MODX3».
  2. «Предпросмотр» и отчёт: сошлись ли артикулы, не пусто ли «сопоставлено».
  3. Снять praisovedsync.dry_run — до этого магазин не меняется.
  4. Включить praisovedsync.enabled и прописать крон со вкладки «Обмен».

Подробности — во вкладке «Документация» самого компонента: она живёт
в лексиконе и обновляется вместе с кодом.

https://praisoved.com/
