會計本地化?

警告

本教程需要您了解如何在Odoo中構建模塊(請參閱 開始 )。

安裝過程?

安裝 account 模塊時,與公司國家代碼對應的本地化模塊會自動安裝。如果沒有設置國家代碼或找不到本地化模塊,則默認安裝 l10n_generic_coa (美國) 本地化模塊。詳見 post init hook。

例如,如果公司所在國家是“瑞士”,則會安裝 l10n_ch。

構建本地化模塊?

一個基本的 l10n_XX 模塊的結構可以通過以下 __manifest__.py 文件描述:

{
    "name": "COUNTRY - Accounting",
    "version": "1.0.0",
    "category": "Accounting/Localizations/Account Charts",
    "license": "LGPL-3",
    "depends": [
        "account",
        # "l10n_multilang",
    ],
    "data": [
        # Chart of Accounts
        "data/account_chart_template_data.xml",
        "data/account_account_tag_data.xml",
        "data/account.account.template.csv",
        "data/account.group.template.csv",

        # Taxes
        "data/account_tax_group_data.xml",
        "data/account_tax_report_data.xml",
        "data/account_tax_template_data.xml",
        "data/account_fiscal_position_template_data.xml",
        "data/account_account_template_post_data.xml",

        "data/account_chart_post_data.xml",
        "data/account_chart_template_try_loading.xml",

        # Views and others
        "views/xxxmodel_views.xml"
    ],
    "demo": [
        "demo/demo_company.xml",
    ]
}

在第一個文件 data/account_chart_template_data.xml 中,我們設置了會計科目表的名稱以及一些基本字段。

另請參閱

圖表模板參考

Example

addons/l10n_ch/data/l10n_ch_chart_data.xml

        <record id="l10nch_chart_template" model="account.chart.template">
            <field name="name">Plan comptable 2015 (Suisse)</field>
            <field name="code_digits">4</field>
            <field name="bank_account_code_prefix">102</field>
            <field name="cash_account_code_prefix">100</field>
            <field name="transfer_account_code_prefix">1090</field>
            <field name="currency_id" ref="base.CHF"/>
            <field name="country_id" ref="base.ch"/>
            <field name="spoken_languages" eval="'it_IT;de_DE;de_CH;fr_FR;fr_CH'"/>
        </record>

注解

記錄的推薦 xmlidchart_template 。如果您需要多個會計科目表,可以添加一些后綴,例如 chart_template_XXX 。

科目表?

賬戶標簽?

另請參閱

賬戶標簽參考

標簽是一種對賬戶進行分類的方式。例如,假設您想創建一個包含多行的財務報告,但您無法找到一條規則來根據其“代碼”分配賬戶。解決方案是使用標簽,為每個報告行使用一個標簽,以過濾您想要的賬戶。

將標簽放入 data/account_account_tag_data.xml 文件中。

Example

addons/l10n_lt/data/account.account.template.csv

"id","name","code","account_type","chart_template_id/id","tag_ids/id","reconcile"
"account_account_template_1130","Software Acquisition Cost",1130,"asset_non_current","l10n_lt.account_chart_template_lithuania","l10n_lt.account_account_tag_a_1_3","False"
"account_account_template_1138","Amortization of Software Value (-)",1138,"asset_non_current","l10n_lt.account_chart_template_lithuania","l10n_lt.account_account_tag_a_1_3","False"
"account_account_template_1200","Land Acquisition Cost",1200,"asset_fixed","l10n_lt.account_chart_template_lithuania","l10n_lt.account_account_tag_a_2_1","False"
"account_account_template_1201","Change of Land Value after Revaluation",1201,"asset_fixed","l10n_lt.account_chart_template_lithuania","l10n_lt.account_account_tag_a_2_1","False"

Example

addons/l10n_at/data/account_account_template.xml

        <record id="chart_at_template_0010" model="account.account.template">
          <field name="name">Aufwendungen für das Ingangsetzen und Erweitern eines Betriebes</field>
          <field name="code">0010</field>
          <field name="reconcile" eval="False"/>
          <field name="chart_template_id" ref="l10n_at_chart_template"/>
          <field name="account_type">asset_non_current</field>
          <field name="tag_ids" eval="[(6, 0, [ref('l10n_at.account_tag_l10n_at_AAI1')])]" />
        </record>

賬戶?

另請參閱

顯然,沒有 科目 ,就不可能有 會計科目表 。你需要在 data/account.account.template.csv 中指定它們。

Example

