Chương 13: Tương Tác Với Các Mô-đun Khác¶
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.
Ví dụ cụ thể: Di chuyển tài khoản¶
Ghi chú
Mục tiêu: ở cuối phần này:
Nên tạo một mô-đun mới
estate_account
Khi bán tài sản phải lập hoá đơn cho người mua

Bất cứ khi nào chúng ta tương tác với một mô-đun khác, chúng ta cần lưu ý đến tính mô-đun. Nếu chúng tôi có ý định bán ứng dụng của mình cho các đại lý bất động sản, một số có thể muốn tính năng lập hoá đơn nhưng những người khác có thể không muốn.
Mô-đun liên kết¶
Cách tiếp cận phổ biến cho các trường hợp sử dụng như vậy là tạo mô-đun 'liên kết'. Trong trường hợp của chúng tôi, mô-đun sẽ phụ thuộc vào `` bất động sản`` và `` tài khoản`` và sẽ bao gồm logic tạo hóa đơn của tài sản di sản. Bằng cách này, bất động sản và các mô-đun kế toán có thể được cài đặt độc lập. Khi cả hai được cài đặt, mô-đun liên kết sẽ cung cấp tính năng mới.
Exercise
Tạo một mô-đun liên kết.
Tạo mô-đun estate_account
, phụ thuộc vào mô-đun estate
và account
. Hiện tại, nó sẽ là một cái vỏ trống rỗng.
Tip: you already did this at the beginning of the tutorial. The process is very similar.
Khi mô-đun estate_account
xuất hiện trong danh sách, hãy tiếp tục và cài đặt nó! Bạn sẽ nhận thấy rằng ứng dụng Lập hoá đơn cũng đã được cài đặt. Điều này được mong đợi vì mô-đun của bạn phụ thuộc vào nó. Nếu bạn gỡ cài đặt ứng dụng Lập hoá đơn, mô-đun của bạn cũng sẽ bị gỡ cài đặt.
Tạo hóa đơn¶
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()
Bạn có thể tìm thấy ví dụ thực tế tại đây.
Exercise
Thêm bước đầu tiên của việc tạo hóa đơn.
Tạo tệp
estate_property.py
trong thư mục chính xác của mô-đunestate_account
._inherit
mô hìnhestate.property
.Ghi đè phương thức
action_sold
(bạn có thể đặt tên khác) để trả về lệnh gọisuper
.
Mẹo: để đảm bảo nó hoạt động, hãy thêm print
hoặc điểm ngắt của trình gỡ lỗi trong phương thức bị ghi đè.
Nó có hoạt động không? Nếu không, có thể kiểm tra xem tất cả các tệp Python đã được nhập chính xác chưa.
Nếu tính năng ghi đè đang hoạt động, chúng tôi có thể tiếp tục và tạo hóa đơn. Thật không may, không có cách nào dễ dàng để biết cách tạo bất kỳ đối tượng cụ thể nào trong SoOn. Trong hầu hết mọi trường hợp, cần phải xem xét mô hình của nó để tìm các trường bắt buộc và cung cấp các giá trị phù hợp.
Một cách hay để học là xem các mô-đun khác đã thực hiện những gì bạn muốn làm như thế nào. Ví dụ: một trong những quy trình bán hàng cơ bản là tạo hóa đơn từ đơn đặt hàng. Đây có vẻ là một điểm khởi đầu tốt vì nó thực hiện chính xác những gì chúng ta muốn làm. Hãy dành chút thời gian để đọc và hiểu phương pháp _create_invoices. Khi bạn đã khóc xong vì nhiệm vụ đơn giản này trông cực kỳ phức tạp, chúng ta có thể chuyển sang phần hướng dẫn.
Để tạo hóa đơn, chúng ta cần có những thông tin sau:
a
partner_id
: khách hàngmột
move_type
: nó có một số giá trị có thể cóa
journal_id
: nhật ký kế toán
Điều này là đủ để tạo một hóa đơn trống.
Exercise
Thêm bước thứ hai của việc tạo hóa đơn.
Tạo một account.move
trống trong phần ghi đè của phương thức action_sold
:
partner_id
được lấy từestate.property
hiện tạimove_type
phải tương ứng với 'Hóa đơn khách hàng'
Lời khuyên:
để tạo một đối tượng, hãy sử dụng
self.env[model_name].create(values)
, trong đóvalues
là mộtdict
.phương thức
create
không chấp nhận tập bản ghi làm giá trị trường.
Khi thuộc tính được đặt thành 'Đã bán', giờ đây bạn sẽ có hóa đơn khách hàng mới được tạo trong Hóa đơn / Khách hàng / Hóa đơn.
Rõ ràng cho đến nay chúng tôi không có bất kỳ dòng hóa đơn nào. Để tạo dòng hóa đơn, chúng ta cần có những thông tin sau:
tên
: mô tả của dòngsố lượng
đơn_vị
Hơn nữa, dòng hóa đơn cần phải được liên kết với một hóa đơn. Cách dễ nhất và hiệu quả nhất để liên kết một dòng với một hóa đơn là bao gồm tất cả các dòng khi tạo hóa đơn. Để thực hiện việc này, trường invoice_line_ids
được bao gồm trong phần tạo account.move
, là một One2many
. One2many và Many2many sử dụng các 'lệnh' đặc biệt mà con người có thể đọc được với không gian tên Command
. Không gian tên này đại diện cho một lệnh bộ ba để thực thi trên một tập hợp các bản ghi. Bộ ba ban đầu là lựa chọn duy nhất để thực hiện các lệnh này, nhưng giờ đây việc sử dụng không gian tên thay thế đã trở thành tiêu chuẩn. Định dạng là đặt chúng vào một danh sách được thực hiện tuần tự. Dưới đây là một ví dụ đơn giản để bao gồm trường One2many line_ids
khi tạo 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
Thêm bước thứ ba của việc tạo hóa đơn.
Thêm hai dòng hóa đơn trong quá trình tạo account.move
. Mỗi tài sản được bán sẽ được lập hóa đơn theo các điều kiện sau:
6% giá bán
thêm 100,00 từ phí hành chính
Mẹo: Thêm invoice_line_ids
khi tạo theo ví dụ trên. Với mỗi dòng, chúng ta cần có tên
, số lượng
và đơn vị giá
.
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.