第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_account 模塊的正確文件夾中創建一個名為 estate_property.py 的文件。

  • _inherit 模型 estate.property 。

  • 覆蓋 action_sold 方法(您可能已經命名為其他名稱),返回 super 調用。

提示:為確保其正常工作,請在覆蓋的方法中添加 print 或調試器斷點。

它是否工作?如果沒有,請檢查所有Python文件是否正確導入。

如果覆蓋功能正常工作,我們可以繼續創建發票。不幸的是,在Odoo中,沒有一種簡單的方法來知道如何創建任何給定的對象。大多數情況下,需要查看其模型以查找所需字段并提供適當的值。

學習的好方法是看看其他模塊已經如何做你想做的事情。例如,銷售的一個基本流程是從銷售訂單創建發票。這看起來是一個很好的起點,因為它正好是我們想要做的?;ㄐr間閱讀和理解 _create_invoices 方法。當你因為這個簡單的任務看起來非常復雜而哭泣時,我們可以繼續本教程。

創建發票需要以下信息:

  • 一個 partner_id :客戶

  • a move_type : 它有多個 可能的值

  • journal_id :會計日記賬

這已經足夠創建一個空的發票了。

Exercise

添加發票創建的第二步。

action_sold 方法的覆蓋中創建一個空的 account.move

  • partner_id 取自當前的 estate.property

  • move_type 應該對應于“客戶發票”

小費:

  • 要創建一個對象,請使用 self.env[model_name].create(values) ,其中 values 是一個 dict 。

  • create 方法不接受記錄集作為字段值。

當一個物業被標記為 ‘已售’,你現在應該在發票/客戶/發票中創建了一個新的客戶發票。

顯然,我們目前還沒有任何發票行。要創建發票行,我們需要以下信息:

  • name : 該行的描述

  • quantity

  • price_unit

此外,發票行需要與發票關聯。將所有行包含在發票創建中是將行鏈接到發票的最簡單和最有效的方法。為此,在 account.move 創建中包含了 invoice_line_ids 字段,它是一個 One2many 。One2many和Many2many使用特殊的“命令”,這些命令已經使用 Command 命名空間使其易于閱讀。該命名空間表示要在一組記錄上執行的三元組命令。三元組最初是執行這些命令的唯一選項,但現在使用命名空間是標準的。格式是將它們放在一個列表中,按順序執行。以下是一個簡單的示例,用于在創建 test.model 時包含一個One2many字段 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

添加發票創建的第三步驟。

在創建 account.move 時添加兩個發票行。每個售出的物業將按以下條件進行開票:

  • 銷售價格的6%

  • 從行政費用中額外增加100.00

提示:按照上面的示例在創建時添加 invoice_line_ids 。每行需要 name , quantityprice_unit 。

這一章可能是到目前為止最難的,但它是最接近Odoo開發實踐的。在 下一章 中,我們將介紹Odoo中使用的模板機制。