addons/l10n_ch/data/account.account.template.csv

"id","name","code","account_type","chart_template_id/id","reconcile"
"ch_coa_1060","Securities (with stock exchange price)","1060","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1069","Accumulated depreciation on securities","1069","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1091","Transfer account: Salaries","1091","asset_current","l10n_ch.l10nch_chart_template","True"
"ch_coa_1099","Transfer account: miscellaneous","1099","asset_current","l10n_ch.l10nch_chart_template","True"
"ch_coa_1100","Accounts receivable from goods and services (Debtors)","1100","asset_receivable","l10n_ch.l10nch_chart_template","True"
"ch_coa_1101","Receivable (PoS)","1101","asset_receivable","l10n_ch.l10nch_chart_template","True"
"ch_coa_1109","Del credere (Acc. depr. on debtors)","1109","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1140","Advances and loans","1140","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1149","Advances and loans adjustments","1149","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1170","Input Tax (VAT) receivable on material, goods, services, energy","1170","asset_current","l10n_ch.l10nch_chart_template","False"
"ch_coa_1171","Input Tax (VAT) receivable on investments, other operating expenses","1171","asset_current","l10n_ch.l10nch_chart_template","False"

CSV 是首選,但您也可以使用 XML 格式。

Example

addons/l10n_at/data/account_account_template.xml

        <record id="chart_at_template_0010" model="account.account.template">
          <field name="name">Aufwendungen für das Ingangsetzen und Erweitern eines Betriebes</field>
          <field name="code">0010</field>
          <field name="reconcile" eval="False"/>
          <field name="chart_template_id" ref="l10n_at_chart_template"/>
          <field name="account_type">asset_non_current</field>
          <field name="tag_ids" eval="[(6, 0, [ref('l10n_at.account_tag_l10n_at_AAI1')])]" />
        </record>

警告

  • 避免使用流動性 account.account.type !實際上,銀行和現金賬戶是在本地化模塊安裝時直接創建的,然后與 account.journal 相關聯。

  • 一般情況下,只需要一個應付/應收賬戶。但是我們還需要定義一個點 of Sale 應收賬戶(在 CoA 中鏈接)。

  • 不要創建太多賬戶:200-300個足夠了。但是,我們主要是要找到一個良好的平衡點,使大多數公司在之后使用時,會對會計科目表進行最小限度的調整。

下一步,會在一個單獨的文件中設置賬戶表的下一步設置,因為我們需要先提供一個 賬戶列表 。在 data/account_chart_post_data.xml 中,我們設置了一些默認賬戶:

Example

addons/l10n_ch/data/l10n_ch_chart_post_data.xml

    <record id="l10nch_chart_template" model="account.chart.template">
        <field name="property_account_receivable_id" ref="ch_coa_1100"/>
        <field name="property_account_payable_id" ref="ch_coa_2000"/>
        <field name="property_account_expense_categ_id" ref="ch_coa_4200"/>
        <field name="property_account_income_categ_id" ref="ch_coa_3200"/>
        <field name="income_currency_exchange_account_id" ref="ch_coa_3806"/>
        <field name="expense_currency_exchange_account_id" ref="ch_coa_4906"/>
        <field name="default_pos_receivable_account_id" ref="ch_coa_1101" />
        <field name="account_journal_early_pay_discount_loss_account_id" ref="ch_coa_4901"/>
        <field name="account_journal_early_pay_discount_gain_account_id" ref="ch_coa_3801"/>
    </record>

賬戶組?

另請參閱

賬戶組引用

賬戶組允許描述賬戶表的分層結構。需要在報告中激活過濾器,然后當您展開成日志條目時,它將顯示賬戶的父級。

它使用前綴 start / end ,因此所有代碼以 startend 之間的某些內容開頭的賬戶都將具有此 account.group 作為父級組。此外,賬戶組也可以有一個父賬戶組,以形成層次結構。

Example

addons/l10n_il/data/account.group.template.csv

編號

代碼前綴開始

代碼前綴結尾

名稱

圖表模板 ID/編號

il_group_100100

100100

100499

固定資產

l10n_il.il_chart_template

il_group_101110

101110

101400

流動資產

l10n_il.il_chart_template

il_group_101401

101401

101799

銀行和現金

l10n_il.il_chart_template

il_group_111000

111000

111999

流動負債

l10n_il.il_chart_template

il_group_112000

112000

112210

非流動負債

l10n_il.il_chart_template

il_group_200000

200000

200199

銷售收入

l10n_il.il_chart_template

il_group_200200

