Skip to content
Snippets Groups Projects
Commit 9a0e3a11 authored by Nhomar Hernandez's avatar Nhomar Hernandez Committed by Quentin De Paoli
Browse files

[IMP] l10n_mx: Completely refactored Mexican CoA Template. Courtesy of Vauxoo.

* Added accounts provided following the structure provided by the SAT
this accounts are only the minimal necessary ones, with the objective
to set the first easiest engagement to new users and tags will represent the actual information
from the document linked.

* The name of the tag is the concatenation of tag.code + tag.name, because the account.tag
model have not the code field.

Note: we will need more accounts but some of them for special operations
which are not basic at all, then it is better just propose the operational accounts
once we understand a proper closing process.

* Set the proper user-types on accounts in order to be able to use it with the official reports this CoA
for operational purpose.

* Added nature field and data in tags to allow set this value in electronic account report, and
set this value with data pre loaded, we did not use user.type for this due to the fact that the same user type can have different nature (if it grows for credit or debit), I do not know if this field brakes the stable rule we can discuse about that.

* Assign the account tags with in the Mexican CoA template installation, and with an onchange(account.code) when manually modifying/creating accounts.

Rationale: If the code of the accounts follows the pattern 111.00.00 or 111-00-00 then it will
set the tag 111.00 if the tag exists, if not then this will be ignored.

