会计本地化¶
警告
本教程要求了解如何在 Odoo 中构建模块(参见 服务器框架入门 )。
安装流程¶
在安装 account 模块时,会根据公司的国家代码自动安装对应的本地化模块。如果没有设置国家代码或未找到本地化模块,则默认安装 l10n_generic_coa <https://github.com/odoo/odoo/blob/18.0/addons/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",
],
"data": [
"data/other_data.xml",
"views/xxxmodel_views.xml",
],
"demo": [
"demo/demo_company.xml",
]
}
您的工作目录应如下所示
l10n_xx
├── data
│ ├── template
│ │ ├── account.account-xx.csv
│ │ ├── account.group-xx.csv
│ │ └── account.tax.group-xx.csv
│ └── other_data.xml
├── views
│ └── xxxmodel_views.xml
├── demo
│ └── demo_company.xml
├── models
│ ├── template_xx.py
│ └── __init__.py
├── __init__.py
└── __manifest__.py
在第一个文件 models/template_xx.py
中,我们设置了账目表的名称以及一些基本字段。
参见
Example
addons/l10n_be/models/template_be.py
def _get_be_template_data(self):
return {
'name': _('Base'),
'visible': False,
'code_digits': '6',
'property_account_receivable_id': 'a400',
'property_account_payable_id': 'a440',
'property_account_expense_categ_id': 'a600',
'property_account_income_categ_id': 'a7000',
}
@template('be', 'res.company')
def _get_be_res_company(self):
return {
self.env.company.id: {
'account_fiscal_country_id': 'base.be',
'bank_account_code_prefix': '550',
'cash_account_code_prefix': '570',
'transfer_account_code_prefix': '580',
'account_default_pos_receivable_account_id': 'a4001',
'income_currency_exchange_account_id': 'a754',
'expense_currency_exchange_account_id': 'a654',
'account_journal_suspense_account_id': 'a499',
'account_journal_early_pay_discount_loss_account_id': 'a657000',
'account_journal_early_pay_discount_gain_account_id': 'a757000',
'account_sale_tax_id': 'attn_VAT-OUT-21-L',
'account_purchase_tax_id': 'attn_VAT-IN-V81-21',
'default_cash_difference_income_account_id': 'a757100',
'default_cash_difference_expense_account_id': 'a657100',
'transfer_account_id': 'a58',
},
}
@template('be', 'account.journal')
def _get_be_account_journal(self):
return {
'sale': {'refund_sequence': True},
'purchase': {'refund_sequence': True},
}
@template('be', 'account.reconcile.model')
账目表¶
账户¶
显然,没有 账户 就无法存在 账目表 。您需要在 data/account.account.template.csv
中指定它们。
Example
addons/l10n_ch/data/template/account.account-ch.csv
"id","name","code","account_type","reconcile","name@de","name@it","name@fr","name@ar","name@zh_CN","name@nl"
"ch_coa_1060","Securities (with stock exchange price)","1060","asset_current","False","Wertpapiere (mit Börsenkurs)","Titoli","Titres","","",""
"ch_coa_1069","Accumulated depreciation on securities","1069","asset_current","False","Kumulierte Abschreibungen auf Wertpapiere","Rettifica valore titoli","Ajustement de la valeur des titres","","",""
"ch_coa_1090","Salary-Pass-Through Account","1090","asset_current","True","Gehaltsdurchlaufkonto","Conto di trasferimento dello stipendio","Compte de transfert de salaire","","",""
"ch_coa_1091","Transfer account: Salaries","1091","asset_current","True","Transferkonto: Gehälter","Conto d'attesa - Salari","Compte d'attente pour salaires","","",""
"ch_coa_1099","Transfer account: miscellaneous","1099","asset_current","True","Transferkonto: Verschiedenes","Conto d'attesa - altro","Compte d'attente autre","","",""
"ch_coa_1100","Accounts receivable from goods and services (Debtors)","1100","asset_receivable","True","Forderungen aus Lieferungen und Leistungen (Debitoren)","Crediti da forniture e prestazioni (debitori)","Débiteurs","","",""
"ch_coa_1101","Receivable (PoS)","1101","asset_receivable","True","Forderungen (PoS)","Crediti (Punti Vendita)","Débiteurs (PoS)","","",""
"ch_coa_1109","Del credere (Acc. depr. on debtors)","1109","asset_current","False","Delkredere (Akontoabzug für Schuldner)","Delcredere","Ducroire","","",""
"ch_coa_1140","Advances and loans","1140","asset_current","False","Vorschüsse und Darlehen","Anticipi e prestiti","Avances et prêts","","",""
"ch_coa_1149","Advances and loans adjustments","1149","asset_current","False","Anpassungen von Vorschüssen und Darlehen","Rettifica valore anticipi e prestiti","Ajustement de la valeur des avances et des prêts","","",""
"ch_coa_1170","Input Tax (VAT) receivable on material, goods, services, energy","1170","asset_current","False","Vorsteuer (MwSt.) auf Material, Waren, Dienstleistungen, Energie","IVA, Imposta precedente su materiale, merce, servizi e energia","Impôt préalable: TVA s/matériel, marchandises, prestations et énergie","","",""
"ch_coa_1171","Input Tax (VAT) receivable on investments, other operating expenses","1171","asset_current","False","Vorsteuer (MwSt.) auf Investitionen, sonstige betriebliche Aufwendungen","IVA, imposta precedente su investimenti e altri costi d’esercizio","Impôt préalable: TVA s/investissements et autres charges d’exploitation","","",""
警告
避免使用
asset_cash
类型的account_type
!实际上,银行和现金账户会在安装本地化模块时直接创建,然后与account.journal
关联。对于通用情况,仅需一个应付/应收类型的账户即可。然而,我们也需要定义一个 PoS 应收账户(在账目表中关联)。
不要创建过多的账户:200-300个已经足够。但更重要的是,我们需要找到一个平衡点,使账目表(CoA)在大多数公司使用时只需进行最少的调整。
账户组¶
参见
账户组用于描述账目表的层级结构。需要在报告中激活过滤器,然后当您展开到日记账分录时,它将显示该账户的父级。
它通过前缀 start/end 工作,因此所有代码介于 start 和 end 之间的账户都会将此 account.group
作为其父组。此外,账户组还可以拥有父账户组以形成层级结构。
Example
addons/l10n_il/data/template/account.group-il.csv
ID |
起始代码前缀 |
结束代码前缀 |
名称 |
名称@希伯来语 |
---|---|---|---|---|
以色列分组_100100 |
100100 |
100499 |
固定资产 |
固定资产(希伯来语) |
以色列分组_101110 |
101110 |
101400 |
流动资产 |
流动资产(希伯来语) |
以色列分组_101401 |
101401 |
101799 |
银行与现金 |
银行与现金(希伯来语) |
以色列分组_111000 |
111000 |
111999 |
流动负债 |
流动负债(希伯来语) |
以色列分组_112000 |
112000 |
112210 |
非流动负债 |
非流动负债(希伯来语) |
以色列分组_200000 |
200000 |
200199 |
Sales Income |
הכנסות ממכירות |
il_group_200200 |
200200 |
200300 |
Other Income |
הכנסות אחרות |
il_group_201000 |
201000 |
201299 |
Cost of Goods |
עלות המכר |
il_group_202000 |
202000 |
220900 |
Expenses |
הוצאות |
il_group_300000 |
300000 |
399999 |
Capital And Shares |
הון ומניות |
税金¶
要添加税金,首先需要指定税金组。通常每个税率只需要一个税金组,但对于 0% 的税率,您需要区分免税、0%、不适用等税金类型。此模型只有两个必填字段:name
和 country
。创建文件 data/template/account.tax.group-xx.csv
并列出这些组。
Example
addons/l10n_uk/data/template/account.tax.group-uk.csv
"id","name","country_id","tax_payable_account_id","tax_receivable_account_id"
"tax_group_0","TAX 0%","base.uk","2202","2202"
"tax_group_5","TAX 5%","base.uk","2202","2202"
"tax_group_175","TAX 17.5%","base.uk","2202","2202"
"tax_group_20","TAX 20%","base.uk","2202","2202"
现在,您可以通过 data/template/account.tax-xx.csv
文件添加税金。您定义的第一个采购/销售税金也将成为产品的默认采购/销售税金。
Example
addons/l10n_ae/data/template/account.tax-ae.csv
"id","name","type_tax_use","amount","amount_type","description","invoice_label","tax_group_id","repartition_line_ids/repartition_type","repartition_line_ids/document_type","repartition_line_ids/tag_ids","repartition_line_ids/account_id","repartition_line_ids/factor_percent"
"uae_sale_tax_5_dubai","5% DB","sale","5.0","percent","Vat 5% Dubai","VAT 5%","ae_tax_group_5","base","invoice","+b. Dubai (Base)","",""
"","","","","","","","","tax","invoice","+b. Dubai (Tax)","uae_account_201017",""
"","","","","","","","","base","refund","-b. Dubai (Base)","",""
"","","","","","","","","tax","refund","-b. Dubai (Tax)","uae_account_201017",""
"uae_sale_tax_5_abu_dhabi","5% AD","sale","5.0","percent","VAT 5% Abu Dhabi","VAT 5%","ae_tax_group_5","base","invoice","+a. Abu Dhabi (Base)","",""
"","","","","","","","","tax","invoice","+a. Abu Dhabi (Tax)","uae_account_201017",""
"","","","","","","","","base","refund","-a. Abu Dhabi (Base)","",""
"","","","","","","","","tax","refund","-a. Abu Dhabi (Tax)","uae_account_201017",""
"uae_sale_tax_5_sharjah","5% S","sale","5.0","percent","VAT 5% Sharjah","VAT 5%","ae_tax_group_5","base","invoice","+c. Sharjah (Base)","",""
"","","","","","","","","tax","invoice","+c. Sharjah (Tax)","uae_account_201017",""
"","","","","","","","","base","refund","-c. Sharjah (Base)","",""
"","","","","","","","","tax","refund","-c. Sharjah (Tax)","uae_account_201017",""
"uae_sale_tax_5_ajman","5% A","sale","5.0","percent","VAT 5% Ajman","VAT 5%","ae_tax_group_5","base","invoice","+d. Ajman (Base)","",""
"","","","","","","","","tax","invoice","+d. Ajman (Tax)","uae_account_201017",""
"","","","","","","","","base","refund","-d. Ajman (Base)","",""
"","","","","","","","","tax","refund","-d. Ajman (Tax)","uae_account_201017",""
"uae_sale_tax_5_umm_al_quwain","5% UAQ","sale","5.0","percent","VAT 5% Umm Al Quwain","VAT 5%","ae_tax_group_5","base","invoice","+e. Umm Al Quwain (Base)","",""
"","","","","","","","","tax","invoice","+e. Umm Al Quwain (Tax)","uae_account_201017",""
"","","","","","","","","base","refund","-e. Umm Al Quwain (Base)","",""
"","","","","","","","","tax","refund","-e. Umm Al Quwain (Tax)","uae_account_201017",""
"uae_sale_tax_5_ras_al_khaima","5% RAK","sale","5.0","percent","VAT 5% Ras Al-Khaima","VAT 5%","ae_tax_group_5","base","invoice","+f. Ras Al-Khaima (Base)","",""
税务报告¶
税务报告在 开票 ( account
)应用中声明,但只有在安装了 会计 ( account_accountant
)后才能访问该报告。
在上一节中,您可能注意到了字段 invoice_repartition_line_ids
或 refund_repartition_line_ids
,但可能对它们一无所知。好消息是:不止您一个人对此感到困惑。坏消息是:您需要稍微弄清楚一些内容。这个主题确实很复杂。
accounting_localization/tax_report.dot > Graph not rendered because `dot` is not installed
简单来说,在税金模板中,您需要在发票/退款分配行中指明是否需要将税基或税金的百分比报告到哪一行(通过 minus/plus_report_line_ids 字段)。当您在 Odoo 界面中检查税金配置时,这一点也会变得清晰(或者查看文档 税金参考 , 税金分配参考 )。
因此,一旦您正确配置了税金,只需添加 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">BAS 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="hierarchy_level">0</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/template/account.fiscal.position-xx.csv
文件中指定财税位置。
Example
addons/l10n_es/data/template/account.fiscal.position-es_common_mainland.csv
"id","sequence","name","name@es","name@ca","auto_apply","vat_required","country_id","country_group_id","tax_ids/tax_src_id","tax_ids/tax_dest_id","account_ids/account_src_id","account_ids/account_dest_id"
"fp_nacional","1","Domestic","Régimen Nacional","Règim nacional","1","1","base.es","","","","",""
"fp_intra_private","2","EU private","EU privado","EU privat","1","","","base.europe","","","",""
"fp_intra","3","Intra-community","Régimen Intracomunitario","Règim intracomunitari","1","1","","base.europe","account_tax_template_p_iva0_s_bc","account_tax_template_p_iva0_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva0_s_sc","account_tax_template_p_iva0_ic_sc","",""
"","","","","","","","","","account_tax_template_p_iva2_bc","account_tax_template_p_iva2_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva2_sc","account_tax_template_p_iva2_ic_sc","",""
"","","","","","","","","","account_tax_template_p_iva4_bc","account_tax_template_p_iva4_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva4_sc","account_tax_template_p_iva4_sp_in","",""
"","","","","","","","","","account_tax_template_p_iva4_bi","account_tax_template_p_iva4_ic_bi","",""
"","","","","","","","","","account_tax_template_p_iva5_bc","account_tax_template_p_iva5_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva5_sc","account_tax_template_p_iva5_ic_sc","",""
"","","","","","","","","","account_tax_template_p_iva7-5_bc","account_tax_template_p_iva7-5_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva7-5_sc","account_tax_template_p_iva7-5_ic_sc","",""
"","","","","","","","","","account_tax_template_p_iva10_bc","account_tax_template_p_iva10_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva10_sc","account_tax_template_p_iva10_sp_in","",""
"","","","","","","","","","account_tax_template_p_iva10_bi","account_tax_template_p_iva10_ic_bi","",""
"","","","","","","","","","account_tax_template_p_iva21_bc","account_tax_template_p_iva21_ic_bc","",""
"","","","","","","","","","account_tax_template_p_iva21_sc","account_tax_template_p_iva21_sp_in","",""
"","","","","","","","","","account_tax_template_p_iva21_bi","account_tax_template_p_iva21_ic_bi","",""
"","","","","","","","","","account_tax_template_s_iva0b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva0s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva2b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva2s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva4b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva4s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva5b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva5s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva7-5b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva7-5s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva10b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva10s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","account_tax_template_s_iva21b","account_tax_template_s_iva0_g_i","",""
"","","","","","","","","","account_tax_template_s_iva21s","account_tax_template_s_iva0_sp_i","",""
"","","","","","","","","","","","account_common_7000","account_common_7001"
"","","","","","","","","","","","account_common_7010","account_common_7011"
"","","","","","","","","","","","account_common_7020","account_common_7021"
"","","","","","","","","","","","account_common_7030","account_common_7031"
"","","","","","","","","","","","account_common_7040","account_common_7041"
"","","","","","","","","","","","account_common_7050","account_common_7051"
"fp_extra","4","Extra-community","Régimen Extracomunitario","Règim extracomunitari","1","","","","account_tax_template_p_iva0_s_bc","account_tax_template_p_iva0_ibc","",""
"","","","","","","","","","account_tax_template_p_iva0_s_sc","account_tax_template_p_iva0_isc","",""
"","","","","","","","","","account_tax_template_p_iva2_bc","account_tax_template_p_iva2_ibc","",""
"","","","","","","","","","account_tax_template_p_iva2_sc","account_tax_template_p_iva2_isc","",""
"","","","","","","","","","account_tax_template_p_iva4_bc","account_tax_template_p_dua_exempt","",""
"","","","","","","","","","account_tax_template_p_iva4_sc","account_tax_template_p_iva4_sp_ex","",""
"","","","","","","","","","account_tax_template_p_iva4_bi","account_tax_template_p_iva4_ibi","",""
"","","","","","","","","","account_tax_template_p_iva5_bc","account_tax_template_p_dua_exempt","",""
"","","","","","","","","","account_tax_template_p_iva5_sc","account_tax_template_p_iva5_isc","",""
"","","","","","","","","","account_tax_template_p_iva7-5_bc","account_tax_template_p_iva7-5_ibc","",""
"","","","","","","","","","account_tax_template_p_iva7-5_sc","account_tax_template_p_iva7-5_isc","",""
"","","","","","","","","","account_tax_template_p_iva10_bc","account_tax_template_p_dua_exempt","",""
"","","","","","","","","","account_tax_template_p_iva10_sc","account_tax_template_p_iva10_sp_ex","",""
最后步骤¶
最后,您可以添加一个演示公司,以便在演示模式下轻松测试本地化功能。
Example
addons/l10n_ch/demo/demo_company.xml
<record id="base.partner_demo_company_ch" model="res.partner" forcecreate="1">
<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>
<field name="is_company" eval="True"/>
</record>
<record id="base.demo_bank_ch" model="res.partner.bank" forcecreate="1">
<field name="acc_type">iban</field>
<field name="acc_number">CH4431999123000889012</field>
<field name="partner_id" ref="base.partner_demo_company_ch"/>
</record>
<record id="base.demo_company_ch" model="res.company" forcecreate="1">
<field name="name">CH Company</field>
<field name="partner_id" ref="base.partner_demo_company_ch"/>
</record>
<function model="res.company" name="_onchange_country_id">
<value eval="[ref('base.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('base.demo_company_ch'))]}"/>
</function>
<function model="account.chart.template" name="try_loading">
<value eval="[]"/>
<value>ch</value>
<value model="res.company" eval="obj().env.ref('base.demo_company_ch')"/>
<value name="install_demo" eval="True"/>
</function>
会计报告¶
参见
会计报表应通过一个单独的模块 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 文件中),调用带有新 报告 ID 的 account.report
。然后将新菜单设置为动作模型中的 parent_id
字段。