200200

200300

其他收入

l10n_il.il_chart_template

il_group_201000

201000

201299

商品成本

l10n_il.il_chart_template

il_group_202000

202000

220900

費用

l10n_il.il_chart_template

il_group_300000

300000

399999

股本和股份

l10n_il.il_chart_template

稅費?

另請參閱

要添加稅收,您首先需要指定稅收組。通常,每個稅率只需要一個稅收組,除了0%,因為您經常需要區分免稅、0%、不適用等稅收。此模型僅有兩個必填字段: 名稱國家 。創建文件 data/account_tax_group_data.xml 并列出組:

<odoo>
    <data noupdate="1">
        <record id="tax_group_tva_0" model="account.tax.group">
            <field name="name">TVA 0%</field>
            <field name="country_id" ref="base.ch"/>
        </record>

        ...
    </data>
</odoo>

Example

addons/l10n_ch/data/account_tax_group_data.xml

        <record id="tax_group_tva_0" model="account.tax.group">
            <field name="name">TVA 0%</field>
            <field name="country_id" ref="base.ch"/>
        </record>
        <record id="tax_group_tva_25" model="account.tax.group">
            <field name="name">TVA 2.5%</field>
            <field name="country_id" ref="base.ch"/>
        </record>
        <record id="tax_group_tva_37" model="account.tax.group">
            <field name="name">TVA 3.7%</field>
            <field name="country_id" ref="base.ch"/>
        </record>
        <record id="tax_group_tva_77" model="account.tax.group">
            <field name="name">TVA 7.7%</field>
            <field name="country_id" ref="base.ch"/>
        </record>
        <record id="tax_group_tva_100" model="account.tax.group">
            <field name="name">TVA 100%</field>
            <field name="country_id" ref="base.ch"/>
        </record>

Example

addons/l10n_uk/data/account.tax.group.csv

id,name,country_id/id
tax_group_0,TAX 0%,base.uk
tax_group_5,TAX 5%,base.uk
tax_group_175,TAX 17.5%,base.uk
tax_group_20,TAX 20%,base.uk

現在,您可以通過 data/account_tax_template_data.xml 文件添加稅費。您定義的第一個購買/銷售稅也將成為產品的默認購買/銷售稅。

Example

addons/l10n_ae/data/account_tax_template_data.xml

    <record id="uae_sale_tax_5_dubai" model="account.tax.template">
        <field name="name">VAT 5% (Dubai)</field>
        <field name="type_tax_use">sale</field>
        <field name="amount">5</field>
        <field name="amount_type">percent</field>
        <field name="description">VAT 5%</field>
        <field name="tax_group_id" ref="ae_tax_group_5"/>
        <field name="chart_template_id" ref="uae_chart_template_standard"/>
        <field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
            (0,0, {
                'repartition_type': 'base',
                'plus_report_expression_ids': [ref('tax_report_line_standard_rated_supplies_base_dubai_tag')],
            }),
            (0,0, {
                'repartition_type': 'tax',
                'account_id': ref('uae_account_201017'),
                'plus_report_expression_ids': [ref('tax_report_line_standard_rated_supplies_vat_dubai_tag')],
            }),
        ]"/>
        <field name="refund_repartition_line_ids" eval="[(5, 0, 0),
            (0,0, {
                'repartition_type': 'base',
                'minus_report_expression_ids': [ref('tax_report_line_standard_rated_supplies_base_dubai_tag')],
            }),
            (0,0, {
                'repartition_type': 'tax',
                'account_id': ref('uae_account_201017'),
                'minus_report_expression_ids': [ref('tax_report_line_standard_rated_supplies_vat_dubai_tag')],
            }),
        ]"/>
    </record>

如果某些賬戶應該使用默認稅率,您可以在 data/account_account_template_post_data.xml 中進行設置。

稅務報告?

Enterprise feature

稅務報告在 開票 ( account ) 應用程序中聲明,但只有在安裝了 會計 ( account_accountant ) 應用程序時才能訪問該報告。

在前一節中,您注意到了字段“invoice_repartition_line_ids”或“refund_repartition_line_ids”,可能對它們一無所知。好消息是:您不是唯一一個不理解的人。壞消息是:您需要稍微弄清楚一下。這個主題很復雜。確實:

