第13章:他のモジュールとの相互作用

:doc:`前の章<12_継承>では、モジュールの動作を変更するために継承を使用しました。 私たちの不動産シナリオでは、さらに一歩進んで、顧客のために請求書を作成できるようにしたいと考えています。 OdooはInvoicingモジュールを提供していますので、私たちの不動産モジュールから直接請求書を作成するのは簡単です。 を選択します。 プロパティが「販売」に設定されると、請求書が請求書アプリケーションに作成されます。

具体例: 会計連携

注釈

目標: このセクションの最後には、

  • 新しいモジュール estate_account が作成されています。

  • 物件を売却した際に、購入者に対して請求書を発行できます。

請求書作成

他のモジュールとやりとりする際には、常にモジュール性を念頭に置く必要があります。このアプリケーションを不動産会社に販売するつもりなら、請求書発行機能を必要とする人もいれば、必要としない人もいるでしょう。

請求書の作成

請求書を作成する時が来ました。estateに機能を追加したいと思います。 roperty モデル、つまりプロパティが売られたときに追加のロジックを追加します。 聞き覚えはありますか? そうでない場合は、何かを見逃してしまったかもしれないので、 :doc:`前の章<12_継承>に戻ることをお勧めします ;-)

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

請求書作成の1つ目のステップを追加してみましょう。

  • estate_account モジュールの正しいフォルダに estate_property.py ファイルを作成してください。

  • estate.property モデルを継承( _inherit )します。

  • action_sold メソッド(別の名前を付けたかもしれません) をオーバーライドして、 super の呼び出しを返します。

ヒント: 動作を確認するには、オーバーライドされたメソッドに print またはデバッガブレークポイントを追加します。

動作していますか?動かない場合は、すべてのPythonファイルが正しくインポートされているかどうかを確認してください。

オーバーライドが動作していれば、先に進んで請求書を作成することができます。残念ながら、Odooで任意のオブジェクトを作成する方法を知る簡単な方法はありません。ほとんどの場合、モデルを見て必要なフィールドを見つけ、適切な値を提供する必要があります。

良い学習方法は、あなたがやりたいことを他のモジュールがどのように行っているかを見ることです。例えば、Salesの基本的なフローの1つに、販売注文から請求書を作成するというものがあります。これは、私たちがやりたいことを正確に実行しているので、よい出発点になりそうです。 _create_invoices メソッドをじっくり読んで理解してみてください。この単純な作業が非常に複雑に見えて泣きそうになったら、チュートリアルを進めましょう。

請求書を作成するには、次の情報が必要です。

  • partner_id: 顧客

  • move_type: 定義された 取りうる値

  • journal_id: 会計ジャーナル

これだけあれば、空の請求書を作成することができます。

Exercise

請求書作成の2つ目のステップを追加してみましょう。

空の account.move を作成し、 action_sold メソッドをオーバーライドします。

  • partner_id は現在の estate.property から取得します。

  • move_type は 'Customer Invoice' (顧客請求)に対応させる必要があります。

ヒント:

  • オブジェクトを生成するには、self.env[model_name].create(values) を使用します。valuesdict です。

  • create メソッドはレコードセットをフィールド値として受け付けません。

物件情報が Sold (売却済み)に設定されると、Invoicing / Customers / Invoices に新しい顧客の請求書が作成されているはずです。

明らかに、このままでは、請求書には明細行がありません。請求書の明細行を作成するには、次の情報が必要です。

  • name: 明細行の説明

  • quantity (数量)

  • price_unit (単価)

さらに、請求書行を請求書にリンクする必要があります。 請求書に行をリンクする最も簡単で最も効率的な方法は、請求書作成時にすべての行を含めることです。 これを行うには、invoice_line_ids 項目が account' に含まれます。 ove`を作成します。これは :class:`~odoo.fields.One2many` です。One2multiとMany2multiは、 :class:`~odooで人間が読めるようになった特別な「コマンド」を使用します。 ields.Command`名前空間。この名前空間は、一連のレコードに対して実行する3連符コマンドを表します。 三連符はもともとこれらのコマンドを実行する唯一のオプションでしたが、今では代わりに名前空間を使用するようになっています。 フォーマットは、順番に実行されるリストに配置することです。 ここでは、``test_model``の作成時にOne2multiのフィールド ``line_ids を含める簡単な例を示します。

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

請求書作成の3つ目のステップを追加してみましょう。

account.move の生成時に請求書の明細行を2行、追加します。販売した各物件は、次の条件で請求書を発行します。

  • 販売価格の6%

  • 事務手数料としての100.00ドル追加

ヒント: 上記の例に沿って作成する際に invoice_line_ids を追加します。各行に namequantityprice_unit が必要です。

この章は、これまで取り上げられてきた中で最も難しい章の一つかもしれません。 しかし、それは実際にはOdoo開発に最も近いものです。 :doc:`next chapter <14_qwebintro>`では、Odoo で使用されているテンプレートメカニズムを紹介します。