Chapter 13: Interact With Other Modules

In the previous chapter, we used inheritance to modify the behavior of a module. In our real estate scenario, we would like to go a step further and be able to generate invoices for our customers. Odoo provides an Invoicing module, so it would be neat to create an invoice directly from our real estate module, i.e. once a property is set to „Sold“, an invoice is created in the Invoicing application.

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

Примітка

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

  • Необхідно створити новий модуль estate_account

  • Коли нерухомість продається, покупцеві має бути виставлений рахунок

Створення рахунку-фактури

Кожен раз, коли ми взаємодіємо з іншим модулем, нам потрібно пам’ятати про модульність. Якщо ми маємо намір продати наш додаток агентствам нерухомості, деякі можуть забажати функцію виставлення рахунків, а інші – ні.

Створення рахунку-фактури

It’s now time to generate the invoice. We want to add functionality to the estate.property model, i.e. we want to add some extra logic for when a property is sold. Does that sound familiar? If not, it’s a good idea to go back to the previous chapter since you might have missed something ;-)

As a first step, we need to extend the action called when pressing the „Sold“ button on a property. To do so, we need to create a model inheritance in the estate_account module for the estate.property model. For now, the overridden action will simply return the super call. Maybe an example will make things clearer:

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

Moreover, an invoice line needs to be linked to an invoice. The easiest and most efficient way to link a line to an invoice is to include all lines at invoice creation. To do this, the invoice_line_ids field is included in the account.move creation, which is a One2many. One2many and Many2many use special „commands“ which have been made human readable with the Command namespace. This namespace represents a triplet command to execute on a set of records. The triplet was originally the only option to do these commands, but it is now standard to use the namespace instead. The format is to place them in a list which is executed sequentially. Here is a simple example to include a One2many field line_ids at creation of a 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.

This chapter might be one of the most difficult that has been covered so far, but it is the closest to what Odoo development will be in practice. In the next chapter, we will introduce the templating mechanism used in Odoo.