Initial commit: Django inventory system

This commit is contained in:
2025-10-22 01:11:06 +03:00
commit d78c43d9a9
93 changed files with 9204 additions and 0 deletions

View File

@@ -0,0 +1,205 @@
# Система генерации артикулов (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.
## Поддержка
При возникновении проблем или вопросов обратитесь к разработчикам проекта.