Перейти до змісту

Ціноутворення (Prices)

Як зберігаються та застосовуються ціни: базові, роздрібні, експортні, індивідуальні для контрагента.


1. Основні сутності

Модель Призначення
PriceType Вид ціни (опт, роздріб, експорт, акція)
ItemPrice Ціна конкретного товару за конкретним видом цін

2. PriceType — вид ціни

  • code / name (напр. wholesale, retail, export, special)
  • currencyCurrency
  • includes_vat — чи включає ПДВ
  • base_price_typePriceType (для похідних: retail = wholesale * 1.3)
  • markup_percent — націнка від базового типу (якщо є)
  • is_active

Приклади видів цін: - wholesale — оптова, UAH, без ПДВ - retail — роздрібна, UAH, з ПДВ (= wholesale × 1.3) - export — експортна, USD, без ПДВ - special — акційна (ручна, обмежений термін)


3. ItemPrice — ціна товару

  • itemItem
  • price_typePriceType
  • 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) — читає retail price 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


Пов'язане