自訂報告

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

重要

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

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

小訣竅

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

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

根級報告

「根級報告」可視為通用、中立的會計報告格式。它們可當作模型使用,以建構本地會計版本。如果某個報表沒有根級報表,它本身便會視為根級報表。

Example

比利時及美國的稅務報告,會使用相同的通用版本作基礎,再根據個別國內法規調整。

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

備註

需要特別建立新根級報告的情況比較少見,例如當國家稅務機關要求呈交新的指定類型報告時。

款式

款式變體是根級報告為特定國家/地區設定的不同版本,所以必定有引用某個根級報告。要建立變體,請在建立新報告時,在 根級報告 欄位中,選擇一個通用(根級)報告。

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

Example

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

選用報告變體。

資料行

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

設定資料行選項。

表達式

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

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

備註

視乎不同引擎,可能也需要有 子算式

Odoo 域名计算引擎

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

子算式讓你對符合搜尋範圍的分錄資料行,定義應如何用作計算表達式的值:

sum

傳回所有相符分錄資料行的數額的總和。

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(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 標籤的賬戶、與識別碼 42 的標籤關聯的賬戶,以及代碼字首為 10 的賬戶。

CD 字尾可透過與標籤相同的方式使用。

Example

tag(my_module.my_tag)C
此算式會配對帶有標籤 my_module.my_tag 以及貸方餘額(C)的賬戶。

字首排除也適用於標籤。

Example

tag(my_module.my_tag)\(10)
此算式會配對帶有標籤 my_module.my_tag 以及代碼字首並非 10 的賬戶。

外部价值计算引擎

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

**算式**可以是以下其中一項:

sum

若傳回值必須是該時段內所有外部值的總和。

most_recent

若傳回值必須是該時段內最新外部值的值。

此外,**子算式**可透過兩種方式使用:

rounding=X

X 填入數字,會指示將數額四捨五入至 X 個小數位。

editable

表示可手動編輯此表達式,並在報表內觸發顯示一個圖示,讓使用者執行此操作。

備註

手動值是在報表目前選擇的 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:`字段名称`列中。