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.

Konkrét példa: Számlamozgás

Megjegyzés

Cél: ennek a szakasznak a végén:

  • Egy új estate_account modult kell létrehozni

  • Amikor egy ingatlant eladnak, számlát kell kiállítani a vevő részére

Számla létrehozása

Bármikor, amikor egy másik modullal lépünk kapcsolatba, szem előtt kell tartanunk a modularitást. Ha azt tervezzük, hogy alkalmazásunkat ingatlanügynökségeknek értékesítjük, egyesek szeretnék a számlázási funkciót, míg mások nem.

Számla létrehozása

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()

Egy gyakorlati példa található itt.

Exercise

Adja hozzá a számla létrehozásának első lépését.

  • Hozzon létre egy estate_property.py fájlt az estate_account modul megfelelő mappájában.

  • _inherit az estate.property modellt.

  • Írja felül az action_sold metódust (lehet, hogy másként nevezte el), hogy a super hívást adja vissza.

Tipp: annak biztosítására, hogy működik, adjon hozzá egy print vagy egy debugger töréspontot a felülírt metódusban.

Működik? Ha nem, ellenőrizze, hogy minden Python fájl helyesen van-e importálva.

Ha a felülírás működik, továbbléphetünk és létrehozhatjuk a számlát. Sajnos nincs egyszerű módja annak, hogy megtudjuk, hogyan hozzunk létre bármilyen objektumot az Odoo-ban. Legtöbbször szükséges megvizsgálni a modelljét, hogy megtaláljuk a szükséges mezőket és megfelelő értékeket adjunk meg.

Jó módszer a tanulásra, ha megnézzük, hogyan csinálják más modulok azt, amit mi is szeretnénk. Például a Sales egyik alapvető folyamata a számla létrehozása egy értékesítési rendelésből. Ez jó kiindulópontnak tűnik, mivel pontosan azt csinálja, amit mi is szeretnénk. Szánjon időt az _create_invoices metódus elolvasására és megértésére. Amikor már túl van a síráson, mert ez az egyszerű feladat rettenetesen bonyolultnak tűnik, továbbléphetünk a bemutatóban.

A számla létrehozásához a következő információkra van szükség:

  • egy partner_id: az ügyfél

  • egy move_type: több lehetséges értékkel

  • egy journal_id: a könyvelési napló

Ez elegendő egy üres számla létrehozásához.

Exercise

Adja hozzá a számlakészítés második lépését.

Hozzon létre egy üres account.move-t az action_sold metódus felülírásában:

  • a partner_id a jelenlegi estate.property-ből származik

  • a move_type-nak meg kell felelnie egy «Customer Invoice»-nak

Tippek:

  • objektum létrehozásához használd a self.env[model_name].create(values)-t, ahol a values egy dict.

  • a create metódus nem fogad el rekordhalmazokat mezőértékként.

Amikor egy ingatlan «Sold» állapotra van állítva, most egy új vevői számlának kell létrejönnie a Számlázás / Vevők / Számlák alatt.

Nyilvánvalóan eddig még nincsenek számlasoraink. Számlasor létrehozásához a következő információkra van szükségünk:

  • name: a sor leírása

  • quantity

  • price_unit

Továbbá, egy számlasornak kapcsolódnia kell egy számlához. A legegyszerűbb és leghatékonyabb módja annak, hogy egy sort egy számlához kapcsoljunk, az, hogy az összes sort a számla létrehozásakor tartalmazzuk. Ehhez az invoice_line_ids mező szerepel az account.move létrehozásában, amely egy One2many. Az One2many és Many2many speciális «parancsokat» használnak, amelyeket az Command névtérrel emberi olvashatóvá tettek. Ez a névtér egy triplet parancsot képvisel, amelyet egy rekordhalmazon hajtanak végre. A triplet eredetileg az egyetlen lehetőség volt ezeknek a parancsoknak a végrehajtására, de most már szabványos a névtér használata. A formátum az, hogy egy listába helyezzük őket, amelyet sorban hajtanak végre. Itt van egy egyszerű példa egy One2many mező line_ids létrehozására egy test_model létrehozásakor:

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

Adja hozzá a számlakészítés harmadik lépését.

Adjon hozzá két számlasort az account.move létrehozása során. Az eladott ingatlanok számlázása a következő feltételek szerint történik:

  • az eladási ár 6%-a

  • további 100,00 adminisztratív díjakból

Tipp: Adja hozzá az invoice_line_ids-t a létrehozáskor a fenti példa alapján. Minden sorhoz szükségünk van egy name, quantity és 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.