自定义报告

Odoo 配备了一个强大且易用的报告框架。该引擎允许您创建新的报告,例如具有特定分组和布局的税务报告、资产负债表和损益表。

重要

激活 开发者模式 以访问会计报告配置。

要创建新报告,请前往 会计 ‣ 配置 ‣ 会计报告。在此处,您可以创建 根报告变体

小技巧

  • 建议将修改后的报告另存为报告变体,以保持其根报告不变。

  • 要从报告本身访问现有报告的管理界面,请点击 (齿轮) 图标。

根报告

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

Example

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

要访问新的根报告,需要创建一个菜单项。要执行此操作,请打开报告的配置,点击 操作,选择 创建菜单项,然后刷新页面。该报告现在可在 :menuselection:`会计 –> 报告`下找到。

注解

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

变体

变体是根报告的特定国家/地区版本,因此总是引用根报告。要创建变体,请在创建新报告时在 根报告 字段中选择通用(根)报告。

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

Example

例如,增值税报告 (BE) `是根报告 :guilabel:`通用税务报告 的一个变体。

报告变体选择。

创建报告(根报告或变量报告)后,下一步是填充行。要创建新行,请点击 添加一行。要修改现有行,请点击行本身并编辑弹出窗口。所有行都需要一个 名称 并且可以有一个可选的 代码 允许在公式中使用行的值。

引擎行选项。

表达式

每一行可以包含一个或多个**表达式**。表达式可以看作是报告行所需的**子变量**。要创建表达式,请在行的弹出窗口中点击 添加一行

创建表达式时,必须输入用于引用该表达式的 标签。该标签在每个报告行的表达式中必须是唯一的。同时必须填写 计算引擎 和 :guilabel:`公式`字段。计算引擎定义了如何解释公式和子公式。如果需要,可以在同一行下混合使用不同计算引擎的表达式。

注解

根据引擎的不同,可能还需要 子公式

Odoo 域名计算引擎

当使用 Odoo 域名 计算引擎时,公式会被解释为 Odoo 域名 针对 account.move.line 对象。

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

总额

结果是匹配移动线路的所有余额之和。

sum_if_pos

如果结果为正数,则为匹配移动行的所有余额之和。否则,结果为`0`。

sum_if_neg

如果结果为负数,传回所有相符分录资料行的余额之和。否则,传回 0

count_rows

结果是此表达式的子行数量。如果父行设置了 分组依据 值,这将对应于匹配的分录行中不同分组键的数量。否则,结果将是匹配的分录行数量。

小技巧

若要**反转**结果的符号,请在子公式的开头加上`-`符号

资料行报告中的表达式资料行

税务标记计算引擎

当使用 税务标记 计算引擎时,系统会将 公式 字段的内容与税务标记进行匹配。如果在创建表达式时此类标记不存在,系统将自动创建它们。

在评估表达式时,表达式计算可大致表示为:(带有 + 标记的分录资料行数目)**`-` **(带有 - 标记的分录资料行数目)

Example

如果 公式 设置为 标记名称,该引擎将匹配税务标记 +标记名称 和 -标记名称,并在必要时创建它们。进一步举例说明:该公式会匹配两个标记。如果公式是 A,它将需要(并在必要时创建)标记 +A 和 -A。

聚合其他公式计算引擎

聚合其他公式 计算引擎对从其他表达式获取的金额执行算术运算。此处的公式由对表达式的引用组成,这些引用通过四种基本算术运算符(加法 +、减法 -、除法 / 和乘法 *)之一分隔。要引用某个表达式,请输入其母行的代码,后跟一个句点`.`和该表达式的**标签**(例如:代码.标签)。

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

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 是大写的货币代码,amount 是以该货币表示的绑定金额。

您还可以使用 cross_report 子公式来匹配另一份报告中的表达式。

科目前缀计算引擎

科目前缀 计算引擎用于根据科目代码的前缀来匹配对应科目的金额,并将这些前缀作为算术表达式中的变量使用。

Example

21
算术表达式也可以是一个前缀,如此处。

Example

21 + 10 - 5
该公式将代码以 2110 开头的账户内的分录资料行数额相加,然后减去代码以 `5`开头的账户内的分录资料行数额。

也可以忽略选定的子前缀。

Example

21 + 10\(101, 102) - 5\(57)
该公式的运作方式与上一示例相同,但不会考虑前缀 10110257

您可以使用后缀 `C`(贷) 和 `D`(借) 对**贷记和借记**进行“子筛选”。在这种情况下,只有账户的前缀匹配,且该账户内的分录资料行的总余额为**贷记/借记**时,才会考虑该账户。

Example

账户 210001 余额为 -42,账户 210002 余额为 25。公式 21D 只与账户 210002 匹配,因此返回 25。210001 不匹配,因为其余额为*贷方*。

