Files
octopus/myproject/SKU_SYSTEM_README.md

206 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Система генерации артикулов (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.
## Поддержка
При возникновении проблем или вопросов обратитесь к разработчикам проекта.