Odoo
МодульOdoo Sales
Замовлення покупця як точка входу в Odoo — звідси розгортається ланцюг постачання, виробництва і платежу.
Що це і навіщо
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:
- Створює
stock.pickingу warehouse, який вказаний на SO (полеwarehouse_id). - Резервує товар на складі через
stock.move. - За правилом продукту (
procure_method='make_to_order') може запустити ще й виробниче замовленняmrp.productionабо purchase requisition. - Інвойс не створює — це окремий крок (кнопка «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 це навмисно: бухгалтер хоче контролювати момент.
Дотичне
- Документ-модель — повний ланцюг SO → picking → invoice
- Fiscal Position — як підмінити 20% на 0% для експорту
- Analytic Account — навіщо аналітичні рахунки
- Бланки — друковані форми (видаткова, ТТН)
- Експорт ГП · 0% — експорт ГП з 0% ПДВ
- Перша подія · закупівля — перша подія і ПДВ
Де цей модуль зустрічається5
- ГайдКонтракт з МО за ст. 187.7Виграли тендер на Прозоро.МО, цикл виробництва 60 днів, оплата +90 днів від акта. Як завести контракт у Sales,…
- ГайдПакет ДСЕКУЯк зібрати документи на разовий дозвіл ДСЕКУ для експорту балістичних плит до НАТО-партнера: контракт у Sales,…
- OdooДокумент-модельЯк один SO запускає ланцюг операцій: реальний приклад руху бізнес-документа крізь моделі Odoo.
- OdooAnalytic AccountЧому аналітика окрема від плану рахунків і як нею вести проєктний облік оборонних контрактів, рахувати маржу з…
- OdooFiscal PositionМеханізм, що автоматично підмінює ставки ПДВ і рахунки залежно від контрагента, валюти, сценарію. Без нього не…