Перейти до основного контенту
База знань · виробничий облік USD41,42 ПДВ20% МЗП8 000

Odoo

Модуль

Odoo Sales

Замовлення покупця як точка входу в Odoo — звідси розгортається ланцюг постачання, виробництва і платежу.

Шлях у меню
Продажі → Замовлення
Технічна модель
sale.order, sale.order.line
Редакція
2026-05-28

Що це і навіщо

Odoo Sales — це модуль, де живе замовлення покупця (sale.order). Здається тривіально: вибрав контрагента, додав рядки, підтвердив. Але насправді саме цей документ диригує усім, що відбувається далі. Підтвердив SO — Odoo автоматично створює stock.picking на відвантаження. Відвантажив — створюється інвойс (account.move). Отримав оплату — закрилася дебіторка. Один документ запускає цілий ланцюг.

Для виробничого підприємства Sales — це ще й точка, де визначаються маржа, аналітика проєкту і податкова стратегія. На SO навішуються analytic_distribution (на який оборонний контракт А-1234 списувати дохід), fiscal_position_id (чи це експорт із 0%, чи внутрішня реалізація з 20%), payment_term_id (передоплата, постоплата, етапи). Все, що мав на думці комерсант, оформлюючи угоду — закодовано тут.

Як це працює

Базовий потік: Quotation (чернетка) → Sales Order (підтверджена) → Done (закрита). Стан тримається в полі state. Поки чернетка — можеш міняти все. Після підтвердження частина полів блокується (контрагент, валюта), бо вже згенеровані downstream-документи.

Коли тиснеш «Confirm», Odoo:

  1. Створює stock.picking у warehouse, який вказаний на SO (поле warehouse_id).
  2. Резервує товар на складі через stock.move.
  3. За правилом продукту (procure_method='make_to_order') може запустити ще й виробниче замовлення mrp.production або purchase requisition.
  4. Інвойс не створює — це окремий крок (кнопка «Create Invoice»), бо в Odoo інвойс зазвичай прив’язаний або до замовлення, або до відвантаження (anglo-saxon: invoice on delivered).

Шлях у меню: Sales → Orders → Quotations / Orders / To Invoice. Найважливіші представлення — Kanban (для менеджера, де видно етапи) і Form (де всі деталі рядків і кнопок).

# Приклад: створити SO програмно
self.env['sale.order'].create({
    'partner_id': partner.id,
    'fiscal_position_id': fp_export.id,
    'order_line': [(0, 0, {
        'product_id': product.id,
        'product_uom_qty': 10,
        'analytic_distribution': {str(project.id): 100},
    })],
}).action_confirm()

У контексті українського обліку

Що з коробки: статуси, журнал продажів, інвойси з прив’язкою до SO. Чого з коробки немає: української видаткової накладної, ТТН, довіреності. Стандартний Odoo роздруковує invoice — це не наш первинний документ. Тому для UA потрібен або Oblik-ERP (там 12+ форм готові), або власні QWeb-шаблони.

Коли підтверджуєш SO, ПДВ не утворюється. ПДВ-зобов’язання виникає або на дату відвантаження, або на дату передоплати — за першою подією (ПКУ 187.1). А це вже рівень account.move. Тому правильна архітектура така: SO задає комерційні умови, а ПН утворюється з інвойса.

Як ми робимо (defense-контекст)

ТОВ «УкрПром-Тех» працює з оборонними контрактами через Прозоро.МО. Кожен контракт — це окрема analytic_account (наприклад, А-1234.2026.Партія-1). На SO ми завжди проставляємо analytic_distribution, інакше дохід «розмажеться» по компанії і неможливо буде порахувати маржу за конкретним контрактом.

Ще одна особливість — поетапна оплата. Військові контракти часто мають схему «30% передоплата → 60% на відвантаженні → 10% після приймання». Для цього беремо payment_term_id із трьома лініями і прив’язуємо до SO. Odoo сам розбиває інвойси за етапами.

Типові граблі

  • Забули fiscal position при експорті. SO підтверджена з 20% замість 0%, інвойс уже сформовано, ПН зареєстровано. Виправлення — РК. Боляче. Профілактика: ставити дефолтну fiscal position на партнера-нерезидента (поле property_account_position_id на res.partner).
  • Аналітика порожня. Менеджер забув проставити проєкт — і дохід висить «загалом». Лікується обов’язковим полем на рівні form view плюс ACL для ролі «Менеджер з продажу».
  • Inventory не резервує. Підтвердив SO, а stock.picking завис у статусі «Waiting». Причина — procure_method='make_to_stock', а товару на складі немає. Або переходь на make-to-order, або налаштуй reordering rules.
  • Інвойс прив’язано до SO, а не до picking. При Invoicing policy = ordered quantities нараховуєш ПДВ ще до відвантаження. Якщо це не передоплата — у бухгалтерії питання. Перевір на product template: invoicing policy має бути delivered quantities для більшості випадків.
  • «Я підтвердив, де інвойс?» Інвойс не створюється автоматично — треба натиснути «Create Invoice» на SO або на picking. У стандартному Odoo це навмисно: бухгалтер хоче контролювати момент.

Дотичне

Де цей модуль зустрічається5