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

Tạo hóa đơn

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.

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ô-đun estate_account.

  • _inherit mô hình estate.property.

  • Ghi đè phương thức action_sold (bạn có thể đặt tên khác) để trả về lệnh gọi super.

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àng

  • mộ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ại

  • move_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ột dict.

  • 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òng

  • số 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đơ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.