自定义报告

Odoo 提供了一个强大且易于使用的报表框架。该引擎允许您创建新的报表,例如 税务报表 ,或者具有 特定分组布局资产负债表利润表

重要

激活 开发者模式 以访问会计报告创建界面。

要创建新报告,请转到 会计 ‣ 配置 ‣ 管理:会计报告。从这里,您可以创建 一个 根报告 或一个 变体

会计报告引擎。

根报告

根报表可以被视为通用的、中立的会计报表。它们作为本地会计版本构建的模型。如果一个报表没有根报表,那么它本身就被视为根报表。

Example

比利时和美国的税务报告都将使用相同的通用版本作为基础,并根据各自的国内法规进行调整。

创建新的根报表时,您需要为其创建一个 菜单项 。要这样做,请打开报表,然后在同一报表上单击 操作 ‣ 创建菜单项 。刷新页面;报表现在可以在 会计 ‣ 报告 下使用。

注解

需要创建新的根报告的情况很少见,例如当一个国家的税务机关需要一种新的特定类型的报告时。

创建菜单项按钮。

变体

变体是根报告的特定于国家的版本,因此始终参考根报告。要创建一个变体,在创建新报告时,在 Root Report 字段中选择一个通用(根)报告。

当从会计应用程序的主菜单之一打开根报告时,所有变体都会显示在视图右上角的变体选择器中。

Example

在下面的图像中, VAT Report (BE) 是根 Generic Tax report 的变体。

报告变体选择。

在创建报表(根报表或变体报表)后,您需要填充它的行。您可以通过单击 添加行 来创建新行,或者通过单击现有行来修改。所有行都 需要 一个 名称 ,并且可以选择性地添加一个 代码 (您自己选择的代码),如果您希望在公式中使用它们的值。

发动机线路选项。

表达式

每一行可以包含一个或多个 表达式 。表达式可以被视为报表行所需的 子变量 。要创建一个表达式,在行报表中点击 添加一行 within

创建表达式时,必须为其指定一个用于引用该表达式的 label 。因此,它必须在每行的表达式中是 唯一 的。还必须指定 Computation EngineFormulaengine 定义了如何解释您的 formula(s)subformula(s) 。如果需要,可以在同一行中混合使用不同的计算引擎来进行表达式。

注解

根据引擎的不同, 子公式 也可能是必需的。

‘Odoo Domain’ 引擎

使用此引擎,公式将被解释为一个 Odoo domain,目标是 account.move.line 对象。

子公式允许您定义匹配域的移动行如何用于计算表达式的值:

sum

结果是匹配的账户行的所有余额之和。

sum_if_pos

结果是匹配的会计分录余额的总和,如果这个金额是正数。否则,它是 0

sum_if_neg

结果是匹配的会计分录余额的总和,如果这个金额是负数。否则,它是 0

count_rows

结果是此表达式的子行数。如果父行具有分组值,则这将对应于匹配的移动行中不同分组键的数量。否则,它将是匹配的移动行数。

您还可以在子公式的开头加上 - 符号来 反转 结果的符号。

在行报告中的表达式行

‘税标签’ 引擎

此引擎的公式由用于匹配税务标签的名称组成。如果在创建表达式时不存在这些标签,它们将被创建。

在评估表达式时,表达式的计算可以粗略地表示为: (带有 + 标签的移动行的金额) - (带有 - 标签的移动行的金额)

Example

如果公式是 tag_name,引擎会匹配税务标签 +tag_name-tag_name,如有必要会创建它们。进一步举例说明:公式匹配两个标签。如果公式是 A,它将需要(如有必要会创建)标签 +A-A

‘聚合其他公式’ 引擎

Use this engine when you need to perform arithmetic operations on the amounts obtained for other expressions. Formulas here are composed of references to expressions separated by one of the four basic arithmetic operators (addition +, subtraction -, division /, and multiplication *). To refer to an expression, type in its parent line’s code followed by a period . and the expression’s label (ex. code.label).

**子公式**可以是以下之一:

if_above(CUR(amount))

只有当算术表达式的值大于提供的边界时,才会返回该值。否则,结果将为 0

if_below(CUR(amount))

只有当算术表达式的值低于提供的边界时,才会返回该值。否则,结果将为 0

if_between(CUR1(amount1), CUR2(amount2))

只有当算术表达式的值严格在提供的范围之间时,才会返回该值。否则,它将被调整为最接近的范围边界。

if_other_expr_above(LINE_CODE.EXPRESSION_LABEL, CUR(amount))

