自定义报告

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

重要

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

要创建新报告,请转到 会计 ‣ 配置 ‣ 会计报告 。从这里,创建 根报告变体

小技巧

  • 考虑将修改后的报告保存为报告变体,以保持其根报告完整。

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

根报告

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

Example

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

需要创建菜单项才能访问新的根报告。为此,打开报告的配置,单击 操作创建菜单项 ,然后刷新页面。报告现在可在 会计 ‣ 报告 下访问。

注解

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

变体

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

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

Example

增值税报告 (BE) 是根 通用税务报告 的一个变体。

报告变体选择。

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

引擎行选项。

表达式

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

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

注解

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

Odoo 域计算引擎

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

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

总额

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

sum_if_pos

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

sum_if_neg

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

count_rows

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

小技巧

反转 结果的符号,请在子公式的开头加上 - 符号。

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

税务标签计算引擎

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

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

Example

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

聚合其他公式计算引擎

聚合其他公式 计算引擎对从其他表达式获得的金额执行算术运算。这里的公式由对表达式的引用组成,这些引用由四种基本算术运算符(加法 +、减法 -、除法 / 和乘法 * )之一分隔。要引用一个表达式,请输入其父行的 代码 ,后跟一个句点 . 和表达式的 标签 (例如 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 是大写的货币代码,amount 是以该货币表示的绑定金额。

cross_report(xml_id | report_id)

用于匹配由 xml_id 或报告 ID 本身定位的另一个报告中的表达式。

账户代码前缀计算引擎

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

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 不匹配,因为其余额为 贷方

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

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 函数 的名称,而 子公式 是在此函数返回的 字典 中获取的 。仅在制作自定义模块时使用此计算引擎。

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

报告栏。

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

行分组

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

注解

行分组要求报告具有可编辑的明确报告行。例如,递延报告不支持行分组,因为它们使用生成的动态行。

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

要在 日记账项目 模型中创建一个非存储的相关字段,首先转到 会计 ‣ 日记账项目 ,然后单击 (bug) 图标,然后单击 字段 。单击 新建 以创建新字段,并填写以下字段:

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

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

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

  • 已存储 :不要勾选此字段,因为只有非存储字段可用于分组行。

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

  • 相关字段定义 :要分组的字段的技术路径

    Example

    要按商业伙伴的销售团队分组,请将相关字段定义设置为 move_id.team_id

分组行

要分组行,请转到所需报告的 选项卡,单击要分组的行,然后编辑 分组依据 字段。输入要用作分组键的字段的技术名称( 字段名称 )。

小技巧

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