projects/org/@it-site-lideravto-cs-old/FIXES_2026-07-06.md

title: Исправления импорта BAZON и прода — сессия 2026-07-06
project: "@it-site-lideravto-cscart"
form: text
status: active


Исправления lideravto.ru (CS-Cart 4.18.3) — 2026-07-05/06

⚠️ УСТАРЕЛО / ЧАСТИЧНО НЕВЕРНО. Описанный здесь пайплайн advanced_import + пресеты 1/2 + prepare + SQL-остатки + tracking='D' — это ТУПИКОВЫЙ путь: он обходит схему-перехват my_changes (нет имени/категорий/SEO). Правильный механизм импорта — ядро exim.import_file + схема my_changes. Единственный источник правды: IMPORT-MECHANISM.md. Ниже оставлено как история фактов (кодировка, инцидент test_import, S3), но НЕ как руководство по импорту.

Прод: www.lideravto.ru, Beget (ssh lideravto), БД lideravto_cs (НЕ wcs — то work).
Все изменения ниже нужно воспроизвести при хард-бекапе/перезагрузке.

0. Причина (контекст)

1. ПАТЧИ КОДА advanced_import (⚠ не upgrade-safe — при обновлении вернуть)

Папка: app/addons/advanced_import/

Файл Что Бэкап
func.php guard: if (empty($images_delimiter)) $images_delimiter="," перед implode/explode картинок (фикс фатала PHP8 explode('')) func.php.bak
Tygh/Addons/AdvancedImport/Readers/Csv.php после каждого fopen(..,'rb') — stream-фильтр cp1251→UTF-8 если не UTF-8 (иначе заголовок-кракозябры): if(!mb_check_encoding($s,"UTF-8")) stream_filter_append($file,"convert.iconv.WINDOWS-1251/UTF-8"); Csv.php.bak-encfilter
Tygh/Addons/AdvancedImport/Presets/Importer.php в prepareImportItems — сборка полного имени: $item['Наименование']=Наименование+Марка+Модель+Номер производителя; в remapItem$remapped_item['tracking']='D' Importer.php.bak-name

2. ПРЕСЕТЫ (БД cscart_import_presets, company 1)

