自定义报告

Odoo 附带一个功能强大且易于使用的报告框架。该引擎允许您创建新的报告,如**税务报告**或**资产负债表**和**收入报表**,并可进行**特定分组**和**布局**。

重要

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

To create a new report, open the Accounting app and navigate to Configuration ‣ Accounting Reports. From here, you can either create a root report or a variant.

根报告

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

Example

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

When creating a new root report, you need to create a menu item for it. To do so, open the report and, on that same report, click the (Actions) icon, then select Create Menu Item. Refresh the page; the report is now available under Accounting ‣ Reporting.

注解

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

变体

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

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

Example

在下图中,:guilabel:`增值税报告(BE)`是根:guilabel:`通用税务报告`的变体。

报表行

创建报表(根报表或变体)后,您需要为其填充报表行。您可以点击添加行创建新行,或点击现有报表行进行修改。所有报表行都必须有名称,如果您希望在公式中使用其值,还可以选择添加代码(由您自行选择)。

引擎行选项。

表达式

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

创建表达式时,您必须指定用于引用该表达式的标签。因此,它在每行的表达式中必须是唯一的。还必须指定计算引擎和公式。引擎定义如何解释您的公式和子公式。如果需要,可以在同一行下混合使用不同计算引擎的表达式。

注解

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

‘Odoo 域名’ 引擎

使用此引擎时,公式被解释为针对`account.move.line`对象的:ref:Odoo 域名<reference/orm/domains>。

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

总额

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

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 子公式来匹配另一份报告中的表达式。

‘账户代码前缀’引擎

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

Example

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

Example

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

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

Example

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

您可以使用后缀 `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)相加,但不会考虑字首 101、102 的账户,然后减去字首为 5 的账户的金额,但不会考虑字首 57 的账户。

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

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`的账户余额相加。

后缀 C 和 D 的使用方法与标签相同。

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 函数**的名称,子公式是要从该函数返回的**字典**中获取的**键**。只有在制作自己的自定义模块时才使用它。

列

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

报告栏。

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

自訂稅務報表設定

報表配置

小技巧

Odoo 報表引擎的所有技術術語和功能已在本頁前面的章節中說明。我們強烈建議在設定自訂稅務報表之前閱讀這些章節。

要建立自訂稅務報表,請開啟會計應用程式,導航至配置 ‣ 會計報表,然後點擊新建:

  • 為您的報表輸入名稱。

  • 選擇根報表。

  • 在可用性欄位下,選擇匹配國家,然後選擇與您公司匹配的國家。

接下來,點擊新增行建立報表行。建立後,點擊該報表行進行配置:

  • 再次點擊新增行以建立運算式並為其命名。

  • 在定義分頁中,根據以下情況為該運算式選擇計算引擎:

在此情況下,您的公司使用稅務格:

  • 選擇稅務標籤作為計算引擎。Odoo 使用此欄位將報表行連結到您的稅務。

  • 在公式欄位中,輸入您的簡短格識別碼(例如 vat_sales_base)。Odoo 會自動為您生成此標籤的 + 和 - 變體,供您在配置 ‣ 稅務內映射。

  • 在子公式欄位中,輸入 base 以報告未稅金額,或輸入 tax 以報告實際徵收/支付的稅額。

根據需要重複此過程。然後點擊儲存並關閉。

或者,您可以:

  • 选择聚合其他公式作为计算引擎。Odoo 使用此字段对报表中已存在的行执行数学运算,而不是扫描原始交易。

  • 在公式字段中,使用引用行代码的基本代数(例如,LINE_10 - LINE_20)。

根據需要重複此過程。然後點擊儲存並關閉。

在表达式的选项标签中,使用公式填充结转至字段,以始终结转余额或仅在金额为负数时结转余额。如果您不想使用此功能,请将此字段留空。

Example

if_below(EUR(0))
此公式仅结转低于 0.00 欧元的金额。

税项配置

接下来,前往Configuration ‣ Taxes并点击New以创建并configure new taxes用于您的自定义税务报表。创建您的销售和采购税,并使用您之前创建的匹配税网格填充所有税的Tax Grids。最后,确保为每个税specify both a tax payable and tax receivable account。

Example

税网格配置。

结账分录

要关闭税,必须在自定义税务报表中使用的每个税上指定tax group。为此,请打开Accounting应用,导航至Configuration ‣ Taxes,打开需要税组的税,点击Advanced Options选项卡,然后在Tax Group字段中选择一个组。分配后,点击(right arrow)图标,并设置Tax Payable Account和Tax Receivable Account。

小技巧

  • 当一切都设置好后,请确保通过创建使用该报表特定税的发票、账单和信用票据来测试您的报表。最后,测试结账分录本身。

  • 如果您想隐藏特定账户使其不在税务结账分录中显示,请前往Configuration ‣ Taxes,选择税,然后点击(settings adjust)图标。从那里,勾选Tax Closing Entry框以调整其可见性。

其他资料

Tax closing