* Generate an account tag by each second level account in SAT catalog, and assign to the corresponding account.
parent d6ead3db
No related branches found
No related tags found
No related merge requests found
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
......@@ -30,8 +30,13 @@ With this module you will have:
.. SAT: http://www.sat.gob.mx/
""",
"depends": ["account", "base_vat"],
"depends": [
"account",
"base_vat",
"account_tax_cash_basis",
],
"data": [
"data/account_tag_data.xml",
"data/l10n_mx_chart_data.xml",
"data/account_tax_data.xml",
"data/account_chart_template_data.yml",
......
-
!python {model: account.chart.template, id: vauxoo_mx_chart_template}: |
self[0].try_loading_for_current_company()
\ No newline at end of file
!python {model: account.chart.template, id: mx_coa}: |
self[0].try_loading_for_current_company()
This diff is collapsed.
......@@ -6,10 +6,6 @@
<field name="name">IVA(0%) VENTAS</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_02" model="account.account.tag">
<field name="name">IVA(11%) VENTAS</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_03" model="account.account.tag">
<field name="name">IVA(16%) VENTAS</field>
<field name="applicability">taxes</field>
......@@ -42,157 +38,129 @@
<field name="name">IVA(0%) COMPRAS</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_11" model="account.account.tag">
<field name="name">IVA(11%) COMPRAS</field>
<field name="applicability">taxes</field>
</record>
<record id="tax_tag_12" model="account.account.tag">
<field name="name">IVA(16%) COMPRAS</field>
<field name="applicability">taxes</field>
</record>
<record id="tax9" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax9" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">IVA(0%) VENTAS</field>
<field name="description">ITAX_010-IN</field>
<field name="amount">0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="account_id" ref="cuenta2202113000"/>
<field name="refund_account_id" ref="cuenta2202113000"/>
<field name="amount">0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="account_id" ref="cuenta209_01"/>
<field name="refund_account_id" ref="cuenta209_01"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_01')])]"/>
</record>
<record id="tax11" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<field name="name">IVA(11%) VENTAS</field>
<field name="description">ITAX_110-IN</field>
<field name="amount">11</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="account_id" ref="cuenta2202113000"/>
<field name="refund_account_id" ref="cuenta2202113000"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_02')])]"/>
</record>
</record>
<record id="tax12" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax12" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">IVA(16%) VENTAS</field>
<field name="description">ITAX_160-IN</field>
<field name="amount">16</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="account_id" ref="cuenta2202113000"/>
<field name="refund_account_id" ref="cuenta2202113000"/>
<field name="amount">16</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="account_id" ref="cuenta209_01"/>
<field name="refund_account_id" ref="cuenta209_01"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_03')])]"/>
</record>
</record>
<record id="tax1" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax1" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RET IVA FLETES 4%</field>
<field name="description">ITAXR_04-OUT</field>
<field name="amount">-4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201112000"/>
<field name="refund_account_id" ref="cuenta2201112000"/>
<field name="amount">-4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_10"/>
<field name="refund_account_id" ref="cuenta216_10"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_04')])]"/>
</record>
</record>
<record id="tax2" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax2" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RET IVA ARRENDAMIENTO 10%</field>
<field name="description">ITAXR_10-OUT</field>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201117000"/>
<field name="refund_account_id" ref="cuenta2201117000"/>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_10"/>
<field name="refund_account_id" ref="cuenta216_10"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_05')])]"/>
</record>
</record>
<record id="tax3" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax3" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RET ISR ARRENDAMIENTO 10%</field>
<field name="description">ITAXA_10-OUT</field>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201116000"/>
<field name="refund_account_id" ref="cuenta2201116000"/>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_03"/>
<field name="refund_account_id" ref="cuenta216_03"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_06')])]"/>
</record>
</record>
<record id="tax5" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax5" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RET ISR HONORARIOS 10%</field>
<field name="description">ITAXH_10-OUT</field>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201115000"/>
<field name="refund_account_id" ref="cuenta2201115000"/>
<field name="amount">-10</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_04"/>
<field name="refund_account_id" ref="cuenta216_04"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_07')])]"/>
</record>
</record>
<record id="tax7" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax7" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RETENCION IVA ARRENDAMIENTO 10.67%</field>
<field name="description">ITAX_1067-OUT</field>
<field name="amount">-10.67</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201116000"/>
<field name="refund_account_id" ref="cuenta2201116000"/>
<field name="amount">-10.67</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_10"/>
<field name="refund_account_id" ref="cuenta216_10"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_08')])]"/>
</record>
</record>
<record id="tax8" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax8" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">RETENCION IVA HONORARIOS 10.67%</field>
<field name="description">ITAX_167-OUT</field>
<field name="amount">-10.67</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta2201118000"/>
<field name="refund_account_id" ref="cuenta2201118000"/>
<field name="amount">-10.67</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta216_10"/>
<field name="refund_account_id" ref="cuenta216_10"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_09')])]"/>
</record>
</record>
<record id="tax13" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax13" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">IVA(0%) COMPRAS</field>
<field name="description">ITAX_010-OUT</field>
<field name="amount">0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta1151004000"/>
<field name="refund_account_id" ref="cuenta1151004000"/>
<field name="amount">0</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta119_01"/>
<field name="refund_account_id" ref="cuenta119_01"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_10')])]"/>
</record>
<record id="tax10" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<field name="name">IVA(11%) COMPRAS</field>
<field name="description">ITAX_110-OUT</field>
<field name="amount">11</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta1151004000"/>
<field name="refund_account_id" ref="cuenta1151004000"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_11')])]"/>
</record>
</record>
<record id="tax14" model="account.tax.template">
<field name="chart_template_id" ref="vauxoo_mx_chart_template"/>
<record id="tax14" model="account.tax.template">
<field name="chart_template_id" ref="mx_coa"/>
<field name="name">IVA(16%) COMPRAS</field>
<field name="description">ITAX_160-OUT</field>
<field name="amount">16</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta1151004000"/>
<field name="refund_account_id" ref="cuenta1151004000"/>
<field name="amount">16</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="account_id" ref="cuenta119_01"/>
<field name="refund_account_id" ref="cuenta119_01"/>
<field name="tag_ids" eval="[(6,0,[ref('tax_tag_12')])]"/>
</record>
</record>
</data>
</odoo>
This diff is collapsed.
# coding: utf-8
# Copyright 2016 Vauxoo (https://www.vauxoo.com) <info@vauxoo.com>
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import chart_template
from . import account
# coding: utf-8
# Copyright 2016 Vauxoo (https://www.vauxoo.com) <info@vauxoo.com>
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
import re
from odoo import models, api, fields, _
class AccountJournal(models.Model):
_inherit = 'account.journal'
@api.model
def _prepare_liquidity_account(self, name, company, currency_id, type):
'''
When preparing the values to use when creating the default debit and credit accounts of a
liquidity journal, set the correct tags for the mexican localization.
'''
res = super(AccountJournal, self)._prepare_liquidity_account(name, company, currency_id, type)
if company.country_id.id == self.env.ref('base.mx').id:
mx_tags = self.env['account.account'].mx_search_tags(res.get('code', ''))
if mx_tags:
res.update({
'tag_ids': [(6, 0, [tag.id for tag in mx_tags])]
})
return res
class AccountAccount(models.Model):
_inherit = 'account.account'
@api.model
def mx_search_tags(self, code):
account_tag = self.env['account.account.tag']
#search if the code is compliant with the regexp we have for tags auto-assignation
re_res = re.search(
'^(?P<first>[1-8][0-9][0-9])[,.]'
'(?P<second>[0-9][0-9])[,.]'
'(?P<third>[0-9]{2,3})$', code)
if not re_res:
return account_tag
#get the elements of that code divided with separation declared in the regexp
account = re_res.groups()
return account_tag.search([
('name', '=like', "%s.%s%%" % (account[0], account[1])),
('color', '=', 4)], limit=1)
@api.onchange('code')
def _onchange_code(self):
if self.company_id.country_id.id == self.env.ref('base.mx').id and self.code:
tags = self.mx_search_tags(self.code)
self.tag_ids = tags
class AccountAccountTag(models.Model):
_inherit = 'account.account.tag'
nature = fields.Selection([
('D', _('Debitable Account')), ('A', _('Creditable Account'))],
help='Used in Mexican report of electronic accounting (account nature).')
# coding: utf-8
# Copyright 2016 Vauxoo (https://www.vauxoo.com) <info@vauxoo.com>
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from odoo import models, api, _
class AccountChartTemplate(models.Model):
_inherit = "account.chart.template"
@api.multi
def _load_template(
self, company, code_digits=None, transfer_account_id=None,
account_ref=None, taxes_ref=None):
"""
Set the 'use_cash_basis' and 'cash_basis_account' fields on account.account. This hack is needed due to the fact
that the tax template does not have the fields 'use_cash_basis' and 'cash_basis_account'.
This hunk should be removed in master, as the account_tax_cash_basis module has been merged already in account
module
"""
self.ensure_one()
accounts, taxes = super(AccountChartTemplate, self)._load_template(
company, code_digits=code_digits,
transfer_account_id=transfer_account_id, account_ref=account_ref,
taxes_ref=taxes_ref)
if not self == self.env.ref('l10n_mx.mx_coa'):
return accounts, taxes
account_tax_obj = self.env['account.tax']
account_obj = self.env['account.account']
taxes_acc = {
'ITAX_010-IN': account_obj.search([('code', '=', '208.01.01')]),
'ITAX_160-IN': account_obj.search([('code', '=', '208.01.01')]),
'ITAXR_04-OUT': account_obj.search([('code', '=', '216.13.01')]),
'ITAXR_10-OUT': account_obj.search([('code', '=', '216.13.01')]),
'ITAX_1067-OUT': account_obj.search([('code', '=', '216.13.01')]),
'ITAX_167-OUT': account_obj.search([('code', '=', '216.13.01')]),
'ITAX_010-OUT': account_obj.search([('code', '=', '208.01.01')]),
'ITAX_160-OUT': account_obj.search([('code', '=', '208.01.01')])}
for tax in self.tax_template_ids:
if tax.description not in taxes_acc:
continue
account_tax_obj.browse(taxes.get(tax.id)).write({
'use_cash_basis': True,
'cash_basis_account': taxes_acc.get(tax.description).id,
})
return accounts, taxes
@api.model
def generate_journals(self, acc_template_ref, company, journals_dict=None):
"""Set the tax_cash_basis_journal_id on the company"""
res = super(AccountChartTemplate, self).generate_journals(
acc_template_ref, company, journals_dict=journals_dict)
if not self == self.env.ref('l10n_mx.mx_coa'):
return res
journal_basis = self.env['account.journal'].search([
('type', '=', 'general'),
('code', '=', 'CBMX')], limit=1)
company.write({'tax_cash_basis_journal_id': journal_basis.id})
return res
@api.multi
def _prepare_all_journals(self, acc_template_ref, company, journals_dict=None):
"""Create the tax_cash_basis_journal_id"""
res = super(AccountChartTemplate, self)._prepare_all_journals(
acc_template_ref, company, journals_dict=journals_dict)
if not self == self.env.ref('l10n_mx.mx_coa'):
return res
res.append({
'type': 'general',
'name': _('Effectively Paid'),
'code': 'CBMX',
'company_id': company.id,
'default_credit_account_id': acc_template_ref.get(
self.income_currency_exchange_account_id.id),
'default_debit_account_id': acc_template_ref.get(
self.expense_currency_exchange_account_id.id),
'show_on_dashboard': True,
})
return res
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment