第13章:他のモジュールとの相互作用¶
:doc:`前の章<12_継承>では、モジュールの動作を変更するために継承を使用しました。 私たちの不動産シナリオでは、さらに一歩進んで、顧客のために請求書を作成できるようにしたいと考えています。 OdooはInvoicingモジュールを提供していますので、私たちの不動産モジュールから直接請求書を作成するのは簡単です。 を選択します。 プロパティが「販売」に設定されると、請求書が請求書アプリケーションに作成されます。
具体例: 会計連携¶
注釈
目標: このセクションの最後には、
新しいモジュール
estate_account
が作成されています。物件を売却した際に、購入者に対して請求書を発行できます。

他のモジュールとやりとりする際には、常にモジュール性を念頭に置く必要があります。このアプリケーションを不動産会社に販売するつもりなら、請求書発行機能を必要とする人もいれば、必要としない人もいるでしょう。
リンクモジュール¶
このようなユースケースでは、 link
モジュールを作成するのが一般的です。今回のケースでは、このモジュールは、 estate
(不動産)と account
(会計)に依存し、不動産物件の請求書作成ロジックを含みます。このようにして、不動産モジュールと会計モジュールを独立してインストールすることができます。両方がインストールされると、リンクモジュールが新機能を提供します。
Exercise
リンクモジュールを作成してみましょう。
estate_account
モジュールを作成します。このモジュールは、 estate
モジュールと account
モジュールに依存します。今のところ、これは空の枠組みです。
ヒント:あなたはすでに :doc:`チュートリアル <02_newapp>の始まり`でこれを行っています。プロセスはとても似ています。
estate_account
モジュールがリストに表示されたら、先にそれをインストールしてください! Invoicing(請求書作成)アプリケーションもインストールされていることに気づくでしょう。これは、あなたのモジュールがInvoicingアプリケーションに依存しているためです。Invoicingアプリケーションをアンインストールすると、あなたのモジュールもアンインストールされます。
請求書の作成¶
請求書を作成する時が来ました。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)
を使用します。values
はdict
です。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
を追加します。各行に name
、 quantity
、 price_unit
が必要です。
この章は、これまで取り上げられてきた中で最も難しい章の一つかもしれません。 しかし、それは実際にはOdoo開発に最も近いものです。 :doc:`next chapter <14_qwebintro>`では、Odoo で使用されているテンプレートメカニズムを紹介します。