206 lines
8.1 KiB
Markdown
206 lines
8.1 KiB
Markdown
# Система генерации артикулов (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.
|
||
|
||
## Поддержка
|
||
|
||
При возникновении проблем или вопросов обратитесь к разработчикам проекта.
|