architect/arh/analysis/2026-02-02-project-structure/SIMPLIFIED_STRUCTURE.md

УПРОЩЁННАЯ СТРУКТУРА КОНТЕКСТБЛОКА

Дата: 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 файла + метаданные ✅

1️⃣ SPEC.md — Спецификация

Объединяет:
- 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/Кабина

Выход: БД CS-Cart

Таблицы:
- cscart_products (товары)
- cscart_categories (категории 4 уровня)
- cscart_product_features_values (oem, node, compatibility)

API для других блоков

// Для catalog блока
lider_import_get_product_by_oem($oem)
lider_import_get_categories_tree()

Декомпозиция

8 блоков, 3.5 часа:

  1. Setup infrastructure (30 мин) — features, категории, presets
  2. Normalize data (45 мин) — марка, OEM, цена
  3. Node mapping (30 мин) — определение узла
  4. Categories (45 мин) — создание 4-level
  5. Products (30 мин) — импорт товаров
  6. Images (15 мин) — загрузка изображений
  7. Hook (15 мин) — регистрация хука
  8. Preset (10 мин) — создание Import Preset

Критерии готовности

MVP готов когда:

Production готов когда:

Проверка:

# Количество товаров
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/** — МОЖНО

3️⃣ GUIDE.md — Руководство

Объединяет:
- 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

Шаг 2: Создать lider_import модуль (2 часа)

Что делаем: Обработка данных при импорте

Действия:

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';
"

Шаг 3-8: ...

[Аналогично для остальных шагов]


Часть 2: ПРИМЕРЫ

Пример 1: Импорт одного товара

Вход:

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'"

Пример 2: Обработка дубля

Вход:

20398547;Амортизатор;5000;10;...
20398547;Амортизатор;5500;5;...   Тот же OEM, другая цена

Ожидаемый результат:
- Товар НЕ дублируется
- Цена обновлена: 5500
- Количество обновлено: 5

Проверка:

mysql -e "SELECT COUNT(*) FROM cscart_products WHERE product_code='20398547'"
# Ожидаемый результат: 1 (не 2!)

Часть 3: КАК ПРОВЕРИТЬ

Быстрая проверка (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

Полная проверка (10 минут)

# 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

Часть 4: ВАЛИДАЦИЯ ДЕПЛОЯ

Pre-deployment

□ Тесты пройдены на staging
□ Бэкап БД создан
□ Rollback план готов

Smoke test (после деплоя)

ssh production "mysql -e 'SELECT addon, status FROM cscart_addons WHERE addon LIKE \"lider_%\"'"
# Ожидаемый результат: lider_setup=A, lider_import=A

Rollback критерии

Откатить ЕСЛИ:
❌ Импорт НЕ работает
❌ Сайт недоступен
❌ Производительность упала >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 файла)