自訂報告

Odoo 配備強大又易用的報告框架。報告引擎讓你可以建立新的報告,例如**稅務報表**,或設有**特定分組方式**及**排版方式**的**資產負債表**及**損益表**。

重要

記得啟動 開發者模式,以進入會計報表建立介面。

要建立新的報告,請前往 會計 ‣ 配置 ‣ 管理:會計報表。在該處,你可選擇建立 根級報告報告款式變體

會計報告引擎。

根級報告

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

Example

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

建立新的根級報表時,你需要為其建立一個**選單項目**。要執行此操作,請開啟報表,然後在該報表內按一下 動作 ‣ 建立選單項目,然後重新載入頁面。報表現在會於 會計 ‣ 報告 下找到。

備註

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

「建立選單項目」按鈕。

變體

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

當你從會計應用程式的任何主選單開啟根級報告時,其所有變體都會顯示在畫面右上角的變體選擇器中。

Example

下圖中,:guilabel:`VAT Report (BE)`(比利時增值稅報告)便是根級報告 :guilabel:`Generic Tax report`(通用稅務報告)的變體。

選用報告變體。

明細列表

建立了報表(根級報告或報告變體)後,你需要填入「資料行」。可按一下 新增資料行 以建立新行,或按一下現有的資料行作修改。所有資料行都**必須**有一個 名稱,並可選擇指定一個額外的 :guilabel:`代碼`(由你選擇),讓你在算式內使用它們的值。

設定資料行選項。

表達式

每個資料行可以包含一個或多個**表達式**。表達式可視為資料行所需的**子變數**。要建立表達式,請按一下資料行報告 之內新增資料行

建立表達式時,你必須指定一個 標籤,用於引用該表達式。故此,每個資料行的表達式的標籤,必須**獨一無二**。還有,必須指定一個 計算引擎 以及 算式計算引擎**定義如何演繹你的**算式**及**子算式。如有需要,同一資料行可以有使用不同計算引擎的表達式,混合計算。

備註

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

「Odoo 搜尋範圍」引擎

使用此引擎時,算式會被解釋為 Odoo 搜尋範圍,針對 account.move.line 物件。

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

sum

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

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
此算式將代碼為 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)
此算式會配對關聯標籤包括識別碼為 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 函數**名稱,子算式就是要在該函數傳回的**字典**(dictionary)中需要讀取的**鍵**(key)。請只在需要自行編寫自訂模組時,才使用此引擎。

直欄

報表可以擁有**無限數量**的直欄,以作顯示。每欄會從**資料行**上宣告的**表達式**獲取數值。直欄的欄位 expression_label 表示所顯示數值來自的表達式的標籤。如果資料行在某欄位中沒有**表達式**,該行在此直欄的位置便不會顯示任何內容。如果需要多個直欄,必須使用不同的**表達式**標籤。

報表的不同直欄。

在會計報告的 選項 分頁選用**期間比較**功能時,所有直欄都會在每個期間內,為每個期間重複顯示。