digraph foo {
  graph [
    newrank=true,
    overlap=false,
  ];
  node [
    fontname="Ubuntu"
    fontsize=10,
    style="filled,setlinewidth(6)",
    shape=box,
    height=0.1,
    width=0.1,
  ];
  edge [
    fontsize=8,
  ];
  res_country[label="res.country", fillcolor=white, penwidth=1];
  subgraph cluster_invoice {
    style = filled;
    label = "Invoices";
    color = lightyellow;
    node [style=filled, color=white];
    edge [fontsize=8,];
    account_move_line[label="account.move.line"]
    account_tax[label="account.tax"]
    account_tax_repartition_line[label="account.tax.repartition.line"];
    account_account_tag[label="account.account.tag"];
    account_move_line -> account_tax [label="tax_ids | tax_line_ids"];
    account_move_line -> account_tax_repartition_line [label="tax_repartition_line_id"];
    account_move_line -> account_account_tag [label="tag_ids"];
    account_tax_repartition_line -> account_account_tag [label="tag_ids"];
    account_tax -> account_tax_repartition_line [label="1 for base, 1..* for tax amount"];
  }
  subgraph cluster_reporting {
    style = filled;
    label = "Reporting";
    color = mistyrose;
    node [style=filled, color=white];
    edge [fontsize=8,];
    account_tax_report [label="account.report"];
    account_tax_report_line [label="account.report.line"];
    account_report_expression [label="account.report.expression"];
    account_tax_report -> account_tax_report_line [label="0..*"]
  }
  subgraph cluster_templates {
    style = filled;
    label = "Templates";
    color = lightblue;
    node [style=filled, color=white];
    edge [fontsize=8,];
    account_tax_template[label="account.tax.template"];
    account_tax_repartition_line_template[label="account.tax.repartition.line.template"];
    account_tax_template -> account_tax_repartition_line_template [label="1 for base, 1..* for tax amount"];
  }
  {
    rank=same;
    account_move_line;
    account_tax_report;
  }
  {
    rank=same;
    account_tax;
    account_tax_repartition_line;
    account_account_tag;
    res_country;
  }
  {
    rank=same;
    account_report_expression;
    account_tax_template;
    account_tax_repartition_line_template;
  }
  account_tax -> account_tax_template [label="    Creates when\n    installing CoA", dir=back];
  account_tax_repartition_line -> account_tax_repartition_line_template[label="    Creates when\n   installing CoA", dir=back];
  account_tax_repartition_line_template -> account_account_tag [label="tag_ids"];
  account_tax_report_line -> account_report_expression [label="0..*"];
  account_tax_report_line -> account_tax_report_line [label="children_ids"];
  account_report_expression -> account_account_tag [label="Engine tax_tags 1..*"];
  account_tax_report -> res_country [label="0..1"];
  account_account_tag -> res_country [label="0..1"];
}

簡單來說,在稅務模板中,您可以通過發票/退款分配行指示哪些報告行需要報告稅的基數或百分比(通過 minus/plus_report_line_ids 字段)。當您在Odoo界面中檢查稅務配置(或查看文檔: Tax References , Tax Repartition References )時,這也變得清晰明了。

因此,一旦您正確配置了稅收,您只需要添加 data/account_tax_report_data.xml 文件,并為您的 account.report 添加一條記錄。為了將其視為稅務報告,您需要為其提供正確的 root_report_id 。

<odoo>
    <record id="tax_report" model="account.report">
        <field name="name">Tax Report</field>
        <field name="root_report_id" ref="account.generic_tax_report"/>
        <field name="country_id" ref="base.XX"/>
    </record>

    ...
</odoo>

… 接著是其行的聲明,作為 account.report.line 記錄。

Example

addons/l10n_au/data/account_tax_report_data.xml

    <record id="tax_report" model="account.report">
        <field name="name">Tax Report</field>
        <field name="root_report_id" ref="account.generic_tax_report"/>
        <field name="country_id" ref="base.au"/>
        <field name="filter_fiscal_position" eval="True"/>
        <field name="availability_condition">country</field>
        <field name="column_ids">
            <record id="tax_report_balance" model="account.report.column">
                <field name="name">Balance</field>
                <field name="expression_label">balance</field>
            </record>
        </field>
        <field name="line_ids">
            <record id="account_tax_report_gstrpt_sale_total" model="account.report.line">
                <field name="name">GST amounts you owe the Tax Office from sales</field>
                <field name="children_ids">
                    <record id="account_tax_report_gstrpt_g1" model="account.report.line">
                        <field name="name">G1: Total Sales (including any GST)</field>
                        <field name="code">G1</field>
                        <field name="expression_ids">
                            <record id="account_tax_report_gstrpt_g1_tag" model="account.report.expression">
                                <field name="label">balance</field>
                                <field name="engine">tax_tags</field>
                                <field name="formula">G1</field>
                            </record>
                        </field>
                        <field name="children_ids">
                            <record id="account_tax_report_gstrpt_g2" model="account.report.line">
                                <field name="name">G2: Export sales</field>
                                <field name="code">G2</field>
                                <field name="expression_ids">
                                    <record id="account_tax_report_gstrpt_g2_tag" model="account.report.expression">
                                        <field name="label">balance</field>
                                        <field name="engine">tax_tags</field>
                                        <field name="formula">G2</field>
                                    </record>
                                </field>
                            </record>

