diff --git a/addons/l10n_latam_base/__init__.py b/addons/l10n_latam_base/__init__.py new file mode 100644 index 00000000000..94e496f8342 --- /dev/null +++ b/addons/l10n_latam_base/__init__.py @@ -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}) diff --git a/addons/l10n_latam_base/__manifest__.py b/addons/l10n_latam_base/__manifest__.py new file mode 100644 index 00000000000..3194f64401c --- /dev/null +++ b/addons/l10n_latam_base/__manifest__.py @@ -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', +} diff --git a/addons/l10n_latam_base/data/l10n_latam.identification.type.csv b/addons/l10n_latam_base/data/l10n_latam.identification.type.csv new file mode 100644 index 00000000000..88c95118a8e --- /dev/null +++ b/addons/l10n_latam_base/data/l10n_latam.identification.type.csv @@ -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, diff --git a/addons/l10n_latam_base/i18n/es.po b/addons/l10n_latam_base/i18n/es.po new file mode 100644 index 00000000000..a58fb117604 --- /dev/null +++ b/addons/l10n_latam_base/i18n/es.po @@ -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" diff --git a/addons/l10n_latam_base/i18n/es_AR.po b/addons/l10n_latam_base/i18n/es_AR.po new file mode 100644 index 00000000000..d927cf13495 --- /dev/null +++ b/addons/l10n_latam_base/i18n/es_AR.po @@ -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" diff --git a/addons/l10n_latam_base/i18n/l10n_latam_base.pot b/addons/l10n_latam_base/i18n/l10n_latam_base.pot new file mode 100644 index 00000000000..7151893fe04 --- /dev/null +++ b/addons/l10n_latam_base/i18n/l10n_latam_base.pot @@ -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 "" diff --git a/addons/l10n_latam_base/models/__init__.py b/addons/l10n_latam_base/models/__init__.py new file mode 100644 index 00000000000..3111eda0b16 --- /dev/null +++ b/addons/l10n_latam_base/models/__init__.py @@ -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 diff --git a/addons/l10n_latam_base/models/l10n_latam_identification_type.py b/addons/l10n_latam_base/models/l10n_latam_identification_type.py new file mode 100644 index 00000000000..68af4f24b1c --- /dev/null +++ b/addons/l10n_latam_base/models/l10n_latam_identification_type.py @@ -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] diff --git a/addons/l10n_latam_base/models/res_company.py b/addons/l10n_latam_base/models/res_company.py new file mode 100644 index 00000000000..165d0afb5f6 --- /dev/null +++ b/addons/l10n_latam_base/models/res_company.py @@ -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) diff --git a/addons/l10n_latam_base/models/res_partner.py b/addons/l10n_latam_base/models/res_partner.py new file mode 100644 index 00000000000..67c4b77644d --- /dev/null +++ b/addons/l10n_latam_base/models/res_partner.py @@ -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) diff --git a/addons/l10n_latam_base/security/ir.model.access.csv b/addons/l10n_latam_base/security/ir.model.access.csv new file mode 100644 index 00000000000..9e4bed68a7e --- /dev/null +++ b/addons/l10n_latam_base/security/ir.model.access.csv @@ -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 diff --git a/addons/l10n_latam_base/views/l10n_latam_identification_type_view.xml b/addons/l10n_latam_base/views/l10n_latam_identification_type_view.xml new file mode 100644 index 00000000000..dba31944f07 --- /dev/null +++ b/addons/l10n_latam_base/views/l10n_latam_identification_type_view.xml @@ -0,0 +1,46 @@ + + + + + l10n_latam.identification.type.tree + l10n_latam.identification.type + tree + + + + + + + + + + + + l10n_latam.identification.type.search + l10n_latam.identification.type + search + + + + + + + + + + + + + Identification Type + l10n_latam.identification.type + tree + + ['|', ('active', '=', True), ('active', '=', False)] + {"search_default_active":1} + + + + + diff --git a/addons/l10n_latam_base/views/res_partner_view.xml b/addons/l10n_latam_base/views/res_partner_view.xml new file mode 100644 index 00000000000..e925faf968a --- /dev/null +++ b/addons/l10n_latam_base/views/res_partner_view.xml @@ -0,0 +1,24 @@ + + + + + view_partner_latam_form + + res.partner + 100 + + + 1 + + + + + + +