Ціноутворення (Prices)¶
Як зберігаються та застосовуються ціни: базові, роздрібні, експортні, індивідуальні для контрагента.
1. Основні сутності¶
| Модель | Призначення |
|---|---|
PriceType |
Вид ціни (опт, роздріб, експорт, акція) |
ItemPrice |
Ціна конкретного товару за конкретним видом цін |
2. PriceType — вид ціни¶
- code / name (напр.
wholesale,retail,export,special) - currency →
Currency - includes_vat — чи включає ПДВ
- base_price_type →
PriceType(для похідних:retail = wholesale * 1.3) - markup_percent — націнка від базового типу (якщо є)
- is_active
Приклади видів цін:
- wholesale — оптова, UAH, без ПДВ
- retail — роздрібна, UAH, з ПДВ (= wholesale × 1.3)
- export — експортна, USD, без ПДВ
- special — акційна (ручна, обмежений термін)
3. ItemPrice — ціна товару¶
- item →
Item - price_type →
PriceType - price — значення
- valid_from — дата початку дії
- valid_to — дата закінчення (NULL = безстроково)
Історія цін зберігається — можна відновити ціну на будь-яку дату.
4. Логіка підстановки ціни¶
При створенні рядка документа (Invoice, Quotation):
1. Визначити PriceType:
- Client.default_price_type (персональна)
- Contract.price_type (з договору)
- Organization.default_price_type (fallback)
2. Знайти ItemPrice:
- WHERE item = X AND price_type = Y
AND valid_from <= today AND (valid_to IS NULL OR valid_to >= today)
3. Застосувати знижку:
- Discount з Contract (fixed / percent)
- Промо-акції
- Special discount від менеджера (permission-based)
5. Price Management (UI)¶
Компонент: components/Essentials/PriceManagement.tsx
Функції: - Масове оновлення цін (Excel import/export) - Копіювання між видами цін (базова + націнка) - Bulk перерахунок (напр. devaluation UAH → USD) - Перегляд історії для одного товару
6. Інтеграція з іншими модулями¶
- Contract.price_type — договір фіксує, яким видом цін обслуговується клієнт
- Invoice (продаж) — підставляє ціну автоматично
- Shop (marketplace) — читає
retailprice type - CRM Quotation — формує комерційну пропозицію на основі цін
🔮 Deferred / Ideas¶
Volume-based pricing (tiered)¶
Мотивація: ціна залежить від обсягу: 1-100 шт — 50 грн, 101+ — 45 грн
Чому відкладено: ItemPrice — flat, треба ItemPriceTier
Trigger: B2B-клієнт з великими замовленнями
Dynamic pricing (rule engine)¶
Мотивація: ціна залежить від попиту, залишків, сезону Чому відкладено: потрібен rule engine + ML-модель Trigger: e-commerce з >10k SKU
Customer-specific pricing overrides¶
Мотивація: для VIP-клієнтів ціна нижча за стандартну оптову
Чому відкладено: зараз через Contract.discount — достатньо для старту
Trigger: запит sales-департаменту
Competitor price tracking¶
Мотивація: автоматично порівнювати наші ціни з конкурентами Чому відкладено: scraping + legal issues Trigger: e-commerce domain