自定义报告¶
Odoo 自带功能强大且易于使用的报告框架。该引擎允许您创建新报告,例如 税务报告 ,或带有 特定分组 和 布局 的 资产负债表 和 利润表 。
重要
激活 开发者模式 以访问会计报表创建界面。
根报告¶
根报告可被视为通用的、中立的会计报告。它们是建立本地会计版本的模型。如果一个报告没有根报告,那么它本身就被视为根报告。
Example
比利时和美国的税务报告都将以相同的通用版本为基础,并根据其本地法规进行调整。
创建新的根报告时,您需要为其创建一个 菜单项 。为此,打开该报告,并在同一报告上点击 (操作) 图标,然后选择 创建菜单项 。刷新页面;该报告现在可在 下找到。
注解
需要创建新的根报告的情况很少见,例如当一个国家/地区的税务机构要求一种新的特定类型的报告时。
变体¶
变体是根报告的特定国家/地区版本,因此总是引用根报告。要创建变体,请在创建新报告时在 根报告 字段中选择通用(根)报告。
从会计应用的任一主菜单打开根报告时,其所有变体都会显示在视图右上角的变体选择器中。
Example
在下图中,增值税报告 (BE) 是根 通用税务报告 的变体。
报告行¶
创建报告(根报告或变体)后,您需要用报告行填充它。您可以点击 添加行 创建新行,或点击现有报告行进行修改。所有报告行都 需要 一个 名称;如果您希望在公式中使用其值,还可以选择性地添加一个 代码 。
表达式¶
每个报告行可包含一个或多个 表达式 。表达式可视为报告行所需的 子变量 。要创建表达式,请在报告行 内部 点击 添加行 。
创建表达式时,您必须分配一个用于引用该表达式的 标签 。因此,它必须在每一行的表达式中都是 唯一 的。还必须指定 计算引擎 和 公式 。 引擎 定义了如何解释您的 公式 和 子公式 。如有需要,可以在同一行下混合使用不同计算引擎的表达式。
注解
根据引擎的不同,可能还需要 子公式 。
‘Odoo 域’ 引擎¶
使用此引擎时,公式会被解释为针对 account.move.line 对象的 Odoo 域 。
子公式允许您定义如何使用与域匹配的移动行来计算表达式的值:
总额结果是匹配移动线路的所有余额之和。
sum_if_pos如果结果为正数,则为匹配移动行的所有余额之和。否则,结果为
0。sum_if_neg如果结果为负数,传回所有相符分录资料行的余额之和。否则,传回
0。count_rows结果是此表达式的子行数。如果报告行设置了分组依据值,则该结果对应匹配分录行中不同分组键的数量。否则,它将是匹配的分录行数量。
您还可以在子公式开头加上 - 号,以 反转 结果的符号。
‘聚合其他公式’ 引擎¶
当您需要对其他表达式所得的金额执行算术运算时,请使用此引擎。这里的公式由表达式引用组成,各引用之间用四种基本算术运算符之一分隔(加法 +、减法 -、除法 / 和乘法 *)。要引用某个表达式,请输入其报告行的 代码 ,后跟句点 . 和表达式的 标签 (例如 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[, force_date_scope])匹配由 xml_id 或报告 ID 本身指定的另一报告中的表达式。如果添加了
force_date_scope,则表达式中定义的 日期范围 将用于计算公式所使用的所有表达式。
‘账户代码前缀’ 引擎¶
此引擎用于将账户代码的前缀作为算术表达式中的变量,以匹配在这些账户上产生的金额。
Example
21Example
21 + 10 - 521 和 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)如果您引用的标签定义在数据文件中,则可以使用 xmlid 代替 id。
Example
tag(my_module.my_tag)您还可以将算术表达式与标记一起使用,也可以将其与前缀选择相结合。
Example
tag(my_module.my_tag) + tag(42) + 1010 的账户余额相加。后缀 C 和 D 的使用方法与标签相同。
Example
tag(my_module.my_tag)C前缀排除也适用于标签。
Example
tag(my_module.my_tag)\(10)10 开头的账户。‘外部值’ 引擎¶
‘外部值’引擎用于引用 手动 值和 结转值 。这些值不使用 account.move.line 存储,而是使用 account.report.external.value 。这些对象各自直接指向其影响的表达式,因此在此处几乎无需对它们的选择做任何处理。
公式 可以是以下之一:
总额如果结果必须是该周期内所有外部值的总和。
most_recent如果结果必须是该周期内最新外部值的值。
此外, 子公式 有两种使用方法:
舍入=X将
X替换为数字,表示将金额四舍五入到小数点后 X 位。可编辑表示可以手动编辑该表达式,从而在报告中显示一个图标,允许用户执行该操作。
注解
手动值在报告中当前选择的 date_to 处创建。
这两个子公式可以混合使用,方法是用 ; 分隔。
Example
editable;rounding=2‘自定义 Python 函数’ 引擎¶
此引擎是供开发者逐案引入表达式自定义计算的一种方式。公式是要调用的 python 函数 的名称,子公式是要在该函数返回的 字典 中获取的 键 。仅在您自行制作自定义模块时才使用它。
日期筛选¶
默认情况下,为每个表达式计算的值会将其考虑的分录行限制为严格落在报告所选间隔内的那些分录行。要更改此行为,请修改表达式的 日期范围 字段。
列¶
报表可显示的列数 无限 。每列会从 资料行 上宣告的 表达式 获取数值。该列的 expression_label 字段给出了显示其值的表达式的标签。如果资料行在某字段中没有 表达式 ,该行在此列的位置便不会显示任何内容。如果需要多个列,必须使用不同的 表达式 标签。
在会计报告的 选项 分页选用 期间比较 功能时,所有列都会在每个期间内,为每个期间重复显示。
行分组¶
通过在 日记账项目 模型上添加或使用现有字段(前提是这些字段是关联且非存储的),可以实现非标准分组。
注解
对行进行分组要求报告具有可编辑的显式报告行。例如,延迟报告不支持行分组,因为它们使用的是动态生成的行。
在日记账项目上创建新字段¶
要在 日记账项目 模型中创建一个非存储的关联字段,首先请前往 ,点击 (bug) 图标,然后点击 字段 。点击 新建 以创建新字段,并填写以下字段:
字段名称:字段的技术名称
字段标签:字段显示的标签
字段类型:此关联字段应指向的字段类型
已存储:请勿勾选此字段,因为只有非存储字段才能用于对行进行分组。
关联模型:如果字段类型是 一对多、多对多 或 多对一,请选择要按其分组的原始字段所属的模型。
关联字段定义:要按其分组的字段的技术路径
Example
例如,要按商业伙伴的销售团队进行分组,请将关联字段定义设置为
move_id.team_id。
对行进行分组¶
要对行进行分组,请前往所需报告的 行 选项卡,点击要分组的行,并编辑 分组依据 字段。输入用作分组键的字段的技术名称(字段名称)。
小技巧
要查找模型所有字段及其技术名称的列表,请前往 ,点击 (bug) 图标,然后点击 字段 。每个字段的技术名称列在 字段名称 列中。
另请参阅
自定义税务报告设置¶
报告配置¶
小技巧
Odoo 报告引擎的所有技术术语和功能都在本页前面的章节中进行了说明。我们强烈建议在设置自定义税务报告之前阅读这些章节。
要创建自定义 税务报告 ,请打开 会计 应用,前往 ,然后点击 新建:
为您的报告输入一个 名称 。
选择一个 根报告 。
在 可用性 字段下,选择 国家/地区匹配,然后选择与您公司匹配的 国家/地区 。
接下来,点击 添加行 创建报告行。创建后,点击该报告行对其进行配置:
再次点击 添加行 以创建 表达式 并为其命名。
在 定义 选项卡中,根据以下场景为该表达式选择 计算引擎:
在此场景中,您的公司 使用 税网格:
选择 税务标签 作为计算引擎。Odoo 使用此字段将报告行与您的税项关联。
在 公式 字段中,输入您的简短网格标识符(例如
vat_sales_base)。Odoo 会自动生成此标签的+和-变体,供您在 中映射。在 子公式 字段中,输入
base以报告未税金额,或输入tax以报告实际收取/缴纳的税额。
根据需要重复此过程。然后,保存并关闭 。
或者,您可以:
选择 聚合其他公式 作为计算引擎。Odoo 使用此字段对报告中 已存在 的行进行运算,而不是扫描原始交易。
在 公式 字段中,使用引用您的行代码的基本代数运算(例如
LINE_10 - LINE_20)。
根据需要重复此过程。然后,保存并关闭 。
在此场景中,您的公司 不使用 税网格,而是严格通过总账账户跟踪一切:
选择 账户代码前缀 作为计算引擎:Odoo 将其用于需要提取财务总计的行。Odoo 不查找交易标签,而是直接从您的科目表提取实时余额。
在 公式 字段中,输入您要跟踪的账户的起始数字(例如,
40将提取以400000、401000等开头的所有收入账户的合计)。
根据需要重复此过程。然后,保存并关闭 。
或者,您可以:
选择 聚合其他公式 作为计算引擎。Odoo 通过对您的其他报告行进行加或减来计算小计、净税额或总计。
在 公式 字段中,使用引用您的行代码的基本代数运算(例如
LINE_10 - LINE_20)。
根据需要重复此过程。然后,保存并关闭 。
在此场景中,您的公司需要标准标签和账户前缀无法处理的高级筛选、用户手动覆盖或复杂算法逻辑:
选择 Odoo 域 作为计算引擎:Odoo 使用它完全绕过税务标签,并使用标准 Odoo 搜索语法筛选原始日记账项目(
account.move.line)。在 公式 字段中,输入以方括号开头的有效域,以筛选特定业务伙伴类别的免税交易。
或者,您可以:
选择 外部值 作为计算引擎。Odoo 使用它记录手动覆盖或历史结转值。
在 公式 字段中,输入
sum(在跨期间报告中将所有手动值相加)或most_recent(仅显示最新值)。在 子公式 字段中,输入
editable以在实际报告上显示编辑图标,允许用户手动修改该值。此外,您还可以输入rounding=x对数字进行舍入。
或者,您可以:
选择 自定义 Python 函数 作为计算引擎。当规则涉及累进级距、循环或多层阈值时,Odoo 将其用作执行引擎,通过后端编码运行特定计算。
在 公式 字段中,输入您自定义本地化模块中定义的 Python 方法的确切技术名称。
根据需要重复此过程。然后,保存并关闭 。
在 表达式 的 选项 选项卡中,用公式填充 结转至 字段,以始终结转余额,或仅在金额为负数时结转。如果不使用此功能,请将此字段留空。
Example
if_below(EUR(0))税项配置¶
接下来,前往 并点击 新建,为您的自定义税务报告创建并 配置新税项 。创建您的 销售 和 采购 税项,并使用您先前创建的匹配税网格为所有税项填写 税网格 。最后,确保为每项税 同时指定应交税费账户和应收税费账户 。
Example
结账分录¶
要结账税项,必须为自定义税务报告中使用的每项税指定 税组 。为此,请打开 会计 应用,前往 ,打开需要税组的税项,点击 高级选项 选项卡,并在 税组 字段中选择一个组。分配后,点击 (右箭头) 图标,并设置 应交税费账户 和 应收税费账户 。
小技巧
一切设置完成后,请务必使用该报告专用的税项创建发票、账单和贷记单,以测试您的报告。最后,测试结账分录本身。
如果要隐藏特定账户使其不在税务结账分录中显示,请前往 ,选择该税项,然后点击 (调整设置) 图标。在此处勾选 税务结账分录 复选框以调整其可见性。
另请参阅