前缀排除可与`C`和`D`后缀混合使用。

Example

21D + 10\(101, 102)C - 5\(57)
该公式会将代码字首为 21 的分录资料行金额(*如果*金额属借方,即 D)以及字首为 10 的分录资料行金额(*如果*金额属贷方,即 C)相加,但不会考虑字首 101102 的账户,然后减去字首为 5 的账户的金额,但不会考虑字首 57 的账户。

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

Example

21D\()
该公式匹配以`21D`开头的账户,不论其余额正负。

除了使用代码前缀来包含账户外,还可以用**账户标记**来匹配它们。举例来说,如果你所在的国家没有标准化的会计科目表,那么相同的前缀在不同的公司可能会有不同的用途,这个方法就特别有用。

Example

tag(25)
该公式可匹配相关标记包含 ID 25 的账户。

如果您引用的标记是在数据文件中定义的,则可以使用 XMLID 代替 ID。

Example

tag(my_module.my_tag)
该公式匹配的账户,其关联标记包括 my_module.my_tag 所表示的标记。

您还可以将算术表达式与标记一起使用,也可以将其与前缀选择相结合。

Example

tag(my_module.my_tag) + tag(42) + 10
标记为 my_module.my_tag 的账户余额将与 ID 为 42 的标记所链接的账户余额以及代码前缀为`10`的账户余额相加。

后缀 CD 的使用方法与标签相同。

Example

tag(my_module.my_tag)C
该公式可匹配带有 my_module.my_tag 标记和贷方余额的账户。

前缀排除也适用于标签。

Example

tag(my_module.my_tag)\(10)
该公式匹配标记为 my_module.my_tag 和代码不是以 10 开头的账户。

外部价值计算引擎

外部值`计算引擎用于指代**手动**和**结转值**。这些值不是用 `account.move.line 来存储,而是用 account.report.external.value 来存储。这些对象中的每一个都直接指向其影响的表达式,因此几乎不需要在这里进行选择。

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

总额

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

most_recent

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

此外,**子公式**有两种使用方法:

舍入=X

X 替换为数字,表示将金额四舍五入到小数点后 X 位。

可编辑

表示可以手动编辑该表达式,从而在报告中显示一个图标,允许用户执行该操作。

注解

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

这两个子公式可以混合使用,方法是用 ; 分隔。

Example

editable;rounding=2
此子公式展示了混合两种行为的正确方式。

自定义 Python 函数计算引擎

自定义 Python 函数 计算引擎是开发者用于根据具体情况引入表达式自定义计算的一种方法。公式`是要调用的 **python 函数**的名称,而 :guilabel:`子公式 是要在该函数返回的**字典**中获取的**键**。仅在制作自定义模块时使用此计算引擎。

报表可显示的列数**无限**。每列会从**资料行**上宣告的**表达式**获取数值。该列的 expression_label 字段给出了显示其值的表达式的标签。如果资料行在某字段中没有**表达式**,该行在此列的位置便不会显示任何内容。如果需要多个列,必须使用不同的**表达式**标签。

报告栏。

在会计报告的 选项 分页选用**期间比较**功能时,所有列都会在每个期间内,为每个期间重复显示。

行分组

通过在*日记账项目*模型上添加或使用现有字段(前提是这些字段是关联且非存储的),可以实现非标准分组。

注解

对行进行分组要求报告具有可编辑的显式报告行。例如,延迟报告不支持行分组,因为它们使用的是动态生成的行。

在日记账项目上创建新字段

要在*日记账项目*模型中创建一个非存储的关联字段,首先请前往 会计 ‣ 日记账项目,点击 (bug) 图标,然后点击 字段。点击 :guilabel:`新建`以创建新字段,并填写以下字段:

  • 字段名称:字段的技术名称

  • 字段标签:字段显示的标签

  • 字段类型:此关联字段应指向的字段类型

  • 已存储:请勿勾选此字段,因为只有非存储字段才能用于对行进行分组。

  • 关联模型:如果字段类型是 一对多多对多多对一,请选择要按其分组的原始字段所属的模型。

  • 关联字段定义:要按其分组的字段的技术路径

    Example

    例如,要按商业伙伴的销售团队进行分组,请将关联字段定义设置为`move_id.team_id`。

对行进行分组

要对行进行分组,请转到目标报告的 行 <accounting/customize/lines>`选项卡,点击您想要分组的那一行,然后编辑 :guilabel:`分组依据 字段。输入要用作分组键的字段的技术名称(字段名称)。

小技巧

要查找模型所有字段及其技术名称的列表,请前往 会计 ‣ 日记账项目,点击 (bug)`图标,然后点击 :guilabel:`字段。每个字段的技术名称列在 :guilabel:`字段名称`列中。