只有当由提供的行代码和表达式标签表示的表达式的值大于提供的边界时,才会返回算术表达式的值。否则,结果将为 0

if_other_expr_below(LINE_CODE.EXPRESSION_LABEL, CUR(amount))

只有当由提供的行代码和表达式标签表示的表达式的值低于提供的界限时,算术表达式的值才会返回。否则,结果将为 0

CUR is the currency code in capital letters, and amount is the amount of the bound expressed in that currency.

您还可以使用 cross_report 子公式来匹配在另一个报表中找到的表达式。

“科目代码前缀”引擎

此引擎用于使用这些账户代码的前缀作为算术表达式中的变量来匹配账户上的金额。

Example

21
算术表达式也可以是单个前缀,例如这里。

Example

21 + 10 - 5
此公式将添加在以 2110 开头的账户上进行的会计分录的余额,并减去以 5 为前缀的账户上的余额。

还可以忽略一些子前缀的选择。

Example

21 + 10\(101, 102) - 5\(57)
这个公式的工作方式与前面的例子相同,但忽略了前缀 10110257

You can apply ‘sub-filtering’ on credits and debits using the C and D suffixes. In this case, an account will only be considered if its prefix matches, and if the total balance of the move lines made on this account is credit/debit.

Example

账户 210001 的余额为 -42,账户 210002 的余额为 25。公式 21D 只匹配账户 210002 ,因此返回 25。 210001 没有匹配到,因为它的余额是 贷方

前缀排除可以与 CD 后缀混合使用。

Example

21D + 10\(101, 102)C - 5\(57)
This formula adds the balances of the move lines made on accounts whose code starts with 21 if it is debit (D) and 10 if it is credit (C), but ignores prefixes 101, 102, and subtracts the balance of the ones on accounts with the prefix 5, ignoring the prefix 57.

要匹配前缀中的字母 CD 并且不将其用作后缀,请使用空的排除 ()

Example

21D\()
此公式匹配以 21D 开头的账户,无论其余额符号如何。

In addition to using code prefixes to include accounts, you can also match them with account tags. This is especially useful, for example, if your country lacks a standardized chart of accounts, where the same prefix might be used for different purposes across companies.

Example

tag(25)
This formula matches accounts whose associated tags contain the one with id 25.

If the tag you reference is defined in a data file, an xmlid can be used instead of the id.

Example

tag(my_module.my_tag)
This formula matches accounts whose associated tags include the tag denoted by my_module.my_tag.

You can also use arithmetic expressions with tags, possibly combining them with prefix selections.

Example

tag(my_module.my_tag) + tag(42) + 10
The balances of accounts tagged as my_module.my_tag will be summed with those of accounts linked to the tag with ID 42 and accounts with the code prefix 10

C and D suffixes can be used in the same way with tags.

Example

tag(my_module.my_tag)C
This formula matches accounts with the tag my_module.my_tag and a credit balance.

Prefix exclusion also works with tags.

Example

tag(my_module.my_tag)\(10)
This formula matches accounts with the tag my_module.my_tag and a code not starting with 10.

‘外部值’ 引擎

使用’外部值’引擎来引用 手动结转值 。这些值不是使用 account.move.line 存储的,而是使用 account.report.external.value 存储的。每个对象直接指向它所影响的表达式,因此在这里对它们的选择需要做很少的工作。

公式 可以是以下之一:

sum

如果结果必须是该期间所有外部值的总和。

most_recent

如果结果必须是该期间内最新外部值的价值。

此外, 子公式 可以有两种使用方式:

rounding=X

X 替换为数字,指示将金额四舍五入到 X 个小数位。

editable

表示此表达式可以手动编辑,触发报表中的图标显示,允许用户执行此操作。

注解

手动值是在报告中当前选择的 date_to 创建的。

通过使用 ; 将两个子公式分开,可以混合使用它们。

Example

editable;rounding=2
这是一个正确的子公式,结合了两种行为。

‘自定义 Python 函数’ 引擎

这个引擎是开发人员根据具体情况引入自定义计算表达式的一种方式。公式是要调用的 python函数 的名称,子公式是要在此函数返回的 字典 中获取的 。只有在制作自定义模块时才使用它。

列数

报告可以显示 无限数量 的列。每列从 上声明的 表达式 获取其值。列的 expression_label 字段给出了显示的表达式的标签。如果一行在该字段中没有 表达式 ,则该列中不显示任何内容。如果需要多个列,必须使用不同的 表达式 标签。

报告的列。

当使用会计报表的 期间比较 功能时,在 选项 选项卡下,所有列都会在每个期间中重复显示。