# Система генерации артикулов (SKU) ## Обзор Новая система генерации артикулов создана для того, чтобы артикулы были **легко озвучиваемыми** по телефону и имели **логическую структуру**. ## Структура артикулов ### Товары (Product) **Формат:** `PROD-XXXXXX` или `PROD-XXXXXX-VARIANT` - `PROD` - префикс для всех товаров - `XXXXXX` - 6-значный номер (000001-999999) - `VARIANT` - опциональный суффикс варианта (размер, цвет и т.д.) **Примеры:** - `PROD-000001` - простой товар без варианта - `PROD-000002-50` - товар с вариантом "50" (например, 50см) - `PROD-000003-M` - товар с вариантом "M" (размер M) - `PROD-000004-RED` - товар с вариантом "RED" (красный цвет) ### Комплекты (ProductKit) **Формат:** `KIT-XXXXXX` - `KIT` - префикс для всех комплектов/букетов - `XXXXXX` - 6-значный номер (000001-999999) **Примеры:** - `KIT-000001` - Букет "Романтика" - `KIT-000002` - Букет "Весна" ## Автоматическое извлечение суффиксов Система автоматически извлекает суффиксы из названия товара: | Название товара | Извлеченный суффикс | Артикул | |----------------|-------------------|---------| | "Роза Freedom 50см" | `50` | `PROD-000001-50` | | "Роза Freedom 60 см" | `60` | `PROD-000002-60` | | "Лента 2.5м" | `25` | `PROD-000003-25` | | "Коробка S" | `S` | `PROD-000004-S` | | "Коробка размер M" | `M` | `PROD-000005-M` | ## Ручное указание суффикса Вы можете вручную указать суффикс в поле `variant_suffix` при создании товара. Это переопределит автоматическое извлечение. **Пример:** ```python product = Product( name="Лента атласная красная", variant_suffix="RED" # Ручной суффикс ) product.save() # Артикул: PROD-000006-RED ``` ## Глобальные счетчики (SKUCounter) Система использует два глобальных счетчика: 1. **Product Counter** - для товаров (Product) 2. **Kit Counter** - для комплектов (ProductKit) Счетчики автоматически увеличиваются при создании нового товара/комплекта. ### Просмотр счетчиков в админке Зайдите в Django Admin → SKU Counters, чтобы увидеть текущие значения счетчиков и предпросмотр следующего артикула. ## Обеспечение уникальности Если артикул уже существует (например, при ручном создании), система автоматически добавит буквенный суффикс: ``` PROD-000001 уже существует → PROD-000001A → PROD-000001B (если A тоже занято) → ... до PROD-000001Z ``` ## Преимущества новой системы ✅ **Легко озвучить:** "PROD тире ноль ноль ноль один тире пятьдесят" ✅ **Короткие артикулы:** 11-14 символов вместо 12 (MD5) ✅ **Логичная структура:** Понятно, что PROD = товар, KIT = комплект ✅ **Масштабируемость:** До 999,999 товаров и 999,999 комплектов ✅ **Стабильность:** Артикул не зависит от категории - можно менять категорию ✅ **Автоматизация:** Суффиксы извлекаются автоматически из названия ## Обратная совместимость Старые товары с MD5-хешами (например, `PRODA41C9EC1`) **остаются нетронутыми**. Новая система применяется только к **новым товарам**, созданным после миграции. ## Использование ### Создание товара без варианта ```python product = Product( name="Роза красная", category=category, cost_price=100, sale_price=200 ) product.save() # Артикул: PROD-000001 ``` ### Создание товара с автопарсингом суффикса ```python product = Product( name="Роза Freedom 50см", # "50см" будет автоматически извлечено category=category, cost_price=150, sale_price=300 ) product.save() # Артикул: PROD-000002-50 # variant_suffix: "50" ``` ### Создание товара с ручным суффиксом ```python product = Product( name="Лента атласная красная", category=category, cost_price=20, sale_price=40, variant_suffix="RED" # Ручной суффикс ) product.save() # Артикул: PROD-000003-RED ``` ### Создание комплекта ```python kit = ProductKit( name="Букет Романтика", slug="buket-romantika", pricing_method='fixed', fixed_price=1500 ) kit.save() # Артикул: KIT-000001 ``` ## Технические детали ### Модели - **SKUCounter** - хранит глобальные счетчики для товаров и комплектов - **Product.variant_suffix** - новое поле для хранения суффикса варианта ### Утилиты Файл: `products/utils/sku_generator.py` **Функции:** - `parse_variant_suffix(name)` - извлекает суффикс из названия - `ensure_sku_unique(base_sku, exclude_id)` - обеспечивает уникальность артикула - `generate_product_sku(product)` - генерирует артикул для товара - `generate_kit_sku()` - генерирует артикул для комплекта ### Миграции - `0007_skucounter_product_variant_suffix.py` - создание модели SKUCounter и добавление поля variant_suffix ## Тестирование Запустите тестовый скрипт для проверки генерации артикулов: ```bash python test_sku_generation.py ``` Скрипт создаст несколько тестовых товаров и комплектов с разными типами артикулов. ## FAQ **Q: Что если я изменю название товара после создания?** A: Артикул НЕ изменится. Артикул генерируется только один раз при создании товара. **Q: Можно ли изменить категорию товара?** A: Да! Артикул не зависит от категории, поэтому вы можете свободно менять категорию. **Q: Что делать, если суффикс извлекся неправильно?** A: Вы можете вручную изменить поле `variant_suffix` в админке и пересохранить товар (но артикул уже не изменится). **Q: Можно ли вручную задать артикул?** A: Да, вы можете вручную задать артикул в поле `sku`. Система проверит уникальность. **Q: Как сбросить счетчики?** A: Не рекомендуется! Но если необходимо, измените значение в Django Admin → SKU Counters. ## Поддержка При возникновении проблем или вопросов обратитесь к разработчикам проекта.