會計本地化?
警告
本教程需要您了解如何在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>
注解
記錄的推薦 xmlid 是 chart_template
。如果您需要多個會計科目表,可以添加一些后綴,例如 chart_template_XXX
。
科目表?
賬戶?
顯然,沒有 科目 ,就不可能有 會計科目表 。你需要在 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 ,因此所有代碼以 start 和 end 之間的某些內容開頭的賬戶都將具有此 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
中進行設置。
稅務報告?
稅務報告在 開票 ( 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"];
}](../../_images/graphviz-a6f9dd5b1e5c804f44b7307d6723656c048761d4.png)
簡單來說,在稅務模板中,您可以通過發票/退款分配行指示哪些報告行需要報告稅的基數或百分比(通過 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>
會計報告?
另請參閱
應該通過一個單獨的模塊 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
字段。
Example