Дата: 2026-02-02
Проблема: Слишком много файлов (было 13+)
Решение: Объединить в 3 основных файла
контекстблок/
├── planning/
│ ├── context.md ← 1
│ ├── constraints.md ← 2
│ ├── requirements.md ← 3
│ ├── interfaces.md ← 4
│ ├── blocks.md ← 5
│ └── criteria.md ← 6
├── dev/
│ ├── INSTRUCTIONS.md ← 7
│ └── examples.md ← 8
├── testing/
│ ├── HOW_TO_TEST.md ← 9
│ ├── test-plan.md ← 10
│ └── validate.sh ← 11
└── deploy/
├── VALIDATION.md ← 12
└── README.md ← 13
Итого: 13+ файлов ❌
контекстблок/
├── CLAUDE.md ← Метаданные (как сейчас)
├── CACHE.yaml ← Зависимости (как сейчас)
│
├── SPEC.md ← 1️⃣ СПЕЦИФИКАЦИЯ
│ (что, зачем, требования, интерфейсы, критерии)
│
├── CONSTRAINTS.md ← 2️⃣ ЗАПРЕТЫ (обязательно!)
│ (что нельзя трогать, каскадные ограничения)
│
├── GUIDE.md ← 3️⃣ РУКОВОДСТВО
│ (как создать + примеры + как проверить)
│
└── src/ ← КОД
Итого: 3 файла + метаданные ✅
Объединяет:
- context.md (что, зачем)
- requirements.md (FR, NFR)
- interfaces.md (входы, выходы, API)
- blocks.md (декомпозиция)
- criteria.md (критерии готовности)
Структура:
# СПЕЦИФИКАЦИЯ: Импорт товаров
## Контекст
**Задача:** Импорт 13,347 товаров из BAZON в CS-Cart
**Зачем:**
- Наполнить каталог для запуска магазина
- Автоматическое обновление цен и остатков
**Что известно:**
- Источник: BAZON CSV (битрикс формат)
- Платформа: CS-Cart 4.19.1 (Advanced Import встроен)
- Количество: 13,347 товаров
**Что НЕ известно:**
- Обработка дублей OEM
- Автоматическая категоризация
---
## Требования
### FR-1: Три типа обменов
- FULL: полное обновление (раз в неделю)
- NEW: только новые товары (каждый час)
- PRICES: только цены (каждый час 9-18)
### FR-2: 4-уровневая категоризация
- Уровень 1: Запчасти
- Уровень 2: Марка (VOLVO, SCANIA...)
- Уровень 3: Серия (4-FH, 5-P...)
- Уровень 4: Узел (Кабина, Двигатель...)
### NFR: Performance
- Импорт 13,347 товаров < 30 минут
- Не блокировать работу сайта
---
## Интерфейсы
### Вход: BAZON CSV
**URL:** (см. data/MASTER.md)
**Формат:**
```csv
Код товара;Название;Цена;Наличие;Категория
20398547;Амортизатор;5000;10;VOLVO/4-FH/Кабина
Таблицы:
- cscart_products (товары)
- cscart_categories (категории 4 уровня)
- cscart_product_features_values (oem, node, compatibility)
// Для catalog блока
lider_import_get_product_by_oem($oem)
lider_import_get_categories_tree()
8 блоков, 3.5 часа:
Проверка:
# Количество товаров
mysql -e "SELECT COUNT(*) FROM cscart_products"
# Ожидаемый результат: 13347
# Количество категорий level 4
mysql -e "SELECT COUNT(*) FROM cscart_categories WHERE level=4"
# Ожидаемый результат: >20
---
## 2️⃣ CONSTRAINTS.md — Запреты
**Остаётся отдельным файлом** (критично для каскадности)
**Структура:**
```markdown
# ЗАПРЕТЫ: Импорт товаров
## ❌ ЗАПРЕЩЕНО ТРОГАТЬ
**CS-Cart Core:**
- ❌ app/functions/fn.catalog.php
- ❌ app/controllers/backend/products.php
- ❌ Схема cscart_products
**Advanced Import:**
- ❌ Код аддона Advanced Import
---
## ❌ ЗАПРЕЩЁННЫЕ ДЕЙСТВИЯ
**Код:**
- ❌ НЕ парсить CSV напрямую (использовать Advanced Import)
- ❌ НЕ использовать глобальные переменные
- ❌ НЕ хардкодить пути
**Данные:**
- ❌ НЕ хардкодить BAZON URL (брать из data/MASTER.md)
- ❌ НЕ хранить credentials в коде
---
## 📍 ГРАНИЦЫ
**Что МОЖНО:**
- ✅ Регистрировать хук products.post.php
- ✅ Создавать Product Features
- ✅ Создавать категории
**Что НЕ входит:**
- ❌ Обработка изображений (catalog блок)
- ❌ SEO URL (seo блок)
---
## 🌊 КАСКАДНЫЕ ОГРАНИЧЕНИЯ
**L1: CS-Cart Core** — НЕ трогать
**L2: Advanced Import** — использовать как есть
**L3: Хук products.post.php** — МОЖНО
**L4: Библиотека lib/** — МОЖНО
Объединяет:
- INSTRUCTIONS.md (как создать)
- examples.md (примеры)
- HOW_TO_TEST.md (как проверить)
- VALIDATION.md (проверка деплоя)
Структура:
# РУКОВОДСТВО: Импорт товаров
## Часть 1: КАК СОЗДАТЬ
### Шаг 1: Создать lider_setup модуль (30 мин)
**Что делаем:** Базовая инфраструктура
**Действия:**
```bash
mkdir -p cscart/app/addons/lider_setup
cd cscart/app/addons/lider_setup
Создать addon.xml:
<?xml version="1.0"?>
<addon scheme="4.0">
<id>lider_setup</id>
...
</addon>
Проверка:
ls -la cscart/app/addons/lider_setup/
# Должны быть: addon.xml, func.php, init.php
Что делаем: Обработка данных при импорте
Действия:
mkdir -p cscart/app/addons/lider_import/lib
Создать lib/normalize.php:
<?php
function normalize_brand($brand) {
// ВОЛЬВО → VOLVO
$map = [
'ВОЛЬВО' => 'VOLVO',
'СКАНИЯ' => 'SCANIA',
];
return $map[$brand] ?? $brand;
}
Проверка:
php -r "
require 'lib/normalize.php';
assert(normalize_brand('ВОЛЬВО') === 'VOLVO');
echo 'OK';
"
[Аналогично для остальных шагов]
Вход:
20398547;Амортизатор кабины;5000;10;VOLVO/4-FH/Кабина
Ожидаемый результат:
- Товар создан (product_code: 20398547)
- Категория: Запчасти → VOLVO → 4-FH → Кабина
- Features: oem=20398547, node=Кабина, compatibility=VOLVO 4-FH
Проверка:
mysql -e "SELECT product, category FROM cscart_products WHERE product_code='20398547'"
Вход:
20398547;Амортизатор;5000;10;...
20398547;Амортизатор;5500;5;... ← Тот же OEM, другая цена
Ожидаемый результат:
- Товар НЕ дублируется
- Цена обновлена: 5500
- Количество обновлено: 5
Проверка:
mysql -e "SELECT COUNT(*) FROM cscart_products WHERE product_code='20398547'"
# Ожидаемый результат: 1 (не 2!)
# 1. Проверить модули
ls -la cscart/app/addons/lider_setup/
ls -la cscart/app/addons/lider_import/
# 2. Проверить Product Features
mysql -e "SELECT COUNT(*) FROM cscart_product_features WHERE description LIKE 'lider_%'"
# Ожидаемый результат: 6
# 3. Проверить Import Presets
mysql -e "SELECT COUNT(*) FROM cscart_import_presets WHERE preset LIKE 'BAZON%'"
# Ожидаемый результат: 3
# 4. Тестовый импорт
php admin.php --dispatch=exim.import --preset_id=7 --limit=100
# Ожидаемый результат: Imported: 100, Errors: 0
# 5. Проверка товаров
mysql -e "SELECT COUNT(*) FROM cscart_products WHERE company_id=1"
# Ожидаемый результат: 100
# 6. Проверка категорий
mysql -e "SELECT COUNT(*) FROM cscart_categories WHERE level=4"
# Ожидаемый результат: >5
# 7. Проверка features
mysql -e "SELECT COUNT(DISTINCT product_id) FROM cscart_product_features_values"
# Ожидаемый результат: 100
Создать testing/validate.sh:
#!/bin/bash
set -e
echo "=== ПРОВЕРКА БЛОКА IMPORT ==="
# Проверка 1/5: Модули
test -d cscart/app/addons/lider_setup || exit 1
echo "[1/5] ✅ Модули"
# Проверка 2/5: Features
COUNT=$(mysql -sN -e "SELECT COUNT(*) FROM cscart_product_features WHERE description LIKE 'lider_%'")
test "$COUNT" -eq 6 || exit 1
echo "[2/5] ✅ Features"
# Проверка 3/5: Presets
COUNT=$(mysql -sN -e "SELECT COUNT(*) FROM cscart_import_presets WHERE preset LIKE 'BAZON%'")
test "$COUNT" -eq 3 || exit 1
echo "[3/5] ✅ Presets"
# Проверка 4/5: Тестовый импорт
php admin.php --dispatch=exim.import --preset_id=7 --limit=10 >/dev/null
echo "[4/5] ✅ Импорт"
# Проверка 5/5: Товары в БД
COUNT=$(mysql -sN -e "SELECT COUNT(*) FROM cscart_products WHERE company_id=1")
test "$COUNT" -ge 10 || exit 1
echo "[5/5] ✅ Товары"
echo "✅ ВСЕ ПРОВЕРКИ ПРОЙДЕНЫ"
Запуск:
bash testing/validate.sh
□ Тесты пройдены на staging
□ Бэкап БД создан
□ Rollback план готов
ssh production "mysql -e 'SELECT addon, status FROM cscart_addons WHERE addon LIKE \"lider_%\"'"
# Ожидаемый результат: lider_setup=A, lider_import=A
Откатить ЕСЛИ:
❌ Импорт НЕ работает
❌ Сайт недоступен
❌ Производительность упала >30%
---
## ИТОГОВАЯ СТРУКТУРА
контекстблок/
├── CLAUDE.md ← Метаданные
├── CACHE.yaml ← Зависимости
│
├── SPEC.md ← СПЕЦИФИКАЦИЯ
│ 1. Контекст (что, зачем)
│ 2. Требования (FR, NFR)
│ 3. Интерфейсы (вход, выход, API)
│ 4. Декомпозиция (8 блоков, 3.5 часа)
│ 5. Критерии (MVP, Production)
│
├── CONSTRAINTS.md ← ЗАПРЕТЫ ⚠️
│ 1. Запрещено трогать
│ 2. Запрещённые действия
│ 3. Границы
│ 4. Каскадные уровни
│
├── GUIDE.md ← РУКОВОДСТВО
│ Часть 1: КАК СОЗДАТЬ (шаги 1-8)
│ Часть 2: ПРИМЕРЫ (примеры 1-N)
│ Часть 3: КАК ПРОВЕРИТЬ (быстрая, полная, авто)
│ Часть 4: ВАЛИДАЦИЯ (pre/post-deploy, rollback)
│
└── src/ ← КОД
└── lib/
├── normalize.php
├── node_mapping.php
├── categories.php
└── features.php
---
## ПРЕИМУЩЕСТВА
### ✅ Простота
- 3 файла вместо 13
- Легко найти нужное
- Меньше переключений между файлами
### ✅ Полнота
- Вся информация сохранена
- Ничего не потеряно
- Логически сгруппировано
### ✅ Удобство для кодера
**Читает по порядку:**
1. SPEC.md → понимает ЧТО делать
2. CONSTRAINTS.md → понимает что НЕЛЬЗЯ
3. GUIDE.md → следует КАК делать + проверяет
---
## СРАВНЕНИЕ
| Параметр | Было | Стало |
|----------|------|-------|
| Файлов | 13+ | 3 |
| Где контекст | context.md | SPEC.md (секция 1) |
| Где требования | requirements.md | SPEC.md (секция 2) |
| Где интерфейсы | interfaces.md | SPEC.md (секция 3) |
| Где запреты | constraints.md | CONSTRAINTS.md (отдельно) |
| Где инструкции | INSTRUCTIONS.md | GUIDE.md (часть 1) |
| Где примеры | examples.md | GUIDE.md (часть 2) |
| Где проверка | HOW_TO_TEST.md | GUIDE.md (часть 3) |
| Где валидация | VALIDATION.md | GUIDE.md (часть 4) |
---
## ЧЕКЛИСТ
**Перед передачей кодеру:**
□ SPEC.md ✅
□ Контекст (что, зачем)
□ Требования (FR, NFR)
□ Интерфейсы (вход, выход)
□ Декомпозиция
□ Критерии
□ CONSTRAINTS.md ✅ ⚠️
□ Запрещено трогать
□ Запрещённые действия
□ Границы
□ Каскадные уровни
□ GUIDE.md ✅
□ Часть 1: КАК СОЗДАТЬ
□ Часть 2: ПРИМЕРЫ
□ Часть 3: КАК ПРОВЕРИТЬ
□ Часть 4: ВАЛИДАЦИЯ
□ CACHE.yaml ✅
✅ ГОТОВО = 3 файла + зависимости
```
СЛЕДУЮЩИЙ ШАГ: Применить к import блоку lideravto (создать 3 файла)