Odoo
МодульПН і РК в Odoo для ЄРПН
Як Odoo працює з податковими накладними: складання, реєстрація в ЄРПН, моніторинг статусу, типи причини та РК для коригувань.
Що це і навіщо
Податкова накладна (ПН) — це фіскальний документ, який платник ПДВ складає на дату першої події (відвантаження або передоплати, ПКУ 187.1) і реєструє в ЄРПН. Розрахунок-коригування (РК) — додатковий документ, який змінює раніше складену ПН (повернення, виправлення помилки, зміна ціни). Усі ПН/РК — публічні в реєстрі, тому помилка коштує штрафу (ст. 120-1 ПКУ, до 50% суми ПЗ).
Стандартний Odoo не знає ПН. Він знає інвойси (account.move типу out_invoice). Тому ПН в українській інсталяції — це окрема модель або розширення account.move з додатковими полями: тип причини, дата складання, дата реєстрації, статус в ЄРПН, серійний номер. Інтеграція з ЄРПН — окремий API-канал.
Як це працює
Логічна модель:
- Подія, яка тригерить ПН. Якщо оплата йде після постачання — це підтвердження інвойсу (інвойс і є першою подією); якщо наперед — отримання передоплати (першою подією стає платіж); якщо відвантаження — валідація picking.
- Створення ПН. Вручну (кнопка «Скласти ПН» на інвойсі) або автоматично через server action. Заповнюються поля: номер, дата складання, контрагент, рядки з номенклатурою і кодом УКТЗЕД, ставка, тип причини.
- Підписання. ПН підписується КЕПом директора або уповноваженого. У Odoo це окремий шар — інтеграція з модулем КЕП або з зовнішніми сервісами (M.E.Doc, Сота, FreDoc).
- Відправка в ЄРПН через API ДПС. Відповідь приходить асинхронно. Статуси: «Очікує підтвердження» → «Зареєстровано» / «Відмова».
- Моніторинг. Cron щоп’ятнадцять хвилин перевіряє статуси ПН зі станом «В очікуванні» й оновлює
stateзапису.
Аналогічно для РК: створюємо РК → підписуємо → реєструємо → чекаємо статусу.
# Спрощена модель ПН
class TaxInvoiceUA(models.Model):
_name = 'tax.invoice.ua'
name = fields.Char('Номер ПН')
date_compiled = fields.Date('Дата складання')
reason_type = fields.Selection([
('02', '02 - Постачання неплатнику'),
('07', '07 - Експорт'),
('09', '09 - Звільнено від ПДВ'),
('14', '14 - Касовий метод'),
])
state = fields.Selection([
('draft', 'Чернетка'),
('signed', 'Підписана'),
('sent', 'Відправлена в ЄРПН'),
('registered', 'Зареєстрована'),
('rejected', 'Відмова'),
])
erpn_response = fields.Text('Відповідь ЄРПН')
Шлях у меню: Бухгалтерія → Документи → Податкові накладні (для кастомної моделі) або Бухгалтерія → Замовники → Інвойси → Tax Invoices (для розширення account.move).
У контексті українського обліку
Типи причини, які треба підтримувати:
- Без коду (порожньо) — звичайна реалізація платнику ПДВ.
- 02 — постачання неплатнику ПДВ (фізособа, дрібний ФОП).
- 07 — експорт за межі митної території.
- 09 — операції, звільнені від оподаткування (ст. 197 ПКУ).
- 14 — постачання за касовим методом (ст. 187.7, 187.10).
- 15 — складена платником сама собі (умовний продаж, безоплатна передача).
Для дат:
- Дата складання = дата першої події (відвантаження або передоплата).
- Дата реєстрації = дата відправки в ЄРПН. За правилом має бути в межах 1090 днів від дати складання, але для нормальної роботи — у місяці складання, інакше ПК у покупця «зависає».
Для номенклатури — обов’язкові коди УКТЗЕД (для товарів) і коди ДКПП (для послуг). У стандартному Odoo цього немає — додаємо як поля на product.template.
Як ми робимо (defense-контекст)
ТОВ «УкрПром-Тех» побудувала ось такий процес:
- Підтверджуємо SO для замовника ЗСУ. Створюється інвойс.
- Перша подія — відвантаження. Під час валідації picking server action створює ПН з типом причини «без коду» (звичайна реалізація) або «09» (звільнення за п.32 підрозд.2 розд.ХХ для постачання військовим).
- Підписання. Через інтеграцію з ID.gov.ua або з нашим внутрішнім КЕП-сервером.
- Реєстрація. Прямий API-виклик в ЄРПН ДПС.
- Моніторинг. Cron
Check ERPN statusщоп’ятнадцять хвилин. Якщо «Зареєстровано» — оновлюємо стан і додаємо у декларацію. Якщо «Відмова» — створюємо завдання бухгалтеру з причиною.
Для експортних операцій (тип 07) додатково перевіряємо наявність МД у статусі «оформлено». Без неї експортна ПН — це передчасна декларація і потенційний штраф.
Типові граблі
- ПН складена з помилкою в УКТЗЕД. Покупець не побачить її у Д5. Виправлення — РК на сторно і нова правильна ПН. Те саме з ІПН покупця.
- Не встигаємо у 15-денний термін реєстрації. Штраф з 16-го дня — від 10% до 50% суми ПДВ. Налаштуй reminder за день до дедлайну.
- Ліміт у СЕА не дотягує. Спробували зареєструвати ПН на 200 тис. ПЗ, а ліміт — 150 тис.: ЄРПН відмовить. Профілактика — звіт «Сьогодні треба зареєструвати ПН на N, доступний ліміт M». Якщо нестача — поповнити СЕА або відкласти реєстрацію.
- РК не пройшло — друга сторона не підписала. Зменшуюче РК реєструє покупець. Завис у статусі — отже, покупець або не підписав, або відмовляється. Залежно від ситуації — нагадування чи зміна оформлення угоди.
- Дата складання — на день раніше першої події. ЄРПН відмовить з помилкою «дата не відповідає першій події»: ПН не може передувати операції.
- На експортній ПН ставка 20% замість 0%. Класична плутанина з fiscal position. Виправлення — РК і нова ПН.
- Аванс частково повернули, а РК не склали. ПН так і висить у повному обсязі, тож декларація завищує ПЗ. На повернуту частину завжди складай РК.
- ПН на безоплатну передачу не складено. Безоплатна передача (наприклад, гуманітарна допомога чи зразок) — теж оподатковуване постачання за ринковою ціною. Тип причини 15, складають самі на себе.
Дотичне
- Декларація ПДВ — як ПН лягають у декларацію
- СЕА ПДВ — ліміт реєстрації
- Податки UA — ставки і fiscal positions
- Касовий метод — касовий метод і ПН на дату оплати
- Перша подія — правило першої події
- Вихідна ПН — реєстрація вихідної ПН
Де цей модуль зустрічається15
- ГайдКасовий 187.7Налаштовуємо в Odoo сценарій, де ПЗ за постачанням бюджетним установам (в/ч, ДОТ, МО) виникає на дату надходже…
- ГайдПомилкова ПНПН в ЄРПН уже зареєстрована, а в ній помилка. Розбираємо, коли вистачає РК на виправлення, коли треба «обнуляю…
- ГайдРК на поверненняПокупець повертає товар — складаємо розрахунок коригування до вихідної ПН з кодом причини «103», передаємо на …
- ГайдСЕА у SalesВід підтвердження SO до реєстрації ПН у ЄРПН — де і коли ΣНакл «з'їдається», де можна впертися у ліміт і як це…
- OdooДекларація ПДВЯк зібрати декларацію з ПДВ з journal entries Odoo: рядки 1-21, додатки Д1-Д6, експорт у формат ДПС.
- OdooДокумент-модельЯк один SO запускає ланцюг операцій: реальний приклад руху бізнес-документа крізь моделі Odoo.
- OdooКасовий методЯк налаштувати tax_exigibility='on_payment' для постачальників ЗСУ (ст. 187.7) і комуналок (ст. 187.10). Wizar…
- OdooПодатки UAЯк налаштувати account.tax для ПДВ 20%, 7%, 0%, без ПДВ і звільнення — і як зв'язати ставки з fiscal positions…
- OdooСЕА ПДВЯк в Odoo відстежувати ΣНакл — баланс електронного рахунку ПДВ, поповнювати його вчасно й не впиратися в ліміт…
- OdooCronir.cron, model_id, function_id. Які стандартні cron важливі. Як писати власні — для перевірки ЄРПН-статусу, на…
- OdooFiscal PositionМеханізм, що автоматично підмінює ставки ПДВ і рахунки залежно від контрагента, валюти, сценарію. Без нього не…
- Odool10n_uaБазовий модуль адаптації Odoo до України: план рахунків, ПДВ-ставки, валюта, дати. Що в коробці є, а чого нема…
- OdooPurchaseЗамовлення постачальнику — джерело надходжень, рахунків від постачальника і вхідного ПДВ.
- OdooQWebЯк Odoo рендерить PDF через QWeb: синтаксис шаблонів, директиви t-set/t-if/t-foreach, кастомізація ПН з типом …
- ПДВРеєстрація ЄРПНРеєстрація ПН в ЄРПН — не формальність, а умова права покупця на ПК. Строк залежить від половини місяця, реєст…