title: Исправления импорта BAZON и прода — сессия 2026-07-06
project: "@it-site-lideravto-cscart"
form: text
status: active
⚠️ УСТАРЕЛО / ЧАСТИЧНО НЕВЕРНО. Описанный здесь пайплайн 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).
Все изменения ниже нужно воспроизвести при хард-бекапе/перезагрузке.
.../18829/lideravtoplus-bitrix.csv (24 кол, UTF-8) → 404. Каталог замёрз с 2026-06-07.https://baz-on.ru/export/c3762/fac5a/lideravtoplus-site-products.csv (cp1251, ;, 21 колонка, ~14312 строк). Нет XML_id, нет числового остатка («Склад»=город), имя короткое.Папка: 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 |
import_strategy=skip_updating_existing_products (CREATE_NEW), file_type=url, file=<fac5a>, delimiter=S, test_import=N, reset_inventory=N.import_strategy=skip_creating_new_products (UPDATE_EXISTING), file_type=url, file=<fac5a>, reset_inventory=N./usr/local/bin/php8.2 ~/lideravto.ru/public_html/admin1.php -p --dispatch=advanced_import.import.import --preset_id=N --switch_company_id=1.getList/add/delete работают; поле id = row_number (НЕ task_id — баг в коннекторе). Поля времени — plural (minutes/hours/days/months/weekdays), НЕ expression.lideravto + пароль аккаунта (см. .credentials.md). ⚠ пароль засветился в сессии — сменить.Модель 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 по присутствию).
Создано 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 фото). Оба исправлены до прода.
~/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 могут остаться для «остатков» (пометка проданных — отдельная задача).
Модуль 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 фото — пока не делал.
prod_cs_20260705_1946 (до правок), prod_golive_20260706_0051 (до go-live), prod_BEFORE_rollback_20260706_1048 (текущее до отката). Откат: zcat <f>.sql.gz | mysql lideravto_cs.