Розділ 13: Взаємодія з іншими модулями¶
У попередній розділ ми використовували успадкування для зміни поведінки модуля. У нашому сценарії з нерухомістю ми хотіли б піти далі та мати можливість генерувати рахунки-фактури для наших клієнтів. Odoo надає модуль виставлення рахунків-фактур, тому було б зручно створювати рахунок-фактуру безпосередньо з нашого модуля нерухомості, тобто після того, як нерухомість встановлено на „Продано“, рахунок-фактура створюється в додатку для виставлення рахунків-фактур.
Конкретний приклад: переміщення облікового запису¶
Примітка
Ціль: у кінці цього розділу:
Необхідно створити новий модуль
estate_accountКоли нерухомість продається, покупцеві має бути виставлений рахунок
Кожен раз, коли ми взаємодіємо з іншим модулем, нам потрібно пам’ятати про модульність. Якщо ми маємо намір продати наш додаток агентствам нерухомості, деякі можуть забажати функцію виставлення рахунків, а інші – ні.
Модуль посилання¶
Загальним підходом для таких випадків використання є створення модуля „посилання“. У нашому випадку модуль залежатиме від estate і account і включатиме логіку створення рахунків-фактур майна нерухомості. Таким чином модулі нерухомості та бухгалтерського обліку можна встановити незалежно. Коли обидва встановлені, модуль зв’язку надає нову функцію.
Exercise
Створіть модуль посилання.
Створіть модуль estate_account, який залежить від модулів estate і account. Поки що це буде порожня оболонка.
Порада: ви вже зробили це на початок посібника. Процес дуже схожий.
Коли модуль estate_account з’явиться у списку, встановіть його! Ви помітите, що також встановлено додаток виставлення рахунків. Це очікувано, оскільки ваш модуль залежить від цього. Якщо ви видалите додаток Виставлення разунків, ваш модуль також буде видалено.
Створення рахунку-фактури¶
Настав час створити рахунок-фактуру. Ми хочемо додати функціональність до моделі estate.property, тобто ми хочемо додати додаткову логіку для випадків продажу нерухомості. Звучить знайомо? Якщо ні, то варто повернутися до попередній розділ, оскільки ви могли щось пропустити ;-)
Як перший крок, нам потрібно розширити дію, яка викликається при натисканні кнопка „Продано“ на властивості. Для цього нам потрібно створити успадкування моделі у модулі estate_account для моделі estate.property. Наразі перевизначена дія просто повертатиме виклик super. Можливо, приклад прояснить ситуацію:
from odoo import models
class InheritedModel(models.Model):
_inherit = "inherited.model"
def inherited_action(self):
return super().inherited_action()
Практичний приклад можна знайти тут.
Exercise
Додайте перший крок створення рахунку-фактури.
Створіть файл
estate_property.pyу правильній папці модуляestate_account._inheritмодельestate.property.Замініть метод
action_sold(можливо, ви назвали його інакше), щоб повернути викликsuper.
Порада: щоб переконатися, що це працює, додайте print або точку зупину налагоджувача в перевизначений метод.
Це працює? Якщо ні, можливо, перевірте, чи всі файли Python правильно імпортовано.
Якщо перевизначення працює, ми можемо рухатися далі та створювати рахунок-фактуру. На жаль, немає простого способу дізнатися, як створити будь-який об’єкт в Odoo. У більшості випадків необхідно переглянути його модель, щоб знайти необхідні поля та надати відповідні значення.
Хороший спосіб навчитися – подивитися, як інші модулі вже роблять те, що ви хочете робити. Наприклад, одним із основних процесів продажів є створення рахунку-фактури із замовлення клієнта. Це виглядає як хороша відправна точка, оскільки вона робить саме те, що ми хочемо робити. Приділіть трохи часу, щоб прочитати та зрозуміти метод _create_invoices. Коли ви закінчите плакати, тому що це просте завдання виглядає надзвичайно складним, ми можемо рухатися вперед у підручнику.
Щоб створити рахунок-фактуру, нам потрібна така інформація:
partner_id: клієнтmove_type: він має кілька можливих значеньjournal_id: бухгалтерський журнал
Цього достатньо, щоб створити порожній рахунок-фактуру.
Exercise
Додайте другий крок створення рахунку-фактури.
Створіть порожній account.move у заміні методу action_sold:
partner_idвзято з поточногоestate.propertymove_typeмає відповідати «Рахунку-фактурі клієнта»
Поради:
щоб створити об’єкт, використовуйте
self.env[model_name].create(values), деvaluesєdict.метод
createне приймає набори записів як значення поля.
Якщо для властивості встановлено значення „Продано“, у вас має бути створений новий рахунок-фактура клієнта в розділі Виставлення рахунків / Клієнти / Рахунки-фактури.
Очевидно, у нас поки що немає рядків рахунків-фактур. Щоб створити рядок рахунку-фактури, нам потрібна така інформація:
name: опис рядкаquantityprice_unit
Більше того, рядок рахунку-фактури потрібно пов’язати з рахунком-фактурою. Найпростіший та найефективніший спосіб пов’язати рядок з рахунком-фактурою – це включити всі рядки під час створення рахунку-фактури. Для цього поле invoice_line_ids включається до створення account.move, яке є One2many. One2many та Many2many використовують спеціальні «команди», які стали читабельними для людини завдяки простору імен Command. Цей простір імен представляє триплетну команду для виконання на наборі записів. Спочатку триплет був єдиним варіантом для виконання цих команд, але зараз стандартно використовувати простір імен. Формат полягає в тому, щоб розмістити їх у списку, який виконується послідовно. Ось простий приклад включення поля One2many line_ids під час створення test_model:
from odoo import Command
def inherited_action(self):
self.env["test_model"].create(
{
"name": "Test",
"line_ids": [
Command.create({
"field_1": "value_1",
"field_2": "value_2",
})
],
}
)
return super().inherited_action()
Exercise
Додайте третій крок створення рахунку-фактури.
Додайте два рядки рахунку-фактури під час створення account.move. За кожне продане майно виставлятиметься рахунок-фактура за такими умовами:
6% від ціни продажу
додаткові 100.00 адміністративних зборів
Порада: Додайте invoice_line_ids під час створення, дотримуючись прикладу вище. Для кожного рядка нам потрібні name, quantity і price_unit.
Цей розділ може бути одним із найскладніших, що були розглянуті досі, але він найближчий до того, якою буде розробка на Odoo на практиці. У наступний розділ ми представимо механізм шаблонів, який використовується в Odoo.