財務位置?

data/account_fiscal_position_template_data.xml 文件中指定財務位置。

Example

addons/l10n_es/data/account_fiscal_position_template_data.xml

        <record id="fp_nacional" model="account.fiscal.position.template">
            <field name="sequence">1</field>
            <field name="name">Régimen Nacional</field>
            <field name="chart_template_id" ref="account_chart_template_common"/>
            <field name="auto_apply" eval="True"/>
            <field name="vat_required" eval="True"/>
            <field name="country_id" ref="base.es"/>
        </record>

最后的步驟?

安裝本地化模塊的最后一步是嘗試將其會計科目表應用于當前公司(如果尚未有)。文件 data/account_chart_template_try_loading.xml 負責此操作。

Example

addons/l10n_ch/data/account_chart_template_data.xml

        <function model="account.chart.template" name="try_loading">
            <value eval="[ref('l10n_ch.l10nch_chart_template')]"/>
        </function>

最后,您可以添加一個演示公司,以便可以在演示模式下輕松測試本地化。

Example

addons/l10n_ch/demo/demo_company.xml

    <record id="partner_demo_company_ch" model="res.partner">
        <field name="name">CH Company</field>
        <field name="vat">CHE-530781296TVA</field>
        <field name="street">14 Meierskappelerstrasse</field>
        <field name="city">Risch-Rotkreuz</field>
        <field name="country_id" ref="base.ch"/>
        
        <field name="zip">6343</field>
        <field name="phone">+41 78 123 45 67</field>
        <field name="email">info@company.chexample.com</field>
        <field name="website">www.chexample.com</field>
    </record>

    <record id="demo_company_ch" model="res.company">
        <field name="name">CH Company</field>
        <field name="partner_id" ref="partner_demo_company_ch"/>
    </record>

    <function model="res.company" name="_onchange_country_id">
        <value eval="[ref('demo_company_ch')]"/>
    </function>

    <function model="res.users" name="write">
        <value eval="[ref('base.user_root'), ref('base.user_admin'), ref('base.user_demo')]"/>
        <value eval="{'company_ids': [(4, ref('l10n_ch.demo_company_ch'))]}"/>
    </function>

    <function model="account.chart.template" name="try_loading">
        <value eval="[ref('l10n_ch.l10nch_chart_template')]"/>
        <value model="res.company" eval="obj().env.ref('l10n_ch.demo_company_ch')"/>
    </function>

會計報告?

Enterprise feature

另請參閱

概覽

應該通過一個單獨的模塊 l10n_XX_reports 來添加會計報告,該模塊應該放在 企業版代碼庫 中。

這樣一個模塊的基本 __manifest__.py 文件如下所示:

{
    "name": "COUNTRY - Accounting Reports",
    "category": "Accounting/Localizations/Reporting",
    "version": "1.0.0",
    "license": "OEEL-1",
    "depends": [
        "l10n_XX", "account_reports"
    ],
    "data": [
        "data/balance_sheet.xml",
        "data/profit_and_loss.xml",
    ],
    "auto_install": True,
}

財務報表的功能概述在這里: 可用的主要報告 。

一些好的例子:

您可以在此處查看字段的含義:

如果您給報表設置了 root_report_id ,則它現在可以在其變體選擇器中使用。如果沒有,則仍需要為其添加菜單項??梢酝ㄟ^報表的表單視圖創建默認菜單項,方法是單擊 操作 ? 創建菜單項 。然后需要刷新頁面才能看到它?;蛘?,要在 報告 菜單中創建一個全新報表的專用部分,需要創建一個新的 ir.ui.menu 記錄(通常在主 l10n_XX 模塊中),以及一個新的 ir.actions.client (通常在新報表的 XML 文件中),該文件調用 account.report 并使用新的 報表 ID 。然后,在操作模型中將新菜單設置為 parent_id 字段。