[ADD] l10n_latam_base: new module to manage multiple identification types

In Latin American countries, every partner needs
to be identified even if he does not have the usual
VAT number (whatever it is called) e.g. you can also
be identified by your identity card.

We chose to put those types also in the vat field,
but to be clear what it is, we added a selection field
before the vat field which is VAT by default, but
is e.g. RUT (VAT of Argentina) when you choose Argentina
as country.
This commit is contained in:
Katherine Zaoral
2019-08-21 17:05:52 +00:00
committed by Josse Colpaert
parent 60dadc8ecd
commit f84dbf63b9
13 changed files with 534 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from odoo import api, SUPERUSER_ID
def _set_default_identification_type(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env['res.partner'].search([]).write({'l10n_latam_identification_type_id': env.ref('l10n_latam_base.it_vat').id})
+28
View File
@@ -0,0 +1,28 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'LATAM Localization Base',
'version': '13.0.1.0.0',
'category': 'Localization',
'sequence': 14,
'author': 'Odoo, ADHOC SA',
'description': """
Base Module for LATAM Localizations
===================================
* Add Identification Type model to represent valid identifications types in different countries: for AFIP (AR), SII (CL), ...
* Add Countries code defined by government to identify legal entities and natural persons of foreign countries.""",
'depends': [
'contacts',
'base_vat',
],
'data': [
'data/l10n_latam.identification.type.csv',
'views/res_partner_view.xml',
'views/l10n_latam_identification_type_view.xml',
'security/ir.model.access.csv',
],
'installable': True,
'auto_install': False,
'application': False,
'post_init_hook': '_set_default_identification_type',
}
@@ -0,0 +1,4 @@
id,name,sequence,is_vat
l10n_latam_base.it_vat,VAT,80,TRUE
l10n_latam_base.it_pass,Passport,90,
l10n_latam_base.it_fid,Foreign ID,100,
1 id name sequence is_vat
2 l10n_latam_base.it_vat VAT 80 TRUE
3 l10n_latam_base.it_pass Passport 90
4 l10n_latam_base.it_fid Foreign ID 100
+164
View File
@@ -0,0 +1,164 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_latam_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0alpha1+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-02 16:26+0000\n"
"PO-Revision-Date: 2019-08-02 16:26+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__active
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Active"
msgstr "Activo"
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Archived"
msgstr "Archivado"
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__country_id
msgid "Country"
msgstr "País"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__create_date
msgid "Created on"
msgstr "Creado el"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__description
msgid "Description"
msgstr "Descripción"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_fid
msgid "Foreign ID"
msgstr "Cédula Extranjera"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__id
msgid "ID"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_partner__vat
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_users__vat
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Identification Number"
msgstr "Número de Identificación"
#. module: l10n_latam_base
#: model:ir.model.fields,help:l10n_latam_base.field_res_partner__vat
#: model:ir.model.fields,help:l10n_latam_base.field_res_users__vat
msgid "Identification Number for selected type"
msgstr "Número de identificación para el tipo seleccionado"
#. module: l10n_latam_base
#: model:ir.actions.act_window,name:l10n_latam_base.action_l10n_latam_identification_type
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_partner__l10n_latam_identification_type_id
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_users__l10n_latam_identification_type_id
#: model:ir.ui.menu,name:l10n_latam_base.menu_l10n_latam_identification_type
msgid "Identification Type"
msgstr "Tipo de Identificación"
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_l10n_latam_identification_type
msgid "Identification Types"
msgstr "Tipos de Identificación"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__is_vat
msgid "Is Vat"
msgstr "Es Identificación Fiscal?"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__name
msgid "Name"
msgstr "Nombre"
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Number"
msgstr "Número"
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_pass
msgid "Passport"
msgstr "Pasaporte"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__sequence
msgid "Sequence"
msgstr "Secuencia"
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Show active identification types"
msgstr "Mostrar los tipos de identificación activos"
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Show archived identification types"
msgstr "Mostrar los tipos de identificación archivados"
#. module: l10n_latam_base
#: model:ir.model.fields,help:l10n_latam_base.field_res_partner__l10n_latam_identification_type_id
#: model:ir.model.fields,help:l10n_latam_base.field_res_users__l10n_latam_identification_type_id
msgid "The type of identification"
msgstr "Tipo de identificación"
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Type"
msgstr "Tipo"
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_vat
msgid "VAT"
msgstr "VAT"
+21
View File
@@ -0,0 +1,21 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_latam_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0alpha1+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-02 16:26+0000\n"
"PO-Revision-Date: 2019-08-02 16:26+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_fid
msgid "Foreign ID"
msgstr "CI Extranjera"
@@ -0,0 +1,164 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_latam_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0alpha1+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-08-02 16:28+0000\n"
"PO-Revision-Date: 2019-08-02 16:28+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__active
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Active"
msgstr ""
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Archived"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_res_company
msgid "Companies"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_res_partner
msgid "Contact"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__country_id
msgid "Country"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__create_uid
msgid "Created by"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__create_date
msgid "Created on"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__description
msgid "Description"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__display_name
msgid "Display Name"
msgstr ""
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_fid
msgid "Foreign ID"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__id
msgid "ID"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_partner__vat
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_users__vat
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Identification Number"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,help:l10n_latam_base.field_res_partner__vat
#: model:ir.model.fields,help:l10n_latam_base.field_res_users__vat
msgid "Identification Number for selected type"
msgstr ""
#. module: l10n_latam_base
#: model:ir.actions.act_window,name:l10n_latam_base.action_l10n_latam_identification_type
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_partner__l10n_latam_identification_type_id
#: model:ir.model.fields,field_description:l10n_latam_base.field_res_users__l10n_latam_identification_type_id
#: model:ir.ui.menu,name:l10n_latam_base.menu_l10n_latam_identification_type
msgid "Identification Type"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model,name:l10n_latam_base.model_l10n_latam_identification_type
msgid "Identification Types"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__is_vat
msgid "Is Vat"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type____last_update
msgid "Last Modified on"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__write_uid
msgid "Last Updated by"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__write_date
msgid "Last Updated on"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__name
msgid "Name"
msgstr ""
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Number"
msgstr ""
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_pass
msgid "Passport"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,field_description:l10n_latam_base.field_l10n_latam_identification_type__sequence
msgid "Sequence"
msgstr ""
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Show active identification types"
msgstr ""
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_l10n_latam_identification_type_search
msgid "Show archived identification types"
msgstr ""
#. module: l10n_latam_base
#: model:ir.model.fields,help:l10n_latam_base.field_res_partner__l10n_latam_identification_type_id
#: model:ir.model.fields,help:l10n_latam_base.field_res_users__l10n_latam_identification_type_id
msgid "The type of identification"
msgstr ""
#. module: l10n_latam_base
#: model_terms:ir.ui.view,arch_db:l10n_latam_base.view_partner_latam_form
msgid "Type"
msgstr ""
#. module: l10n_latam_base
#: model:l10n_latam.identification.type,name:l10n_latam_base.it_vat
msgid "VAT"
msgstr ""
@@ -0,0 +1,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import l10n_latam_identification_type
from . import res_partner
from . import res_company
@@ -0,0 +1,22 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api
from odoo.osv import expression
class L10nLatamIdentificationType(models.Model):
_name = 'l10n_latam.identification.type'
_description = "Identification Types"
_order = 'sequence'
sequence = fields.Integer(default=10)
name = fields.Char(translate=True, required=True,)
description = fields.Char()
active = fields.Boolean(default=True)
is_vat = fields.Boolean()
country_id = fields.Many2one('res.country')
def name_get(self):
multi_localization = len(self.search([]).mapped('country_id')) > 1
return [(rec.id, '%s%s' % (
rec.name, multi_localization and rec.country_id and ' (%s)' % rec.country_id.code or '')) for rec in self]
@@ -0,0 +1,18 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api
class ResCompany(models.Model):
_inherit = 'res.company'
@api.model
def create(self, vals):
""" If exists, use specific vat identification.type for the country of the company """
country_id = vals.get('country_id')
if country_id:
country_vat_type = self.env['l10n_latam.identification.type'].search(
[('is_vat', '=', True), ('country_id', '=', country_id)], limit=1)
if country_vat_type:
self = self.with_context(default_l10n_latam_identification_type_id=country_vat_type.id)
return super().create(vals)
@@ -0,0 +1,28 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api
class ResPartner(models.Model):
_inherit = 'res.partner'
l10n_latam_identification_type_id = fields.Many2one('l10n_latam.identification.type',
string="Identification Type", index=True, auto_join=True,
default=lambda self: self.env.ref('l10n_latam_base.it_vat', raise_if_not_found=False),
help="The type of identification")
vat = fields.Char(string='Identification Number', help="Identification Number for selected type")
@api.model
def _commercial_fields(self):
return super()._commercial_fields() + ['l10n_latam_identification_type_id']
@api.constrains('vat', 'l10n_latam_identification_type_id')
def check_vat(self):
with_vat = self.filtered(lambda x: x.l10n_latam_identification_type_id.is_vat)
return super(ResPartner, with_vat).check_vat()
@api.onchange('country_id')
def _onchange_country(self):
country = self.country_id or self.company_id.country_id or self.env.company.country_id
self.l10n_latam_identification_type_id = self.env['l10n_latam.identification.type'].search(
[('country_id', '=', country.id), ('is_vat', '=', True)]) or self.env.ref('l10n_latam_base.it_vat', raise_if_not_found=False)
@@ -0,0 +1,3 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_latam_identification_type_all","latam id type all","model_l10n_latam_identification_type",,1,0,0,0
"access_latam_identification_type_manager","latam id type manager","model_l10n_latam_identification_type","base.group_partner_manager",1,1,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_latam_identification_type_all latam id type all model_l10n_latam_identification_type 1 0 0 0
3 access_latam_identification_type_manager latam id type manager model_l10n_latam_identification_type base.group_partner_manager 1 1 0 0
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_l10n_latam_identification_type_tree" model="ir.ui.view">
<field name="name">l10n_latam.identification.type.tree</field>
<field name="model">l10n_latam.identification.type</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree decoration-muted="(not active)" create="0" edit="0">
<field name="name"/>
<field name="description"/>
<field name="country_id"/>
<field name="active" widget="boolean_toggle"/>
</tree>
</field>
</record>
<record id="view_l10n_latam_identification_type_search" model="ir.ui.view">
<field name="name">l10n_latam.identification.type.search</field>
<field name="model">l10n_latam.identification.type</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="description"/>
<field name="country_id"/>
<filter name="active" string="Active" domain="[('active','=',True)]" help="Show active identification types"/>
<filter name="inactive" string="Archived" domain="[('active','=',False)]" help="Show archived identification types"/>
</search>
</field>
</record>
<record id="action_l10n_latam_identification_type" model="ir.actions.act_window">
<field name="name">Identification Type</field>
<field name="res_model">l10n_latam.identification.type</field>
<field name="view_mode">tree</field>
<field name="search_view_id" ref="view_l10n_latam_identification_type_search"/>
<field name="domain">['|', ('active', '=', True), ('active', '=', False)]</field>
<field name="context">{"search_default_active":1}</field>
</record>
<menuitem action="action_l10n_latam_identification_type"
id="menu_l10n_latam_identification_type"
parent="contacts.res_partner_menu_config"/>
</odoo>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_partner_latam_form" model="ir.ui.view">
<field name="name">view_partner_latam_form</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="model">res.partner</field>
<field name="priority">100</field>
<field type="xml" name="arch">
<field name="vat" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="vat" position="after">
<label for="l10n_latam_identification_type_id" string="Identification Number"/>
<div>
<field name="l10n_latam_identification_type_id" options="{'no_open': True, 'no_create': True}" placeholder="Type" attrs="{'readonly': [('parent_id','!=',False)]}" class="oe_inline" domain="country_id and ['|', ('country_id', '=', False), ('country_id', '=', country_id)] or []" required="True"/>
<span class="oe_read_only"> - </span>
<field name="vat" placeholder="Number" class="oe_inline" attrs="{'readonly': [('parent_id','!=',False)]}"/>
</div>
</field>
</field>
</record>
</odoo>