3. КРОН (Beget API cron/*)

4. ДАННЫЕ — ОСТАТКИ по присутствию в фиде (2026-07-06)

Модель amount-driven (НЕ tracking='D'): в фиде → amount>0 (в наличии), нет в фиде → amount=0 (продан → нативное «Нет в наличии» + стикер п.6).

Применено на проде 2026-07-06 (детерминированно, через temp-таблицу кодов + JOIN, БЕЗ импорта — патч кодировки на проде был откачен):

temp feed_codes (14732 кода из фида) 
UPDATE cscart_products p LEFT JOIN feed_codes f ON p.product_code=f.code
  SET p.amount = CASE WHEN f.code IS NULL THEN 0 WHEN p.amount<=0 THEN 1 ELSE p.amount END
  WHERE p.product_code<>''

Результат: ПРОДАНО (amount=0) = 3469 (активных 1401), в наличии = 14001. tracking не трогаем (на проде tracking='D'=0, все отслеживаются).
Бэкап (точечный amount+tracking, 17470 UPDATE): ~/backups/prod_stock_cols_20260706_134611.sql.gz. Откат: zcat ...|mysql.

Патчи кода на проде откатились при восстановлении: Csv.php (кодировка) — НЕТ (0), Importer.php (имя) — НЕТ (есть .bak-name), func.php — цел. Для НАТИВНОГО preset-импорта cp1251-фида патч Csv.php надо вернуть. Разовый апдейт остатков сделан в обход (SQL по присутствию).

4b. ЗАГРУЗКА НОВЫХ ТОВАРОВ (preset 1 CREATE_NEW) — СДЕЛАНО на проде 2026-07-06

Создано 591 новых карточки (каталог 17470 → 18061), 0 без имени, 0 без категории, все в наличии (amount=1). Откат: DELETE FROM cscart_products WHERE product_id > 17472 (+ descriptions/prices/categories/features).

Пайплайн (протестирован на клоне csdm ПЕРЕД продом — отсеял 2 бага):
1. ~/import_run/prepare_preset1.php — качает fac5a, fgetcsv (НЕ explode по \n — в поле «Комментарий» переносы строк рвут записи!), санитайз \r\n→пробел, генерит колонку «Наименование полное» = Наименование+Марка+Модель+Номер производителя, переименовывает колонки под маппинг preset 1. Выход: prepared_preset1.csv (14591 строка, UTF-8).
2. Файл кладём в <site>/public_html/var/files/1/prepared_preset1.csv (это fn_get_files_dir_path(1)).
3. ⚠ Источник файла берётся из cscart_import_preset_states (file/file_type), НЕ из options! Обновить И states, И options: file='prepared_preset1.csv', file_type='local'.
4. Маппинг preset 1 НЕ трогаем (даёт 3-уровневые категории Марка→Модель→Наименование): Product name←«Наименование полное», Level 3 Category←«Наименование» (короткое), Category←Марка, Model←Модель, feature←«Номер детали (OEM-номер)», Price←Цена, Images←«Фото товара», Quantity←«Остаток товара (кол-во)»=1.
5. Importer.php — СТОК (патч имени НЕ нужен и вреден: затирал бы категорийную колонку «Наименование»). Запуск: admin1.php -p --dispatch=advanced_import.import.import --preset_id=1 --switch_company_id=1.

2 бага, пойманных на клоне: (а) states держал старый URL сырого фида → имена пустые; (б) prepare бил CSV по \n → колонки съезжали (код=кусок описания, имя=URL фото). Оба исправлены до прода.

5. Скрипты (~/import_run/ на сервере)

lib_db.php, feed_prepare.php, mark_sold.php, dump.php, restore.php, configure*.php. После переноса имени/tracking в модуль — обёртки run_products.sh/run_prices.sh НЕ нужны (крон дёргает пресеты напрямую). feed_prepare/mark_sold могут остаться для «остатков» (пометка проданных — отдельная задача).

6. Стикер «ПРОДАНО» — РАБОТАЕТ (через my_changes, 2026-07-06)

Модуль lider_sold отброшен (func.php аддонов на этом Beget не грузится). Рабочее решение — шаблонные хуки в штатном аддоне my_changes (status=A, всегда активен), БЕЗ func.php.

Сигнал: amount<=0 && tracking!='D' = продан (нет в фиде → reset_inventory обнулил). На проде модель уже amount-driven (17465 в наличии, нулёвки = проданы). tracking=D НЕ используется.

Файлы (в ОБЕИХ копиях темы var/themes_repository/responsive И design/themes/responsive), путь templates/addons/my_changes/hooks/:
- index/head_scripts.post.tpl — CSS .lider-sold-badge (обязательно в {literal} — иначе Smarty 500).
- products/product_labels.post.tpl — бейдж на ДЕТАЛЬНОЙ (зона меток).
- products/list_images_block.post.tpl — бейдж в СЕТКЕ категории (обёртка превью; product_labels в гриде спрятан за {if $show_product_labels} — не годится).

Условие в обоих: {if $product.amount <= 0 && $product.tracking != 'D'}<span class="lider-sold-badge">Продано</span>{/if}.

Проверено на живом проде: детальная 10926 + сетка = бейдж; товар в наличии 15683 = нет бейджа. Глобально, только на нулёвках. Не upgrade-safe для темы (при обновлении темы вернуть).

Отброшено: app/addons/lider_sold + пакет ~/lider_sold_v1.0.0.tgz + таблица cscart_lider_sold — не нужны (сигнал берём из нативного amount). Опционально grayscale фото — пока не делал.

7. Бэкапы прода (~/backups/)

prod_cs_20260705_1946 (до правок), prod_golive_20260706_0051 (до go-live), prod_BEFORE_rollback_20260706_1048 (текущее до отката). Откат: zcat <f>.sql.gz | mysql lideravto_cs.

Открытые вопросы