Розділ 14: Взаємодія з іншими модулями

У попередньому розділі ми використовували успадкування, щоб змінити поведінку модуля. У нашому сценарії нерухомості ми хотіли б піти далі й мати можливість генерувати рахунки-фактури для наших клієнтів. Odoo надає модуль виставлення рахунків, тому було б доцільно створювати рахунок-фактуру безпосередньо з нашого модуля нерухомості, тобто коли для власності встановлено значення „Продано“, рахунок створюється у додатку виставлення рахунків.

Конкретний приклад: переміщення облікового запису

Примітка

Ціль: у кінці цього розділу:

  • Необхідно створити новий модуль 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. Коли ви закінчите плакати, тому що це просте завдання виглядає надзвичайно складним, ми можемо рухатися вперед у підручнику.

Щоб створити рахунок-фактуру, нам потрібна така інформація:

Цього достатньо, щоб створити порожній рахунок-фактуру.

Exercise

Додайте другий крок створення рахунку-фактури.

Створіть порожній account.move у заміні методу action_sold:

  • partner_id взято з поточного estate.property

  • move_type має відповідати «Рахунку-фактурі клієнта»

Поради:

  • щоб створити об’єкт, використовуйте self.env[model_name].create(values), де values є dict.

  • метод create не приймає набори записів як значення поля.

Якщо для властивості встановлено значення „Продано“, у вас має бути створений новий рахунок-фактура клієнта в розділі Виставлення рахунків / Клієнти / Рахунки-фактури.

Очевидно, у нас поки що немає рядків рахунків-фактур. Щоб створити рядок рахунку-фактури, нам потрібна така інформація:

  • name: опис рядка

  • quantity

  • price_unit

Крім того, рядок інвойсу потрібно прив’язати до інвойсу. Найпростіший і найефективніший спосіб прив’язати рядок до інвойсу - включити всі рядки при створенні інвойсу. Для цього поле invoice_line_ids включається в створення account.move, який є One2many`. One2many та Many2many використовують спеціальні „команди“, описані у Поширені методи ORM. Цей формат являє собою список триплетів, що виконуються послідовно, де кожен триплет є командою для виконання на множині записів. Ось простий приклад включення поля One2many line_ids при створенні test_model:

def inherited_action(self):
    self.env["test_model"].create(
        {
            "name": "Test",
            "line_ids": [
                (
                    0,
                    0,
                    {
                        "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.