diff --git a/account_tax_group_type/README.rst b/account_tax_group_type/README.rst new file mode 100644 index 0000000..1509c36 --- /dev/null +++ b/account_tax_group_type/README.rst @@ -0,0 +1,18 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +=============== +Tax Group Types +=============== + +Types for Tax Groups + + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/account_tax_group_type/__init__.py b/account_tax_group_type/__init__.py new file mode 100644 index 0000000..f74d8e4 --- /dev/null +++ b/account_tax_group_type/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/account_tax_group_type/__manifest__.py b/account_tax_group_type/__manifest__.py new file mode 100644 index 0000000..43106c8 --- /dev/null +++ b/account_tax_group_type/__manifest__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Tax Group Types", + "summary": "Types for Tax Groups", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/JoanMarin", + "author": "Joan Marín Github@JoanMarin", + "category": "Localization", + "depends": ["account_menu"], + "data": [ + 'security/ir.model.access.csv', + "views/account_tax_group_views.xml", + ], + "installable": True, +} diff --git a/account_tax_group_type/i18n/account_tax_group_type.pot b/account_tax_group_type/i18n/account_tax_group_type.pot new file mode 100644 index 0000000..9cb5fd8 --- /dev/null +++ b/account_tax_group_type/i18n/account_tax_group_type.pot @@ -0,0 +1,110 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_tax_group_type +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-20 13:59+0000\n" +"PO-Revision-Date: 2021-08-20 13:59+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: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__code +msgid "Code" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_uid +msgid "Created by" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_date +msgid "Created on" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__description +msgid "Description" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__display_name +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__display_name +msgid "Display Name" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__id +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__id +msgid "ID" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group____last_update +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__name +msgid "Name" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__tax +msgid "Tax" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group +msgid "Tax Group" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__tax_group_type_id +msgid "Tax Group Type" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group_type +msgid "Tax Group Types" +msgstr "" + +#. module: account_tax_group_type +#: code:addons/account_tax_group_type/models/account_tax_group_type.py:0 +#, python-format +msgid "The code of Tax Group Type must be unique!" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__type +msgid "Type" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__withholding_tax +msgid "Withholding Tax" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.constraint,message:account_tax_group_type.constraint_account_tax_group_type_code_uniq +msgid "¡El código del Tipo de Grupo Impuesto debe ser único!" +msgstr "" diff --git a/account_tax_group_type/i18n/es.po b/account_tax_group_type/i18n/es.po new file mode 100644 index 0000000..431299f --- /dev/null +++ b/account_tax_group_type/i18n/es.po @@ -0,0 +1,106 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_tax_group_type +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-20 14:04+0000\n" +"PO-Revision-Date: 2021-08-20 14:04+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: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__code +msgid "Code" +msgstr "Código" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__description +msgid "Description" +msgstr "Descripción" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__display_name +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__display_name +msgid "Display Name" +msgstr "Nombre Público" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__id +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__id +msgid "ID" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group____last_update +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__name +msgid "Name" +msgstr "Nombre" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__tax +msgid "Tax" +msgstr "Impuesto" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group +msgid "Tax Group" +msgstr "Grupo de impuestos" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__tax_group_type_id +msgid "Tax Group Type" +msgstr "Tipo de Grupo de Impuesto" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group_type +msgid "Tax Group Types" +msgstr "Tipos de Grupos de Impuestos" + +#. module: account_tax_group_type +#: code:addons/account_tax_group_type/models/account_tax_group_type.py:0 +#: model:ir.model.constraint,message:account_tax_group_type.constraint_account_tax_group_type_code_uniq +#, python-format +msgid "The code of Tax Group Type must be unique!" +msgstr "¡El código del Tipo de Grupo Impuesto debe ser único!" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__type +msgid "Type" +msgstr "Tipo" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__withholding_tax +msgid "Withholding Tax" +msgstr "Impuesto de Retención" diff --git a/account_tax_group_type/i18n/es_CO.po b/account_tax_group_type/i18n/es_CO.po new file mode 100644 index 0000000..b00148e --- /dev/null +++ b/account_tax_group_type/i18n/es_CO.po @@ -0,0 +1,106 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_tax_group_type +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-31 20:46+0000\n" +"PO-Revision-Date: 2021-08-31 20:46+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: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__code +msgid "Code" +msgstr "Código" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__description +msgid "Description" +msgstr "Descripción" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__display_name +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__display_name +msgid "Display Name" +msgstr "Nombre Público" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__id +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__id +msgid "ID" +msgstr "" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group____last_update +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__name +msgid "Name" +msgstr "Nombre" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__tax +msgid "Tax" +msgstr "Impuesto" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group +msgid "Tax Group" +msgstr "Grupo de impuestos" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group__tax_group_type_id +msgid "Tax Group Type" +msgstr "Tipo de Grupo de Impuesto" + +#. module: account_tax_group_type +#: model:ir.model,name:account_tax_group_type.model_account_tax_group_type +msgid "Tax Group Types" +msgstr "Tipos de Grupos de Impuestos" + +#. module: account_tax_group_type +#: code:addons/account_tax_group_type/models/account_tax_group_type.py:0 +#: model:ir.model.constraint,message:account_tax_group_type.constraint_account_tax_group_type_code_uniq +#, python-format +msgid "The code of Tax Group Type must be unique!" +msgstr "¡El código del Tipo de Grupo Impuesto debe ser único!" + +#. module: account_tax_group_type +#: model:ir.model.fields,field_description:account_tax_group_type.field_account_tax_group_type__type +msgid "Type" +msgstr "Tipo" + +#. module: account_tax_group_type +#: model:ir.model.fields.selection,name:account_tax_group_type.selection__account_tax_group_type__type__withholding_tax +msgid "Withholding Tax" +msgstr "Impuesto de Retención" diff --git a/account_tax_group_type/models/__init__.py b/account_tax_group_type/models/__init__.py new file mode 100644 index 0000000..0f53cc5 --- /dev/null +++ b/account_tax_group_type/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_tax_group_type +from . import account_tax_group diff --git a/account_tax_group_type/models/account_tax_group.py b/account_tax_group_type/models/account_tax_group.py new file mode 100644 index 0000000..432b9af --- /dev/null +++ b/account_tax_group_type/models/account_tax_group.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountTaxGroup(models.Model): + _inherit = "account.tax.group" + + tax_group_type_id = fields.Many2one( + comodel_name="account.tax.group.type", + string="Tax Group Type") diff --git a/account_tax_group_type/models/account_tax_group_type.py b/account_tax_group_type/models/account_tax_group_type.py new file mode 100644 index 0000000..2727011 --- /dev/null +++ b/account_tax_group_type/models/account_tax_group_type.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ + + +class AccountTaxGroupType(models.Model): + _name = 'account.tax.group.type' + _description = 'Tax Group Types' + + code = fields.Char(string='Code', required=True) + name = fields.Char(string='Name', required=True) + type = fields.Selection( + selection=[('tax', 'Tax'), ('withholding_tax', 'Withholding Tax')], + string='Type', + required=True, + default=False) + description = fields.Char(string='Description') + + _sql_constraints = [ + ('code_uniq', 'unique (code)', + _('The code of Tax Group Type must be unique!'))] diff --git a/account_tax_group_type/security/ir.model.access.csv b/account_tax_group_type/security/ir.model.access.csv new file mode 100644 index 0000000..a574bfc --- /dev/null +++ b/account_tax_group_type/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_account_tax_group_type_user,access_account_tax_group_type_user,model_account_tax_group_type,,1,0,0,0 +access_account_tax_group_type_manager,access_account_tax_group_type_manager,model_account_tax_group_type,base.group_system,1,1,1,1 \ No newline at end of file diff --git a/account_tax_group_type/static/description/icon.png b/account_tax_group_type/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/account_tax_group_type/static/description/icon.png differ diff --git a/account_tax_group_type/views/account_tax_group_views.xml b/account_tax_group_type/views/account_tax_group_views.xml new file mode 100644 index 0000000..90cc2c4 --- /dev/null +++ b/account_tax_group_type/views/account_tax_group_views.xml @@ -0,0 +1,23 @@ + + + + account.tax.group + + + + + + + + + account.tax.group + + + + + + + + + + diff --git a/electronic_invoice_dian/__init__.py b/electronic_invoice_dian/__init__.py new file mode 100644 index 0000000..393c9ef --- /dev/null +++ b/electronic_invoice_dian/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +""" +Module models +""" +from . import models +from . import wizard +from . import controllers diff --git a/electronic_invoice_dian/__manifest__.py b/electronic_invoice_dian/__manifest__.py new file mode 100644 index 0000000..f0dc186 --- /dev/null +++ b/electronic_invoice_dian/__manifest__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# pylint: disable=missing-docstring +{ + 'name': "Facturación Electrónica DIAN", + 'summary': """ + Facturación Electrónica DIAN""", + 'description': """ + Envio de facturas y notas electrónicas, por Avancys SAS como + proveedor tecnológico o por software propio. + """, + 'author': "Avancys SAS", + 'website': "http://www.avancys.com", + 'category': 'Accounting/Accounting', + 'version': '14.0.0.0', + 'depends': ['account', 'sale'], + 'license': 'OEEL-1', + 'installable': True, + 'data': [ + 'data/data.xml', + # 'data/res.country.state.csv', + 'security/security.xml', + 'security/ir.model.access.csv', + 'wizard/ei_multi_process.xml', + 'wizard/ei_state_reset.xml', + 'views/res_company.xml', + 'views/electronic_invoice_resolution.xml', + 'views/account_journal.xml', + 'views/account_move.xml', + 'views/account_tax.xml', + 'views/uom_uom.xml', + 'views/sale_order.xml', + 'views/res_partner.xml', + 'templates/customer_acknowledge_email.xml', + 'templates/customer_acknowledge_response.xml', + 'templates/electronic_invoice.xml', + 'report/electronic_invoice_report.xml', + ], +} diff --git a/electronic_invoice_dian/changelog b/electronic_invoice_dian/changelog new file mode 100755 index 0000000..e69de29 diff --git a/electronic_invoice_dian/controllers/__init__.py b/electronic_invoice_dian/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/electronic_invoice_dian/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/electronic_invoice_dian/controllers/main.py b/electronic_invoice_dian/controllers/main.py new file mode 100644 index 0000000..17615d6 --- /dev/null +++ b/electronic_invoice_dian/controllers/main.py @@ -0,0 +1,43 @@ +import odoo +from odoo import api, SUPERUSER_ID +import odoo.http as http +from odoo.http import request +import odoo.addons.web.controllers.main as webmain +import json +import os + + +class AccountInvoiceAck(http.Controller): + @http.route('/invoice/dian/accept', type='http', auth="public") + def accept(self, db, token, id): + registry = odoo.modules.registry.Registry(db) + state_change = None + with api.Environment.manage(), registry.cursor() as cr: + env = api.Environment(cr, SUPERUSER_ID, {}) + invoice_id = env['account.move'].search([ + ('access_token', '=', token), + ('ei_state', '!=', 'customer_accept'), + ('id', '=', id) + ]) + if invoice_id: + state_change = invoice_id.do_accept() + if not state_change: + return + return request.render('electronic_invoice_dian.customer_accept_invoice', {}) + + @http.route('/invoice/dian/reject', type='http', auth="public") + def reject(self, db, token, id): + registry = odoo.modules.registry.Registry(db) + state_change = None + with api.Environment.manage(), registry.cursor() as cr: + env = api.Environment(cr, SUPERUSER_ID, {}) + invoice_id = env['account.move'].search([ + ('access_token', '=', token), + ('ei_state', '!=', 'customer_accept'), + ('id', '=', id) + ]) + if invoice_id: + state_change = invoice_id.do_accept() + if not state_change: + return + return request.render('electronic_invoice_dian.customer_reject_invoice', {}) diff --git a/electronic_invoice_dian/data/data.xml b/electronic_invoice_dian/data/data.xml new file mode 100644 index 0000000..1f11aed --- /dev/null +++ b/electronic_invoice_dian/data/data.xml @@ -0,0 +1,4 @@ + + + + diff --git a/electronic_invoice_dian/data/res.country.state.csv b/electronic_invoice_dian/data/res.country.state.csv new file mode 100644 index 0000000..1ecb450 --- /dev/null +++ b/electronic_invoice_dian/data/res.country.state.csv @@ -0,0 +1,34 @@ +"id","code","name" +base.state_co_01,"05","ANTIOQUIA" +base.state_co_02,"08","ATLANTICO" +base.state_co_03,"11","BOGOTA" +base.state_co_04,"13","BOLIVAR" +base.state_co_05,"15","BOYACA" +base.state_co_06,"17","CALDAS" +base.state_co_07,"18","CAQUETA" +base.state_co_08,"19","CAUCA" +base.state_co_09,"20","CESAR" +base.state_co_10,"23","CORDOBA" +base.state_co_11,"25","CUNDINAMARCA" +base.state_co_12,"27","CHOCO" +base.state_co_13,"41","HUILA" +base.state_co_14,"44","LA GUAJIRA" +base.state_co_15,"47","MAGDALENA" +base.state_co_16,"50","META" +base.state_co_17,"52","NARIÑO" +base.state_co_18,"54","N. DE SANTANDER" +base.state_co_19,"63","QUINDIO" +base.state_co_20,"66","RISARALDA" +base.state_co_21,"68","SANTANDER" +base.state_co_22,"70","SUCRE" +base.state_co_23,"73","TOLIMA" +base.state_co_24,"76","VALLE DEL CAUCA" +base.state_co_25,"81","ARAUCA" +base.state_co_26,"85","CASANARE" +base.state_co_27,"86","PUTUMAYO" +base.state_co_28,"88","SAN ANDRES" +base.state_co_29,"91","AMAZONAS" +base.state_co_30,"94","GUAINIA" +base.state_co_31,"95","GUAVIARE" +base.state_co_32,"97","VAUPES" +base.state_co_33,"99","VICHADA" diff --git a/electronic_invoice_dian/models/__init__.py b/electronic_invoice_dian/models/__init__.py new file mode 100644 index 0000000..e005fc5 --- /dev/null +++ b/electronic_invoice_dian/models/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" +Models +""" + +from . import res_company +from . import electronic_invoice_resolution +from . import account_journal +from . import account_move +from . import account_tax +from . import ei_transaction_log +from . import uom_uom +from . import sale_order +from . import res_partner diff --git a/electronic_invoice_dian/models/account_journal.py b/electronic_invoice_dian/models/account_journal.py new file mode 100644 index 0000000..4153a19 --- /dev/null +++ b/electronic_invoice_dian/models/account_journal.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api +from odoo.exceptions import ValidationError + +INVALID_TYPE_WARN = """Tipo de diario no válido para facturación electrónica""" + + +class AccountJournal(models.Model): + _inherit = 'account.journal' + + resolution_id = fields.Many2one( + string='Resolución de Numeración', + comodel_name='electronic.invoice.resolution') + + @api.constrains('resolution_id') + def check_document_type(self): + if self.type != 'sale' and self.resolution_id: + raise ValidationError(INVALID_TYPE_WARN) diff --git a/electronic_invoice_dian/models/account_move.py b/electronic_invoice_dian/models/account_move.py new file mode 100644 index 0000000..8c25a24 --- /dev/null +++ b/electronic_invoice_dian/models/account_move.py @@ -0,0 +1,1048 @@ +# -*- coding: utf-8 -*- +import base64 +from email.utils import parseaddr +import operator +import uuid +import logging +from functools import reduce +import qrcode +# import cStringIO +from odoo import models, fields, api +from odoo.exceptions import ValidationError +from odoo.tools import config +from datetime import datetime, timedelta +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT +import requests +import json +import re +import os +from zipfile import ZipFile +from .http_helper import HEADERS +from .http_helper import INVOICE +from .http_helper import URL_XML +from .http_helper import DIAN_INVOICE_URL_BASE +from . import xml_helper + +# Constants + +UTC_ADJUST = '-05:00' +UTC_TIME_CO = 5 +HOUR_CHARS = 11 +PRECISION = 2 +EI_STATE_SELECTION = [ + ('pending', 'No Transferido'), + ('done', 'Emitido'), + ('exception', 'Excepción de Envio'), + ('dian_reject', 'Rechazado DIAN'), + ('dian_accept', 'Aceptado DIAN'), + ('customer_reject', 'Rechazado Cliente'), + ('customer_accept', 'Aceptado Cliente') +] +TAM_MAP_NAME = { + '01': 'IVA', + '02': 'IC', + '03': 'ICA', + '04': 'INC', + '05': 'ReteIVA', + '06': 'ReteFuente', + '07': 'ReteICA' +} + +# Warnings + +WRONG_DB_MATCH_WARNING = """ +No es posible generar la Factura Electrónica, verifique que la compañía tenga +habilitado el check de Facturación Electrónica y que la base de datos sea la correcta""" +ENV_MISSING_WARNING = """ +Debe configurarse en la Compañía el tipo de Ambiente para Facturación Electrónica""" +OP_TYPE_MISSING_WARNING = """ +Debe configurarse en la Compañía el Tipo de Operación""" +UNSUPPORTED_PDF_FORMAT_WARNING = """ +Formato de pdf de factura electrónica no encontrado, +verifique la parametrizacion en la compañia. +""" +JOURNAL_RESOLUTION_ERROR = """ +Error en la resolución del diario: +No se encontro ID de Resolución o Tipo de documento +""" +NO_CURRENCY_RATE_WARNING = """ +No se encontró una tasa de cambio para la Fecha de la factura +""" +NO_REFERENCED_INVOICE_ERROR = """ +No se encontró una factura electrónica a rectificar válida""" +UNACCEPTED_REFERENCE_ERROR = """ +La factura electrónica a rectificar %s no tiene CUFE +""" +PDF_GENERATION_ERROR = """Hubo un error al generar el PDF de la factura""" +SEND_ERROR = """No fue posible enviar la factura al proovedor, error de conexión""" +PROVIDER_ERROR = """ +Ha ocurrido un error al procesar la factura, por favor intente de nuevo""" +INVALID_EMAIL_ERROR = """No se encontró un email válido en el cliente""" +EMAIL_GENERATION_ERROR = """No se pudo generar email FE %s""" + +# Logger + +_logger = logging.getLogger(__name__) + + +class AccountMove(models.Model): + _inherit = 'account.move' + + transaction_log_ids = fields.One2many( + string='Logs', comodel_name='ei.transaction.log', + inverse_name='invoice_id', copy=False) + ei_state = fields.Selection( + string='Estado FE', default='pending', readonly=True, copy=False, + selection=EI_STATE_SELECTION) + ei_cufe = fields.Char( + string='CUFE', readonly=True, size=96, tracking=True, + copy=False) + ei_cude = fields.Char( + string='CUDE', readonly=True, size=96, tracking=True, + copy=False) + ei_qr = fields.Char(string='Informacion QR', readonly=True, copy=False) + ei_xml_content = fields.Text(string='Contenido XML', copy=False) + ei_app_response = fields.Text( + string='Contenido XML Application Response', copy=False) + ei_email_sent = fields.Boolean(string='Email Enviado', copy=False) + ei_generation_date = fields.Char( + string='Hora de Generación', readonly=True, copy=False) + ei_validation_date = fields.Char( + string='Hora de Validacion', readonly=True, copy=False) + out_refund_id = fields.Many2one( + string='Factura Rectificada', comodel_name='account.move', copy=False) + invoice_reference = fields.Char(string='No. Orden / Referencia') + + # Acknowledgement management + + def _create_token(self): + self.ensure_one() + if not self.access_token: + self.access_token = uuid.uuid4().hex + + def do_accept(self): + if self.ei_state in ('customer_accept', 'customer_reject'): + return False + self.ei_state = 'customer_accept' + return True + + def do_reject(self): + if self.ei_state in ('customer_accept', 'customer_reject'): + return False + self.ei_state = 'customer_reject' + return True + + # Log management + + def create_transaction_log(self, invoice, state, content, document_type='none'): + self.env['ei.transaction.log'].create({ + 'invoice_id': invoice.id, + 'date': datetime.now(), + 'document_state': state, + 'document_type': document_type, + 'content': content + }) + + # Invoice processing + + def action_post(self): + company = self.mapped(lambda invoice: invoice.company_id) + res = super(AccountMove, self).action_post() + if company.ei_automatic_generation: + self.generate_electronic_invoice() + return res + + def _get_invoice_json(self, invoice): + company = invoice.company_id + company_partner = company.partner_id + invoice_partner = invoice.partner_id + journal = invoice.journal_id + document_type = journal.resolution_id.document_type + resolution = journal.resolution_id + if (not resolution.id_param or not resolution.prefix or not document_type): + self.create_transaction_log( + invoice, 'exception', JOURNAL_RESOLUTION_ERROR) + return False + generation_date_time = (invoice.create_date - timedelta(hours=UTC_TIME_CO)).strftime( + DEFAULT_SERVER_DATETIME_FORMAT) + UTC_ADJUST + invoice.ei_generation_date = generation_date_time + generation_time = generation_date_time[HOUR_CHARS:] + day_rate = self.env['res.currency.rate'].search([ + ('name', '=', invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT)), + ('currency_id', '=', invoice.currency_id.id) + ]) + if invoice.currency_id != company.currency_id and not day_rate: + raise ValidationError(NO_CURRENCY_RATE_WARNING) + currency_name = invoice.currency_id.name + + ncnd = "enabled" if document_type in ('91', '92') else "disabled" + case_reference_invoice = { + '91': invoice.reversed_entry_id or invoice.out_refund_id, + '92': invoice.debit_origin_id, + } + reference_invoice = case_reference_invoice.get(document_type, False) + + if ncnd == "enabled": + if not reference_invoice: + self.create_transaction_log( + invoice, 'exception', NO_REFERENCED_INVOICE_ERROR) + return False + if not reference_invoice.ei_cufe: + self.create_transaction_log( + invoice, 'exception', UNACCEPTED_REFERENCE_ERROR % reference_invoice.name) + return False + + datos_conexion = { + "token": company.software_token, + "documento": company_partner.ref_num, + "dv": str(company_partner.verification_code), + "id_cabecera": "0", + "id_usuario": "1" + } + tipo_documento = { + "numero": document_type + } + basicos_factura = { + "consecutivo": invoice.name.replace(journal.resolution_id.prefix, ''), + "moneda": currency_name, + "tipo_operacion": company.ei_id_customization, + "fecha_factura": invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT), + "hora_factura": generation_time + } + respuesta = { + "ruta_post": company.service_url_post, + "ruta_get": company.service_url_get, + "metodo": "ajax", + "extra1": "", + "extra2": "" + } + param_basico = { + "id_param": str(journal.resolution_id.id_param), + "test": "0", + "ambiente": "1" if company.ei_environment == 'production' else "2", + "ruta_to_soap": ("SendBillSync" + if company.ei_environment == 'production' + else "SendTestSetAsync") + } + facturador = { + "ProviderID": company_partner.ref_num, + "dv": str(company_partner.verification_code) + } + autorizacion_descarga = { + "activo": "enabled", + "numero_documento": "", + "dv": "", + "tipo_documento": company_partner.ref_type_id.code_dian + } + WithholdingTaxTotal = { + "aplica": "0" + } + + def validate_country_code(country_code): + if country_code == '169': + return 'CO' + return str(country_code) + + def is_colombia(country_code): + return country_code in ('169', 'CO') + + datos_empresa = { + "Pais": validate_country_code(company_partner.country_id.code), + "departamento": company_partner.state_id.code, + "municipio": company_partner.state_id.code + company_partner.city_id.zipcode, + "direccion": company_partner.street, + "nombre_sucursal": company_partner.city_id.name or company_partner.name + } + partner_country = invoice_partner.country_id.code + datos_cliente = { + "tipo_persona": "1", + "Pais": partner_country, + "municipio": (str(invoice_partner.state_id.code) + + str(invoice_partner.city_id.zipcode) + if is_colombia(partner_country) else ""), + "numero_documento": invoice_partner.ref_num, + "dv": str(invoice_partner.verification_code), + "tipo_documento": invoice_partner.ref_type_id.code_dian, + "departamento": (invoice_partner.state_id.code + if is_colombia(partner_country) else ""), + "direccion": (invoice_partner.street or "") + (invoice_partner.street2 or ""), + "nombre_sucursal": "", + "RUT_nombre": invoice_partner.name or 'Receptor', + "RUT_pais": partner_country, + "RUT_departamento": (invoice_partner.state_id.code + if is_colombia(partner_country) else ""), + "RUT_municipio": (str(invoice_partner.state_id.code) + + str(invoice_partner.city_id.zipcode) + if is_colombia(partner_country) else ""), + "RUT_direcci\u00f3n": invoice_partner.street, + "RUT_impuesto": "01", + "Respon_fiscales": "", + "Num_matricula_mercantil": "", + "Nombre_contacto": invoice_partner.name, + "Tel_contacto": invoice_partner.phone, + "Correo_contacto": invoice_partner.email, + "Nota_contacto": "" + } + datos_transportadora = { + "active": "disabled", + "tipo_persona": "1", + "Pais": "", + "municipio": "", + "numero_documento": "", + "dv": "", + "tipo_documento": "", + "departamento": "", + "direccion": "", + "nombre_sucursal": "", + "RUT_nombre": "", + "RUT_pais": "", + "RUT_departamento": "", + "RUT_municipio": "", + "RUT_direcci\u00f3n": "", + "RUT_impuesto": "", + "Respon_fiscales": "", + "Num_matricula_mercantil": "", + "Nombre_contacto": "", + "Tel_contacto": "", + "Telfax_contacto": "", + "Correo_contacto": "", + "Nota_contacto": "" + } + QR = { + "active": "enabled" + } + Periodo_pago = { + "active": "disabled", + "fecha_inicial": "", + "fecha_final": "" + } + payment_term = sum(invoice.invoice_payment_term_id.line_ids.mapped( + lambda line: line.days)) + Metodo_pago = { + "active": "enabled", + "codigo_metodo": "2" if payment_term else "1", + "codigo_medio": "ZZZ", + "fecha_vencimiento": (invoice.invoice_date_due.strftime(DEFAULT_SERVER_DATE_FORMAT) + or invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT)), + "identificacion_metodo": "Mutuo Acuerdo" + } + + Referencia_factura = { + "active": ncnd, + "referencia_afectada": (reference_invoice.name if ncnd == "enabled" else ""), + "cufe_cude": (reference_invoice.ei_cufe if ncnd == "enabled" else ""), + "algoritm_cufe_cude": "CUFE-SHA384", + "fecha_factura": (reference_invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT) + if ncnd == "enabled" else "") + } + Referencia_factura2 = { + "active": "disabled", + "referencia_afectada": "", + "cufe_cude": "", + "algoritm_cufe_cude": "", + "fecha_factura": "" + } + respuesta_discrepancia = { + "active": ncnd, + "referencia": (reference_invoice.name + if ncnd == "enabled" else ""), + "codigo": ("4" if document_type == '91' + else "6" if document_type == "92" else ""), + "descripci\u00f3n_correccion": "" + } + order_reference = invoice.invoice_reference or "" + order_de_referencia = { + "active": "enabled" if order_reference else "disabled", + "codigo": order_reference, + "IssueDate": invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT), + } + Referencia_envio = { + "active": "disabled", + "id": "" + } + Referencia_recibido = { + "active": "disabled", + "id": "" + } + Terminos_de_entrega = { + "active": "disabled", + "terminos_Especiales": "", + "cod_respo_perdida": "" + } + currency_rate = "enabled" if invoice.currency_id != company.currency_id else "disabled" + currency_rate_val = day_rate.rate or 1.0 + Tasa_cambio = { + "active": currency_rate, + "Divisa_base": invoice.currency_id.name, + "Divisa_a_convertir": company.currency_id.name, + "Valor": str(currency_rate_val), + "Fecha_conversion": invoice.invoice_date.strftime(DEFAULT_SERVER_DATE_FORMAT) + } + AdditionalDocumentReference = { + "active": "disabled", + "pre_consec": "", + "fecha_creacion": "", + "identificador": "" + } + Anticipos = [ + { + "active": "disabled", + "tipo_anticipo": "RED3123856", + "valor_pago": "1000.00", + "fecha_recibido": "2018-10-01", + "fecha_realizado": "2018-09-29", + "hora_realizado": "23:02:05", + "instrucciones": "Prepago recibido" + }, + { + "active": "disabled", + "tipo_anticipo": "RED3123857", + "valor_pago": "850.00", + "fecha_recibido": "2018-10-01", + "fecha_realizado": "2018-09-29", + "hora_realizado": "23:02:05", + "instrucciones": "Prepago recibido" + } + ] + + Productos_servicios = [] + # Invoice lines + for line in invoice.invoice_line_ids.filtered( + lambda line: not line.exclude_from_invoice_tab and line.quantity > 0.0): + sample = line.discount == 100.0 + line_taxes = [ + [ + tax.ei_code, + TAM_MAP_NAME.get(tax.ei_code, ''), + str(abs(round(tax.amount))) + ] for tax in + line.tax_ids if tax.ei_code == '01' + ] + taxes = reduce(operator.add, line_taxes or [0]) or [] + line_detail = { + "active": "enabled", + "Cantidad": str(line.quantity), + "unidad_cantidad": str(line.product_uom_id.code_dian), + "Costo_unidad": str(round(line.price_unit / currency_rate_val, PRECISION)), + "Muestra": "Si" if sample else "No", + "DeliveryLocation_active": ("enabled" if line.product_id.default_code + else "disabled"), + "DeliveryLocation_esq_id": "999", + "DeliveryLocation_nombre": "", + "DeliveryLocation_dato": line.product_id.default_code or "", + "Codigo_muestra": "01" if sample else "0", + "Desc_muestra": str(line.discount or 0.0), + "Valor_muestra": (str(round(line.price_unit / currency_rate_val, PRECISION)) + if sample else "0"), + "Descuento_cargo": "Credito", + "ID_descuento_cargo": "11", + "Porcentaje_descuento_cargo": "0.0" if sample else str(line.discount or 0.0), + "Descripcion_descuento_cargo": "Otro descuento", + "Mandatario": "", + "Descripcion": line.product_id.name or "", + "Prefijo_codigo_producto": "", + "Codigo_producto": line.product_id.default_code or "", + "Cantidad_x_paquete": "1", + "Marca": "ninguna", + "Modelo": "ninguna", + "esquema_id": "", + "esquema_dato": "", + "esquema_name": "", + "array_impuestos": taxes, + "tributo_unidad": "0", + "SellersItemIdentification_ID": "", + "InformationContentProviderParty_ID": "" + } + Productos_servicios.append(line_detail) + + datafe = { + "datos_conexion": datos_conexion, + "tipo_documento": tipo_documento, + "basicos_factura": basicos_factura, + "respuesta": respuesta, + "param_basico": param_basico, + "facturador": facturador, + "autorizacion_descarga": autorizacion_descarga, + "WithholdingTaxTotal": WithholdingTaxTotal, + "datos_empresa": datos_empresa, + "datos_cliente": datos_cliente, + "datos_transportadora": datos_transportadora, + "QR": QR, + "Periodo_pago": Periodo_pago, + "Metodo_pago": Metodo_pago, + "Referencia_factura": Referencia_factura, + "Referencia_factura2": Referencia_factura2, + "respuesta_discrepancia": respuesta_discrepancia, + "order_de_referencia": order_de_referencia, + "Referencia_envio": Referencia_envio, + "Referencia_recibido": Referencia_recibido, + "Terminos_de_entrega": Terminos_de_entrega, + "Tasa_cambio": Tasa_cambio, + "AdditionalDocumentReference": AdditionalDocumentReference, + "Anticipos": Anticipos, + "Productos_servicios": Productos_servicios + } + return datafe + + def _set_validation_date(self, invoice, xml_response): + try: + xml_issue_date = re.search( + r'(.*)', + xml_response).group(1) + xml_issue_time = re.search( + r'(.*)', + xml_response).group(1) + invoice.ei_validation_date = ' '.join( + (xml_issue_date, xml_issue_time)) + except: + invoice.ei_validation_date = invoice.ei_generation_date + + def send_to_provider(self, url, datafe, invoice): + data = 'json_data=' + \ + base64.b64encode(json.dumps(datafe).encode( + 'utf-8')).decode('utf-8') + try: + response = requests.post( + url, data=data, headers=HEADERS, verify=False) + self.create_transaction_log( + invoice, 'sent', + json.dumps(datafe).encode('utf-8'), 'json' + ) + return response + except: + self.create_transaction_log( + invoice, 'exception', SEND_ERROR + ) + return {} + + def process_response(self, response, invoice): + document_type = invoice.journal_id.resolution_id.document_type + try: + response_body = response.content.decode('utf-8') + valid = re.search(r'valid: \'(\w*)\'', response_body).group(1) + cufe = (re.search(r'cufe: \'(\w*)\'', response_body).group(1) + if document_type == '01' else '') + cude = (re.search(r'cufe: \'(\w*)\'', response_body).group(1) + if document_type in ('91', '92') else '') + qr_code = re.search(r'qr: \'(.*)\'', response_body).group(1) + response_64 = re.search( + r'response_64: \'(.*)\'', response_body).group(1) + response_xml = str(base64.b64decode(response_64), 'utf-8') + info_check = (invoice.name in response_xml + if invoice.company_id.ei_environment == 'production' else True) + _logger.info("Verificacion de informacion recibida: %s, %s" % ( + invoice.name, info_check)) + if not info_check: + self.create_transaction_log( + invoice, 'provider_error', PROVIDER_ERROR + ) + invoice.ei_state = 'exception' + return {} + if not re.search('Documento validado por la DIAN', response_xml): + response = re.search(r'response: \'(.*)\'', response_body) + response = response.group(1) if response else '' + self.create_transaction_log( + invoice, 'dian_reject', response_xml or response + ) + invoice.ei_state = 'dian_reject' + return {} + response_xml = base64.b64decode(response_64) + self._set_validation_date(invoice, response_xml) + return { + 'valid': valid, + 'cufe': cufe, + 'cude': cude, + 'qr': qr_code, + 'response_64': response_xml + } + except: + error_log = re.search( + r'response_error: \'(.*)\'', response_body) + log_content = (error_log.group(1) + if error_log + else (response_body or response.content or '')) + self.create_transaction_log( + invoice, 'dian_reject', log_content + ) + invoice.ei_state = 'dian_reject' + return {} + + def send_invoice(self, invoice): + company = invoice.company_id + datafe = self._get_invoice_json(invoice) + if not datafe: + return False + response = self.send_to_provider(company.service_url, datafe, invoice) + if not response: + return False + result = self.process_response(response, invoice) + if not result: + return False + invoice.ei_cufe = result['cufe'] + invoice.ei_cude = result['cude'] + invoice.ei_qr = result['qr'] + response_64 = result['response_64'] + invoice.ei_state = 'dian_accept' + invoice.create_transaction_log( + invoice, 'dian_accept', response_64, 'app_response' + ) + self.env.cr.commit() + + def generate_electronic_invoice(self): + company = self.mapped(lambda invoice: invoice.company_id) + if not company.electronic_invoice or company.ei_database != self._cr.dbname: + raise ValidationError(WRONG_DB_MATCH_WARNING) + if not company.ei_environment: + raise ValidationError(ENV_MISSING_WARNING) + if not company.ei_id_customization: + raise ValidationError(OP_TYPE_MISSING_WARNING) + # + to_send_invoices = self.filtered( + lambda invoice: invoice.ei_state + not in ('dian_accept', 'customer_accept', 'customer_reject') + and invoice.move_type in ['out_invoice', 'out_refund']) + for invoice in to_send_invoices: + self.send_invoice(invoice) + if invoice.ei_state != 'dian_accept': + continue + if not company.auto_acceptance_email: + continue + invoice.send_acknowlegement_email() + + # Email Management + + def get_invoice_attachments(self): + self.ensure_one() + self.get_attachments() + return True + + def resend_acknowlegement_email(self): + self.send_acknowlegement_email(force_send=True) + + def valid_email_address(self): + regex = r'(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)' + emails = self.partner_id.ei_email or self.partner_id.email or '' + email_list = emails.split(';') + return list(filter( + lambda email: re.match(regex, email), + map(lambda email: parseaddr(email)[1], email_list))) + + def send_acknowlegement_email(self, force_send=False): + email_pool = self.env['mail.mail'] + for invoice in self: + invoice._create_token() + if not invoice.valid_email_address(): + self.create_transaction_log( + invoice, 'email_fail', INVALID_EMAIL_ERROR + ) + continue + email = invoice.prepare_email() + if not email: + _logger.error(EMAIL_GENERATION_ERROR, invoice.name) + continue + email_pool = email_pool + email + invoice.create_transaction_log(invoice, 'email_sent', 'OK') + invoice.ei_email_sent = True + if force_send: + email_pool.send() + + def prepare_email(self): + self.ensure_one() + mail_pool = self.env['mail.mail'] + ctx = self._context.copy() + ctx.update({ + 'dbname': self._cr.dbname, + }) + template = self.env.ref( + 'electronic_invoice_dian.electronic_invoice_customer_acknowlegement') + try: + mail_id = template.with_context(ctx).send_mail( + self.id, force_send=False) + except: + return mail_pool + mail = mail_pool.browse(mail_id) + attachment_ids = self.get_attachments() + if not attachment_ids: + return mail_pool + zipped_attachments = self._zip_attachments(attachment_ids) + if zipped_attachments: + mail.write({'attachment_ids': [(6, 0, zipped_attachments.ids)]}) + return mail + return mail_pool + + # Mail attachments + + def _zip_attachments(self, attachments): + self.ensure_one() + filestore = os.path.join( + config['data_dir'], 'filestore', self.env.cr.dbname, ) + xml_file, pdf_file, = self.name + '.xml', self.name + '.pdf' + zip_file = self.name + '.zip' + att_zip_file = 'anexos_' + zip_file + invoice_attachments = attachments.filtered( + lambda att: att.name in [xml_file, pdf_file]) + other_attachments = attachments.filtered( + lambda att: att.name not in [xml_file, pdf_file]) + current_dir = os.getcwd() + try: + os.chdir(self.company_id.ei_tmp_path) + if other_attachments: + with ZipFile(att_zip_file, 'w') as zip_invoice: + for att in other_attachments: + zip_invoice.write(os.path.join( + filestore, att.store_fname), att.name) + with ZipFile(zip_file, 'w') as zip_invoice: + for att in invoice_attachments: + zip_invoice.write(os.path.join( + filestore, att.store_fname), att.name) + if other_attachments: + zip_invoice.write(att_zip_file, att_zip_file) + zipped_attachment = self.env['ir.attachment'].sudo().create({ + 'name': zip_file, + 'type': 'binary', + 'datas': base64.encodebytes(open(zip_file, 'br').read()), + 'res_model': 'account.move', + 'res_id': self.id, + 'mimetype': 'application/zip' + }) + map(os.remove, [zip_file] + + ([att_zip_file] if other_attachments else[])) + os.chdir(current_dir) + return zipped_attachment + except Exception as exc: + _logger.error(exc) + os.chdir(current_dir) + return attachments + + def get_attachments(self): + company = self.company_id + xml_file = self.name + '.xml' + pdf_file = self.name + '.pdf' + attachment_pool = self.env['ir.attachment'] + attachment_domain = [ + ('res_model', '=', 'account.move'), + ('res_id', '=', self.id), + ] + attachment_ids = attachment_pool.search(attachment_domain) + attachment_names = attachment_ids.mapped(lambda att: att.name) + if xml_file not in attachment_names: + if not self.create_xml_attachment(): + return attachment_pool + if pdf_file not in attachment_names: + if not self.create_pdf_attachment(): + return attachment_pool + updated_attachment_ids = attachment_pool.search( + attachment_domain) + sale_order_attachments = (company.attach_customer_order + and self.get_sale_order_attachments() + or attachment_pool) + picking_attachments = (company.attach_delivery_note + and self.get_picking_attachments() + or attachment_pool) + if company.attach_invoice_docs: + return (updated_attachment_ids + sale_order_attachments + + picking_attachments) + xml_and_pdf_attachments = updated_attachment_ids.filtered( + lambda att: att.name in (xml_file, pdf_file) + ) + return (xml_and_pdf_attachments + sale_order_attachments + + picking_attachments) + + def get_cufe_from_log(self): + acceptance_log = self.transaction_log_ids.filtered( + lambda log: 'ApplicationResponse' in log.content + and self.name in log.content + and 'Documento validado por la DIAN' in log.content) + if not acceptance_log: + return '' + app_response = acceptance_log[0].content + cufe_group = re.search( + r'(.*)', + app_response) + if not cufe_group: + return '' + cufe_cude = cufe_group.group(1) + if cufe_cude != self.ei_cufe and self.journal_id.resolution_id.document_type == '01': + self.ei_qr = self.ei_qr.replace(self.ei_cufe, cufe_cude) + self.ei_cufe = cufe_cude + if cufe_cude != self.ei_cude and self.journal_id.resolution_id.document_type in ( + '91', '92', '03'): + self.ei_qr = self.ei_qr.replace(self.ei_cude, cufe_cude) + self.ei_cude = cufe_cude + return cufe_cude + + def _validate_in_dian(self, cuxe): + if self.company_id.ei_environment == 'test': + return True + dian_request = requests.get(DIAN_INVOICE_URL_BASE + cuxe) + dian_response = dian_request.content + if cuxe in dian_response.decode('utf-8'): + return True + return False + + def _get_xml_json(self, invoice): + company = self.company_id + company_partner = company.partner_id + document_type = invoice.journal_id.resolution_id.document_type + return { + "datos_conexion": { + "token": company.software_token, + "documento": company_partner.ref_num + }, + "key": { + "cufe": invoice.ei_cufe if document_type == '01' else invoice.ei_cude + }, + "Datos_software": { + "ambiente": ("1" if company.ei_environment == 'production' + else "0") + } + } + + def get_xml(self, datafe): + data = 'json_data=' + \ + base64.b64encode(json.dumps(datafe).encode( + 'utf-8')).decode('utf-8') + try: + response = requests.post( + URL_XML, data=data, headers=HEADERS, verify=False) + xmlb64 = re.search( + r'(.*)', + str(response.content, 'utf-8')).group(1) + xml_fe = base64.b64decode(xmlb64) + return xml_fe + except: + pass + return '' + + def create_xml_attachment(self): + cufe_cude = self.get_cufe_from_log() or self.ei_cufe or self.ei_cude + if not cufe_cude or not self._validate_in_dian(cufe_cude): + self.ei_state = 'exception' + self.ei_cufe = '' + self.ei_cude = '' + self.ei_qr = '' + self.ei_app_response = '' + self.ei_xml_content = '' + return False + xml_fe = self.ei_xml_content or self.get_xml(self._get_xml_json(self)) + if not xml_fe: + return False + if not self.ei_xml_content: + self.ei_xml_content = xml_fe + filename = self.name + '.xml' + xml_att_document = self.build_attached_document() + xml_fe_normalized = (xml_att_document.encode('utf-8') if + isinstance(xml_att_document, str) else xml_att_document) + data_attach = { + 'name': filename, + 'datas': base64.b64encode(xml_fe_normalized), + 'res_model': 'account.move', + 'res_id': self.id, + 'mimetype': 'application/xml', + 'type': 'binary' + } + return self.env['ir.attachment'].sudo().create(data_attach) + + def create_pdf_attachment(self): + attachment_pool = self.env['ir.attachment'] + self.ensure_one() + report = self.company_id.ei_report_id + if report and report.report_type == 'qweb-pdf': + try: + pdf_data, __ = report.sudo()._render_qweb_pdf(self.id) + created_attachment = attachment_pool.search([ + ('res_model', '=', 'account.move'), + ('res_id', '=', self.id), + ('name', '=', self.name + '.pdf'), + ]) + if created_attachment: + return True + data_attach = { + 'name': self.name + '.pdf', + 'datas': base64.b64encode(pdf_data), + 'res_model': 'account.move', + 'res_id': self.id, + 'mimetype': 'application/pdf', + 'type': 'binary' + } + self.env['ir.attachment'].sudo().create(data_attach) + return True + except Exception as exc: + _logger.error(exc) + raise ValidationError(PDF_GENERATION_ERROR) + else: + raise ValidationError(UNSUPPORTED_PDF_FORMAT_WARNING) + + def get_order_attachment(self, order): + attachment_pool = self.env['ir.attachment'] + if not order.customer_po_file: + return attachment_pool + filename = order.customer_po_name or 'OrdenDeCompra.pdf' + existing_attachment = attachment_pool.search([ + ('res_model', '=', 'sale.order'), + ('res_id', '=', order.id), + ('name', '=', filename), + ]) + if existing_attachment: + return existing_attachment + data_attach = { + 'name': filename, + 'datas': order.customer_po_file, + 'res_model': 'sale.order', + 'res_id': order.id, + 'mimetype': 'application/pdf', + 'type': 'binary' + } + return self.env['ir.attachment'].sudo().create(data_attach) + + def get_sale_orders(self): + order_lines = self.env['sale.order.line'].search([ + ('invoice_lines', 'in', self.invoice_line_ids.ids) + ]) + orders = order_lines.mapped(lambda line: line.order_id) + return orders + + def get_sale_order_attachments(self): + self.ensure_one() + attachment_pool = self.env['ir.attachment'] + orders = self.get_sale_orders() + if not orders: + return attachment_pool + attachments = orders.mapped(self.get_order_attachment) + return attachments + + def get_picking_attachments(self): + return self.env['ir.attachment'] + + # Mass send, Unused + + def ei_email_mass_send(self): + to_email_invoices = self.env['account.move'].search([ + ('ei_state', '=', 'dian_accep'), + ('ei_email_sent', '=', False) + ], limit=100) + to_email_invoices.send_acknowlegement_email() + + # XML AttachedDocument + + def _get_header_tags(self): + company = self.company_id + utc_adj = '-05:00' + return { + 'UBLVersionID': 'DIAN 2.1', + 'CustomizationID': 'Documentos adjuntos', + 'ProfileID': 'DIAN 2.1', + 'ProfileExecutionID': ("1" if company.ei_environment == 'production' else "2"), + 'ID': uuid.uuid4().hex, + 'IssueDate': self.ei_generation_date.split(' ')[0], + 'IssueTime': self.ei_generation_date.split(' ')[1], + 'DocumentType': u'Contenedor de Factura Electrónica', + 'ParentDocumentID': str(self.name) + } + + def _get_sender_tags(self): + company = self.company_id + return { + 'RegistrationName': company.name, + 'CompanyID': company.partner_id.ref_num, + 'TaxLevelCode': company.tributary_obligations or 'R-99-PN', + 'ID': '01', + 'Name': 'IVA' + } + + def _get_sender_attrs(self): + company = self.company_id + return { + 'CompanyID': { + 'schemeAgencyID': "195", + 'schemeID': str(company.partner_id.verification_code or 0), + 'schemeName': company.partner_id.ref_type_id.code_dian + }, + 'TaxLevelCode': { + 'listName': "48" + }, + } + + def _get_receiver_tags(self): + return { + 'RegistrationName': self.partner_id.name, + 'CompanyID': self.partner_id.ref_num, + 'TaxLevelCode': 'R-99-PN', + 'ID': '01', + 'Name': 'IVA' + } + + def _get_receiver_attrs(self): + company = self.company_id + return { + 'CompanyID': { + 'schemeAgencyID': "195", + 'schemeID': str(self.partner_id.verification_code or 0), + 'schemeName': self.partner_id.ref_type_id.code_dian + }, + 'TaxLevelCode': { + 'listName': "48" + }, + } + + def _get_attachment_tags(self): + return { + 'MimeCode': 'text/xml', + 'EncodingCode': 'UTF-8', + 'Description': 'ei_xml_content', + } + + def _get_doc_line_tags(self): + issue_date = self.ei_generation_date + validation_date, validation_time = (self.ei_validation_date.split( + ' ') if self.ei_validation_date else ('', '')) + return { + 'LineID': '1', + 'ID': self.name, + 'UUID': (self.ei_cufe or self.ei_cude), + 'IssueDate': issue_date[:10], + 'DocumentType': 'ApplicationResponse', + 'MimeCode': 'text/xml', + 'EncodingCode': 'UTF-8', + 'Description': 'ei_app_response', + 'ValidatorID': u'Unidad Especial Dirección de Impuestos y Aduanas Nacionales', + 'ValidationResultCode': u'02', + 'ValidationDate': str(validation_date), + 'ValidationTime': str(validation_time), + } + + def _get_doc_line_attrs(self): + return { + 'UUID': { + 'schemeName': "CUFE-SHA384" + } + } + + def build_attached_document(self): + vals = { + 'header': { + 'tags': self._get_header_tags(), + 'attrs': {} + }, + 'sender': { + 'tags': self._get_sender_tags(), + 'attrs': self._get_sender_attrs() + }, + 'receiver': { + 'tags': self._get_receiver_tags(), + 'attrs': self._get_receiver_attrs() + }, + 'attachment': { + 'tags': self._get_attachment_tags(), + 'attrs': {} + }, + 'doc_line': { + 'tags': self._get_doc_line_tags(), + 'attrs': self._get_doc_line_attrs() + } + } + log_app_response = self.transaction_log_ids.filtered( + lambda log: log.document_type == 'app_response') + app_response = log_app_response[0].content if log_app_response else '' + return xml_helper.build_xml_attached_document( + self.ei_xml_content, app_response, vals) diff --git a/electronic_invoice_dian/models/account_tax.py b/electronic_invoice_dian/models/account_tax.py new file mode 100644 index 0000000..9b07840 --- /dev/null +++ b/electronic_invoice_dian/models/account_tax.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + +EI_CODE_SELECTION = [ + ('01', 'IVA'), + ('02', 'IC'), + ('03', 'ICA'), + ('04', 'INC'), + ('05', 'ReteIVA'), + ('06', 'ReteFuente'), + ('07', 'ReteICA') +] + + +class AccountTax(models.Model): + _inherit = 'account.tax' + + ei_code = fields.Selection( + string='Código Facturación Electrónica', + selection=EI_CODE_SELECTION) diff --git a/electronic_invoice_dian/models/ei_transaction_log.py b/electronic_invoice_dian/models/ei_transaction_log.py new file mode 100644 index 0000000..0986e38 --- /dev/null +++ b/electronic_invoice_dian/models/ei_transaction_log.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api + +DOCUMENT_STATE_SELECTION = [ + ('sent', 'Emitido'), + ('dian_reject', 'Rechazo Dian'), + ('dian_accept', 'Aceptación Dian'), + ('email_sent', 'Email Enviado'), + ('email_fail', 'Email Fallido'), + ('customer_accept', 'Aceptación Cliente'), + ('customer_reject', 'Rechazo Cliente'), + ('provider_error', 'Error de Procesamiento'), + ('exception', 'Excepción de Envio'), +] +DOCUMENT_TYPE_SELECTION = [ + ('json', 'Json'), + ('app_response', 'Application Response'), + ('xml_fe', 'Factura XML'), + ('none', 'Ninguno'), +] + + +class EITransactionLog(models.Model): + _name = 'ei.transaction.log' + _description = 'Log de Facturacion Electronica' + _order = 'date desc' + + invoice_id = fields.Many2one( + string='Factura', comodel_name='account.move', readonly=True) + date = fields.Datetime(string='Fecha', readonly=True) + document_state = fields.Selection( + string='Estado', selection=DOCUMENT_STATE_SELECTION, readonly=True) + document_type = fields.Selection( + string='Tipo de documento', selection=DOCUMENT_TYPE_SELECTION, + readonly=True) + content = fields.Text(string='Contenido', readonly=True) diff --git a/electronic_invoice_dian/models/electronic_invoice_resolution.py b/electronic_invoice_dian/models/electronic_invoice_resolution.py new file mode 100644 index 0000000..7f546ca --- /dev/null +++ b/electronic_invoice_dian/models/electronic_invoice_resolution.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api +from odoo.exceptions import ValidationError +from lxml import etree +import requests +import re +import json +import base64 +import operator +from functools import reduce +from .http_helper import URL_NUMBERING_XML, AVANCYS_NIT, HEADERS + +ID_PARAM_HELP = """Provisto por el Proveedor Tecnológico""" +DOCUMENT_TYPE_HELP = """ +Para Notas Crédito y Débito los datos de resolución no aplican""" +DOCUMENT_TYPE_SELECTION = [ + ('01', 'Factura Electrónica'), + ('91', 'Nota Crédito'), + ('92', 'Nota Débito'), + ('03', 'Contingencia') +] + +# Warnings + +NOT_ENOUGH_DATA_WARN = """ +No hay suficientes datos para obtener la información, Por favor ingrese +al menos los siguientes: + +- Número de Resolución +- Prefijo +- Numeración Desde +- Numeración Hasta +""" +MULTI_RESOLUTION_WARN = """ +Se encontro mas de una resolución con los mismos parametros. +""" +NO_RESOLUTION_WARN = """ +No se encontro ninguna resolución que coincida con los datos.""" +RESOLUTION_SAMPLE = """ +Ejemplo: Resolución DIAN N° 00000000 desde PREFIJO 1 hasta PREFIJO 1000 +""" + + +class ElectronicInvoiceResolution(models.Model): + _name = 'electronic.invoice.resolution' + _description = 'Resolucion de Facturacion Electronica' + + name = fields.Char(string='Nombre', required=True) + number = fields.Char(string='Número de Resolución') + prefix = fields.Char('Prefijo', required=True) + from_number = fields.Integer(string='Numeración Desde', copy=False) + to_number = fields.Integer(string='Numeración Hasta', copy=False) + valid_date_from = fields.Date(string='Fecha Inicio Resolución', copy=False) + valid_date_to = fields.Date(string='Fecha Fin Resolución', copy=False) + id_param = fields.Integer( + string='ID Resolución', help=ID_PARAM_HELP, required=True, default=0) + technical_key = fields.Char(string='Clave Técnica', copy=False) + document_type = fields.Selection( + string='Tipo de Documento', selection=DOCUMENT_TYPE_SELECTION, + required=True, copy=False, help=DOCUMENT_TYPE_HELP) + description = fields.Text( + string='Texto de Resolución', help=RESOLUTION_SAMPLE) + company_id = fields.Many2one( + 'res.company', 'Company', + default=lambda self: self.env.company, + index=True, required=True) + + def get_resolution_xml(self): + self.ensure_one() + company = self.company_id + body_dict = { + "datos_conexion": + { + "token": company.software_token, + "documento": company.partner_id.ref_num, + "documentoT": (AVANCYS_NIT + if company.ei_software_operation == 'provider' + else company.partner_id.ref_num) + }, + "Datos_software": + { + "codigo": company.software_code_dian, + "ambiente": "1" + } + } + data = 'json_data=' + \ + base64.b64encode(json.dumps(body_dict).encode( + 'utf-8')).decode('utf-8') + response = requests.post(URL_NUMBERING_XML, data=data, + headers=HEADERS, verify=False) + return str(response.content, 'utf-8') + + def parse_resolution(self, resolution): + return { + 'ResolutionNumber': re.search( + r'(.*?)', resolution).group(1), + 'ResolutionDate': re.search( + r'(.*?)', resolution).group(1), + 'Prefix': re.search(r'(.*?)', resolution).group(1), + 'FromNumber': re.search(r'(.*?)', resolution).group(1), + 'ToNumber': re.search(r'(.*?)', resolution).group(1), + 'ValidDateFrom': re.search( + r'(.*?)', resolution).group(1), + 'ValidDateTo': re.search(r'(.*?)', resolution).group(1), + 'TechnicalKey': re.search(r'(.*?)', + resolution).group(1) + } + + def resolucion_match(self, resolucion_match): + return reduce(operator.and_, [ + self.number == resolucion_match.get('ResolutionNumber', False), + self.prefix == resolucion_match.get('Prefix', False), + str(self.from_number) == resolucion_match.get('FromNumber', False), + str(self.to_number) == resolucion_match.get('ToNumber', False), + ]) + + def get_technical_key(self): + if not self.prefix or not self.number or not self.from_number or not self.to_number: + raise ValidationError(NOT_ENOUGH_DATA_WARN) + self.technical_key = '' + resolution_xml = self.get_resolution_xml() + resolutions = re.findall( + r'([\s\S.]*?)', resolution_xml) + if not resolutions: + return + resolutions_list = list(map(self.parse_resolution, resolutions)) + matching_resolution = list( + filter(self.resolucion_match, resolutions_list)) + if not matching_resolution: + raise ValidationError(NO_RESOLUTION_WARN) + if len(matching_resolution) > 1: + raise ValidationError(MULTI_RESOLUTION_WARN) + self.technical_key = matching_resolution[0]['TechnicalKey'] diff --git a/electronic_invoice_dian/models/http_helper.py b/electronic_invoice_dian/models/http_helper.py new file mode 100644 index 0000000..c91e369 --- /dev/null +++ b/electronic_invoice_dian/models/http_helper.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from collections import OrderedDict +import base64 +import json +import re +import requests + + +HEADERS = { + 'Host': 'terabyte.com.co', + 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.5', + 'Accept-Encoding': 'gzip, deflate', + 'Referer': 'https://www.avancyserp.com/', + 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Length': '5580', + 'Origin': 'https://www.avancyserp.com', + 'Connection': 'close', + 'Upgrade-Insecure-Requests': '1', +} + + +INVOICE = { + "datos_conexion": {}, + "tipo_documento": {}, + "basicos_factura": {}, + "respuesta": {}, + "param_basico": {}, + "facturador": {}, + "autorizacion_descarga": {}, + "WithholdingTaxTotal": {}, + "datos_empresa": {}, + "datos_cliente": {}, + "datos_transportadora": {}, + "QR": {}, + "Periodo_pago": {}, + "Metodo_pago": {}, + "Referencia_factura": {}, + "Referencia_factura2": {}, + "respuesta_discrepancia": {}, + "order_de_referencia": {}, + "Referencia_envio": {}, + "Referencia_recibido": {}, + "Terminos_de_entrega": {}, + "Tasa_cambio": {}, + "AdditionalDocumentReference": {}, + "Anticipos": [], + "Productos_servicios": [] +} + +URL_XML = 'https://facturaelectronica.avancyserp.com/facturacion_electronica/v5.2/xml/formatos/GetXmlByDocumentKey.php' +URL_NUMBERING_XML = 'https://facturaelectronica.avancyserp.com/facturacion_electronica/v5.2/xml/formatos/GetNumberingRange.php' +DEFAULT_SERVICE_POST = 'https://www.avancyserp.com/response_ajax.php' +DEFAULT_SERVICE_URL = 'https://facturaelectronica.avancyserp.com/facturacion_electronica/v5.2/send.php' +DEFAULT_SERVICE_URL_GET = 'https://facturaelectronica.avancyserp.com/facturacion_electronica/v5.2/view_response.php' +AVANCYS_NIT = 900297700 +DIAN_INVOICE_URL_BASE = 'https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey=' diff --git a/electronic_invoice_dian/models/res_company.py b/electronic_invoice_dian/models/res_company.py new file mode 100644 index 0000000..0d99062 --- /dev/null +++ b/electronic_invoice_dian/models/res_company.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models +from .http_helper import DEFAULT_SERVICE_URL +from .http_helper import DEFAULT_SERVICE_URL_GET +from .http_helper import DEFAULT_SERVICE_POST + +EI_DATABASE_HELP = """ +Base de Datos en la cual funcionará la Facturación Electrónica""" +EI_ENVIRONMENT_HELP = """ +Indicador del tipo de ambiente de Facturación Electrónica que se usará en +esta Base de Datos""" +SERVICE_URL_HELP = """URL de envio de Facturación Electrónica del Proveedor""" +SERVICE_URL_GET_HELP = """URL de Respuesta de Proveedor""" +SERVICE_URL_POST_HELP = """ +URL de envio de Facturación Electrónica del Facturador""" +SOFTWARE_TOKEN_HELP = """Token de Proveedor Tecnológico""" +SOFTWARE_CODE_DIAN_HELP = """Codigo de software dado por la DIAN""" +EI_TMP_PATH_HELP = """Directorio local para archivos temporales""" +EI_AUTOMATIC_GENERATION_HELP = """ +Enviar factura electrónica automáticamente al validar la factura""" +ATTACH_CUSTOMER_ORDER_HELP = """ +Adjuntar en el correo la orden de compra del cliente""" +ATTACH_DELIVERY_NOTE_HELP = """Adjuntar documento de remisión de pedido""" +ATTACH_INVOICE_DOCS_HELP = """ +Adjuntar documentos adicionales al pdf y xml adjuntos en la factura""" +AUTO_ACCEPTANCE_EMAIL_HELP = """Enviar correo de aceptación al cliente +una vez la factura haya quedado aceptada por la DIAN""" +EI_ID_CUSTOMIZATION_HELP = """ +Tipo de Operación principal de facturación electrónica de la compañía""" +TRIBUTARY_OBLIGATIONS_HELP = """ +Usadas en la construcción del XML AttachedDocument""" + + +class ResCompany(models.Model): + _inherit = 'res.company' + + # Basic config + + electronic_invoice = fields.Boolean( + string='Activar Facturación Electrónica') + ei_database = fields.Char( + string='Base de Datos', default=lambda self: self.env.cr.dbname, + required=True, help=EI_DATABASE_HELP) + ei_environment = fields.Selection( + string='Ambiente', + selection=[ + ('production', u'Producción'), ('test', u'Habilitación')], + default='test', required=True, help=EI_ENVIRONMENT_HELP) + ei_software_operation = fields.Selection( + string='Operación de Software', + selection=[ + ('own', u'Software Propio'), + ('provider', u'Proveedor Tecnológico')], + default='provider', required=True) + + # Server + + service_url = fields.Char( + string='URL Servicio', help=SERVICE_URL_HELP, + default=DEFAULT_SERVICE_URL) + service_url_get = fields.Char( + string='URL Respuesta', help=SERVICE_URL_GET_HELP, + default=DEFAULT_SERVICE_URL_GET) + service_url_post = fields.Char( + string='URL Peticion', help=SERVICE_URL_POST_HELP, + default=DEFAULT_SERVICE_POST) + software_token = fields.Char( + string='Token', help=SOFTWARE_TOKEN_HELP) + software_code_dian = fields.Char( + string='Codigo Software DIAN', help=SOFTWARE_CODE_DIAN_HELP) + ei_tmp_path = fields.Char( + string='Ruta de Archivos Temporales', + help=EI_TMP_PATH_HELP, default='/tmp') + + # Policies + + ei_automatic_generation = fields.Boolean( + string='Enviar Factura al Validar', + help=EI_AUTOMATIC_GENERATION_HELP) + attach_customer_order = fields.Boolean( + string='Adjuntar OC Cliente', help=ATTACH_CUSTOMER_ORDER_HELP) + attach_delivery_note = fields.Boolean( + string='Adjuntar Remisión', help=ATTACH_DELIVERY_NOTE_HELP) + attach_invoice_docs = fields.Boolean( + string='Envíar Adjuntos de Factura', + help=ATTACH_INVOICE_DOCS_HELP) + auto_acceptance_email = fields.Boolean( + string='Email de Aceptación Automático', + help=AUTO_ACCEPTANCE_EMAIL_HELP) + + # Settings + + ei_id_customization = fields.Selection( + string='Operación Principal', + selection=[('09', 'AIU'), ('10', 'Estandar'), ('11', 'Mandatos')], + required=True, default='10', + help=EI_ID_CUSTOMIZATION_HELP) + mail_server_id = fields.Many2one( + string='Servidor Email Preferido', + comodel_name='ir.mail_server') + ei_report_id = fields.Many2one( + string='Formato PDF', comodel_name='ir.actions.report', + domain=[('model', '=', 'account.move')]) + tributary_obligations = fields.Char( + string='Obligaciones Tributarias', + help=TRIBUTARY_OBLIGATIONS_HELP, + default='R-99-PN') + invoice_batch_process = fields.Boolean(string='Procesamiento Masivo') diff --git a/electronic_invoice_dian/models/res_partner.py b/electronic_invoice_dian/models/res_partner.py new file mode 100644 index 0000000..0648aa4 --- /dev/null +++ b/electronic_invoice_dian/models/res_partner.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + ei_email = fields.Char(string='E-mail Facturación Electrónica') diff --git a/electronic_invoice_dian/models/sale_order.py b/electronic_invoice_dian/models/sale_order.py new file mode 100644 index 0000000..36ff5d6 --- /dev/null +++ b/electronic_invoice_dian/models/sale_order.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api +from odoo.exceptions import ValidationError + +DATASIZE_RATIO = 3.0 / 4.0 # converts from len to actual filesize +MAX_FILE_SIZE = 2000000 +MAX_SIZE_WARN = """ +El tamaño del archivo de la Orden de Compra Cliente supera los 2Mb permitidos""" + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + customer_po_file = fields.Binary( + string='Orden de Compra Cliente', copy=False) + customer_po_name = fields.Char('Nombre OC Cliente', copy=False) + customer_po_policy = fields.Boolean( + string='Política Envío OC', related='company_id.attach_customer_order', + readonly=True) + + @api.constrains('customer_po_file') + def _check_file_size(self): + if self.customer_po_file: + if len(self.customer_po_file) * DATASIZE_RATIO > MAX_FILE_SIZE: + raise ValidationError(MAX_SIZE_WARN) diff --git a/electronic_invoice_dian/models/uom_uom.py b/electronic_invoice_dian/models/uom_uom.py new file mode 100644 index 0000000..2909fe0 --- /dev/null +++ b/electronic_invoice_dian/models/uom_uom.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class UomUom(models.Model): + _inherit = 'uom.uom' + + code_dian = fields.Char(string='Código DIAN') diff --git a/electronic_invoice_dian/models/xml_helper.py b/electronic_invoice_dian/models/xml_helper.py new file mode 100644 index 0000000..42c6b3b --- /dev/null +++ b/electronic_invoice_dian/models/xml_helper.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +# pylint: disable=invalid-name, bare-except, eval-used, cell-var-from-loop +# pylint: disable=unused-wildcard-import,wildcard-import,too-many-locals +""" +XML Helper to build invoice +""" + + +from xml.etree.ElementTree import SubElement as ETSE +from xml.etree.ElementTree import Element as ETE +import xml.etree.ElementTree as ET +from .xml_schemas import ATTDOC_ATTRS +from .xml_schemas import Prefix as pfx +from .xml_schemas import NAMESPACES + +for ns in NAMESPACES: + ET.register_namespace(ns, NAMESPACES[ns]) + + +def set_document_root(ET, doc_type): + """Attachem Document Creation""" + AttachedDocument = ET.Element( + doc_type, + attrib=ATTDOC_ATTRS + ) + return AttachedDocument + + +def set_header(AttachedDocument, tags, tag_attributes): + UBLVersionID = ET.SubElement(AttachedDocument, pfx.cbc + 'UBLVersionID') + CustomizationID = ET.SubElement( + AttachedDocument, pfx.cbc + 'CustomizationID') + ProfileID = ET.SubElement( + AttachedDocument, pfx.cbc + 'ProfileID') + ProfileExecutionID = ET.SubElement( + AttachedDocument, pfx.cbc + 'ProfileExecutionID') + ID = ET.SubElement( + AttachedDocument, pfx.cbc + 'ID') + IssueDate = ET.SubElement( + AttachedDocument, pfx.cbc + 'IssueDate') + IssueTime = ET.SubElement( + AttachedDocument, pfx.cbc + 'IssueTime') + DocumentType = ET.SubElement( + AttachedDocument, pfx.cbc + 'DocumentType') + ParentDocumentID = ET.SubElement( + AttachedDocument, pfx.cbc + 'ParentDocumentID') + for tag in tags: + try: + eval(tag).text = tags[tag] + except: + pass + return AttachedDocument + + +def set_party(Party, tags, tag_attributes): + PartyTaxScheme = ET.SubElement( + Party, pfx.cac + 'PartyTaxScheme') + RegistrationName = ET.SubElement( + PartyTaxScheme, pfx.cbc + 'RegistrationName') + CompanyID = ET.SubElement( + PartyTaxScheme, pfx.cbc + 'CompanyID', + attrib=tag_attributes.get('CompanyID', {})) + TaxLevelCode = ET.SubElement( + PartyTaxScheme, pfx.cbc + 'TaxLevelCode', + attrib=tag_attributes.get('TaxLevelCode', {})) + TaxScheme = ET.SubElement( + PartyTaxScheme, pfx.cac + 'TaxScheme') + ID = ET.SubElement( + TaxScheme, pfx.cbc + 'ID') + Name = ET.SubElement( + TaxScheme, pfx.cbc + 'Name') + for tag in tags: + try: + eval(tag).text = tags[tag] + except: + pass + return Party + + +def set_sender_party(AttachedDocument, values, tag_attributes): + SenderParty = ET.SubElement( + AttachedDocument, pfx.cac + 'SenderParty') + set_party(SenderParty, values, tag_attributes) + return AttachedDocument + + +def set_receiver_party(AttachedDocument, values, tag_attributes): + ReceiverParty = ET.SubElement( + AttachedDocument, pfx.cac + 'ReceiverParty') + set_party(ReceiverParty, values, tag_attributes) + return AttachedDocument + + +def set_attchment(Document, tags, tag_attributes): + Attachment = ET.SubElement( + Document, pfx.cac + 'Attachment') + ExternalReference = ET.SubElement( + Attachment, pfx.cac + 'ExternalReference') + MimeCode = ET.SubElement( + ExternalReference, pfx.cbc + 'MimeCode') + EncodingCode = ET.SubElement( + ExternalReference, pfx.cbc + 'EncodingCode') + Description = ET.SubElement( + ExternalReference, pfx.cbc + 'Description') + for tag in tags: + try: + eval(tag).text = tags[tag] + except: + pass + return Document + + +def set_parent_document_line_reference(AttachedDocument, tags, tag_attributes): + ParentDocumentLineReference = ET.SubElement( + AttachedDocument, pfx.cac + 'ParentDocumentLineReference') + LineID = ET.SubElement( + ParentDocumentLineReference, pfx.cbc + 'LineID') + DocumentReference = ET.SubElement( + ParentDocumentLineReference, pfx.cac + 'DocumentReference') + ID = ET.SubElement(DocumentReference, pfx.cbc + 'ID') + UUID = ET.SubElement(DocumentReference, pfx.cbc + 'UUID', + attrib=tag_attributes.get('UUID', {})) + IssueDate = ET.SubElement(DocumentReference, pfx.cbc + 'IssueDate') + DocumentType = ET.SubElement(DocumentReference, pfx.cbc + 'DocumentType') + set_attchment(DocumentReference, tags, tag_attributes) + ResultOfVerification = ET.SubElement( + DocumentReference, pfx.cac + 'ResultOfVerification') + ValidatorID = ET.SubElement( + ResultOfVerification, pfx.cbc + 'ValidatorID') + ValidationResultCode = ET.SubElement( + ResultOfVerification, pfx.cbc + 'ValidationResultCode') + ValidationDate = ET.SubElement( + ResultOfVerification, pfx.cbc + 'ValidationDate') + ValidationTime = ET.SubElement( + ResultOfVerification, pfx.cbc + 'ValidationTime') + for tag in tags: + try: + eval(tag).text = tags[tag] + except: + pass + return AttachedDocument + + +def sanitize_utf_es(text): + chars = { + 'ñ': u'ñ', 'á': u'á', 'é': u'é', 'í': u'í', + 'ó': u'ó', 'ú': u'ú', 'Á': u'Á', 'É': u'É', + 'Í': u'Í', 'Ó': u'Ó', 'Ú': u'Ú'} + sanitized_text = text + for es_char, utf_char in chars.items(): + sanitized_text = sanitized_text.replace(es_char, utf_char) + return sanitized_text + + +def build_xml_attached_document(xml_fe, app_response, values): + xml_declaration = '\n' + document = set_document_root(ET, doc_type='AttachedDocument') + document = set_header( + document, values['header']['tags'], values['header']['attrs']) + document = set_sender_party( + document, values['sender']['tags'], values['sender']['attrs']) + document = set_receiver_party( + document, values['receiver']['tags'], values['receiver']['attrs']) + document = set_attchment( + document, values['attachment']['tags'], values['attachment']['attrs']) + document = set_parent_document_line_reference( + document, values['doc_line']['tags'], values['doc_line']['attrs']) + # return document + doc_string = xml_declaration + ET.tostring(document).decode('utf-8').replace( + 'ei_xml_content', '' % xml_fe).replace( + 'ei_app_response', '' % app_response) + return sanitize_utf_es(doc_string).encode('utf-8') diff --git a/electronic_invoice_dian/models/xml_schemas.py b/electronic_invoice_dian/models/xml_schemas.py new file mode 100644 index 0000000..6131610 --- /dev/null +++ b/electronic_invoice_dian/models/xml_schemas.py @@ -0,0 +1,40 @@ +""" +Namespaces declarations +""" + +NAMESPACES = { + 'ds': "http://www.w3.org/2000/09/xmldsig#", + 'cac': "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2", + 'cbc': "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", + 'ccts': "urn:un:unece:uncefact:data:specification:CoreComponentTypeSchemaModule:2", + 'ext': "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2", + 'xades': "http://uri.etsi.org/01903/v1.3.2#", + 'xades141': "http://uri.etsi.org/01903/v1.4.1#" +} + +ATTDOC_ATTRS = { + "xmlns:ext": "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2", + "xmlns": "urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2", +} +cac = '{%s}' % NAMESPACES['cac'] +cbc = '{%s}' % NAMESPACES['cbc'] +ccts = '{%s}' % NAMESPACES['ccts'] +ext = '{%s}' % NAMESPACES['ext'] +xades = '{%s}' % NAMESPACES['xades'] +xades141 = '{%s}' % NAMESPACES['xades141'] +ds = 'ds:' + + +class DictMap(dict): + __getattr__ = dict.__getitem__ + + +PREFIXMAP = { + 'cac': cac, + 'cbc': cbc, + 'ccts': ccts, + 'ext': ext, + 'xades': xades, + 'xades141': xades141, +} +Prefix = DictMap(PREFIXMAP) diff --git a/electronic_invoice_dian/report/electronic_invoice_report.xml b/electronic_invoice_dian/report/electronic_invoice_report.xml new file mode 100644 index 0000000..a202644 --- /dev/null +++ b/electronic_invoice_dian/report/electronic_invoice_report.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/electronic_invoice_dian/security/ir.model.access.csv b/electronic_invoice_dian/security/ir.model.access.csv new file mode 100755 index 0000000..60aed9a --- /dev/null +++ b/electronic_invoice_dian/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_electronic_invoice_resolution_manager,access_electronic_invoice_resolution_manager,model_electronic_invoice_resolution,electronic_invoice_dian.group_manager,1,1,1,1 +access_electronic_invoice_resolution_user,access_electronic_invoice_resolution_user,model_electronic_invoice_resolution,electronic_invoice_dian.group_user,1,1,0,0 +access_electronic_invoice_resolution_invoice_user,access_electronic_invoice_resolution_user,model_electronic_invoice_resolution,account.group_account_invoice,1,1,0,0 +access_ei_transaction_log_manager,access_ei_transaction_log_manager,model_ei_transaction_log,electronic_invoice_dian.group_manager,1,1,1,1 +access_ei_transaction_log_user,access_ei_transaction_log_user,model_ei_transaction_log,electronic_invoice_dian.group_user,1,1,0,0 +access_ei_transaction_log_invoice_user,access_ei_transaction_log_user,model_ei_transaction_log,account.group_account_invoice,1,1,0,0 +access_ei_multi_process_manager,access_ei_multi_process_manager,model_ei_multi_process,electronic_invoice_dian.group_manager,1,1,1,1 +access_ei_multi_process_user,access_ei_multi_process_user,model_ei_multi_process,electronic_invoice_dian.group_user,1,1,1,0 +access_ei_multi_process_invoice_user,access_ei_multi_process_user,model_ei_multi_process,account.group_account_invoice,1,1,1,0 +access_ei_state_reset_manager,access_ei_state_Reset_manager,model_ei_state_reset,electronic_invoice_dian.group_manager,1,1,1,1 diff --git a/electronic_invoice_dian/security/security.xml b/electronic_invoice_dian/security/security.xml new file mode 100644 index 0000000..418e046 --- /dev/null +++ b/electronic_invoice_dian/security/security.xml @@ -0,0 +1,24 @@ + + + + + Facturación Electrónica DIAN + + + Administrador + + + + + Usuario + + + + + Resolución de Facturación Electronica: multi-company + + + [('company_id', 'in', company_ids)] + + + diff --git a/electronic_invoice_dian/static/description/icon.png b/electronic_invoice_dian/static/description/icon.png new file mode 100644 index 0000000..32bb3ad Binary files /dev/null and b/electronic_invoice_dian/static/description/icon.png differ diff --git a/electronic_invoice_dian/templates/customer_acknowledge_email.xml b/electronic_invoice_dian/templates/customer_acknowledge_email.xml new file mode 100644 index 0000000..6039beb --- /dev/null +++ b/electronic_invoice_dian/templates/customer_acknowledge_email.xml @@ -0,0 +1,60 @@ + + + + + Envio de factura electrónica + ${object.company_id.email or ''} + ${object.company_id.partner_id.ref_num};${object.company_id.partner_id.name};${object.name};${object.journal_id.resolution_id.document_type};${object.company_id.partner_id.name} + + ${(object.partner_id.ei_email or object.partner_id.email)} + ${False} + + + + + + ${object.name} + + + + +
+
+ Factura electronica ${object.name} +
+
+ Estimado: ${object.partner_id.name},
+

Se ha generado un factura electrónica a su nombre

+ Emisor: ${object.company_id.partner_id.name} +

Adjunto encontrará los archivos de la factura, por favor indique la + aceptación o rechazo de la misma

+
+



+ + +
+
+

+ Por Avancys SAS https://www.avancys.com Proveedor tecnologico. +

+
+ + + + ]]> +
+
+ +
+
\ No newline at end of file diff --git a/electronic_invoice_dian/templates/customer_acknowledge_response.xml b/electronic_invoice_dian/templates/customer_acknowledge_response.xml new file mode 100644 index 0000000..df0c7d8 --- /dev/null +++ b/electronic_invoice_dian/templates/customer_acknowledge_response.xml @@ -0,0 +1,39 @@ + + + + + + + \ No newline at end of file diff --git a/electronic_invoice_dian/templates/electronic_invoice.xml b/electronic_invoice_dian/templates/electronic_invoice.xml new file mode 100644 index 0000000..5ddd9d2 --- /dev/null +++ b/electronic_invoice_dian/templates/electronic_invoice.xml @@ -0,0 +1,396 @@ + + + + + + + + + + + diff --git a/electronic_invoice_dian/views/account_journal.xml b/electronic_invoice_dian/views/account_journal.xml new file mode 100644 index 0000000..d3c1cb5 --- /dev/null +++ b/electronic_invoice_dian/views/account_journal.xml @@ -0,0 +1,22 @@ + + + + + account.journal.ei.view.form + account.journal + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/electronic_invoice_dian/views/account_move.xml b/electronic_invoice_dian/views/account_move.xml new file mode 100644 index 0000000..7363b30 --- /dev/null +++ b/electronic_invoice_dian/views/account_move.xml @@ -0,0 +1,66 @@ + + + + + account.move.ei.view.form + account.move + + + + + + + + + + diff --git a/l10n_co_account_e_invoicing/views/account_tax_group_views.xml b/l10n_co_account_e_invoicing/views/account_tax_group_views.xml new file mode 100644 index 0000000..2cd037c --- /dev/null +++ b/l10n_co_account_e_invoicing/views/account_tax_group_views.xml @@ -0,0 +1,17 @@ + + + + + account.tax.group + + + + + + + {'required': [('is_einvoicing', '=', True)]} + + + + + diff --git a/l10n_co_account_e_invoicing/views/ir_sequence_views.xml b/l10n_co_account_e_invoicing/views/ir_sequence_views.xml new file mode 100644 index 0000000..e65742a --- /dev/null +++ b/l10n_co_account_e_invoicing/views/ir_sequence_views.xml @@ -0,0 +1,15 @@ + + + + + ir.sequence + + + + + + + + + + diff --git a/l10n_co_account_e_invoicing/views/product_template_views.xml b/l10n_co_account_e_invoicing/views/product_template_views.xml new file mode 100644 index 0000000..acf3988 --- /dev/null +++ b/l10n_co_account_e_invoicing/views/product_template_views.xml @@ -0,0 +1,22 @@ + + + + product.template + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n_co_account_e_invoicing/views/res_company_views.xml b/l10n_co_account_e_invoicing/views/res_company_views.xml new file mode 100644 index 0000000..e2f22cc --- /dev/null +++ b/l10n_co_account_e_invoicing/views/res_company_views.xml @@ -0,0 +1,115 @@ + + + + res.company + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_co_account_e_invoicing/views/res_partner_views.xml b/l10n_co_account_e_invoicing/views/res_partner_views.xml new file mode 100644 index 0000000..df8c591 --- /dev/null +++ b/l10n_co_account_e_invoicing/views/res_partner_views.xml @@ -0,0 +1,24 @@ + + + + res.partner + + + + + + + + + + + + diff --git a/l10n_co_account_move_discrepancy_response/README.rst b/l10n_co_account_move_discrepancy_response/README.rst new file mode 100644 index 0000000..bbd23a6 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/README.rst @@ -0,0 +1,33 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +========================================================================= +Conceptos de corrección para facturas rectificativas para la localizacion +========================================================================= +========== +Colombiana +========== + +Este módulo tiene los conceptos de corrección para facturas rectificativas +identificados por la DIAN para la localizacion Colombiana, informacion obtenida +del anexo tecnico para facturacion electronica version 1.8, puntos 13.2.4. y +13.2.5. + +- Crea un campo en las facturas rectificativas para definir el concepto de + corrección que le corresponda. + +This module has the correction concepts for refund invoices identified by the +DIAN for the Colombian localization, information obtained from the technical +annex for e-invoicing version 1.8, points 13.2.4. and 13.2.5. + +- Creates a field in the refund invoices to define the concept of correction + that corresponds to it. + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/l10n_co_account_move_discrepancy_response/__init__.py b/l10n_co_account_move_discrepancy_response/__init__.py new file mode 100644 index 0000000..b3f2d6a --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizards diff --git a/l10n_co_account_move_discrepancy_response/__manifest__.py b/l10n_co_account_move_discrepancy_response/__manifest__.py new file mode 100644 index 0000000..995ee1d --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/__manifest__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Conceptos de corrección para facturas rectificativas " + "para la localizacion Colombiana", + "summary": "Este módulo tiene los conceptos de corrección para facturas " + "rectificativas identificados por la DIAN para la localizacion Colombiana", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/JoanMarin", + "author": "Joan Marín Github@JoanMarin", + "category": "Localization", + "depends": [ + "account_debit_note", + "account_invoice_force_number_extended" + ], + "data": [ + "security/ir.model.access.csv", + "data/account_move_discrepancy_response_code_data.xml", + "wizards/account_debit_note_views.xml", + "wizards/account_move_reversal_views.xml", + "views/account_move_discrepancy_response_code_views.xml", + "views/account_move_views.xml", + "views/account_journal_views.xml", + ], + "installable": True, +} diff --git a/l10n_co_account_move_discrepancy_response/data/account_move_discrepancy_response_code_data.xml b/l10n_co_account_move_discrepancy_response/data/account_move_discrepancy_response_code_data.xml new file mode 100644 index 0000000..c3fb0c8 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/data/account_move_discrepancy_response_code_data.xml @@ -0,0 +1,48 @@ + + + + Devolución parcial de los bienes y/o no aceptación parcial del servicio + 1 + credit + + + Anulación de factura electrónica + 2 + credit + + + Rebaja o descuento parcial o total + 3 + credit + + + Ajuste de precio + 4 + credit + + + Otros + 5 + credit + + + Intereses + 1 + debit + + + Gastos por cobrar + 2 + debit + + + Cambio del valor + 3 + debit + + + Otros + 4 + debit + + diff --git a/l10n_co_account_move_discrepancy_response/i18n/es.po b/l10n_co_account_move_discrepancy_response/i18n/es.po new file mode 100644 index 0000000..1adadd9 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/i18n/es.po @@ -0,0 +1,193 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_discrepancy_response +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:28+0000\n" +"PO-Revision-Date: 2021-07-01 14: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_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Revocación de movimiento en cuenta" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_debit_note +msgid "Add Debit Note wizard" +msgstr "Asistente para agregar nota débito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "" +"Check this box if you don't want to share the same sequence for invoices and" +" debit notes made from this journal" +msgstr "Marque esta casilla si no quiere compartir la misma secuencia para facturas y" +" las notas debito hechas desde este diario" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__code +msgid "Code" +msgstr "Código" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__discrepancy_response_code_id +msgid "Correction concept for Refund Invoice" +msgstr "Concepto de Corrección para la Factura Rectificativa" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.actions.act_window,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_action +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_discrepancy_response_code +#: model:ir.ui.menu,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_tree +msgid "Correction concepts for Refund Invoices" +msgstr "Conceptos de Corrección para Facturas Rectificativas" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__credit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__credit +msgid "Credit Note" +msgstr "Nota Crédito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__debit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__debit +msgid "Debit Note" +msgstr "Nota Débito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "Debit Note Entry Sequence" +msgstr "Secuencia de Asiento de Nota Débito" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#, python-format +msgid "Debit Note Sequence - " +msgstr "Secuencia de Nota Débito - " + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "Dedicated Debit Note Sequence" +msgstr "Secuencia de Nota Débito Dedicada" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_account_move_discrepancy_response +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Group By" +msgstr "Agrupar Por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_journal +msgid "Journal" +msgstr "Diario" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move +msgid "Journal Entry" +msgstr "Asiento contable" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__name +msgid "Name" +msgstr "Nombre" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the debit notes" +msgstr "Por favor, defina una secuencia para notas debito" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the refunds" +msgstr "Por favor, defina una secuencia para facturas rectificativas" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence on the journal." +msgstr "Por favor, defina una secuencia para el diario." + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__refund_type +msgid "Refund Type" +msgstr "Tipo Rectificación" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "" +"This field contains the information related to the numbering of the debit " +"note entries of this journal." +msgstr "" +"Este campo contiene la información relativa a la numeración de los asientos " +"de nota débito de este diario." + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__type +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Type" +msgstr "Tipo" diff --git a/l10n_co_account_move_discrepancy_response/i18n/es_CO.po b/l10n_co_account_move_discrepancy_response/i18n/es_CO.po new file mode 100644 index 0000000..1adadd9 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/i18n/es_CO.po @@ -0,0 +1,193 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_discrepancy_response +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:28+0000\n" +"PO-Revision-Date: 2021-07-01 14: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_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "Revocación de movimiento en cuenta" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_debit_note +msgid "Add Debit Note wizard" +msgstr "Asistente para agregar nota débito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "" +"Check this box if you don't want to share the same sequence for invoices and" +" debit notes made from this journal" +msgstr "Marque esta casilla si no quiere compartir la misma secuencia para facturas y" +" las notas debito hechas desde este diario" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__code +msgid "Code" +msgstr "Código" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__discrepancy_response_code_id +msgid "Correction concept for Refund Invoice" +msgstr "Concepto de Corrección para la Factura Rectificativa" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.actions.act_window,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_action +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_discrepancy_response_code +#: model:ir.ui.menu,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_tree +msgid "Correction concepts for Refund Invoices" +msgstr "Conceptos de Corrección para Facturas Rectificativas" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__credit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__credit +msgid "Credit Note" +msgstr "Nota Crédito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__debit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__debit +msgid "Debit Note" +msgstr "Nota Débito" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "Debit Note Entry Sequence" +msgstr "Secuencia de Asiento de Nota Débito" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#, python-format +msgid "Debit Note Sequence - " +msgstr "Secuencia de Nota Débito - " + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "Dedicated Debit Note Sequence" +msgstr "Secuencia de Nota Débito Dedicada" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_account_move_discrepancy_response +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Group By" +msgstr "Agrupar Por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_journal +msgid "Journal" +msgstr "Diario" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move +msgid "Journal Entry" +msgstr "Asiento contable" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__name +msgid "Name" +msgstr "Nombre" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the debit notes" +msgstr "Por favor, defina una secuencia para notas debito" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the refunds" +msgstr "Por favor, defina una secuencia para facturas rectificativas" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence on the journal." +msgstr "Por favor, defina una secuencia para el diario." + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__refund_type +msgid "Refund Type" +msgstr "Tipo Rectificación" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "" +"This field contains the information related to the numbering of the debit " +"note entries of this journal." +msgstr "" +"Este campo contiene la información relativa a la numeración de los asientos " +"de nota débito de este diario." + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__type +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Type" +msgstr "Tipo" diff --git a/l10n_co_account_move_discrepancy_response/i18n/l10n_co_account_move_discrepancy_response.pot b/l10n_co_account_move_discrepancy_response/i18n/l10n_co_account_move_discrepancy_response.pot new file mode 100644 index 0000000..2162ace --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/i18n/l10n_co_account_move_discrepancy_response.pot @@ -0,0 +1,190 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_discrepancy_response +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:28+0000\n" +"PO-Revision-Date: 2021-07-01 14: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_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_reversal +msgid "Account Move Reversal" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_debit_note +msgid "Add Debit Note wizard" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "" +"Check this box if you don't want to share the same sequence for invoices and" +" debit notes made from this journal" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__code +msgid "Code" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__discrepancy_response_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__discrepancy_response_code_id +msgid "Correction concept for Refund Invoice" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.actions.act_window,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_action +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move_discrepancy_response_code +#: model:ir.ui.menu,name:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_tree +msgid "Correction concepts for Refund Invoices" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__credit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__credit +msgid "Credit Note" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move__refund_type__debit +#: model:ir.model.fields.selection,name:l10n_co_account_move_discrepancy_response.selection__account_move_discrepancy_response_code__type__debit +msgid "Debit Note" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "Debit Note Entry Sequence" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_journal.py:0 +#, python-format +msgid "Debit Note Sequence - " +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence +msgid "Dedicated Debit Note Sequence" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Group By" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__id +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_journal +msgid "Journal" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model,name:l10n_co_account_move_discrepancy_response.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_debit_note____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_journal____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_reversal____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__name +msgid "Name" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the debit notes" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence for the refunds" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: code:addons/l10n_co_account_move_discrepancy_response/models/account_move.py:0 +#, python-format +msgid "Please define a sequence on the journal." +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_bank_statement_line__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move__refund_type +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_payment__refund_type +msgid "Refund Type" +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,help:l10n_co_account_move_discrepancy_response.field_account_journal__debit_note_sequence_id +msgid "" +"This field contains the information related to the numbering of the debit " +"note entries of this journal." +msgstr "" + +#. module: l10n_co_account_move_discrepancy_response +#: model:ir.model.fields,field_description:l10n_co_account_move_discrepancy_response.field_account_move_discrepancy_response_code__type +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_discrepancy_response.account_move_discrepancy_response_code_view_search +msgid "Type" +msgstr "" diff --git a/l10n_co_account_move_discrepancy_response/models/__init__.py b/l10n_co_account_move_discrepancy_response/models/__init__.py new file mode 100644 index 0000000..d515f61 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_journal +from . import account_move_discrepancy_response_code +from . import account_move diff --git a/l10n_co_account_move_discrepancy_response/models/account_journal.py b/l10n_co_account_move_discrepancy_response/models/account_journal.py new file mode 100644 index 0000000..41597d4 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/models/account_journal.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, api, fields, _ + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + debit_note_sequence = fields.Boolean( + string="Dedicated Debit Note Sequence", + help="Check this box if you don't want to share the same sequence for invoices and debit " + "notes made from this journal", + default=False) + debit_note_sequence_id = fields.Many2one( + comodel_name="ir.sequence", + string="Debit Note Entry Sequence", + help= + "This field contains the information related to the numbering of the debit note " + "entries of this journal.", + copy=False) + + @api.model + def create(self, vals): + if (vals.get('type') in ('sale', 'purchase') + and vals.get('debit_note_sequence') + and not vals.get('debit_note_sequence_id')): + values = { + 'name': _('Debit Note Sequence - ') + vals.get('name'), + 'company_id': vals.get('company_id'), + 'prefix': 'DN' + (vals.get('code') or '')} + vals['debit_note_sequence_id'] = self.create_sequence(values) + + return super(AccountJournal, self).create(vals) + + def write(self, vals): + res = super(AccountJournal, self).write(vals) + + for journal in self.filtered(lambda j: j.type in ('sale', 'purchase')): + if journal.debit_note_sequence and not journal.debit_note_sequence_id: + values = { + 'name': _('Debit Note Sequence - ') + journal.name, + 'company_id': journal.company_id, + 'prefix': 'DN' + (journal.code or '')} + journal.debit_note_sequence_id = self.create_sequence(values) + + return res diff --git a/l10n_co_account_move_discrepancy_response/models/account_move.py b/l10n_co_account_move_discrepancy_response/models/account_move.py new file mode 100644 index 0000000..d943630 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/models/account_move.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ +from odoo.exceptions import UserError + + +class AccountMove(models.Model): + _inherit = "account.move" + + refund_type = fields.Selection( + selection=[('debit', 'Debit Note'), ('credit', 'Credit Note')], + index=True, + string='Refund Type', + tracking=True) + discrepancy_response_code_id = fields.Many2one( + comodel_name='account.move.discrepancy.response.code', + string='Correction concept for Refund Invoice') + + def action_post(self): + msg1 = _('Please define a sequence for the refunds') + msg2 = _('Please define a sequence for the debit notes') + msg3 = _('Please define a sequence on the journal.') + + for move in self: + if move.move_name == '/': + new_name = '/' + + if move.journal_id.sequence_id: + sequence = move.journal_id.sequence_id + + if move.journal_id.refund_sequence and move.refund_type == 'credit': + if not move.journal_id.refund_sequence_id: + raise UserError(msg1) + + sequence = move.journal_id.refund_sequence_id + + if move.journal_id.debit_note_sequence and move.refund_type == 'debit': + if not move.journal_id.debit_note_sequence_id: + raise UserError(msg2) + + sequence = move.journal_id.debit_note_sequence_id + + new_name = sequence.next_by_id() + else: + raise UserError(msg3) + + move.move_name = new_name + + return super(AccountMove, self).action_post() diff --git a/l10n_co_account_move_discrepancy_response/models/account_move_discrepancy_response_code.py b/l10n_co_account_move_discrepancy_response/models/account_move_discrepancy_response_code.py new file mode 100644 index 0000000..a2d4f1e --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/models/account_move_discrepancy_response_code.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountInvoiceDiscrepancyResponseCode(models.Model): + _name = 'account.move.discrepancy.response.code' + _description = 'Correction concepts for Refund Invoices' + + name = fields.Char(string='Name') + code = fields.Char(string='Code') + type = fields.Selection( + selection=[('credit', 'Credit Note'), ('debit', 'Debit Note')], + string='Type') diff --git a/l10n_co_account_move_discrepancy_response/security/ir.model.access.csv b/l10n_co_account_move_discrepancy_response/security/ir.model.access.csv new file mode 100644 index 0000000..7c1843a --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/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_account_move_discrepancy_response_code_manager,account.move.discrepancy.response.code.manager,model_account_move_discrepancy_response_code,account.group_account_manager,1,1,1,1 +access_account_move_discrepancy_response_code_users,account.move.discrepancy.response.code.users,model_account_move_discrepancy_response_code,,1,0,0,0 diff --git a/l10n_co_account_move_discrepancy_response/static/description/icon.png b/l10n_co_account_move_discrepancy_response/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/l10n_co_account_move_discrepancy_response/static/description/icon.png differ diff --git a/l10n_co_account_move_discrepancy_response/static/src/img/icon.png b/l10n_co_account_move_discrepancy_response/static/src/img/icon.png new file mode 100644 index 0000000..00a133a Binary files /dev/null and b/l10n_co_account_move_discrepancy_response/static/src/img/icon.png differ diff --git a/l10n_co_account_move_discrepancy_response/views/account_journal_views.xml b/l10n_co_account_move_discrepancy_response/views/account_journal_views.xml new file mode 100644 index 0000000..c4b44a7 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/views/account_journal_views.xml @@ -0,0 +1,17 @@ + + + + account.journal + + + + + + + + + diff --git a/l10n_co_account_move_discrepancy_response/views/account_move_discrepancy_response_code_views.xml b/l10n_co_account_move_discrepancy_response/views/account_move_discrepancy_response_code_views.xml new file mode 100644 index 0000000..22c6285 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/views/account_move_discrepancy_response_code_views.xml @@ -0,0 +1,54 @@ + + + + account.move.discrepancy.response.code + + + + + + + + + + + account.move.discrepancy.response.code + + + + + + + + + + + + + account.move.discrepancy.response.code + +
+ + + + + +
+
+
+ + + Correction concepts for Refund Invoices + ir.actions.act_window + account.move.discrepancy.response.code + tree,form + + + + + +
diff --git a/l10n_co_account_move_discrepancy_response/views/account_move_views.xml b/l10n_co_account_move_discrepancy_response/views/account_move_views.xml new file mode 100644 index 0000000..6c2fd8f --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/views/account_move_views.xml @@ -0,0 +1,16 @@ + + + + account.move + + + + + + + + + diff --git a/l10n_co_account_move_discrepancy_response/wizards/__init__.py b/l10n_co_account_move_discrepancy_response/wizards/__init__.py new file mode 100644 index 0000000..0fec4f7 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/wizards/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_debit_note +from . import account_move_reversal diff --git a/l10n_co_account_move_discrepancy_response/wizards/account_debit_note.py b/l10n_co_account_move_discrepancy_response/wizards/account_debit_note.py new file mode 100644 index 0000000..d7b0fd1 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/wizards/account_debit_note.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class AccountDebitNote(models.TransientModel): + _inherit = "account.debit.note" + + discrepancy_response_code_id = fields.Many2one( + comodel_name='account.move.discrepancy.response.code', + string='Correction concept for Refund Invoice') + + def _prepare_default_values(self, move): + values = super(AccountDebitNote, self)._prepare_default_values(move) + values['refund_type'] = 'debit' + values['discrepancy_response_code_id'] = self.discrepancy_response_code_id.id + + return values diff --git a/l10n_co_account_move_discrepancy_response/wizards/account_debit_note_views.xml b/l10n_co_account_move_discrepancy_response/wizards/account_debit_note_views.xml new file mode 100644 index 0000000..a66fe2c --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/wizards/account_debit_note_views.xml @@ -0,0 +1,15 @@ + + + + account.debit.note + + + + + + + + diff --git a/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal.py b/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal.py new file mode 100644 index 0000000..026d1e2 --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class AccountMoveReversal(models.TransientModel): + _inherit = "account.move.reversal" + + discrepancy_response_code_id = fields.Many2one( + comodel_name='account.move.discrepancy.response.code', + string='Correction concept for Refund Invoice') + + def _prepare_default_reversal(self, move): + values = super(AccountMoveReversal, self)._prepare_default_reversal(move) + values['refund_type'] = 'credit' + values['discrepancy_response_code_id'] = self.discrepancy_response_code_id.id + + return values diff --git a/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal_views.xml b/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal_views.xml new file mode 100644 index 0000000..1cdadaa --- /dev/null +++ b/l10n_co_account_move_discrepancy_response/wizards/account_move_reversal_views.xml @@ -0,0 +1,15 @@ + + + + account.move.reversal + + + + + + + + diff --git a/l10n_co_account_move_payment_mean/README.rst b/l10n_co_account_move_payment_mean/README.rst new file mode 100644 index 0000000..667914f --- /dev/null +++ b/l10n_co_account_move_payment_mean/README.rst @@ -0,0 +1,34 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +======================================================= +Formas y medios de pago para la localizacion Colombiana +======================================================= + +Este módulo tiene las formas y medios de pago identificados por la DIAN para la +localizacion Colombiana, informacion obtenida del anexo tecnico para +facturacion electronica version 1.8, punto 13.3.4. + +- Crea un campo en la factura para definir la forma de pago que tuvo, se creo + una funcion 'onchange' que establece 'Contado' si la fecha de la factura es + igual a la fecha de vencimiento, si no, establece 'Crédito'. + +Known issues / Roadmap +====================== + +Future possible improvement: +Habilitar campo 'payment_mean_code_id' correspondiente al medio de pago, queda +pendiente porque hay que analizar si con este campo en tipo 'Many2one' es +suficiente para suplir el requerimiento o puede ser necesario establecer un +campo One2many ya que la factura podría tener 2 o mas pagos y cada uno podría +ser con un medio de pago diferente, o pensar en una solución mas avanzada que +este relacionada con el pago de las facturas en Odoo. + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/l10n_co_account_move_payment_mean/__init__.py b/l10n_co_account_move_payment_mean/__init__.py new file mode 100644 index 0000000..9027225 --- /dev/null +++ b/l10n_co_account_move_payment_mean/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/l10n_co_account_move_payment_mean/__manifest__.py b/l10n_co_account_move_payment_mean/__manifest__.py new file mode 100644 index 0000000..b4f9bc5 --- /dev/null +++ b/l10n_co_account_move_payment_mean/__manifest__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Formas y medios de pago para la localizacion Colombiana", + "summary": "Este módulo tiene las formas y medios de pago identificados " + "por la DIAN para la localizacion Colombiana", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/JoanMarin", + "author": "Joan Marín Github@JoanMarin", + "category": "Localization", + "depends": ["account"], + "data": [ + "security/ir.model.access.csv", + "data/account_payment_mean_data.xml", + "data/account.payment.mean.code.csv", + "views/account_payment_mean_views.xml", + "views/account_payment_mean_code_views.xml", + "views/account_move_views.xml", + ], + "installable": True, +} diff --git a/l10n_co_account_move_payment_mean/data/account.payment.mean.code.csv b/l10n_co_account_move_payment_mean/data/account.payment.mean.code.csv new file mode 100644 index 0000000..5172127 --- /dev/null +++ b/l10n_co_account_move_payment_mean/data/account.payment.mean.code.csv @@ -0,0 +1,79 @@ +id,code,name +account_payment_mean_code_001,1,Instrumento no definido +account_payment_mean_code_002,2,Crédito ACH +account_payment_mean_code_003,3,Débito ACH +account_payment_mean_code_004,4,Reversión débito de demanda ACH +account_payment_mean_code_005,5,Reversión crédito de demanda ACH +account_payment_mean_code_006,6,Crédito de demanda ACH +account_payment_mean_code_007,7,Débito de demanda ACH +account_payment_mean_code_008,8,Mantener +account_payment_mean_code_009,9,Clearing Nacional o Regional +account_payment_mean_code_010,10,Efectivo +account_payment_mean_code_011,11,Reversión Crédito Ahorro +account_payment_mean_code_012,12,Reversión Débito Ahorro +account_payment_mean_code_013,13,Crédito Ahorro +account_payment_mean_code_014,14,Débito Ahorro +account_payment_mean_code_015,15,Bookentry Crédito +account_payment_mean_code_016,16,Bookentry Débito +account_payment_mean_code_017,17,Concentración de la demanda en efectivo / Desembolso Crédito (CCD) +account_payment_mean_code_018,18,Concentración de la demanda en efectivo / Desembolso (CCD) débito +account_payment_mean_code_019,19,Crédito Pago negocio corporativo (CTP) +account_payment_mean_code_020,20,Cheque +account_payment_mean_code_021,21,Proyecto bancario +account_payment_mean_code_022,22,Proyecto bancario certificado +account_payment_mean_code_023,23,Cheque bancario +account_payment_mean_code_024,24,Nota cambiaria esperando aceptación +account_payment_mean_code_025,25,Cheque certificado +account_payment_mean_code_026,26,Cheque Local +account_payment_mean_code_027,27,Débito Pago Negocio Corporativo (CTP) +account_payment_mean_code_028,28,Crédito Negocio Intercambio Corporativo (CTX) +account_payment_mean_code_029,29,Débito Negocio Intercambio Corporativo (CTX) +account_payment_mean_code_030,30,Transferencia Crédito +account_payment_mean_code_031,31,Transferencia Débito +account_payment_mean_code_032,32,Concentración Efectivo / Desembolso Crédito plus (CCD+) +account_payment_mean_code_033,33,Concentración Efectivo / Desembolso Débito plus (CCD+) +account_payment_mean_code_034,34,Pago y depósito pre acordado (PPD) +account_payment_mean_code_035,35,Concentración efectivo ahorros / Desembolso Crédito (CCD) +account_payment_mean_code_036,36,Concentración efectivo ahorros / Desembolso Débito (CCD) +account_payment_mean_code_037,37,Pago Negocio Corporativo Ahorros Crédito (CTP) +account_payment_mean_code_038,38,Pago Negocio Corporativo Ahorros Débito (CTP) +account_payment_mean_code_039,39,Crédito Negocio Intercambio Corporativo (CTX) +account_payment_mean_code_040,40,Débito Negocio Intercambio Corporativo (CTX) +account_payment_mean_code_041,41,Concentración efectivo/Desembolso Crédito plus (CCD+) +account_payment_mean_code_042,42,Consignación bancaria +account_payment_mean_code_043,43,Concentración efectivo / Desembolso Débito plus (CCD+) +account_payment_mean_code_044,44,Nota cambiaria +account_payment_mean_code_045,45,Transferencia Crédito Bancario +account_payment_mean_code_046,46,Transferencia Débito Interbancario +account_payment_mean_code_047,47,Transferencia Débito Bancaria +account_payment_mean_code_048,48,Tarjeta Crédito +account_payment_mean_code_049,49,Tarjeta Débito +account_payment_mean_code_050,50,Postgiro +account_payment_mean_code_051,51,Telex estándar bancario francés +account_payment_mean_code_052,52,Pago comercial urgente +account_payment_mean_code_053,53,Pago Tesorería Urgente +account_payment_mean_code_060,60,Nota promisoria +account_payment_mean_code_061,61,Nota promisoria firmada por el acreedor +account_payment_mean_code_062,62,"Nota promisoria firmada por el acreedor, avalada por el banco" +account_payment_mean_code_063,63,"Nota promisoria firmada por el acreedor, avalada por un tercero" +account_payment_mean_code_064,64,Nota promisoria firmada por el banco +account_payment_mean_code_065,65,Nota promisoria firmada por un banco avalada por otro banco +account_payment_mean_code_066,66,Nota promisoria firmada +account_payment_mean_code_067,67,Nota promisoria firmada por un tercero avalada por un banco +account_payment_mean_code_070,70,Retiro de nota por el por el acreedor +account_payment_mean_code_071,71,Bonos +account_payment_mean_code_072,72,Vales +account_payment_mean_code_074,74,Retiro de nota por el por el acreedor sobre un banco +account_payment_mean_code_075,75,"Retiro de nota por el acreedor, avalada por otro banco" +account_payment_mean_code_076,76,"Retiro de nota por el acreedor, sobre un banco avalada por un tercero" +account_payment_mean_code_077,77,Retiro de una nota por el acreedor sobre un tercero +account_payment_mean_code_078,78,Retiro de una nota por el acreedor sobre un tercero tercero avalada por un banco +account_payment_mean_code_091,91,Nota bancaria transferible +account_payment_mean_code_092,92,Cheque local trasferible +account_payment_mean_code_093,93,Giro referenciado +account_payment_mean_code_094,94,Giro urgente +account_payment_mean_code_095,95,Giro formato abierto +account_payment_mean_code_096,96,Método de pago solicitado no usado +account_payment_mean_code_097,97,Clearing entre partners +account_payment_mean_code_098,98,"Cuentas de Ahorro de Tramite Simplificado (CATS)(Nequi, Daviplata, etc)" +account_payment_mean_code_zzz,ZZZ,Acuerdo mutuo diff --git a/l10n_co_account_move_payment_mean/data/account_payment_mean_data.xml b/l10n_co_account_move_payment_mean/data/account_payment_mean_data.xml new file mode 100644 index 0000000..8fd9ed9 --- /dev/null +++ b/l10n_co_account_move_payment_mean/data/account_payment_mean_data.xml @@ -0,0 +1,11 @@ + + + + Counted + 1 + + + Credit + 2 + + diff --git a/l10n_co_account_move_payment_mean/i18n/es.po b/l10n_co_account_move_payment_mean/i18n/es.po new file mode 100644 index 0000000..23d99c5 --- /dev/null +++ b/l10n_co_account_move_payment_mean/i18n/es.po @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_payment_mean +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-06-30 22:29+0000\n" +"PO-Revision-Date: 2021-06-30 22:29+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_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__code +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__code +msgid "Code" +msgstr "Código" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.l10n_co_account_payment_mean_menu +msgid "Colombian Localization Payments" +msgstr "Pagos de Localización Colombiana" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_1 +msgid "Counted" +msgstr "Contado" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_2 +msgid "Credit" +msgstr "Crédito" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_move +msgid "Journal Entry" +msgstr "Asiento contable" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_code_id +msgid "Mean of Payment" +msgstr "Medio de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__name +msgid "Name" +msgstr "Nombre" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_code_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean_code +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_tree +msgid "Payment Means" +msgstr "Medios de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_id +msgid "Payment Method" +msgstr "Método de pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_tree +msgid "Payment Methods" +msgstr "Formas de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_search +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_search +msgid "Search" +msgstr "Buscar" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The code must be unique" +msgstr "El código debe ser único" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py:0 +#, python-format +msgid "The combination of code and name must be unique" +msgstr "La combinación de código y nombre debe ser única" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The name must be unique" +msgstr "El nombre debe ser único" diff --git a/l10n_co_account_move_payment_mean/i18n/es_CO.po b/l10n_co_account_move_payment_mean/i18n/es_CO.po new file mode 100644 index 0000000..23d99c5 --- /dev/null +++ b/l10n_co_account_move_payment_mean/i18n/es_CO.po @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_payment_mean +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-06-30 22:29+0000\n" +"PO-Revision-Date: 2021-06-30 22:29+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_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__code +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__code +msgid "Code" +msgstr "Código" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.l10n_co_account_payment_mean_menu +msgid "Colombian Localization Payments" +msgstr "Pagos de Localización Colombiana" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_1 +msgid "Counted" +msgstr "Contado" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_2 +msgid "Credit" +msgstr "Crédito" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_move +msgid "Journal Entry" +msgstr "Asiento contable" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_code_id +msgid "Mean of Payment" +msgstr "Medio de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__name +msgid "Name" +msgstr "Nombre" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_code_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean_code +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_tree +msgid "Payment Means" +msgstr "Medios de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_id +msgid "Payment Method" +msgstr "Método de pago" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_tree +msgid "Payment Methods" +msgstr "Formas de Pago" + +#. module: l10n_co_account_move_payment_mean +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_search +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_search +msgid "Search" +msgstr "Buscar" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The code must be unique" +msgstr "El código debe ser único" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py:0 +#, python-format +msgid "The combination of code and name must be unique" +msgstr "La combinación de código y nombre debe ser única" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The name must be unique" +msgstr "El nombre debe ser único" diff --git a/l10n_co_account_move_payment_mean/i18n/l10n_co_account_move_payment_mean.pot b/l10n_co_account_move_payment_mean/i18n/l10n_co_account_move_payment_mean.pot new file mode 100644 index 0000000..1191b27 --- /dev/null +++ b/l10n_co_account_move_payment_mean/i18n/l10n_co_account_move_payment_mean.pot @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_account_move_payment_mean +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-06-30 22:29+0000\n" +"PO-Revision-Date: 2021-06-30 22:29+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_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__code +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__code +msgid "Code" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.l10n_co_account_payment_mean_menu +msgid "Colombian Localization Payments" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_1 +msgid "Counted" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__create_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:account.payment.mean,name:l10n_co_account_move_payment_mean.account_payment_mean_2 +msgid "Credit" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__display_name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__id +msgid "ID" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean____last_update +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_uid +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__write_date +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_code_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_code_id +msgid "Mean of Payment" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean__name +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment_mean_code__name +msgid "Name" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_code_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean_code +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_code_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_tree +msgid "Payment Means" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_bank_statement_line__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_move__payment_mean_id +#: model:ir.model.fields,field_description:l10n_co_account_move_payment_mean.field_account_payment__payment_mean_id +msgid "Payment Method" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model:ir.actions.act_window,name:l10n_co_account_move_payment_mean.account_payment_mean_action +#: model:ir.model,name:l10n_co_account_move_payment_mean.model_account_payment_mean +#: model:ir.ui.menu,name:l10n_co_account_move_payment_mean.account_payment_mean_menu +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_form +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_tree +msgid "Payment Methods" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_code_view_search +#: model_terms:ir.ui.view,arch_db:l10n_co_account_move_payment_mean.account_payment_mean_view_search +msgid "Search" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The code must be unique" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py:0 +#, python-format +msgid "The combination of code and name must be unique" +msgstr "" + +#. module: l10n_co_account_move_payment_mean +#: code:addons/l10n_co_account_move_payment_mean/models/account_payment_mean.py:0 +#, python-format +msgid "The name must be unique" +msgstr "" diff --git a/l10n_co_account_move_payment_mean/models/__init__.py b/l10n_co_account_move_payment_mean/models/__init__.py new file mode 100644 index 0000000..acdb316 --- /dev/null +++ b/l10n_co_account_move_payment_mean/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_payment_mean +from . import account_payment_mean_code +from . import account_move diff --git a/l10n_co_account_move_payment_mean/models/account_move.py b/l10n_co_account_move_payment_mean/models/account_move.py new file mode 100644 index 0000000..a9bd3a8 --- /dev/null +++ b/l10n_co_account_move_payment_mean/models/account_move.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + @api.depends('invoice_date', 'invoice_date_due', 'invoice_payment_term_id') + def _get_payment_mean_id(self): + for move in self: + ir_model_data_obj = self.env['ir.model.data'] + id_payment_term = ir_model_data_obj.get_object_reference( + 'account', 'account_payment_term_immediate')[1] + payment_term_immediate = self.env['account.payment.term'].browse( + id_payment_term) + + if not move.invoice_date: + id_payment_mean = False + elif (not move.invoice_payment_term_id + and move.invoice_date == move.invoice_date_due): + id_payment_mean = ir_model_data_obj.get_object_reference( + 'l10n_co_account_move_payment_mean', 'account_payment_mean_1')[1] + elif move.invoice_payment_term_id == payment_term_immediate: + id_payment_mean = ir_model_data_obj.get_object_reference( + 'l10n_co_account_move_payment_mean', 'account_payment_mean_1')[1] + else: + id_payment_mean = ir_model_data_obj.get_object_reference( + 'l10n_co_account_move_payment_mean', 'account_payment_mean_2')[1] + + move.payment_mean_id = self.env['account.payment.mean'].browse( + id_payment_mean) + + @api.onchange('invoice_date', 'invoice_date_due', 'invoice_payment_term_id') + def _onchange_invoice_dates_payment_term(self): + if not self.payment_mean_code_id: + self.payment_mean_code_id = self.env['account.payment.mean.code'].search( + [('code', '=', '1')]).id + + payment_mean_id = fields.Many2one( + comodel_name='account.payment.mean', + compute="_get_payment_mean_id", + string='Payment Method', + store=False) + payment_mean_code_id = fields.Many2one( + comodel_name='account.payment.mean.code', + string='Mean of Payment', + copy=False) + + @api.model + def create(self, vals): + res = super(AccountMove, self).create(vals) + + for invoice in res: + invoice._onchange_invoice_dates_payment_term() + + return res + + def write(self, vals): + res = super(AccountMove, self).write(vals) + + if vals.get('invoice_date'): + for invoice in self: + invoice._onchange_invoice_dates_payment_term() + + return res diff --git a/l10n_co_account_move_payment_mean/models/account_payment_mean.py b/l10n_co_account_move_payment_mean/models/account_payment_mean.py new file mode 100644 index 0000000..5e6cbe0 --- /dev/null +++ b/l10n_co_account_move_payment_mean/models/account_payment_mean.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ + + +class AccountPaymentMean(models.Model): + _name = 'account.payment.mean' + _description = 'Payment Methods' + + name = fields.Char(string='Name', required=True, translate=True) + code = fields.Char(string='Code', required=True) + + _sql_constraints = [ + ('name_unique', 'unique(name)', _("The name must be unique")), + ('code_unique', 'unique(code)', _("The code must be unique"))] diff --git a/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py b/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py new file mode 100644 index 0000000..3abf6d3 --- /dev/null +++ b/l10n_co_account_move_payment_mean/models/account_payment_mean_code.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ + + +class AccountPaymentMeanCode(models.Model): + _name = 'account.payment.mean.code' + _description = 'Payment Means' + + name = fields.Char(string='Name', required=True) + code = fields.Char(string='Code', required=True) + + _sql_constraints = [ + ('code_and_name_unique', 'unique(code, name)', + _("The combination of code and name must be unique"))] diff --git a/l10n_co_account_move_payment_mean/security/ir.model.access.csv b/l10n_co_account_move_payment_mean/security/ir.model.access.csv new file mode 100644 index 0000000..c6f2fdb --- /dev/null +++ b/l10n_co_account_move_payment_mean/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_payment_mean_manager,account_payment_mean_manager,model_account_payment_mean,account.group_account_manager,1,1,1,1 +access_account_payment_mean_users,account_payment_mean_users,model_account_payment_mean,,1,0,0,0 +access_account_payment_mean_code_manager,account_payment_mean_code_manager,model_account_payment_mean_code,account.group_account_manager,1,1,1,1 +access_account_payment_mean_code_users,account_payment_mean_code_users,model_account_payment_mean_code,,1,0,0,0 diff --git a/l10n_co_account_move_payment_mean/static/description/icon.png b/l10n_co_account_move_payment_mean/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/l10n_co_account_move_payment_mean/static/description/icon.png differ diff --git a/l10n_co_account_move_payment_mean/views/account_move_views.xml b/l10n_co_account_move_payment_mean/views/account_move_views.xml new file mode 100644 index 0000000..e08c1f3 --- /dev/null +++ b/l10n_co_account_move_payment_mean/views/account_move_views.xml @@ -0,0 +1,14 @@ + + + + account.move + + + + + + + + + diff --git a/l10n_co_account_move_payment_mean/views/account_payment_mean_code_views.xml b/l10n_co_account_move_payment_mean/views/account_payment_mean_code_views.xml new file mode 100644 index 0000000..d6d1f4b --- /dev/null +++ b/l10n_co_account_move_payment_mean/views/account_payment_mean_code_views.xml @@ -0,0 +1,49 @@ + + + + account.payment.mean.code + + + + + + + + + + account.payment.mean.code + + + + + + + + + + account.payment.mean.code + +
+ + + + +
+
+
+ + + Payment Means + ir.actions.act_window + account.payment.mean.code + tree,form + + + + + +
diff --git a/l10n_co_account_move_payment_mean/views/account_payment_mean_views.xml b/l10n_co_account_move_payment_mean/views/account_payment_mean_views.xml new file mode 100644 index 0000000..4f72de4 --- /dev/null +++ b/l10n_co_account_move_payment_mean/views/account_payment_mean_views.xml @@ -0,0 +1,54 @@ + + + + account.payment.mean + + + + + + + + + + account.payment.mean + + + + + + + + + + account.payment.mean + +
+ + + + +
+
+
+ + + Payment Methods + ir.actions.act_window + account.payment.mean + tree,form + + + + + + + +
diff --git a/l10n_co_account_tax_group_type/README.rst b/l10n_co_account_tax_group_type/README.rst new file mode 100644 index 0000000..7cda524 --- /dev/null +++ b/l10n_co_account_tax_group_type/README.rst @@ -0,0 +1,24 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +========================= +Colombian Tax Group Types +========================= + +Este módulo tiene los Tributos (tipos de impuesto) identificados por la DIAN +para la localizacion Colombiana, informacion obtenida del anexo tecnico para +facturacion electronica version 1.8, punto 13.2.2. + +This module has the Tributes (types of tax) identified by the DIAN for the +Colombian localization, information obtained from the technical annex for +e-invoicing version 1.8, point 13.2.2. + + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/l10n_co_account_tax_group_type/__init__.py b/l10n_co_account_tax_group_type/__init__.py new file mode 100644 index 0000000..0414ac6 --- /dev/null +++ b/l10n_co_account_tax_group_type/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/l10n_co_account_tax_group_type/__manifest__.py b/l10n_co_account_tax_group_type/__manifest__.py new file mode 100644 index 0000000..c74b6c0 --- /dev/null +++ b/l10n_co_account_tax_group_type/__manifest__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Colombian Tax Group Types", + "summary": "Colombian Tax Group Types", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/JoanMarin", + "author": "Joan Marín Github@JoanMarin", + "category": "Localization", + "depends": ["account_tax_group_type"], + "data": ["data/account_tax_group_type_data.xml"], + "installable": True, +} diff --git a/l10n_co_account_tax_group_type/data/account_tax_group_type_data.xml b/l10n_co_account_tax_group_type/data/account_tax_group_type_data.xml new file mode 100644 index 0000000..1a2966e --- /dev/null +++ b/l10n_co_account_tax_group_type/data/account_tax_group_type_data.xml @@ -0,0 +1,105 @@ + + + + 01 + IVA + tax + Impuesto sobre la Ventas + + + 02 + IC + tax + Impuesto al Consumo Departamental Nominal + + + 03 + ICA + tax + Impuesto de Industria, Comercio y Aviso + + + 04 + INC + tax + Impuesto Nacional al Consumo + + + 05 + ReteIVA + withholding_tax + Retención sobre el IVA + + + 06 + ReteRenta + withholding_tax + Retención sobre Renta + + + 07 + ReteICA + withholding_tax + Retención sobre el ICA + + + 08 + IC Porcentual + tax + Impuesto al Consumo Departamental Porcentual + + + 20 + FtoHorticultura + tax + Cuota de Fomento Hortifrutícula + + + 21 + Timbre + tax + Impuesto de Timbre + + + 22 + INC Bolsas + tax + Impuesto Nacional al Consumo de Bolsa Plástica + + + 23 + INCarbono + tax + Impuesto Nacional del Carbono + + + 24 + INCombustibles + tax + Impuesto Nacional a los Combustibles + + + 25 + Sobretasa Combustibles + tax + Sobretasa a los combustibles + + + 26 + Sordicom + tax + Contribución minoristas (Combustibles) + + + 30 + IC Datos + tax + Impuesto al Consumo de Datos + + + ZZ + Nombre de la figura tributaria + tax + Otros tributos, tasas, contribuciones, y similares + + diff --git a/l10n_co_account_tax_group_type/i18n/es.po b/l10n_co_account_tax_group_type/i18n/es.po new file mode 100644 index 0000000..781a35e --- /dev/null +++ b/l10n_co_account_tax_group_type/i18n/es.po @@ -0,0 +1,15 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-20 13:59+0000\n" +"PO-Revision-Date: 2021-08-20 13:59+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" diff --git a/l10n_co_account_tax_group_type/i18n/es_CO.po b/l10n_co_account_tax_group_type/i18n/es_CO.po new file mode 100644 index 0000000..781a35e --- /dev/null +++ b/l10n_co_account_tax_group_type/i18n/es_CO.po @@ -0,0 +1,15 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-20 13:59+0000\n" +"PO-Revision-Date: 2021-08-20 13:59+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" diff --git a/l10n_co_account_tax_group_type/i18n/l10n_co_account_tax_group_type.pot b/l10n_co_account_tax_group_type/i18n/l10n_co_account_tax_group_type.pot new file mode 100644 index 0000000..781a35e --- /dev/null +++ b/l10n_co_account_tax_group_type/i18n/l10n_co_account_tax_group_type.pot @@ -0,0 +1,15 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-08-20 13:59+0000\n" +"PO-Revision-Date: 2021-08-20 13:59+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" diff --git a/l10n_co_account_tax_group_type/static/description/icon.png b/l10n_co_account_tax_group_type/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/l10n_co_account_tax_group_type/static/description/icon.png differ diff --git a/l10n_co_base_location/README.rst b/l10n_co_base_location/README.rst new file mode 100644 index 0000000..9b8170a --- /dev/null +++ b/l10n_co_base_location/README.rst @@ -0,0 +1,23 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +=================================== +Colombian Geographical Localization +=================================== + +Section 13.4. Geographic Codes of the technical annex version 1.8: +- Data Colombian States +- Data Colombian ZIP/cities. + +Sección 13.4. Códigos Geográficos del anexo técnico versión 1.8: +- Datos Departamentos colombianos. +- Datos ZIP/ciudades colombianas. + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/l10n_co_base_location/__init__.py b/l10n_co_base_location/__init__.py new file mode 100644 index 0000000..f74d8e4 --- /dev/null +++ b/l10n_co_base_location/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/l10n_co_base_location/__manifest__.py b/l10n_co_base_location/__manifest__.py new file mode 100644 index 0000000..3729340 --- /dev/null +++ b/l10n_co_base_location/__manifest__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Location management (aka Better ZIP) - Colombian Data", + "summary": "Colombian Data ZIP/Cities, States and Countries", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "website": "https://github.com/JoanMarin", + "author": "Joan Marín Github@JoanMarin", + "category": "Localization", + "depends": [ + "account_avancys", + "base_location"], + "data": [ + # "data/res.country.state.csv", + # "data/res.city.csv", + # "data/res.city.zip.csv", + "views/res_country_state_views.xml", + "views/res_city_views.xml", + "views/res_city_zip_views.xml", + "views/res_partner_views.xml" + ], + "installable": True, +} diff --git a/l10n_co_base_location/data/res.city.csv b/l10n_co_base_location/data/res.city.csv new file mode 100644 index 0000000..b7017b0 --- /dev/null +++ b/l10n_co_base_location/data/res.city.csv @@ -0,0 +1,1141 @@ +id,code,name,state_id:id,country_id:id +co91263,91263,EL ENCANTO,base.state_co_29,base.co +co91405,91405,LA CHORRERA,base.state_co_29,base.co +co91407,91407,LA PEDRERA,base.state_co_29,base.co +co91430,91430,LA VICTORIA,base.state_co_29,base.co +co91001,91001,LETICIA,base.state_co_29,base.co +co91460,91460,MIRITI - PARANA,base.state_co_29,base.co +co91530,91530,PUERTO ALEGRIA,base.state_co_29,base.co +co91536,91536,PUERTO ARICA,base.state_co_29,base.co +co91540,91540,PUERTO NARIÑO,base.state_co_29,base.co +co91669,91669,PUERTO SANTANDER,base.state_co_29,base.co +co91798,91798,TARAPACA,base.state_co_29,base.co +co05002,05002,ABEJORRAL,base.state_co_01,base.co +co05004,05004,ABRIAQUI,base.state_co_01,base.co +co05021,05021,ALEJANDRIA,base.state_co_01,base.co +co05030,05030,AMAGA,base.state_co_01,base.co +co05031,05031,AMALFI,base.state_co_01,base.co +co05034,05034,ANDES,base.state_co_01,base.co +co05036,05036,ANGELOPOLIS,base.state_co_01,base.co +co05038,05038,ANGOSTURA,base.state_co_01,base.co +co05040,05040,ANORI,base.state_co_01,base.co +co05044,05044,ANZA,base.state_co_01,base.co +co05045,05045,APARTADO,base.state_co_01,base.co +co05051,05051,ARBOLETES,base.state_co_01,base.co +co05055,05055,ARGELIA,base.state_co_01,base.co +co05059,05059,ARMENIA,base.state_co_01,base.co +co05079,05079,BARBOSA,base.state_co_01,base.co +co05088,05088,BELLO,base.state_co_01,base.co +co05086,05086,BELMIRA,base.state_co_01,base.co +co05091,05091,BETANIA,base.state_co_01,base.co +co05093,05093,BETULIA,base.state_co_01,base.co +co05107,05107,BRICEÑO,base.state_co_01,base.co +co05113,05113,BURITICA,base.state_co_01,base.co +co05138,05138,CAÑASGORDAS,base.state_co_01,base.co +co05120,05120,CACERES,base.state_co_01,base.co +co05125,05125,CAICEDO,base.state_co_01,base.co +co05129,05129,CALDAS,base.state_co_01,base.co +co05134,05134,CAMPAMENTO,base.state_co_01,base.co +co05142,05142,CARACOLI,base.state_co_01,base.co +co05145,05145,CARAMANTA,base.state_co_01,base.co +co05147,05147,CAREPA,base.state_co_01,base.co +co05150,05150,CAROLINA,base.state_co_01,base.co +co05154,05154,CAUCASIA,base.state_co_01,base.co +co05172,05172,CHIGORODO,base.state_co_01,base.co +co05190,05190,CISNEROS,base.state_co_01,base.co +co05101,05101,CIUDAD BOLIVAR,base.state_co_01,base.co +co05197,05197,COCORNA,base.state_co_01,base.co +co05206,05206,CONCEPCION,base.state_co_01,base.co +co05209,05209,CONCORDIA,base.state_co_01,base.co +co05212,05212,COPACABANA,base.state_co_01,base.co +co05234,05234,DABEIBA,base.state_co_01,base.co +co05237,05237,DON MATIAS,base.state_co_01,base.co +co05240,05240,EBEJICO,base.state_co_01,base.co +co05250,05250,EL BAGRE,base.state_co_01,base.co +co05148,05148,EL CARMEN DE VIBORAL,base.state_co_01,base.co +co05697,05697,EL SANTUARIO,base.state_co_01,base.co +co05264,05264,ENTRERRIOS,base.state_co_01,base.co +co05266,05266,ENVIGADO,base.state_co_01,base.co +co05282,05282,FREDONIA,base.state_co_01,base.co +co05284,05284,FRONTINO,base.state_co_01,base.co +co05306,05306,GIRALDO,base.state_co_01,base.co +co05308,05308,GIRARDOTA,base.state_co_01,base.co +co05310,05310,GOMEZ PLATA,base.state_co_01,base.co +co05313,05313,GRANADA,base.state_co_01,base.co +co05315,05315,GUADALUPE,base.state_co_01,base.co +co05318,05318,GUARNE,base.state_co_01,base.co +co05321,05321,GUATAPE,base.state_co_01,base.co +co05347,05347,HELICONIA,base.state_co_01,base.co +co05353,05353,HISPANIA,base.state_co_01,base.co +co05360,05360,ITAGUI,base.state_co_01,base.co +co05361,05361,ITUANGO,base.state_co_01,base.co +co05364,05364,JARDIN,base.state_co_01,base.co +co05368,05368,JERICO,base.state_co_01,base.co +co05376,05376,LA CEJA,base.state_co_01,base.co +co05380,05380,LA ESTRELLA,base.state_co_01,base.co +co05390,05390,LA PINTADA,base.state_co_01,base.co +co05400,05400,LA UNION,base.state_co_01,base.co +co05411,05411,LIBORINA,base.state_co_01,base.co +co05425,05425,MACEO,base.state_co_01,base.co +co05440,05440,MARINILLA,base.state_co_01,base.co +co05001,05001,MEDELLIN,base.state_co_01,base.co +co05467,05467,MONTEBELLO,base.state_co_01,base.co +co05475,05475,MURINDO,base.state_co_01,base.co +co05480,05480,MUTATA,base.state_co_01,base.co +co05483,05483,NARIÑO,base.state_co_01,base.co +co05495,05495,NECHI,base.state_co_01,base.co +co05490,05490,NECOCLI,base.state_co_01,base.co +co05501,05501,OLAYA,base.state_co_01,base.co +co05541,05541,PEÑOL,base.state_co_01,base.co +co05543,05543,PEQUE,base.state_co_01,base.co +co05576,05576,PUEBLORRICO,base.state_co_01,base.co +co05579,05579,PUERTO BERRIO,base.state_co_01,base.co +co05585,05585,PUERTO NARE,base.state_co_01,base.co +co05591,05591,PUERTO TRIUNFO,base.state_co_01,base.co +co05604,05604,REMEDIOS,base.state_co_01,base.co +co05607,05607,RETIRO,base.state_co_01,base.co +co05615,05615,RIONEGRO,base.state_co_01,base.co +co05628,05628,SABANALARGA,base.state_co_01,base.co +co05631,05631,SABANETA,base.state_co_01,base.co +co05642,05642,SALGAR,base.state_co_01,base.co +co05647,05647,SAN ANDRES DE CUERQUIA,base.state_co_01,base.co +co05649,05649,SAN CARLOS,base.state_co_01,base.co +co05652,05652,SAN FRANCISCO,base.state_co_01,base.co +co05656,05656,SAN JERONIMO,base.state_co_01,base.co +co05658,05658,SAN JOSE DE LA MONTAÑA,base.state_co_01,base.co +co05659,05659,SAN JUAN DE URABA,base.state_co_01,base.co +co05660,05660,SAN LUIS,base.state_co_01,base.co +co05664,05664,SAN PEDRO DE LOS MILAGROS,base.state_co_01,base.co +co05665,05665,SAN PEDRO DE URABA,base.state_co_01,base.co +co05667,05667,SAN RAFAEL,base.state_co_01,base.co +co05670,05670,SAN ROQUE,base.state_co_01,base.co +co05674,05674,SAN VICENTE,base.state_co_01,base.co +co05679,05679,SANTA BARBARA,base.state_co_01,base.co +co05686,05686,SANTA ROSA DE OSOS,base.state_co_01,base.co +co05042,05042,SANTAFE DE ANTIOQUIA,base.state_co_01,base.co +co05690,05690,SANTO DOMINGO,base.state_co_01,base.co +co05736,05736,SEGOVIA,base.state_co_01,base.co +co05756,05756,SONSON,base.state_co_01,base.co +co05761,05761,SOPETRAN,base.state_co_01,base.co +co05789,05789,TAMESIS,base.state_co_01,base.co +co05790,05790,TARAZA,base.state_co_01,base.co +co05792,05792,TARSO,base.state_co_01,base.co +co05809,05809,TITIRIBI,base.state_co_01,base.co +co05819,05819,TOLEDO,base.state_co_01,base.co +co05837,05837,TURBO,base.state_co_01,base.co +co05842,05842,URAMITA,base.state_co_01,base.co +co05847,05847,URRAO,base.state_co_01,base.co +co05854,05854,VALDIVIA,base.state_co_01,base.co +co05856,05856,VALPARAISO,base.state_co_01,base.co +co05858,05858,VEGACHI,base.state_co_01,base.co +co05861,05861,VENECIA,base.state_co_01,base.co +co05873,05873,VIGIA DEL FUERTE,base.state_co_01,base.co +co05885,05885,YALI,base.state_co_01,base.co +co05887,05887,YARUMAL,base.state_co_01,base.co +co05890,05890,YOLOMBO,base.state_co_01,base.co +co05893,05893,YONDO,base.state_co_01,base.co +co05895,05895,ZARAGOZA,base.state_co_01,base.co +co81001,81001,ARAUCA,base.state_co_25,base.co +co81065,81065,ARAUQUITA,base.state_co_25,base.co +co81220,81220,CRAVO NORTE,base.state_co_25,base.co +co81300,81300,FORTUL,base.state_co_25,base.co +co81591,81591,PUERTO RONDON,base.state_co_25,base.co +co81736,81736,SARAVENA,base.state_co_25,base.co +co81794,81794,TAME,base.state_co_25,base.co +co88564,88564,PROVIDENCIA,base.state_co_28,base.co +co88001,88001,SAN ANDRES,base.state_co_28,base.co +co08078,08078,BARANOA,base.state_co_02,base.co +co08001,08001,BARRANQUILLA,base.state_co_02,base.co +co08137,08137,CAMPO DE LA CRUZ,base.state_co_02,base.co +co08141,08141,CANDELARIA,base.state_co_02,base.co +co08296,08296,GALAPA,base.state_co_02,base.co +co08372,08372,JUAN DE ACOSTA,base.state_co_02,base.co +co08421,08421,LURUACO,base.state_co_02,base.co +co08433,08433,MALAMBO,base.state_co_02,base.co +co08436,08436,MANATI,base.state_co_02,base.co +co08520,08520,PALMAR DE VARELA,base.state_co_02,base.co +co08549,08549,PIOJO,base.state_co_02,base.co +co08558,08558,POLONUEVO,base.state_co_02,base.co +co08560,08560,PONEDERA,base.state_co_02,base.co +co08573,08573,PUERTO COLOMBIA,base.state_co_02,base.co +co08606,08606,REPELON,base.state_co_02,base.co +co08634,08634,SABANAGRANDE,base.state_co_02,base.co +co08638,08638,SABANALARGA,base.state_co_02,base.co +co08675,08675,SANTA LUCIA,base.state_co_02,base.co +co08685,08685,SANTO TOMAS,base.state_co_02,base.co +co08758,08758,SOLEDAD,base.state_co_02,base.co +co08770,08770,SUAN,base.state_co_02,base.co +co08832,08832,TUBARA,base.state_co_02,base.co +co08849,08849,USIACURI,base.state_co_02,base.co +co11001,11001,LOCALIDAD ANTONIO NARIÑO,base.state_co_03,base.co +co11001,11001,LOCALIDAD BARRIOS UNIDOS,base.state_co_03,base.co +co11001,11001,LOCALIDAD BOSA,base.state_co_03,base.co +co11001,11001,LOCALIDAD CANDELARIA,base.state_co_03,base.co +co11001,11001,LOCALIDAD CHAPINERO,base.state_co_03,base.co +co11001,11001,LOCALIDAD CIUDAD BOLIVAR,base.state_co_03,base.co +co11001,11001,LOCALIDAD ENGATIVA,base.state_co_03,base.co +co11001,11001,LOCALIDAD FONTIBON,base.state_co_03,base.co +co11001,11001,LOCALIDAD KENNEDY,base.state_co_03,base.co +co11001,11001,LOCALIDAD LOS MARTIRES,base.state_co_03,base.co +co11001,11001,LOCALIDAD PUENTE ARANDA,base.state_co_03,base.co +co11001,11001,LOCALIDAD RAFAEL URIBE URIBE,base.state_co_03,base.co +co11001,11001,LOCALIDAD SAN CRISTOBAL,base.state_co_03,base.co +co11001,11001,LOCALIDAD SANTA FE,base.state_co_03,base.co +co11001,11001,LOCALIDAD SUBA,base.state_co_03,base.co +co11001,11001,LOCALIDAD SUMAPAZ,base.state_co_03,base.co +co11001,11001,LOCALIDAD TEUSAQUILLO,base.state_co_03,base.co +co11001,11001,LOCALIDAD TUNJUELITO,base.state_co_03,base.co +co11001,11001,LOCALIDAD USAQUEN,base.state_co_03,base.co +co11001,11001,LOCALIDAD USME,base.state_co_03,base.co +co13006,13006,ACHI,base.state_co_04,base.co +co13030,13030,ALTOS DEL ROSARIO,base.state_co_04,base.co +co13042,13042,ARENAL,base.state_co_04,base.co +co13052,13052,ARJONA,base.state_co_04,base.co +co13062,13062,ARROYOHONDO,base.state_co_04,base.co +co13074,13074,BARRANCO DE LOBA,base.state_co_04,base.co +co13140,13140,CALAMAR,base.state_co_04,base.co +co13160,13160,CANTAGALLO,base.state_co_04,base.co +co13001,13001,CARTAGENA,base.state_co_04,base.co +co13188,13188,CICUCO,base.state_co_04,base.co +co13222,13222,CLEMENCIA,base.state_co_04,base.co +co13212,13212,CORDOBA,base.state_co_04,base.co +co13244,13244,EL CARMEN DE BOLIVAR,base.state_co_04,base.co +co13248,13248,EL GUAMO,base.state_co_04,base.co +co13268,13268,EL PEÑON,base.state_co_04,base.co +co13300,13300,HATILLO DE LOBA,base.state_co_04,base.co +co13430,13430,MAGANGUE,base.state_co_04,base.co +co13433,13433,MAHATES,base.state_co_04,base.co +co13440,13440,MARGARITA,base.state_co_04,base.co +co13442,13442,MARIA LA BAJA,base.state_co_04,base.co +co13468,13468,MOMPOS,base.state_co_04,base.co +co13458,13458,MONTECRISTO,base.state_co_04,base.co +co13473,13473,MORALES,base.state_co_04,base.co +co13490,13490,NOROSI,base.state_co_04,base.co +co13549,13549,PINILLOS,base.state_co_04,base.co +co13580,13580,REGIDOR,base.state_co_04,base.co +co13600,13600,RIO VIEJO,base.state_co_04,base.co +co13620,13620,SAN CRISTOBAL,base.state_co_04,base.co +co13647,13647,SAN ESTANISLAO,base.state_co_04,base.co +co13650,13650,SAN FERNANDO,base.state_co_04,base.co +co13654,13654,SAN JACINTO,base.state_co_04,base.co +co13655,13655,SAN JACINTO DEL CAUCA,base.state_co_04,base.co +co13657,13657,SAN JUAN NEPOMUCENO,base.state_co_04,base.co +co13667,13667,SAN MARTIN DE LOBA,base.state_co_04,base.co +co13670,13670,SAN PABLO,base.state_co_04,base.co +co13673,13673,SANTA CATALINA,base.state_co_04,base.co +co13683,13683,SANTA ROSA,base.state_co_04,base.co +co13688,13688,SANTA ROSA DEL SUR,base.state_co_04,base.co +co13744,13744,SIMITI,base.state_co_04,base.co +co13760,13760,SOPLAVIENTO,base.state_co_04,base.co +co13780,13780,TALAIGUA NUEVO,base.state_co_04,base.co +co13810,13810,TIQUISIO,base.state_co_04,base.co +co13836,13836,TURBACO,base.state_co_04,base.co +co13838,13838,TURBANA,base.state_co_04,base.co +co13873,13873,VILLANUEVA,base.state_co_04,base.co +co13894,13894,ZAMBRANO,base.state_co_04,base.co +co15022,15022,ALMEIDA,base.state_co_05,base.co +co15047,15047,AQUITANIA,base.state_co_05,base.co +co15051,15051,ARCABUCO,base.state_co_05,base.co +co15087,15087,BELEN,base.state_co_05,base.co +co15090,15090,BERBEO,base.state_co_05,base.co +co15092,15092,BETEITIVA,base.state_co_05,base.co +co15097,15097,BOAVITA,base.state_co_05,base.co +co15104,15104,BOYACA,base.state_co_05,base.co +co15106,15106,BRICEÑO,base.state_co_05,base.co +co15109,15109,BUENAVISTA,base.state_co_05,base.co +co15114,15114,BUSBANZA,base.state_co_05,base.co +co15131,15131,CALDAS,base.state_co_05,base.co +co15135,15135,CAMPOHERMOSO,base.state_co_05,base.co +co15162,15162,CERINZA,base.state_co_05,base.co +co15172,15172,CHINAVITA,base.state_co_05,base.co +co15176,15176,CHIQUINQUIRA,base.state_co_05,base.co +co15232,15232,CHIQUIZA,base.state_co_05,base.co +co15180,15180,CHISCAS,base.state_co_05,base.co +co15183,15183,CHITA,base.state_co_05,base.co +co15185,15185,CHITARAQUE,base.state_co_05,base.co +co15187,15187,CHIVATA,base.state_co_05,base.co +co15236,15236,CHIVOR,base.state_co_05,base.co +co15189,15189,CIENEGA,base.state_co_05,base.co +co15204,15204,COMBITA,base.state_co_05,base.co +co15212,15212,COPER,base.state_co_05,base.co +co15215,15215,CORRALES,base.state_co_05,base.co +co15218,15218,COVARACHIA,base.state_co_05,base.co +co15223,15223,CUBARA,base.state_co_05,base.co +co15224,15224,CUCAITA,base.state_co_05,base.co +co15226,15226,CUITIVA,base.state_co_05,base.co +co15238,15238,DUITAMA,base.state_co_05,base.co +co15244,15244,EL COCUY,base.state_co_05,base.co +co15248,15248,EL ESPINO,base.state_co_05,base.co +co15272,15272,FIRAVITOBA,base.state_co_05,base.co +co15276,15276,FLORESTA,base.state_co_05,base.co +co15293,15293,GACHANTIVA,base.state_co_05,base.co +co15296,15296,GAMEZA,base.state_co_05,base.co +co15332,15332,GÜICAN,base.state_co_05,base.co +co15299,15299,GARAGOA,base.state_co_05,base.co +co15317,15317,GUACAMAYAS,base.state_co_05,base.co +co15322,15322,GUATEQUE,base.state_co_05,base.co +co15325,15325,GUAYATA,base.state_co_05,base.co +co15362,15362,IZA,base.state_co_05,base.co +co15367,15367,JENESANO,base.state_co_05,base.co +co15368,15368,JERICO,base.state_co_05,base.co +co15380,15380,LA CAPILLA,base.state_co_05,base.co +co15403,15403,LA UVITA,base.state_co_05,base.co +co15401,15401,LA VICTORIA,base.state_co_05,base.co +co15377,15377,LABRANZAGRANDE,base.state_co_05,base.co +co15425,15425,MACANAL,base.state_co_05,base.co +co15442,15442,MARIPI,base.state_co_05,base.co +co15455,15455,MIRAFLORES,base.state_co_05,base.co +co15464,15464,MONGUA,base.state_co_05,base.co +co15466,15466,MONGUI,base.state_co_05,base.co +co15469,15469,MONIQUIRA,base.state_co_05,base.co +co15476,15476,MOTAVITA,base.state_co_05,base.co +co15480,15480,MUZO,base.state_co_05,base.co +co15491,15491,NOBSA,base.state_co_05,base.co +co15494,15494,NUEVO COLON,base.state_co_05,base.co +co15500,15500,OICATA,base.state_co_05,base.co +co15507,15507,OTANCHE,base.state_co_05,base.co +co15511,15511,PACHAVITA,base.state_co_05,base.co +co15514,15514,PAEZ,base.state_co_05,base.co +co15516,15516,PAIPA,base.state_co_05,base.co +co15518,15518,PAJARITO,base.state_co_05,base.co +co15522,15522,PANQUEBA,base.state_co_05,base.co +co15531,15531,PAUNA,base.state_co_05,base.co +co15533,15533,PAYA,base.state_co_05,base.co +co15537,15537,PAZ DE RIO,base.state_co_05,base.co +co15542,15542,PESCA,base.state_co_05,base.co +co15550,15550,PISBA,base.state_co_05,base.co +co15572,15572,PUERTO BOYACA,base.state_co_05,base.co +co15580,15580,QUIPAMA,base.state_co_05,base.co +co15599,15599,RAMIRIQUI,base.state_co_05,base.co +co15600,15600,RAQUIRA,base.state_co_05,base.co +co15621,15621,RONDON,base.state_co_05,base.co +co15632,15632,SABOYA,base.state_co_05,base.co +co15638,15638,SACHICA,base.state_co_05,base.co +co15646,15646,SAMACA,base.state_co_05,base.co +co15660,15660,SAN EDUARDO,base.state_co_05,base.co +co15664,15664,SAN JOSE DE PARE,base.state_co_05,base.co +co15667,15667,SAN LUIS DE GACENO,base.state_co_05,base.co +co15673,15673,SAN MATEO,base.state_co_05,base.co +co15676,15676,SAN MIGUEL DE SEMA,base.state_co_05,base.co +co15681,15681,SAN PABLO DE BORBUR,base.state_co_05,base.co +co15690,15690,SANTA MARIA,base.state_co_05,base.co +co15693,15693,SANTA ROSA DE VITERBO,base.state_co_05,base.co +co15696,15696,SANTA SOFIA,base.state_co_05,base.co +co15686,15686,SANTANA,base.state_co_05,base.co +co15720,15720,SATIVANORTE,base.state_co_05,base.co +co15723,15723,SATIVASUR,base.state_co_05,base.co +co15740,15740,SIACHOQUE,base.state_co_05,base.co +co15753,15753,SOATA,base.state_co_05,base.co +co15757,15757,SOCHA,base.state_co_05,base.co +co15755,15755,SOCOTA,base.state_co_05,base.co +co15759,15759,SOGAMOSO,base.state_co_05,base.co +co15761,15761,SOMONDOCO,base.state_co_05,base.co +co15762,15762,SORA,base.state_co_05,base.co +co15764,15764,SORACA,base.state_co_05,base.co +co15763,15763,SOTAQUIRA,base.state_co_05,base.co +co15774,15774,SUSACON,base.state_co_05,base.co +co15776,15776,SUTAMARCHAN,base.state_co_05,base.co +co15778,15778,SUTATENZA,base.state_co_05,base.co +co15790,15790,TASCO,base.state_co_05,base.co +co15798,15798,TENZA,base.state_co_05,base.co +co15804,15804,TIBANA,base.state_co_05,base.co +co15806,15806,TIBASOSA,base.state_co_05,base.co +co15808,15808,TINJACA,base.state_co_05,base.co +co15810,15810,TIPACOQUE,base.state_co_05,base.co +co15814,15814,TOCA,base.state_co_05,base.co +co15816,15816,TOGÜI,base.state_co_05,base.co +co15820,15820,TOPAGA,base.state_co_05,base.co +co15822,15822,TOTA,base.state_co_05,base.co +co15001,15001,TUNJA,base.state_co_05,base.co +co15832,15832,TUNUNGUA,base.state_co_05,base.co +co15835,15835,TURMEQUE,base.state_co_05,base.co +co15837,15837,TUTA,base.state_co_05,base.co +co15839,15839,TUTAZA,base.state_co_05,base.co +co15842,15842,UMBITA,base.state_co_05,base.co +co15861,15861,VENTAQUEMADA,base.state_co_05,base.co +co15407,15407,VILLA DE LEYVA,base.state_co_05,base.co +co15879,15879,VIRACACHA,base.state_co_05,base.co +co15897,15897,ZETAQUIRA,base.state_co_05,base.co +co17013,17013,AGUADAS,base.state_co_06,base.co +co17042,17042,ANSERMA,base.state_co_06,base.co +co17050,17050,ARANZAZU,base.state_co_06,base.co +co17088,17088,BELALCAZAR,base.state_co_06,base.co +co17174,17174,CHINCHINA,base.state_co_06,base.co +co17272,17272,FILADELFIA,base.state_co_06,base.co +co17380,17380,LA DORADA,base.state_co_06,base.co +co17388,17388,LA MERCED,base.state_co_06,base.co +co17001,17001,MANIZALES,base.state_co_06,base.co +co17433,17433,MANZANARES,base.state_co_06,base.co +co17442,17442,MARMATO,base.state_co_06,base.co +co17444,17444,MARQUETALIA,base.state_co_06,base.co +co17446,17446,MARULANDA,base.state_co_06,base.co +co17486,17486,NEIRA,base.state_co_06,base.co +co17495,17495,NORCASIA,base.state_co_06,base.co +co17513,17513,PACORA,base.state_co_06,base.co +co17524,17524,PALESTINA,base.state_co_06,base.co +co17541,17541,PENSILVANIA,base.state_co_06,base.co +co17614,17614,RIOSUCIO,base.state_co_06,base.co +co17616,17616,RISARALDA,base.state_co_06,base.co +co17653,17653,SALAMINA,base.state_co_06,base.co +co17662,17662,SAMANA,base.state_co_06,base.co +co17665,17665,SAN JOSE,base.state_co_06,base.co +co17777,17777,SUPIA,base.state_co_06,base.co +co17867,17867,VICTORIA,base.state_co_06,base.co +co17873,17873,VILLAMARIA,base.state_co_06,base.co +co17877,17877,VITERBO,base.state_co_06,base.co +co18029,18029,ALBANIA,base.state_co_07,base.co +co18094,18094,BELEN DE LOS ANDAQUIES,base.state_co_07,base.co +co18150,18150,CARTAGENA DEL CHAIRA,base.state_co_07,base.co +co18205,18205,CURILLO,base.state_co_07,base.co +co18247,18247,EL DONCELLO,base.state_co_07,base.co +co18256,18256,EL PAUJIL,base.state_co_07,base.co +co18001,18001,FLORENCIA,base.state_co_07,base.co +co18410,18410,LA MONTAÑITA,base.state_co_07,base.co +co18460,18460,MILAN,base.state_co_07,base.co +co18479,18479,MORELIA,base.state_co_07,base.co +co18592,18592,PUERTO RICO,base.state_co_07,base.co +co18610,18610,SAN JOSE DEL FRAGUA,base.state_co_07,base.co +co18753,18753,SAN VICENTE DEL CAGUAN,base.state_co_07,base.co +co18756,18756,SOLANO,base.state_co_07,base.co +co18785,18785,SOLITA,base.state_co_07,base.co +co18860,18860,VALPARAISO,base.state_co_07,base.co +co85010,85010,AGUAZUL,base.state_co_26,base.co +co85015,85015,CHAMEZA,base.state_co_26,base.co +co85125,85125,HATO COROZAL,base.state_co_26,base.co +co85136,85136,LA SALINA,base.state_co_26,base.co +co85139,85139,MANI,base.state_co_26,base.co +co85162,85162,MONTERREY,base.state_co_26,base.co +co85225,85225,NUNCHIA,base.state_co_26,base.co +co85230,85230,OROCUE,base.state_co_26,base.co +co85250,85250,PAZ DE ARIPORO,base.state_co_26,base.co +co85263,85263,PORE,base.state_co_26,base.co +co85279,85279,RECETOR,base.state_co_26,base.co +co85300,85300,SABANALARGA,base.state_co_26,base.co +co85315,85315,SACAMA,base.state_co_26,base.co +co85325,85325,SAN LUIS DE PALENQUE,base.state_co_26,base.co +co85400,85400,TAMARA,base.state_co_26,base.co +co85410,85410,TAURAMENA,base.state_co_26,base.co +co85430,85430,TRINIDAD,base.state_co_26,base.co +co85440,85440,VILLANUEVA,base.state_co_26,base.co +co85001,85001,YOPAL,base.state_co_26,base.co +co19022,19022,ALMAGUER,base.state_co_08,base.co +co19050,19050,ARGELIA,base.state_co_08,base.co +co19075,19075,BALBOA,base.state_co_08,base.co +co19100,19100,BOLIVAR,base.state_co_08,base.co +co19110,19110,BUENOS AIRES,base.state_co_08,base.co +co19130,19130,CAJIBIO,base.state_co_08,base.co +co19137,19137,CALDONO,base.state_co_08,base.co +co19142,19142,CALOTO,base.state_co_08,base.co +co19212,19212,CORINTO,base.state_co_08,base.co +co19256,19256,EL TAMBO,base.state_co_08,base.co +co19290,19290,FLORENCIA,base.state_co_08,base.co +co19318,19318,GUAPI,base.state_co_08,base.co +co19355,19355,INZA,base.state_co_08,base.co +co19364,19364,JAMBALO,base.state_co_08,base.co +co19392,19392,LA SIERRA,base.state_co_08,base.co +co19397,19397,LA VEGA,base.state_co_08,base.co +co19418,19418,LOPEZ,base.state_co_08,base.co +co19450,19450,MERCADERES,base.state_co_08,base.co +co19455,19455,MIRANDA,base.state_co_08,base.co +co19473,19473,MORALES,base.state_co_08,base.co +co19513,19513,PADILLA,base.state_co_08,base.co +co19517,19517,PAEZ,base.state_co_08,base.co +co19532,19532,PATIA,base.state_co_08,base.co +co19533,19533,PIAMONTE,base.state_co_08,base.co +co19548,19548,PIENDAMO,base.state_co_08,base.co +co19001,19001,POPAYAN,base.state_co_08,base.co +co19573,19573,PUERTO TEJADA,base.state_co_08,base.co +co19585,19585,PURACE,base.state_co_08,base.co +co19622,19622,ROSAS,base.state_co_08,base.co +co19693,19693,SAN SEBASTIAN,base.state_co_08,base.co +co19701,19701,SANTA ROSA,base.state_co_08,base.co +co19698,19698,SANTANDER DE QUILICHAO,base.state_co_08,base.co +co19743,19743,SILVIA,base.state_co_08,base.co +co19760,19760,SOTARA,base.state_co_08,base.co +co19780,19780,SUAREZ,base.state_co_08,base.co +co19785,19785,SUCRE,base.state_co_08,base.co +co19807,19807,TIMBIO,base.state_co_08,base.co +co19809,19809,TIMBIQUI,base.state_co_08,base.co +co19821,19821,TORIBIO,base.state_co_08,base.co +co19824,19824,TOTORO,base.state_co_08,base.co +co19845,19845,VILLA RICA,base.state_co_08,base.co +co20011,20011,AGUACHICA,base.state_co_09,base.co +co20013,20013,AGUSTIN CODAZZI,base.state_co_09,base.co +co20032,20032,ASTREA,base.state_co_09,base.co +co20045,20045,BECERRIL,base.state_co_09,base.co +co20060,20060,BOSCONIA,base.state_co_09,base.co +co20175,20175,CHIMICHAGUA,base.state_co_09,base.co +co20178,20178,CHIRIGUANA,base.state_co_09,base.co +co20228,20228,CURUMANI,base.state_co_09,base.co +co20238,20238,EL COPEY,base.state_co_09,base.co +co20250,20250,EL PASO,base.state_co_09,base.co +co20295,20295,GAMARRA,base.state_co_09,base.co +co20310,20310,GONZALEZ,base.state_co_09,base.co +co20383,20383,LA GLORIA,base.state_co_09,base.co +co20400,20400,LA JAGUA DE IBIRICO,base.state_co_09,base.co +co20621,20621,LA PAZ,base.state_co_09,base.co +co20443,20443,MANAURE,base.state_co_09,base.co +co20517,20517,PAILITAS,base.state_co_09,base.co +co20550,20550,PELAYA,base.state_co_09,base.co +co20570,20570,PUEBLO BELLO,base.state_co_09,base.co +co20614,20614,RIO DE ORO,base.state_co_09,base.co +co20710,20710,SAN ALBERTO,base.state_co_09,base.co +co20750,20750,SAN DIEGO,base.state_co_09,base.co +co20770,20770,SAN MARTIN,base.state_co_09,base.co +co20787,20787,TAMALAMEQUE,base.state_co_09,base.co +co20001,20001,VALLEDUPAR,base.state_co_09,base.co +co27006,27006,ACANDI,base.state_co_12,base.co +co27025,27025,ALTO BAUDO,base.state_co_12,base.co +co27050,27050,ATRATO,base.state_co_12,base.co +co27073,27073,BAGADO,base.state_co_12,base.co +co27075,27075,BAHIA SOLANO,base.state_co_12,base.co +co27077,27077,BAJO BAUDO,base.state_co_12,base.co +co27099,27099,BOJAYA,base.state_co_12,base.co +co27150,27150,CARMEN DEL DARIEN,base.state_co_12,base.co +co27160,27160,CERTEGUI,base.state_co_12,base.co +co27205,27205,CONDOTO,base.state_co_12,base.co +co27135,27135,EL CANTON DEL SAN PABLO,base.state_co_12,base.co +co27245,27245,EL CARMEN DE ATRATO,base.state_co_12,base.co +co27250,27250,EL LITORAL DEL SAN JUAN,base.state_co_12,base.co +co27361,27361,ISTMINA,base.state_co_12,base.co +co27372,27372,JURADO,base.state_co_12,base.co +co27413,27413,LLORO,base.state_co_12,base.co +co27425,27425,MEDIO ATRATO,base.state_co_12,base.co +co27430,27430,MEDIO BAUDO,base.state_co_12,base.co +co27450,27450,MEDIO SAN JUAN,base.state_co_12,base.co +co27491,27491,NOVITA,base.state_co_12,base.co +co27495,27495,NUQUI,base.state_co_12,base.co +co27001,27001,QUIBDO,base.state_co_12,base.co +co27580,27580,RIO IRO,base.state_co_12,base.co +co27600,27600,RIO QUITO,base.state_co_12,base.co +co27615,27615,RIOSUCIO,base.state_co_12,base.co +co27660,27660,SAN JOSE DEL PALMAR,base.state_co_12,base.co +co27745,27745,SIPI,base.state_co_12,base.co +co27787,27787,TADO,base.state_co_12,base.co +co27800,27800,UNGUIA,base.state_co_12,base.co +co27810,27810,UNION PANAMERICANA,base.state_co_12,base.co +co23068,23068,AYAPEL,base.state_co_10,base.co +co23079,23079,BUENAVISTA,base.state_co_10,base.co +co23090,23090,CANALETE,base.state_co_10,base.co +co23162,23162,CERETE,base.state_co_10,base.co +co23168,23168,CHIMA,base.state_co_10,base.co +co23182,23182,CHINU,base.state_co_10,base.co +co23189,23189,CIENAGA DE ORO,base.state_co_10,base.co +co23300,23300,COTORRA,base.state_co_10,base.co +co23350,23350,LA APARTADA,base.state_co_10,base.co +co23417,23417,LORICA,base.state_co_10,base.co +co23419,23419,LOS CORDOBAS,base.state_co_10,base.co +co23500,23500,MOÑITOS,base.state_co_10,base.co +co23464,23464,MOMIL,base.state_co_10,base.co +co23466,23466,MONTELIBANO,base.state_co_10,base.co +co23001,23001,MONTERIA,base.state_co_10,base.co +co23555,23555,PLANETA RICA,base.state_co_10,base.co +co23570,23570,PUEBLO NUEVO,base.state_co_10,base.co +co23574,23574,PUERTO ESCONDIDO,base.state_co_10,base.co +co23580,23580,PUERTO LIBERTADOR,base.state_co_10,base.co +co23586,23586,PURISIMA,base.state_co_10,base.co +co23660,23660,SAHAGUN,base.state_co_10,base.co +co23670,23670,SAN ANDRES SOTAVENTO,base.state_co_10,base.co +co23672,23672,SAN ANTERO,base.state_co_10,base.co +co23675,23675,SAN BERNARDO DEL VIENTO,base.state_co_10,base.co +co23678,23678,SAN CARLOS,base.state_co_10,base.co +co23682,23682,SAN JOSE DE URE,base.state_co_10,base.co +co23686,23686,SAN PELAYO,base.state_co_10,base.co +co23807,23807,TIERRALTA,base.state_co_10,base.co +co23815,23815,TUCHIN,base.state_co_10,base.co +co23855,23855,VALENCIA,base.state_co_10,base.co +co25001,25001,AGUA DE DIOS,base.state_co_11,base.co +co25019,25019,ALBAN,base.state_co_11,base.co +co25035,25035,ANAPOIMA,base.state_co_11,base.co +co25040,25040,ANOLAIMA,base.state_co_11,base.co +co25599,25599,APULO,base.state_co_11,base.co +co25053,25053,ARBELAEZ,base.state_co_11,base.co +co25086,25086,BELTRAN,base.state_co_11,base.co +co25095,25095,BITUIMA,base.state_co_11,base.co +co25099,25099,BOJACA,base.state_co_11,base.co +co25120,25120,CABRERA,base.state_co_11,base.co +co25123,25123,CACHIPAY,base.state_co_11,base.co +co25126,25126,CAJICA,base.state_co_11,base.co +co25148,25148,CAPARRAPI,base.state_co_11,base.co +co25151,25151,CAQUEZA,base.state_co_11,base.co +co25154,25154,CARMEN DE CARUPA,base.state_co_11,base.co +co25168,25168,CHAGUANI,base.state_co_11,base.co +co25175,25175,CHIA,base.state_co_11,base.co +co25178,25178,CHIPAQUE,base.state_co_11,base.co +co25181,25181,CHOACHI,base.state_co_11,base.co +co25183,25183,CHOCONTA,base.state_co_11,base.co +co25200,25200,COGUA,base.state_co_11,base.co +co25214,25214,COTA,base.state_co_11,base.co +co25224,25224,CUCUNUBA,base.state_co_11,base.co +co25245,25245,EL COLEGIO,base.state_co_11,base.co +co25258,25258,EL PEÑON,base.state_co_11,base.co +co25260,25260,EL ROSAL,base.state_co_11,base.co +co25269,25269,FACATATIVA,base.state_co_11,base.co +co25279,25279,FOMEQUE,base.state_co_11,base.co +co25281,25281,FOSCA,base.state_co_11,base.co +co25286,25286,FUNZA,base.state_co_11,base.co +co25288,25288,FUQUENE,base.state_co_11,base.co +co25290,25290,FUSAGASUGA,base.state_co_11,base.co +co25293,25293,GACHALA,base.state_co_11,base.co +co25295,25295,GACHANCIPA,base.state_co_11,base.co +co25297,25297,GACHETA,base.state_co_11,base.co +co25299,25299,GAMA,base.state_co_11,base.co +co25307,25307,GIRARDOT,base.state_co_11,base.co +co25312,25312,GRANADA,base.state_co_11,base.co +co25317,25317,GUACHETA,base.state_co_11,base.co +co25320,25320,GUADUAS,base.state_co_11,base.co +co25322,25322,GUASCA,base.state_co_11,base.co +co25324,25324,GUATAQUI,base.state_co_11,base.co +co25326,25326,GUATAVITA,base.state_co_11,base.co +co25328,25328,GUAYABAL DE SIQUIMA,base.state_co_11,base.co +co25335,25335,GUAYABETAL,base.state_co_11,base.co +co25339,25339,GUTIERREZ,base.state_co_11,base.co +co25368,25368,JERUSALEN,base.state_co_11,base.co +co25372,25372,JUNIN,base.state_co_11,base.co +co25377,25377,LA CALERA,base.state_co_11,base.co +co25386,25386,LA MESA,base.state_co_11,base.co +co25394,25394,LA PALMA,base.state_co_11,base.co +co25398,25398,LA PEÑA,base.state_co_11,base.co +co25402,25402,LA VEGA,base.state_co_11,base.co +co25407,25407,LENGUAZAQUE,base.state_co_11,base.co +co25426,25426,MACHETA,base.state_co_11,base.co +co25430,25430,MADRID,base.state_co_11,base.co +co25436,25436,MANTA,base.state_co_11,base.co +co25438,25438,MEDINA,base.state_co_11,base.co +co25473,25473,MOSQUERA,base.state_co_11,base.co +co25483,25483,NARIÑO,base.state_co_11,base.co +co25486,25486,NEMOCON,base.state_co_11,base.co +co25488,25488,NILO,base.state_co_11,base.co +co25489,25489,NIMAIMA,base.state_co_11,base.co +co25491,25491,NOCAIMA,base.state_co_11,base.co +co25513,25513,PACHO,base.state_co_11,base.co +co25518,25518,PAIME,base.state_co_11,base.co +co25524,25524,PANDI,base.state_co_11,base.co +co25530,25530,PARATEBUENO,base.state_co_11,base.co +co25535,25535,PASCA,base.state_co_11,base.co +co25572,25572,PUERTO SALGAR,base.state_co_11,base.co +co25580,25580,PULI,base.state_co_11,base.co +co25592,25592,QUEBRADANEGRA,base.state_co_11,base.co +co25594,25594,QUETAME,base.state_co_11,base.co +co25596,25596,QUIPILE,base.state_co_11,base.co +co25612,25612,RICAURTE,base.state_co_11,base.co +co25645,25645,SAN ANTONIO DEL TEQUENDAMA,base.state_co_11,base.co +co25649,25649,SAN BERNARDO,base.state_co_11,base.co +co25653,25653,SAN CAYETANO,base.state_co_11,base.co +co25658,25658,SAN FRANCISCO,base.state_co_11,base.co +co25662,25662,SAN JUAN DE RIO SECO,base.state_co_11,base.co +co25718,25718,SASAIMA,base.state_co_11,base.co +co25736,25736,SESQUILE,base.state_co_11,base.co +co25740,25740,SIBATE,base.state_co_11,base.co +co25743,25743,SILVANIA,base.state_co_11,base.co +co25745,25745,SIMIJACA,base.state_co_11,base.co +co25754,25754,SOACHA,base.state_co_11,base.co +co25758,25758,SOPO,base.state_co_11,base.co +co25769,25769,SUBACHOQUE,base.state_co_11,base.co +co25772,25772,SUESCA,base.state_co_11,base.co +co25777,25777,SUPATA,base.state_co_11,base.co +co25779,25779,SUSA,base.state_co_11,base.co +co25781,25781,SUTATAUSA,base.state_co_11,base.co +co25785,25785,TABIO,base.state_co_11,base.co +co25793,25793,TAUSA,base.state_co_11,base.co +co25797,25797,TENA,base.state_co_11,base.co +co25799,25799,TENJO,base.state_co_11,base.co +co25805,25805,TIBACUY,base.state_co_11,base.co +co25807,25807,TIBIRITA,base.state_co_11,base.co +co25815,25815,TOCAIMA,base.state_co_11,base.co +co25817,25817,TOCANCIPA,base.state_co_11,base.co +co25823,25823,TOPAIPI,base.state_co_11,base.co +co25839,25839,UBALA,base.state_co_11,base.co +co25841,25841,UBAQUE,base.state_co_11,base.co +co25845,25845,UNE,base.state_co_11,base.co +co25851,25851,UTICA,base.state_co_11,base.co +co25506,25506,VENECIA,base.state_co_11,base.co +co25862,25862,VERGARA,base.state_co_11,base.co +co25867,25867,VIANI,base.state_co_11,base.co +co25843,25843,VILLA DE SAN DIEGO DE UBATE,base.state_co_11,base.co +co25871,25871,VILLAGOMEZ,base.state_co_11,base.co +co25873,25873,VILLAPINZON,base.state_co_11,base.co +co25875,25875,VILLETA,base.state_co_11,base.co +co25878,25878,VIOTA,base.state_co_11,base.co +co25885,25885,YACOPI,base.state_co_11,base.co +co25898,25898,ZIPACON,base.state_co_11,base.co +co25899,25899,ZIPAQUIRA,base.state_co_11,base.co +co94343,94343,BARRANCO MINAS,base.state_co_30,base.co +co94886,94886,CACAHUAL,base.state_co_30,base.co +co94885,94885,GUADALUPE,base.state_co_30,base.co +co94001,94001,INIRIDA,base.state_co_30,base.co +co94663,94663,MAPIRIPANA,base.state_co_30,base.co +co94888,94888,MORICHAL,base.state_co_30,base.co +co94887,94887,PANA PANA,base.state_co_30,base.co +co94884,94884,PUERTO COLOMBIA,base.state_co_30,base.co +co94883,94883,SAN FELIPE,base.state_co_30,base.co +co95015,95015,CALAMAR,base.state_co_31,base.co +co95025,95025,EL RETORNO,base.state_co_31,base.co +co95200,95200,MIRAFLORES,base.state_co_31,base.co +co95001,95001,SAN JOSE DEL GUAVIARE,base.state_co_31,base.co +co41006,41006,ACEVEDO,base.state_co_13,base.co +co41013,41013,AGRADO,base.state_co_13,base.co +co41016,41016,AIPE,base.state_co_13,base.co +co41020,41020,ALGECIRAS,base.state_co_13,base.co +co41026,41026,ALTAMIRA,base.state_co_13,base.co +co41078,41078,BARAYA,base.state_co_13,base.co +co41132,41132,CAMPOALEGRE,base.state_co_13,base.co +co41206,41206,COLOMBIA,base.state_co_13,base.co +co41244,41244,ELIAS,base.state_co_13,base.co +co41298,41298,GARZON,base.state_co_13,base.co +co41306,41306,GIGANTE,base.state_co_13,base.co +co41319,41319,GUADALUPE,base.state_co_13,base.co +co41349,41349,HOBO,base.state_co_13,base.co +co41357,41357,IQUIRA,base.state_co_13,base.co +co41359,41359,ISNOS,base.state_co_13,base.co +co41378,41378,LA ARGENTINA,base.state_co_13,base.co +co41396,41396,LA PLATA,base.state_co_13,base.co +co41483,41483,NATAGA,base.state_co_13,base.co +co41001,41001,NEIVA,base.state_co_13,base.co +co41503,41503,OPORAPA,base.state_co_13,base.co +co41518,41518,PAICOL,base.state_co_13,base.co +co41524,41524,PALERMO,base.state_co_13,base.co +co41530,41530,PALESTINA,base.state_co_13,base.co +co41548,41548,PITAL,base.state_co_13,base.co +co41551,41551,PITALITO,base.state_co_13,base.co +co41615,41615,RIVERA,base.state_co_13,base.co +co41660,41660,SALADOBLANCO,base.state_co_13,base.co +co41668,41668,SAN AGUSTIN,base.state_co_13,base.co +co41676,41676,SANTA MARIA,base.state_co_13,base.co +co41770,41770,SUAZA,base.state_co_13,base.co +co41791,41791,TARQUI,base.state_co_13,base.co +co41799,41799,TELLO,base.state_co_13,base.co +co41801,41801,TERUEL,base.state_co_13,base.co +co41797,41797,TESALIA,base.state_co_13,base.co +co41807,41807,TIMANA,base.state_co_13,base.co +co41872,41872,VILLAVIEJA,base.state_co_13,base.co +co41885,41885,YAGUARA,base.state_co_13,base.co +co44035,44035,ALBANIA,base.state_co_14,base.co +co44078,44078,BARRANCAS,base.state_co_14,base.co +co44090,44090,DIBULLA,base.state_co_14,base.co +co44098,44098,DISTRACCION,base.state_co_14,base.co +co44110,44110,EL MOLINO,base.state_co_14,base.co +co44279,44279,FONSECA,base.state_co_14,base.co +co44378,44378,HATONUEVO,base.state_co_14,base.co +co44420,44420,LA JAGUA DEL PILAR,base.state_co_14,base.co +co44430,44430,MAICAO,base.state_co_14,base.co +co44560,44560,MANAURE,base.state_co_14,base.co +co44001,44001,RIOHACHA,base.state_co_14,base.co +co44650,44650,SAN JUAN DEL CESAR,base.state_co_14,base.co +co44847,44847,URIBIA,base.state_co_14,base.co +co44855,44855,URUMITA,base.state_co_14,base.co +co44874,44874,VILLANUEVA,base.state_co_14,base.co +co47030,47030,ALGARROBO,base.state_co_15,base.co +co47053,47053,ARACATACA,base.state_co_15,base.co +co47058,47058,ARIGUANI,base.state_co_15,base.co +co47161,47161,CERRO SAN ANTONIO,base.state_co_15,base.co +co47170,47170,CHIBOLO,base.state_co_15,base.co +co47189,47189,CIENAGA,base.state_co_15,base.co +co47205,47205,CONCORDIA,base.state_co_15,base.co +co47245,47245,EL BANCO,base.state_co_15,base.co +co47258,47258,EL PIÑON,base.state_co_15,base.co +co47268,47268,EL RETEN,base.state_co_15,base.co +co47288,47288,FUNDACION,base.state_co_15,base.co +co47318,47318,GUAMAL,base.state_co_15,base.co +co47460,47460,NUEVA GRANADA,base.state_co_15,base.co +co47541,47541,PEDRAZA,base.state_co_15,base.co +co47545,47545,PIJIÑO DEL CARMEN,base.state_co_15,base.co +co47551,47551,PIVIJAY,base.state_co_15,base.co +co47555,47555,PLATO,base.state_co_15,base.co +co47570,47570,PUEBLOVIEJO,base.state_co_15,base.co +co47605,47605,REMOLINO,base.state_co_15,base.co +co47660,47660,SABANAS DE SAN ANGEL,base.state_co_15,base.co +co47675,47675,SALAMINA,base.state_co_15,base.co +co47692,47692,SAN SEBASTIAN DE BUENAVISTA,base.state_co_15,base.co +co47703,47703,SAN ZENON,base.state_co_15,base.co +co47707,47707,SANTA ANA,base.state_co_15,base.co +co47720,47720,SANTA BARBARA DE PINTO,base.state_co_15,base.co +co47001,47001,SANTA MARTA,base.state_co_15,base.co +co47745,47745,SITIONUEVO,base.state_co_15,base.co +co47798,47798,TENERIFE,base.state_co_15,base.co +co47960,47960,ZAPAYAN,base.state_co_15,base.co +co47980,47980,ZONA BANANERA,base.state_co_15,base.co +co50006,50006,ACACIAS,base.state_co_16,base.co +co50110,50110,BARRANCA DE UPIA,base.state_co_16,base.co +co50124,50124,CABUYARO,base.state_co_16,base.co +co50150,50150,CASTILLA LA NUEVA,base.state_co_16,base.co +co50223,50223,CUBARRAL,base.state_co_16,base.co +co50226,50226,CUMARAL,base.state_co_16,base.co +co50245,50245,EL CALVARIO,base.state_co_16,base.co +co50251,50251,EL CASTILLO,base.state_co_16,base.co +co50270,50270,EL DORADO,base.state_co_16,base.co +co50287,50287,FUENTE DE ORO,base.state_co_16,base.co +co50313,50313,GRANADA,base.state_co_16,base.co +co50318,50318,GUAMAL,base.state_co_16,base.co +co50350,50350,LA MACARENA,base.state_co_16,base.co +co50400,50400,LEJANIAS,base.state_co_16,base.co +co50325,50325,MAPIRIPAN,base.state_co_16,base.co +co50330,50330,MESETAS,base.state_co_16,base.co +co50450,50450,PUERTO CONCORDIA,base.state_co_16,base.co +co50568,50568,PUERTO GAITAN,base.state_co_16,base.co +co50577,50577,PUERTO LLERAS,base.state_co_16,base.co +co50573,50573,PUERTO LOPEZ,base.state_co_16,base.co +co50590,50590,PUERTO RICO,base.state_co_16,base.co +co50606,50606,RESTREPO,base.state_co_16,base.co +co50680,50680,SAN CARLOS DE GUAROA,base.state_co_16,base.co +co50683,50683,SAN JUAN DE ARAMA,base.state_co_16,base.co +co50686,50686,SAN JUANITO,base.state_co_16,base.co +co50689,50689,SAN MARTIN,base.state_co_16,base.co +co50370,50370,URIBE,base.state_co_16,base.co +co50001,50001,VILLAVICENCIO,base.state_co_16,base.co +co50711,50711,VISTAHERMOSA,base.state_co_16,base.co +co52022,52022,ALDANA,base.state_co_17,base.co +co52036,52036,ANCUYA,base.state_co_17,base.co +co52051,52051,ARBOLEDA - BERRUECOS,base.state_co_17,base.co +co52079,52079,BARBACOAS,base.state_co_17,base.co +co52083,52083,BELEN,base.state_co_17,base.co +co52110,52110,BUESACO,base.state_co_17,base.co +co52240,52240,CHACHAGÜI,base.state_co_17,base.co +co52203,52203,COLON,base.state_co_17,base.co +co52207,52207,CONSACA,base.state_co_17,base.co +co52210,52210,CONTADERO,base.state_co_17,base.co +co52215,52215,CORDOBA,base.state_co_17,base.co +co52224,52224,CUASPUD,base.state_co_17,base.co +co52227,52227,CUMBAL,base.state_co_17,base.co +co52233,52233,CUMBITARA,base.state_co_17,base.co +co52250,52250,EL CHARCO,base.state_co_17,base.co +co52254,52254,EL PEÑOL,base.state_co_17,base.co +co52256,52256,EL ROSARIO,base.state_co_17,base.co +co52258,52258,EL TABLON DE GOMEZ,base.state_co_17,base.co +co52260,52260,EL TAMBO,base.state_co_17,base.co +co52520,52520,FRANCISCO PIZARRO,base.state_co_17,base.co +co52287,52287,FUNES,base.state_co_17,base.co +co52317,52317,GUACHUCAL,base.state_co_17,base.co +co52320,52320,GUAITARILLA,base.state_co_17,base.co +co52323,52323,GUALMATAN,base.state_co_17,base.co +co52352,52352,ILES,base.state_co_17,base.co +co52354,52354,IMUES,base.state_co_17,base.co +co52356,52356,IPIALES,base.state_co_17,base.co +co52378,52378,LA CRUZ,base.state_co_17,base.co +co52381,52381,LA FLORIDA,base.state_co_17,base.co +co52385,52385,LA LLANADA,base.state_co_17,base.co +co52390,52390,LA TOLA,base.state_co_17,base.co +co52399,52399,LA UNION,base.state_co_17,base.co +co52405,52405,LEIVA,base.state_co_17,base.co +co52411,52411,LINARES,base.state_co_17,base.co +co52418,52418,LOS ANDES,base.state_co_17,base.co +co52427,52427,MAGÜI,base.state_co_17,base.co +co52435,52435,MALLAMA,base.state_co_17,base.co +co52473,52473,MOSQUERA,base.state_co_17,base.co +co52480,52480,NARIÑO,base.state_co_17,base.co +co52490,52490,OLAYA HERRERA,base.state_co_17,base.co +co52506,52506,OSPINA,base.state_co_17,base.co +co52001,52001,PASTO,base.state_co_17,base.co +co52540,52540,POLICARPA,base.state_co_17,base.co +co52560,52560,POTOSI,base.state_co_17,base.co +co52565,52565,PROVIDENCIA,base.state_co_17,base.co +co52573,52573,PUERRES,base.state_co_17,base.co +co52585,52585,PUPIALES,base.state_co_17,base.co +co52612,52612,RICAURTE,base.state_co_17,base.co +co52621,52621,ROBERTO PAYAN,base.state_co_17,base.co +co52678,52678,SAMANIEGO,base.state_co_17,base.co +co52835,52835,SAN ANDRES DE TUMACO,base.state_co_17,base.co +co52685,52685,SAN BERNARDO,base.state_co_17,base.co +co52019,52019,SAN JOSE DE ALBAN,base.state_co_17,base.co +co52687,52687,SAN LORENZO,base.state_co_17,base.co +co52693,52693,SAN PABLO,base.state_co_17,base.co +co52694,52694,SAN PEDRO DE CARTAGO,base.state_co_17,base.co +co52683,52683,SANDONA,base.state_co_17,base.co +co52696,52696,SANTA BARBARA,base.state_co_17,base.co +co52699,52699,SANTACRUZ,base.state_co_17,base.co +co52720,52720,SAPUYES,base.state_co_17,base.co +co52786,52786,TAMINANGO,base.state_co_17,base.co +co52788,52788,TANGUA,base.state_co_17,base.co +co52838,52838,TUQUERRES,base.state_co_17,base.co +co52885,52885,YACUANQUER,base.state_co_17,base.co +co54003,54003,ABREGO,base.state_co_18,base.co +co54051,54051,ARBOLEDAS,base.state_co_18,base.co +co54099,54099,BOCHALEMA,base.state_co_18,base.co +co54109,54109,BUCARASICA,base.state_co_18,base.co +co54128,54128,CACHIRA,base.state_co_18,base.co +co54125,54125,CACOTA,base.state_co_18,base.co +co54172,54172,CHINACOTA,base.state_co_18,base.co +co54174,54174,CHITAGA,base.state_co_18,base.co +co54206,54206,CONVENCION,base.state_co_18,base.co +co54001,54001,CUCUTA,base.state_co_18,base.co +co54223,54223,CUCUTILLA,base.state_co_18,base.co +co54239,54239,DURANIA,base.state_co_18,base.co +co54245,54245,EL CARMEN,base.state_co_18,base.co +co54250,54250,EL TARRA,base.state_co_18,base.co +co54261,54261,EL ZULIA,base.state_co_18,base.co +co54313,54313,GRAMALOTE,base.state_co_18,base.co +co54344,54344,HACARI,base.state_co_18,base.co +co54347,54347,HERRAN,base.state_co_18,base.co +co54385,54385,LA ESPERANZA,base.state_co_18,base.co +co54398,54398,LA PLAYA,base.state_co_18,base.co +co54377,54377,LABATECA,base.state_co_18,base.co +co54405,54405,LOS PATIOS,base.state_co_18,base.co +co54418,54418,LOURDES,base.state_co_18,base.co +co54480,54480,MUTISCUA,base.state_co_18,base.co +co54498,54498,OCAÑA,base.state_co_18,base.co +co54518,54518,PAMPLONA,base.state_co_18,base.co +co54520,54520,PAMPLONITA,base.state_co_18,base.co +co54553,54553,PUERTO SANTANDER,base.state_co_18,base.co +co54599,54599,RAGONVALIA,base.state_co_18,base.co +co54660,54660,SALAZAR,base.state_co_18,base.co +co54670,54670,SAN CALIXTO,base.state_co_18,base.co +co54673,54673,SAN CAYETANO,base.state_co_18,base.co +co54680,54680,SANTIAGO,base.state_co_18,base.co +co54720,54720,SARDINATA,base.state_co_18,base.co +co54743,54743,SILOS,base.state_co_18,base.co +co54800,54800,TEORAMA,base.state_co_18,base.co +co54810,54810,TIBU,base.state_co_18,base.co +co54820,54820,TOLEDO,base.state_co_18,base.co +co54871,54871,VILLA CARO,base.state_co_18,base.co +co54874,54874,VILLA DEL ROSARIO,base.state_co_18,base.co +co86219,86219,COLON,base.state_co_27,base.co +co86573,86573,LEGUIZAMO,base.state_co_27,base.co +co86001,86001,MOCOA,base.state_co_27,base.co +co86320,86320,ORITO,base.state_co_27,base.co +co86568,86568,PUERTO ASIS,base.state_co_27,base.co +co86569,86569,PUERTO CAICEDO,base.state_co_27,base.co +co86571,86571,PUERTO GUZMAN,base.state_co_27,base.co +co86755,86755,SAN FRANCISCO,base.state_co_27,base.co +co86757,86757,SAN MIGUEL,base.state_co_27,base.co +co86760,86760,SANTIAGO,base.state_co_27,base.co +co86749,86749,SIBUNDOY,base.state_co_27,base.co +co86865,86865,VALLE DEL GUAMUEZ,base.state_co_27,base.co +co86885,86885,VILLAGARZON,base.state_co_27,base.co +co63001,63001,ARMENIA,base.state_co_19,base.co +co63111,63111,BUENAVISTA,base.state_co_19,base.co +co63130,63130,CALARCA,base.state_co_19,base.co +co63190,63190,CIRCASIA,base.state_co_19,base.co +co63212,63212,CORDOBA,base.state_co_19,base.co +co63272,63272,FILANDIA,base.state_co_19,base.co +co63302,63302,GENOVA,base.state_co_19,base.co +co63401,63401,LA TEBAIDA,base.state_co_19,base.co +co63470,63470,MONTENEGRO,base.state_co_19,base.co +co63548,63548,PIJAO,base.state_co_19,base.co +co63594,63594,QUIMBAYA,base.state_co_19,base.co +co63690,63690,SALENTO,base.state_co_19,base.co +co66045,66045,APIA,base.state_co_20,base.co +co66075,66075,BALBOA,base.state_co_20,base.co +co66088,66088,BELEN DE UMBRIA,base.state_co_20,base.co +co66170,66170,DOSQUEBRADAS,base.state_co_20,base.co +co66318,66318,GUATICA,base.state_co_20,base.co +co66383,66383,LA CELIA,base.state_co_20,base.co +co66400,66400,LA VIRGINIA,base.state_co_20,base.co +co66440,66440,MARSELLA,base.state_co_20,base.co +co66456,66456,MISTRATO,base.state_co_20,base.co +co66001,66001,PEREIRA,base.state_co_20,base.co +co66572,66572,PUEBLO RICO,base.state_co_20,base.co +co66594,66594,QUINCHIA,base.state_co_20,base.co +co66682,66682,SANTA ROSA DE CABAL,base.state_co_20,base.co +co66687,66687,SANTUARIO,base.state_co_20,base.co +co68013,68013,AGUADA,base.state_co_21,base.co +co68020,68020,ALBANIA,base.state_co_21,base.co +co68051,68051,ARATOCA,base.state_co_21,base.co +co68077,68077,BARBOSA,base.state_co_21,base.co +co68079,68079,BARICHARA,base.state_co_21,base.co +co68081,68081,BARRANCABERMEJA,base.state_co_21,base.co +co68092,68092,BETULIA,base.state_co_21,base.co +co68101,68101,BOLIVAR,base.state_co_21,base.co +co68001,68001,BUCARAMANGA,base.state_co_21,base.co +co68121,68121,CABRERA,base.state_co_21,base.co +co68132,68132,CALIFORNIA,base.state_co_21,base.co +co68147,68147,CAPITANEJO,base.state_co_21,base.co +co68152,68152,CARCASI,base.state_co_21,base.co +co68160,68160,CEPITA,base.state_co_21,base.co +co68162,68162,CERRITO,base.state_co_21,base.co +co68167,68167,CHARALA,base.state_co_21,base.co +co68169,68169,CHARTA,base.state_co_21,base.co +co68176,68176,CHIMA,base.state_co_21,base.co +co68179,68179,CHIPATA,base.state_co_21,base.co +co68190,68190,CIMITARRA,base.state_co_21,base.co +co68207,68207,CONCEPCION,base.state_co_21,base.co +co68209,68209,CONFINES,base.state_co_21,base.co +co68211,68211,CONTRATACION,base.state_co_21,base.co +co68217,68217,COROMORO,base.state_co_21,base.co +co68229,68229,CURITI,base.state_co_21,base.co +co68235,68235,EL CARMEN DE CHUCURI,base.state_co_21,base.co +co68245,68245,EL GUACAMAYO,base.state_co_21,base.co +co68250,68250,EL PEÑON,base.state_co_21,base.co +co68255,68255,EL PLAYON,base.state_co_21,base.co +co68264,68264,ENCINO,base.state_co_21,base.co +co68266,68266,ENCISO,base.state_co_21,base.co +co68271,68271,FLORIAN,base.state_co_21,base.co +co68276,68276,FLORIDABLANCA,base.state_co_21,base.co +co68296,68296,GALAN,base.state_co_21,base.co +co68298,68298,GAMBITA,base.state_co_21,base.co +co68327,68327,GÜEPSA,base.state_co_21,base.co +co68307,68307,GIRON,base.state_co_21,base.co +co68318,68318,GUACA,base.state_co_21,base.co +co68320,68320,GUADALUPE,base.state_co_21,base.co +co68322,68322,GUAPOTA,base.state_co_21,base.co +co68324,68324,GUAVATA,base.state_co_21,base.co +co68344,68344,HATO,base.state_co_21,base.co +co68368,68368,JESUS MARIA,base.state_co_21,base.co +co68370,68370,JORDAN,base.state_co_21,base.co +co68377,68377,LA BELLEZA,base.state_co_21,base.co +co68397,68397,LA PAZ,base.state_co_21,base.co +co68385,68385,LANDAZURI,base.state_co_21,base.co +co68406,68406,LEBRIJA,base.state_co_21,base.co +co68418,68418,LOS SANTOS,base.state_co_21,base.co +co68425,68425,MACARAVITA,base.state_co_21,base.co +co68432,68432,MALAGA,base.state_co_21,base.co +co68444,68444,MATANZA,base.state_co_21,base.co +co68464,68464,MOGOTES,base.state_co_21,base.co +co68468,68468,MOLAGAVITA,base.state_co_21,base.co +co68498,68498,OCAMONTE,base.state_co_21,base.co +co68500,68500,OIBA,base.state_co_21,base.co +co68502,68502,ONZAGA,base.state_co_21,base.co +co68522,68522,PALMAR,base.state_co_21,base.co +co68524,68524,PALMAS DEL SOCORRO,base.state_co_21,base.co +co68533,68533,PARAMO,base.state_co_21,base.co +co68547,68547,PIEDECUESTA,base.state_co_21,base.co +co68549,68549,PINCHOTE,base.state_co_21,base.co +co68572,68572,PUENTE NACIONAL,base.state_co_21,base.co +co68573,68573,PUERTO PARRA,base.state_co_21,base.co +co68575,68575,PUERTO WILCHES,base.state_co_21,base.co +co68615,68615,RIONEGRO,base.state_co_21,base.co +co68655,68655,SABANA DE TORRES,base.state_co_21,base.co +co68669,68669,SAN ANDRES,base.state_co_21,base.co +co68673,68673,SAN BENITO,base.state_co_21,base.co +co68679,68679,SAN GIL,base.state_co_21,base.co +co68682,68682,SAN JOAQUIN,base.state_co_21,base.co +co68684,68684,SAN JOSE DE MIRANDA,base.state_co_21,base.co +co68686,68686,SAN MIGUEL,base.state_co_21,base.co +co68689,68689,SAN VICENTE DE CHUCURI,base.state_co_21,base.co +co68705,68705,SANTA BARBARA,base.state_co_21,base.co +co68720,68720,SANTA HELENA DEL OPON,base.state_co_21,base.co +co68745,68745,SIMACOTA,base.state_co_21,base.co +co68755,68755,SOCORRO,base.state_co_21,base.co +co68770,68770,SUAITA,base.state_co_21,base.co +co68773,68773,SUCRE,base.state_co_21,base.co +co68780,68780,SURATA,base.state_co_21,base.co +co68820,68820,TONA,base.state_co_21,base.co +co68855,68855,VALLE DE SAN JOSE,base.state_co_21,base.co +co68861,68861,VELEZ,base.state_co_21,base.co +co68867,68867,VETAS,base.state_co_21,base.co +co68872,68872,VILLANUEVA,base.state_co_21,base.co +co68895,68895,ZAPATOCA,base.state_co_21,base.co +co70110,70110,BUENAVISTA,base.state_co_22,base.co +co70124,70124,CAIMITO,base.state_co_22,base.co +co70230,70230,CHALAN,base.state_co_22,base.co +co70204,70204,COLOSO,base.state_co_22,base.co +co70215,70215,COROZAL,base.state_co_22,base.co +co70221,70221,COVEÑAS,base.state_co_22,base.co +co70233,70233,EL ROBLE,base.state_co_22,base.co +co70235,70235,GALERAS,base.state_co_22,base.co +co70265,70265,GUARANDA,base.state_co_22,base.co +co70400,70400,LA UNION,base.state_co_22,base.co +co70418,70418,LOS PALMITOS,base.state_co_22,base.co +co70429,70429,MAJAGUAL,base.state_co_22,base.co +co70473,70473,MORROA,base.state_co_22,base.co +co70508,70508,OVEJAS,base.state_co_22,base.co +co70523,70523,PALMITO,base.state_co_22,base.co +co70670,70670,SAMPUES,base.state_co_22,base.co +co70678,70678,SAN BENITO ABAD,base.state_co_22,base.co +co70702,70702,SAN JUAN DE BETULIA,base.state_co_22,base.co +co70742,70742,SAN LUIS DE SINCE,base.state_co_22,base.co +co70708,70708,SAN MARCOS,base.state_co_22,base.co +co70713,70713,SAN ONOFRE,base.state_co_22,base.co +co70717,70717,SAN PEDRO,base.state_co_22,base.co +co70820,70820,SANTIAGO DE TOLU,base.state_co_22,base.co +co70001,70001,SINCELEJO,base.state_co_22,base.co +co70771,70771,SUCRE,base.state_co_22,base.co +co70823,70823,TOLU VIEJO,base.state_co_22,base.co +co73024,73024,ALPUJARRA,base.state_co_23,base.co +co73026,73026,ALVARADO,base.state_co_23,base.co +co73030,73030,AMBALEMA,base.state_co_23,base.co +co73043,73043,ANZOATEGUI,base.state_co_23,base.co +co73055,73055,ARMERO,base.state_co_23,base.co +co73067,73067,ATACO,base.state_co_23,base.co +co73124,73124,CAJAMARCA,base.state_co_23,base.co +co73148,73148,CARMEN DE APICALA,base.state_co_23,base.co +co73152,73152,CASABIANCA,base.state_co_23,base.co +co73168,73168,CHAPARRAL,base.state_co_23,base.co +co73200,73200,COELLO,base.state_co_23,base.co +co73217,73217,COYAIMA,base.state_co_23,base.co +co73226,73226,CUNDAY,base.state_co_23,base.co +co73236,73236,DOLORES,base.state_co_23,base.co +co73268,73268,ESPINAL,base.state_co_23,base.co +co73270,73270,FALAN,base.state_co_23,base.co +co73275,73275,FLANDES,base.state_co_23,base.co +co73283,73283,FRESNO,base.state_co_23,base.co +co73319,73319,GUAMO,base.state_co_23,base.co +co73347,73347,HERVEO,base.state_co_23,base.co +co73349,73349,HONDA,base.state_co_23,base.co +co73001,73001,IBAGUE,base.state_co_23,base.co +co73352,73352,ICONONZO,base.state_co_23,base.co +co73408,73408,LERIDA,base.state_co_23,base.co +co73411,73411,LIBANO,base.state_co_23,base.co +co73443,73443,MARIQUITA,base.state_co_23,base.co +co73449,73449,MELGAR,base.state_co_23,base.co +co73461,73461,MURILLO,base.state_co_23,base.co +co73483,73483,NATAGAIMA,base.state_co_23,base.co +co73504,73504,ORTEGA,base.state_co_23,base.co +co73520,73520,PALOCABILDO,base.state_co_23,base.co +co73547,73547,PIEDRAS,base.state_co_23,base.co +co73555,73555,PLANADAS,base.state_co_23,base.co +co73563,73563,PRADO,base.state_co_23,base.co +co73585,73585,PURIFICACION,base.state_co_23,base.co +co73616,73616,RIOBLANCO,base.state_co_23,base.co +co73622,73622,RONCESVALLES,base.state_co_23,base.co +co73624,73624,ROVIRA,base.state_co_23,base.co +co73671,73671,SALDAÑA,base.state_co_23,base.co +co73675,73675,SAN ANTONIO,base.state_co_23,base.co +co73678,73678,SAN LUIS,base.state_co_23,base.co +co73686,73686,SANTA ISABEL,base.state_co_23,base.co +co73770,73770,SUAREZ,base.state_co_23,base.co +co73854,73854,VALLE DE SAN JUAN,base.state_co_23,base.co +co73861,73861,VENADILLO,base.state_co_23,base.co +co73870,73870,VILLAHERMOSA,base.state_co_23,base.co +co73873,73873,VILLARRICA,base.state_co_23,base.co +co76020,76020,ALCALA,base.state_co_24,base.co +co76036,76036,ANDALUCIA,base.state_co_24,base.co +co76041,76041,ANSERMANUEVO,base.state_co_24,base.co +co76054,76054,ARGELIA,base.state_co_24,base.co +co76100,76100,BOLIVAR,base.state_co_24,base.co +co76109,76109,BUENAVENTURA,base.state_co_24,base.co +co76113,76113,BUGALAGRANDE,base.state_co_24,base.co +co76122,76122,CAICEDONIA,base.state_co_24,base.co +co76001,76001,CALI,base.state_co_24,base.co +co76126,76126,CALIMA,base.state_co_24,base.co +co76130,76130,CANDELARIA,base.state_co_24,base.co +co76147,76147,CARTAGO,base.state_co_24,base.co +co76233,76233,DAGUA,base.state_co_24,base.co +co76243,76243,EL AGUILA,base.state_co_24,base.co +co76246,76246,EL CAIRO,base.state_co_24,base.co +co76248,76248,EL CERRITO,base.state_co_24,base.co +co76250,76250,EL DOVIO,base.state_co_24,base.co +co76275,76275,FLORIDA,base.state_co_24,base.co +co76306,76306,GINEBRA,base.state_co_24,base.co +co76318,76318,GUACARI,base.state_co_24,base.co +co76111,76111,GUADALAJARA DE BUGA,base.state_co_24,base.co +co76364,76364,JAMUNDI,base.state_co_24,base.co +co76377,76377,LA CUMBRE,base.state_co_24,base.co +co76400,76400,LA UNION,base.state_co_24,base.co +co76403,76403,LA VICTORIA,base.state_co_24,base.co +co76497,76497,OBANDO,base.state_co_24,base.co +co76520,76520,PALMIRA,base.state_co_24,base.co +co76563,76563,PRADERA,base.state_co_24,base.co +co76606,76606,RESTREPO,base.state_co_24,base.co +co76616,76616,RIOFRIO,base.state_co_24,base.co +co76622,76622,ROLDANILLO,base.state_co_24,base.co +co76670,76670,SAN PEDRO,base.state_co_24,base.co +co76736,76736,SEVILLA,base.state_co_24,base.co +co76823,76823,TORO,base.state_co_24,base.co +co76828,76828,TRUJILLO,base.state_co_24,base.co +co76834,76834,TULUA,base.state_co_24,base.co +co76845,76845,ULLOA,base.state_co_24,base.co +co76863,76863,VERSALLES,base.state_co_24,base.co +co76869,76869,VIJES,base.state_co_24,base.co +co76890,76890,YOTOCO,base.state_co_24,base.co +co76892,76892,YUMBO,base.state_co_24,base.co +co76895,76895,ZARZAL,base.state_co_24,base.co +co97161,97161,CARURU,base.state_co_32,base.co +co97001,97001,MITU,base.state_co_32,base.co +co97511,97511,PACOA,base.state_co_32,base.co +co97777,97777,PAPUNAUA,base.state_co_32,base.co +co97666,97666,TARAIRA,base.state_co_32,base.co +co97889,97889,YAVARATE,base.state_co_32,base.co +co99773,99773,CUMARIBO,base.state_co_33,base.co +co99524,99524,LA PRIMAVERA,base.state_co_33,base.co +co99001,99001,PUERTO CARREÑO,base.state_co_33,base.co +co99624,99624,SANTA ROSALIA,base.state_co_33,base.co \ No newline at end of file diff --git a/l10n_co_base_location/data/res.city.zip.csv b/l10n_co_base_location/data/res.city.zip.csv new file mode 100644 index 0000000..ff5ee66 --- /dev/null +++ b/l10n_co_base_location/data/res.city.zip.csv @@ -0,0 +1,3682 @@ +id,name,city_id:id,type +co913010,913010,co91263,Urbano +co913019,913019,co91263,Rural +co913018,913018,co91263,Rural +co913017,913017,co91263,Rural +co914057,914057,co91405,Rural +co914050,914050,co91405,Urbano +co917010,917010,co91407,Urbano +co917017,917017,co91407,Rural +co917018,917018,co91407,Rural +co916017,916017,co91430,Rural +co910001,910001,co91001,Urbano +co910007,910007,co91001,Rural +co910008,910008,co91001,Rural +co916057,916057,co91460,Rural +co916058,916058,co91460,Rural +co913050,913050,co91530,Urbano +co913057,913057,co91530,Rural +co912010,912010,co91536,Urbano +co912018,912018,co91536,Rural +co912019,912019,co91536,Rural +co912017,912017,co91536,Rural +co911017,911017,co91540,Rural +co911010,911010,co91540,Urbano +co911018,911018,co91540,Rural +co915010,915010,co91669,Urbano +co915019,915019,co91669,Rural +co915018,915018,co91669,Rural +co915017,915017,co91669,Rural +co911030,911030,co91798,Urbano +co911037,911037,co91798,Rural +co911039,911039,co91798,Rural +co911038,911038,co91798,Rural +co055030,055030,co05002,Urbano +co055038,055038,co05002,Rural +co055037,055037,co05002,Rural +co057460,057460,co05004,Urbano +co057467,057467,co05004,Rural +co053820,053820,co05021,Urbano +co053827,053827,co05021,Rural +co055840,055840,co05030,Urbano +co055847,055847,co05030,Rural +co055848,055848,co05030,Rural +co052840,052840,co05031,Urbano +co052848,052848,co05031,Rural +co052847,052847,co05031,Rural +co056068,056068,co05034,Rural +co056067,056067,co05034,Rural +co056060,056060,co05034,Urbano +co055830,055830,co05036,Urbano +co055837,055837,co05036,Rural +co051810,051810,co05038,Urbano +co051818,051818,co05038,Rural +co051817,051817,co05038,Rural +co052857,052857,co05040,Rural +co052850,052850,co05040,Urbano +co056850,056850,co05044,Urbano +co056858,056858,co05044,Rural +co056857,056857,co05044,Rural +co057841,057841,co05045,Urbano +co057840,057840,co05045,Urbano +co057847,057847,co05045,Rural +co057820,057820,co05051,Urbano +co057828,057828,co05051,Rural +co057827,057827,co05051,Rural +co057829,057829,co05051,Rural +co054838,054838,co05055,Rural +co054830,054830,co05055,Urbano +co054837,054837,co05055,Rural +co055860,055860,co05059,Urbano +co055867,055867,co05059,Rural +co051028,051028,co05079,Rural +co051027,051027,co05079,Rural +co051020,051020,co05079,Urbano +co051050,051050,co05088,Urbano +co051057,051057,co05088,Rural +co051059,051059,co05088,Rural +co051051,051051,co05088,Urbano +co051058,051058,co05088,Rural +co051052,051052,co05088,Urbano +co051054,051054,co05088,Urbano +co051053,051053,co05088,Urbano +co051420,051420,co05086,Urbano +co051427,051427,co05086,Rural +co056070,056070,co05091,Urbano +co056077,056077,co05091,Rural +co056860,056860,co05093,Urbano +co056867,056867,co05093,Rural +co056868,056868,co05093,Rural +co052060,052060,co05107,Urbano +co052067,052067,co05107,Rural +co052068,052068,co05107,Rural +co057030,057030,co05113,Urbano +co057037,057037,co05113,Rural +co057038,057038,co05113,Rural +co057067,057067,co05138,Rural +co057068,057068,co05138,Rural +co057060,057060,co05138,Urbano +co052450,052450,co05120,Urbano +co052458,052458,co05120,Rural +co052457,052457,co05120,Rural +co056840,056840,co05125,Urbano +co056847,056847,co05125,Rural +co055440,055440,co05129,Urbano +co055448,055448,co05129,Rural +co055447,055447,co05129,Rural +co052020,052020,co05134,Urbano +co052027,052027,co05134,Rural +co053450,053450,co05142,Urbano +co053457,053457,co05142,Rural +co056040,056040,co05145,Urbano +co056047,056047,co05145,Rural +co057850,057850,co05147,Urbano +co057857,057857,co05147,Rural +co057858,057858,co05147,Rural +co051840,051840,co05150,Urbano +co051847,051847,co05150,Rural +co052410,052410,co05154,Urbano +co052418,052418,co05154,Rural +co052417,052417,co05154,Rural +co057410,057410,co05172,Urbano +co057417,057417,co05172,Rural +co057418,057418,co05172,Rural +co053050,053050,co05190,Urbano +co053057,053057,co05190,Rural +co056460,056460,co05101,Urbano +co056467,056467,co05101,Rural +co056468,056468,co05101,Rural +co054440,054440,co05197,Urbano +co054447,054447,co05197,Rural +co054448,054448,co05197,Rural +co053810,053810,co05206,Urbano +co053817,053817,co05206,Rural +co056410,056410,co05209,Urbano +co056417,056417,co05209,Rural +co051047,051047,co05212,Rural +co051040,051040,co05212,Urbano +co051048,051048,co05212,Rural +co057430,057430,co05234,Urbano +co057437,057437,co05234,Rural +co057438,057438,co05234,Rural +co051850,051850,co05237,Urbano +co051858,051858,co05237,Rural +co051857,051857,co05237,Rural +co055810,055810,co05240,Urbano +co055817,055817,co05240,Rural +co055818,055818,co05240,Rural +co052437,052437,co05250,Rural +co052438,052438,co05250,Rural +co052430,052430,co05250,Urbano +co054037,054037,co05148,Rural +co054030,054030,co05148,Urbano +co054038,054038,co05148,Rural +co054450,054450,co05697,Urbano +co054457,054457,co05697,Rural +co051430,051430,co05264,Urbano +co051437,051437,co05264,Rural +co055428,055428,co05266,Rural +co055427,055427,co05266,Rural +co055421,055421,co05266,Urbano +co055422,055422,co05266,Urbano +co055420,055420,co05266,Urbano +co055070,055070,co05282,Urbano +co055077,055077,co05282,Rural +co055078,055078,co05282,Rural +co057450,057450,co05284,Urbano +co057457,057457,co05284,Rural +co057458,057458,co05284,Rural +co057040,057040,co05306,Urbano +co057047,057047,co05306,Rural +co051038,051038,co05308,Rural +co051037,051037,co05308,Rural +co051030,051030,co05308,Urbano +co051830,051830,co05310,Urbano +co051838,051838,co05310,Rural +co051837,051837,co05310,Rural +co054410,054410,co05313,Urbano +co054417,054417,co05313,Rural +co051820,051820,co05315,Urbano +co051827,051827,co05315,Rural +co054050,054050,co05318,Urbano +co054058,054058,co05318,Rural +co054057,054057,co05318,Rural +co053840,053840,co05321,Urbano +co053847,053847,co05321,Rural +co055820,055820,co05347,Urbano +co055827,055827,co05347,Rural +co056450,056450,co05353,Urbano +co056457,056457,co05353,Rural +co055411,055411,co05360,Urbano +co055412,055412,co05360,Urbano +co055410,055410,co05360,Urbano +co055417,055417,co05360,Rural +co055413,055413,co05360,Urbano +co052070,052070,co05361,Urbano +co052079,052079,co05361,Rural +co052078,052078,co05361,Rural +co052077,052077,co05361,Rural +co056050,056050,co05364,Urbano +co056057,056057,co05364,Rural +co056010,056010,co05368,Urbano +co056017,056017,co05368,Rural +co055017,055017,co05376,Rural +co055018,055018,co05376,Rural +co055010,055010,co05376,Urbano +co055467,055467,co05380,Rural +co055460,055460,co05380,Urbano +co055468,055468,co05380,Rural +co055060,055060,co05390,Urbano +co055067,055067,co05390,Rural +co055068,055068,co05390,Rural +co055020,055020,co05400,Urbano +co055027,055027,co05400,Rural +co055028,055028,co05400,Rural +co051460,051460,co05411,Urbano +co051468,051468,co05411,Rural +co051467,051467,co05411,Rural +co053460,053460,co05425,Urbano +co053467,053467,co05425,Rural +co054020,054020,co05440,Urbano +co054027,054027,co05440,Rural +co054028,054028,co05440,Rural +co050013,050013,co05001,Urbano +co050017,050017,co05001,Rural +co050002,050002,co05001,Urbano +co050007,050007,co05001,Rural +co050041,050041,co05001,Urbano +co050021,050021,co05001,Urbano +co050024,050024,co05001,Urbano +co050006,050006,co05001,Urbano +co050020,050020,co05001,Urbano +co050016,050016,co05001,Urbano +co050014,050014,co05001,Urbano +co050043,050043,co05001,Urbano +co050037,050037,co05001,Rural +co050048,050048,co05001,Rural +co050031,050031,co05001,Urbano +co050025,050025,co05001,Urbano +co050030,050030,co05001,Urbano +co050018,050018,co05001,Rural +co050015,050015,co05001,Urbano +co050027,050027,co05001,Rural +co050044,050044,co05001,Urbano +co050003,050003,co05001,Urbano +co050004,050004,co05001,Urbano +co050011,050011,co05001,Urbano +co050047,050047,co05001,Rural +co050035,050035,co05001,Urbano +co050036,050036,co05001,Urbano +co050022,050022,co05001,Urbano +co050040,050040,co05001,Urbano +co050010,050010,co05001,Urbano +co050001,050001,co05001,Urbano +co050032,050032,co05001,Urbano +co050028,050028,co05001,Rural +co050042,050042,co05001,Urbano +co050023,050023,co05001,Urbano +co050034,050034,co05001,Urbano +co050029,050029,co05001,Rural +co050005,050005,co05001,Urbano +co050033,050033,co05001,Urbano +co050012,050012,co05001,Urbano +co050026,050026,co05001,Urbano +co055040,055040,co05467,Urbano +co055047,055047,co05467,Rural +co055048,055048,co05467,Rural +co056810,056810,co05475,Urbano +co056817,056817,co05475,Rural +co056818,056818,co05475,Rural +co057427,057427,co05480,Rural +co057420,057420,co05480,Urbano +co057428,057428,co05480,Rural +co054840,054840,co05483,Urbano +co054848,054848,co05483,Rural +co054847,054847,co05483,Rural +co052420,052420,co05495,Urbano +co052427,052427,co05495,Rural +co052428,052428,co05495,Rural +co057870,057870,co05490,Urbano +co057877,057877,co05490,Rural +co057878,057878,co05490,Rural +co051450,051450,co05501,Urbano +co051457,051457,co05501,Rural +co053850,053850,co05541,Urbano +co053857,053857,co05541,Rural +co057010,057010,co05543,Urbano +co057017,057017,co05543,Rural +co057018,057018,co05543,Rural +co056440,056440,co05576,Urbano +co056447,056447,co05576,Rural +co053420,053420,co05579,Urbano +co053427,053427,co05579,Rural +co053428,053428,co05579,Rural +co053430,053430,co05585,Urbano +co053437,053437,co05585,Rural +co053440,053440,co05591,Urbano +co053448,053448,co05591,Rural +co053447,053447,co05591,Rural +co052820,052820,co05604,Urbano +co052827,052827,co05604,Rural +co052828,052828,co05604,Rural +co055438,055438,co05607,Rural +co055437,055437,co05607,Rural +co055430,055430,co05607,Urbano +co054040,054040,co05615,Urbano +co054047,054047,co05615,Rural +co054048,054048,co05615,Rural +co057020,057020,co05628,Urbano +co057028,057028,co05628,Rural +co057027,057027,co05628,Rural +co055450,055450,co05631,Urbano +co055457,055457,co05631,Rural +co056478,056478,co05642,Rural +co056477,056477,co05642,Rural +co056470,056470,co05642,Urbano +co052040,052040,co05647,Urbano +co052047,052047,co05647,Rural +co054420,054420,co05649,Urbano +co054427,054427,co05649,Rural +co054428,054428,co05649,Rural +co054810,054810,co05652,Urbano +co054818,054818,co05652,Rural +co054817,054817,co05652,Rural +co051070,051070,co05656,Urbano +co051077,051077,co05656,Rural +co051410,051410,co05658,Urbano +co051417,051417,co05658,Rural +co057810,057810,co05659,Urbano +co057817,057817,co05659,Rural +co054430,054430,co05660,Urbano +co054437,054437,co05660,Rural +co054438,054438,co05660,Rural +co051010,051010,co05664,Urbano +co051017,051017,co05664,Rural +co057830,057830,co05665,Urbano +co057839,057839,co05665,Rural +co057838,057838,co05665,Rural +co057837,057837,co05665,Rural +co053838,053838,co05667,Rural +co053830,053830,co05667,Urbano +co053837,053837,co05667,Rural +co053030,053030,co05670,Urbano +co053037,053037,co05670,Rural +co054010,054010,co05674,Urbano +co054017,054017,co05674,Rural +co054018,054018,co05674,Rural +co055050,055050,co05679,Urbano +co055057,055057,co05679,Rural +co055058,055058,co05679,Rural +co051860,051860,co05686,Urbano +co051868,051868,co05686,Rural +co051867,051867,co05686,Rural +co057050,057050,co05042,Urbano +co057057,057057,co05042,Rural +co057058,057058,co05042,Rural +co053040,053040,co05690,Urbano +co053048,053048,co05690,Rural +co053047,053047,co05690,Rural +co052810,052810,co05736,Urbano +co052818,052818,co05736,Rural +co052817,052817,co05736,Rural +co054820,054820,co05756,Urbano +co054827,054827,co05756,Rural +co054829,054829,co05756,Rural +co054828,054828,co05756,Rural +co051440,051440,co05761,Urbano +co051448,051448,co05761,Rural +co051447,051447,co05761,Rural +co056020,056020,co05789,Urbano +co056027,056027,co05789,Rural +co056028,056028,co05789,Rural +co052460,052460,co05790,Urbano +co052467,052467,co05790,Rural +co052468,052468,co05790,Rural +co056430,056430,co05792,Urbano +co056437,056437,co05792,Rural +co056438,056438,co05792,Rural +co055858,055858,co05809,Rural +co055850,055850,co05809,Urbano +co055857,055857,co05809,Rural +co052050,052050,co05819,Urbano +co052057,052057,co05819,Rural +co057860,057860,co05837,Urbano +co057869,057869,co05837,Rural +co057868,057868,co05837,Rural +co057867,057867,co05837,Rural +co057440,057440,co05842,Urbano +co057447,057447,co05842,Rural +co056830,056830,co05847,Urbano +co056838,056838,co05847,Rural +co056837,056837,co05847,Rural +co052010,052010,co05854,Urbano +co052018,052018,co05854,Rural +co052017,052017,co05854,Rural +co056030,056030,co05856,Urbano +co056037,056037,co05856,Rural +co052830,052830,co05858,Urbano +co052837,052837,co05858,Rural +co056420,056420,co05861,Urbano +co056427,056427,co05861,Rural +co056820,056820,co05873,Urbano +co056828,056828,co05873,Rural +co056827,056827,co05873,Rural +co053010,053010,co05885,Urbano +co053017,053017,co05885,Rural +co052030,052030,co05887,Urbano +co052037,052037,co05887,Rural +co052038,052038,co05887,Rural +co053020,053020,co05890,Urbano +co053028,053028,co05890,Rural +co053027,053027,co05890,Rural +co053410,053410,co05893,Urbano +co053417,053417,co05893,Rural +co053418,053418,co05893,Rural +co052440,052440,co05895,Urbano +co052447,052447,co05895,Rural +co052448,052448,co05895,Rural +co810001,810001,co81001,Urbano +co810007,810007,co81001,Rural +co810008,810008,co81001,Rural +co810009,810009,co81001,Rural +co816010,816010,co81065,Urbano +co816017,816017,co81065,Rural +co816019,816019,co81065,Rural +co816018,816018,co81065,Rural +co812010,812010,co81220,Urbano +co812018,812018,co81220,Rural +co812017,812017,co81220,Rural +co812019,812019,co81220,Rural +co814050,814050,co81300,Urbano +co814057,814057,co81300,Rural +co814058,814058,co81300,Rural +co813010,813010,co81591,Urbano +co813017,813017,co81591,Rural +co813018,813018,co81591,Rural +co815010,815010,co81736,Urbano +co815018,815018,co81736,Rural +co815017,815017,co81736,Rural +co814018,814018,co81794,Rural +co814017,814017,co81794,Rural +co814010,814010,co81794,Urbano +co880027,880027,co88564,Rural +co880020,880020,co88564,Urbano +co880028,880028,co88564,Rural +co880008,880008,co88001,Rural +co880001,880001,co88001,Urbano +co880007,880007,co88001,Rural +co082027,082027,co08078,Rural +co082028,082028,co08078,Rural +co082020,082020,co08078,Urbano +co080010,080010,co08001,Urbano +co080016,080016,co08001,Urbano +co080004,080004,co08001,Urbano +co080002,080002,co08001,Urbano +co080007,080007,co08001,Rural +co080014,080014,co08001,Urbano +co080012,080012,co08001,Urbano +co080001,080001,co08001,Urbano +co080005,080005,co08001,Urbano +co080011,080011,co08001,Urbano +co080013,080013,co08001,Urbano +co080003,080003,co08001,Urbano +co080015,080015,co08001,Urbano +co080006,080006,co08001,Urbano +co080020,080020,co08001,Urbano +co084040,084040,co08137,Urbano +co084047,084047,co08137,Rural +co084020,084020,co08141,Urbano +co084027,084027,co08141,Rural +co082001,082001,co08296,Urbano +co082007,082007,co08296,Rural +co081048,081048,co08372,Rural +co081047,081047,co08372,Rural +co081040,081040,co08372,Urbano +co085060,085060,co08421,Urbano +co085068,085068,co08421,Rural +co085067,085067,co08421,Rural +co083027,083027,co08433,Rural +co083028,083028,co08433,Rural +co083021,083021,co08433,Urbano +co083020,083020,co08433,Urbano +co085020,085020,co08436,Urbano +co085027,085027,co08436,Rural +co083087,083087,co08520,Rural +co083080,083080,co08520,Urbano +co081060,081060,co08549,Urbano +co081067,081067,co08549,Rural +co082040,082040,co08558,Urbano +co082047,082047,co08558,Rural +co084001,084001,co08560,Urbano +co084007,084007,co08560,Rural +co084008,084008,co08560,Rural +co081008,081008,co08573,Rural +co081007,081007,co08573,Rural +co081001,081001,co08573,Urbano +co085040,085040,co08606,Urbano +co085048,085048,co08606,Rural +co085047,085047,co08606,Rural +co083040,083040,co08634,Urbano +co083047,083047,co08634,Rural +co085001,085001,co08638,Urbano +co085009,085009,co08638,Rural +co085007,085007,co08638,Rural +co085008,085008,co08638,Rural +co084080,084080,co08675,Urbano +co084087,084087,co08675,Rural +co083067,083067,co08685,Rural +co083060,083060,co08685,Urbano +co083007,083007,co08758,Rural +co083005,083005,co08758,Urbano +co083003,083003,co08758,Urbano +co083002,083002,co08758,Urbano +co083004,083004,co08758,Urbano +co083010,083010,co08758,Urbano +co083001,083001,co08758,Urbano +co083006,083006,co08758,Urbano +co084060,084060,co08770,Urbano +co084067,084067,co08770,Rural +co081027,081027,co08832,Rural +co081028,081028,co08832,Rural +co081020,081020,co08832,Urbano +co082067,082067,co08849,Rural +co082060,082060,co08849,Urbano +co111511,111511,co11001,Urbano +co111221,111221,co11001,Urbano +co111211,111211,co11001,Urbano +co110721,110721,co11001,Urbano +co110741,110741,co11001,Urbano +co110711,110711,co11001,Urbano +co110731,110731,co11001,Urbano +co111711,111711,co11001,Urbano +co110221,110221,co11001,Urbano +co110211,110211,co11001,Urbano +co110231,110231,co11001,Urbano +co111971,111971,co11001,Rural +co111981,111981,co11001,Rural +co111961,111961,co11001,Urbano +co111921,111921,co11001,Urbano +co111911,111911,co11001,Urbano +co111951,111951,co11001,Urbano +co111931,111931,co11001,Urbano +co111941,111941,co11001,Urbano +co111041,111041,co11001,Urbano +co111011,111011,co11001,Urbano +co111021,111021,co11001,Urbano +co111031,111031,co11001,Urbano +co111061,111061,co11001,Urbano +co111071,111071,co11001,Urbano +co111051,111051,co11001,Urbano +co110931,110931,co11001,Urbano +co110911,110911,co11001,Urbano +co110921,110921,co11001,Urbano +co110831,110831,co11001,Urbano +co110851,110851,co11001,Urbano +co110841,110841,co11001,Urbano +co110871,110871,co11001,Urbano +co110821,110821,co11001,Urbano +co110811,110811,co11001,Urbano +co110861,110861,co11001,Urbano +co110881,110881,co11001,Urbano +co111411,111411,co11001,Urbano +co111631,111631,co11001,Urbano +co111621,111621,co11001,Urbano +co111611,111611,co11001,Urbano +co111841,111841,co11001,Urbano +co111831,111831,co11001,Urbano +co111811,111811,co11001,Urbano +co111821,111821,co11001,Urbano +co110441,110441,co11001,Urbano +co110411,110411,co11001,Urbano +co110431,110431,co11001,Urbano +co110421,110421,co11001,Urbano +co110311,110311,co11001,Urbano +co110321,110321,co11001,Urbano +co111166,111166,co11001,Urbano +co111131,111131,co11001,Urbano +co111161,111161,co11001,Urbano +co111176,111176,co11001,Urbano +co111141,111141,co11001,Urbano +co111156,111156,co11001,Urbano +co111121,111121,co11001,Urbano +co111111,111111,co11001,Urbano +co111171,111171,co11001,Urbano +co111151,111151,co11001,Urbano +co112041,112041,co11001,Rural +co112031,112031,co11001,Rural +co112021,112021,co11001,Rural +co112011,112011,co11001,Rural +co111321,111321,co11001,Urbano +co111311,111311,co11001,Urbano +co110621,110621,co11001,Urbano +co110611,110611,co11001,Urbano +co110151,110151,co11001,Urbano +co110141,110141,co11001,Urbano +co110121,110121,co11001,Urbano +co110131,110131,co11001,Urbano +co110111,110111,co11001,Urbano +co110531,110531,co11001,Urbano +co110561,110561,co11001,Rural +co110541,110541,co11001,Urbano +co110571,110571,co11001,Rural +co110521,110521,co11001,Urbano +co110511,110511,co11001,Urbano +co110551,110551,co11001,Rural +co134020,134020,co13006,Urbano +co134028,134028,co13006,Rural +co134027,134027,co13006,Rural +co133508,133508,co13030,Rural +co133501,133501,co13030,Urbano +co133507,133507,co13030,Rural +co134520,134520,co13042,Urbano +co134527,134527,co13042,Rural +co131028,131028,co13052,Rural +co131029,131029,co13052,Rural +co131020,131020,co13052,Urbano +co131027,131027,co13052,Rural +co131560,131560,co13062,Urbano +co131567,131567,co13062,Rural +co133517,133517,co13074,Rural +co133518,133518,co13074,Rural +co133510,133510,co13074,Urbano +co131547,131547,co13140,Rural +co131540,131540,co13140,Urbano +co131548,131548,co13140,Rural +co135060,135060,co13160,Urbano +co135067,135067,co13160,Rural +co130019,130019,co13001,Rural +co130018,130018,co13001,Rural +co130005,130005,co13001,Urbano +co130008,130008,co13001,Rural +co130027,130027,co13001,Rural +co130009,130009,co13001,Rural +co130017,130017,co13001,Rural +co130007,130007,co13001,Rural +co130001,130001,co13001,Urbano +co130006,130006,co13001,Urbano +co130012,130012,co13001,Urbano +co130014,130014,co13001,Urbano +co130004,130004,co13001,Urbano +co130002,130002,co13001,Urbano +co130013,130013,co13001,Urbano +co130015,130015,co13001,Urbano +co130010,130010,co13001,Urbano +co130011,130011,co13001,Urbano +co130003,130003,co13001,Urbano +co132550,132550,co13188,Urbano +co132557,132557,co13188,Rural +co130510,130510,co13222,Urbano +co130517,130517,co13222,Rural +co132507,132507,co13212,Rural +co132508,132508,co13212,Rural +co132501,132501,co13212,Urbano +co132058,132058,co13244,Rural +co132057,132057,co13244,Rural +co132050,132050,co13244,Urbano +co132059,132059,co13244,Rural +co132007,132007,co13248,Rural +co132001,132001,co13248,Urbano +co133550,133550,co13268,Urbano +co133558,133558,co13268,Rural +co133557,133557,co13268,Rural +co133040,133040,co13300,Urbano +co133048,133048,co13300,Rural +co133047,133047,co13300,Rural +co133049,133049,co13300,Rural +co132518,132518,co13430,Rural +co132519,132519,co13430,Rural +co132517,132517,co13430,Rural +co132512,132512,co13430,Urbano +co132527,132527,co13430,Rural +co132511,132511,co13430,Urbano +co131048,131048,co13433,Rural +co131047,131047,co13433,Rural +co131040,131040,co13433,Urbano +co133020,133020,co13440,Urbano +co133027,133027,co13440,Rural +co133028,133028,co13440,Rural +co131060,131060,co13442,Urbano +co131077,131077,co13442,Rural +co131069,131069,co13442,Rural +co131068,131068,co13442,Rural +co131067,131067,co13442,Rural +co132560,132560,co13468,Urbano +co132568,132568,co13468,Rural +co132567,132567,co13468,Rural +co134070,134070,co13458,Urbano +co134077,134077,co13458,Rural +co134540,134540,co13473,Urbano +co134548,134548,co13473,Rural +co134547,134547,co13473,Rural +co134510,134510,co13490,Urbano +co134517,134517,co13490,Rural +co134001,134001,co13549,Urbano +co134007,134007,co13549,Rural +co134008,134008,co13549,Rural +co133560,133560,co13580,Urbano +co133567,133567,co13580,Rural +co134501,134501,co13600,Urbano +co134507,134507,co13600,Rural +co131520,131520,co13620,Urbano +co131527,131527,co13620,Rural +co130540,130540,co13647,Urbano +co130547,130547,co13647,Rural +co133007,133007,co13650,Rural +co133001,133001,co13650,Urbano +co133008,133008,co13650,Rural +co132030,132030,co13654,Urbano +co132037,132037,co13654,Rural +co134060,134060,co13655,Urbano +co134068,134068,co13655,Rural +co134067,134067,co13655,Rural +co132010,132010,co13657,Urbano +co132017,132017,co13657,Rural +co132018,132018,co13657,Rural +co133530,133530,co13667,Urbano +co133538,133538,co13667,Rural +co133537,133537,co13667,Rural +co135040,135040,co13670,Urbano +co135047,135047,co13670,Rural +co135048,135048,co13670,Rural +co130501,130501,co13673,Urbano +co130507,130507,co13673,Rural +co130508,130508,co13673,Rural +co130527,130527,co13683,Rural +co130520,130520,co13683,Urbano +co130528,130528,co13683,Rural +co135001,135001,co13688,Urbano +co135007,135007,co13688,Rural +co135008,135008,co13688,Rural +co135020,135020,co13744,Urbano +co135028,135028,co13744,Rural +co135027,135027,co13744,Rural +co131501,131501,co13760,Urbano +co131507,131507,co13760,Rural +co132540,132540,co13780,Urbano +co132548,132548,co13780,Rural +co132547,132547,co13780,Rural +co134040,134040,co13810,Urbano +co134048,134048,co13810,Rural +co134047,134047,co13810,Rural +co131007,131007,co13836,Rural +co131008,131008,co13836,Rural +co131001,131001,co13836,Urbano +co131010,131010,co13838,Urbano +co131017,131017,co13838,Rural +co130530,130530,co13873,Urbano +co130537,130537,co13873,Rural +co132047,132047,co13894,Rural +co132040,132040,co13894,Urbano +co153020,153020,co15022,Urbano +co153027,153027,co15022,Rural +co152420,152420,co15047,Urbano +co152429,152429,co15047,Rural +co152427,152427,co15047,Rural +co152428,152428,co15047,Rural +co154201,154201,co15051,Urbano +co154207,154207,co15051,Rural +co150640,150640,co15087,Urbano +co150647,150647,co15087,Rural +co152617,152617,co15090,Rural +co152610,152610,co15090,Urbano +co150610,150610,co15092,Urbano +co150617,150617,co15092,Rural +co151060,151060,co15097,Urbano +co151067,151067,co15097,Rural +co153610,153610,co15104,Urbano +co153617,153617,co15104,Rural +co154670,154670,co15106,Urbano +co154677,154677,co15106,Rural +co154840,154840,co15109,Urbano +co154847,154847,co15109,Rural +co154848,154848,co15109,Rural +co152087,152087,co15114,Rural +co152080,152080,co15114,Urbano +co154660,154660,co15131,Urbano +co154667,154667,co15131,Rural +co152640,152640,co15135,Urbano +co152647,152647,co15135,Rural +co150627,150627,co15162,Rural +co150620,150620,co15162,Urbano +co153287,153287,co15172,Rural +co153280,153280,co15172,Urbano +co154640,154640,co15176,Urbano +co154647,154647,co15176,Rural +co154648,154648,co15176,Rural +co154020,154020,co15232,Urbano +co154027,154027,co15232,Rural +co151401,151401,co15180,Urbano +co151407,151407,co15180,Rural +co151601,151601,co15183,Urbano +co151609,151609,co15183,Rural +co151608,151608,co15183,Rural +co151607,151607,co15183,Rural +co154420,154420,co15185,Urbano +co154428,154428,co15185,Rural +co154427,154427,co15185,Rural +co150240,150240,co15187,Urbano +co150247,150247,co15187,Rural +co153001,153001,co15236,Urbano +co153007,153007,co15236,Rural +co153440,153440,co15189,Urbano +co153447,153447,co15189,Rural +co150201,150201,co15204,Urbano +co150208,150208,co15204,Rural +co150207,150207,co15204,Rural +co154860,154860,co15212,Urbano +co154867,154867,co15212,Rural +co152060,152060,co15215,Urbano +co152067,152067,co15215,Rural +co151040,151040,co15218,Urbano +co151047,151047,co15218,Rural +co151420,151420,co15223,Urbano +co151427,151427,co15223,Rural +co154060,154060,co15224,Urbano +co154067,154067,co15224,Rural +co152230,152230,co15226,Urbano +co152237,152237,co15226,Rural +co150467,150467,co15238,Rural +co150461,150461,co15238,Urbano +co150468,150468,co15238,Rural +co150469,150469,co15238,Rural +co150462,150462,co15238,Urbano +co150477,150477,co15238,Rural +co151280,151280,co15244,Urbano +co151287,151287,co15244,Rural +co151240,151240,co15248,Urbano +co151247,151247,co15248,Rural +co152250,152250,co15272,Urbano +co152257,152257,co15272,Rural +co150601,150601,co15276,Urbano +co150607,150607,co15276,Rural +co154220,154220,co15293,Urbano +co154227,154227,co15293,Rural +co152020,152020,co15296,Urbano +co152027,152027,co15296,Rural +co151440,151440,co15332,Urbano +co151447,151447,co15332,Rural +co151448,151448,co15332,Rural +co152860,152860,co15299,Urbano +co152867,152867,co15299,Rural +co151220,151220,co15317,Urbano +co151227,151227,co15317,Rural +co153050,153050,co15322,Urbano +co153057,153057,co15322,Rural +co153040,153040,co15325,Urbano +co153047,153047,co15325,Rural +co152240,152240,co15362,Urbano +co152247,152247,co15362,Rural +co153601,153601,co15367,Urbano +co153608,153608,co15367,Rural +co153607,153607,co15367,Rural +co150840,150840,co15368,Urbano +co150847,150847,co15368,Rural +co153220,153220,co15380,Urbano +co153227,153227,co15380,Rural +co150860,150860,co15403,Urbano +co150867,150867,co15403,Rural +co155001,155001,co15401,Urbano +co155007,155007,co15401,Rural +co151840,151840,co15377,Urbano +co151847,151847,co15377,Rural +co152840,152840,co15425,Urbano +co152847,152847,co15425,Rural +co154820,154820,co15442,Urbano +co154827,154827,co15442,Rural +co154828,154828,co15442,Rural +co152667,152667,co15455,Rural +co152660,152660,co15455,Urbano +co152001,152001,co15464,Urbano +co152007,152007,co15464,Rural +co152201,152201,co15466,Urbano +co152207,152207,co15466,Rural +co154260,154260,co15469,Urbano +co154267,154267,co15469,Rural +co154269,154269,co15469,Rural +co154268,154268,co15469,Rural +co154080,154080,co15476,Urbano +co154087,154087,co15476,Rural +co154880,154880,co15480,Urbano +co154887,154887,co15480,Rural +co152280,152280,co15491,Urbano +co152287,152287,co15491,Rural +co152288,152288,co15491,Rural +co153620,153620,co15494,Urbano +co153627,153627,co15494,Rural +co150220,150220,co15500,Urbano +co150227,150227,co15500,Rural +co155060,155060,co15507,Urbano +co155068,155068,co15507,Rural +co155067,155067,co15507,Rural +co153210,153210,co15511,Urbano +co153217,153217,co15511,Rural +co152620,152620,co15514,Urbano +co152627,152627,co15514,Rural +co150447,150447,co15516,Rural +co150449,150449,co15516,Rural +co150440,150440,co15516,Urbano +co150448,150448,co15516,Rural +co152407,152407,co15518,Rural +co152401,152401,co15518,Urbano +co151260,151260,co15522,Urbano +co151267,151267,co15522,Rural +co154801,154801,co15531,Urbano +co154807,154807,co15531,Rural +co154808,154808,co15531,Rural +co151827,151827,co15533,Rural +co151820,151820,co15533,Urbano +co150680,150680,co15537,Urbano +co150687,150687,co15537,Rural +co152460,152460,co15542,Urbano +co152468,152468,co15542,Rural +co152469,152469,co15542,Rural +co152467,152467,co15542,Rural +co151801,151801,co15550,Urbano +co151807,151807,co15550,Rural +co155208,155208,co15572,Rural +co155201,155201,co15572,Urbano +co155209,155209,co15572,Rural +co155218,155218,co15572,Rural +co155207,155207,co15572,Rural +co155217,155217,co15572,Rural +co155219,155219,co15572,Rural +co155027,155027,co15580,Rural +co155020,155020,co15580,Urbano +co155028,155028,co15580,Rural +co153407,153407,co15599,Rural +co153401,153401,co15599,Urbano +co153408,153408,co15599,Rural +co153801,153801,co15600,Urbano +co153807,153807,co15600,Rural +co153808,153808,co15600,Rural +co153809,153809,co15600,Rural +co153420,153420,co15621,Urbano +co153427,153427,co15621,Rural +co154601,154601,co15632,Urbano +co154617,154617,co15632,Rural +co154608,154608,co15632,Rural +co154609,154609,co15632,Rural +co154607,154607,co15632,Rural +co153887,153887,co15638,Rural +co153880,153880,co15638,Urbano +co153660,153660,co15646,Urbano +co153667,153667,co15646,Rural +co153668,153668,co15646,Rural +co152601,152601,co15660,Urbano +co152607,152607,co15660,Rural +co154460,154460,co15664,Urbano +co154467,154467,co15664,Rural +co152801,152801,co15667,Urbano +co152807,152807,co15667,Rural +co151207,151207,co15673,Rural +co151201,151201,co15673,Urbano +co153820,153820,co15676,Urbano +co153827,153827,co15676,Rural +co155040,155040,co15681,Urbano +co155047,155047,co15681,Rural +co155048,155048,co15681,Rural +co152820,152820,co15690,Urbano +co152827,152827,co15690,Rural +co150480,150480,co15693,Urbano +co150488,150488,co15693,Rural +co150487,150487,co15693,Rural +co154247,154247,co15696,Rural +co154240,154240,co15696,Urbano +co154440,154440,co15686,Urbano +co154448,154448,co15686,Rural +co154447,154447,co15686,Rural +co150820,150820,co15720,Urbano +co150827,150827,co15720,Rural +co150801,150801,co15723,Urbano +co150807,150807,co15723,Rural +co153460,153460,co15740,Urbano +co153468,153468,co15740,Rural +co153467,153467,co15740,Rural +co151001,151001,co15753,Urbano +co151007,151007,co15753,Rural +co151640,151640,co15757,Urbano +co151647,151647,co15757,Rural +co151620,151620,co15755,Urbano +co151628,151628,co15755,Rural +co151627,151627,co15755,Rural +co152217,152217,co15759,Rural +co152219,152219,co15759,Rural +co152218,152218,co15759,Rural +co152210,152210,co15759,Urbano +co152211,152211,co15759,Urbano +co153030,153030,co15761,Urbano +co153037,153037,co15761,Rural +co154040,154040,co15762,Urbano +co154047,154047,co15762,Rural +co153480,153480,co15764,Urbano +co153487,153487,co15764,Rural +co150420,150420,co15763,Urbano +co150428,150428,co15763,Rural +co150427,150427,co15763,Rural +co150880,150880,co15774,Urbano +co150887,150887,co15774,Rural +co153867,153867,co15776,Rural +co153860,153860,co15776,Urbano +co153067,153067,co15778,Rural +co153060,153060,co15778,Urbano +co151660,151660,co15790,Urbano +co151667,151667,co15790,Rural +co153207,153207,co15798,Rural +co153201,153201,co15798,Urbano +co153260,153260,co15804,Urbano +co153268,153268,co15804,Rural +co153267,153267,co15804,Rural +co152260,152260,co15806,Urbano +co152268,152268,co15806,Rural +co152267,152267,co15806,Rural +co153840,153840,co15808,Urbano +co153847,153847,co15808,Rural +co151020,151020,co15810,Urbano +co151027,151027,co15810,Rural +co150260,150260,co15814,Urbano +co150268,150268,co15814,Rural +co150267,150267,co15814,Rural +co154401,154401,co15816,Urbano +co154407,154407,co15816,Rural +co152047,152047,co15820,Rural +co152040,152040,co15820,Urbano +co152440,152440,co15822,Urbano +co152447,152447,co15822,Rural +co152448,152448,co15822,Rural +co150003,150003,co15001,Urbano +co150009,150009,co15001,Rural +co150007,150007,co15001,Rural +co150002,150002,co15001,Urbano +co150001,150001,co15001,Urbano +co150008,150008,co15001,Rural +co154687,154687,co15832,Rural +co154680,154680,co15832,Urbano +co153630,153630,co15835,Urbano +co153637,153637,co15835,Rural +co150401,150401,co15837,Urbano +co150407,150407,co15837,Rural +co150408,150408,co15837,Rural +co150660,150660,co15839,Urbano +co150667,150667,co15839,Rural +co153240,153240,co15842,Urbano +co153247,153247,co15842,Rural +co153248,153248,co15842,Rural +co153640,153640,co15861,Urbano +co153649,153649,co15861,Rural +co153648,153648,co15861,Rural +co153647,153647,co15861,Rural +co154001,154001,co15407,Urbano +co154007,154007,co15407,Rural +co153450,153450,co15879,Urbano +co153457,153457,co15879,Rural +co152680,152680,co15897,Urbano +co152687,152687,co15897,Rural +co172020,172020,co17013,Urbano +co172029,172029,co17013,Rural +co172027,172027,co17013,Rural +co172028,172028,co17013,Rural +co177080,177080,co17042,Urbano +co177089,177089,co17042,Rural +co177088,177088,co17042,Rural +co177087,177087,co17042,Rural +co171040,171040,co17050,Urbano +co171047,171047,co17050,Rural +co177001,177001,co17088,Urbano +co177007,177007,co17088,Rural +co176020,176020,co17174,Urbano +co176027,176027,co17174,Rural +co176028,176028,co17174,Rural +co171020,171020,co17272,Urbano +co171027,171027,co17272,Rural +co171028,171028,co17272,Rural +co175038,175038,co17380,Rural +co175030,175030,co17380,Urbano +co175037,175037,co17380,Rural +co175031,175031,co17380,Urbano +co172067,172067,co17388,Rural +co172060,172060,co17388,Urbano +co170007,170007,co17001,Rural +co170001,170001,co17001,Urbano +co170004,170004,co17001,Urbano +co170017,170017,co17001,Rural +co170003,170003,co17001,Urbano +co170006,170006,co17001,Urbano +co170008,170008,co17001,Rural +co170002,170002,co17001,Urbano +co170009,170009,co17001,Rural +co173020,173020,co17433,Urbano +co173028,173028,co17433,Rural +co173027,173027,co17433,Rural +co178007,178007,co17442,Rural +co178001,178001,co17442,Urbano +co173040,173040,co17444,Urbano +co173047,173047,co17444,Rural +co173048,173048,co17444,Rural +co173007,173007,co17446,Rural +co173001,173001,co17446,Urbano +co171001,171001,co17486,Urbano +co171008,171008,co17486,Rural +co171007,171007,co17486,Rural +co175001,175001,co17495,Urbano +co175007,175007,co17495,Rural +co172040,172040,co17513,Urbano +co172047,172047,co17513,Rural +co172048,172048,co17513,Rural +co176040,176040,co17524,Urbano +co176048,176048,co17524,Rural +co176047,176047,co17524,Rural +co173060,173060,co17541,Urbano +co173069,173069,co17541,Rural +co173068,173068,co17541,Rural +co173067,173067,co17541,Rural +co178057,178057,co17614,Rural +co178049,178049,co17614,Rural +co178048,178048,co17614,Rural +co178047,178047,co17614,Rural +co178040,178040,co17614,Urbano +co177060,177060,co17616,Urbano +co177068,177068,co17616,Rural +co177067,177067,co17616,Rural +co172001,172001,co17653,Urbano +co172008,172008,co17653,Rural +co172007,172007,co17653,Rural +co172009,172009,co17653,Rural +co174001,174001,co17662,Urbano +co174009,174009,co17662,Rural +co174008,174008,co17662,Rural +co174007,174007,co17662,Rural +co177040,177040,co17665,Urbano +co177047,177047,co17665,Rural +co178020,178020,co17777,Urbano +co178028,178028,co17777,Rural +co178027,178027,co17777,Rural +co174030,174030,co17867,Urbano +co174038,174038,co17867,Rural +co174037,174037,co17867,Rural +co176001,176001,co17873,Urbano +co176007,176007,co17873,Rural +co176008,176008,co17873,Rural +co177020,177020,co17877,Urbano +co177027,177027,co17877,Rural +co186030,186030,co18029,Urbano +co186038,186038,co18029,Rural +co186037,186037,co18029,Rural +co186010,186010,co18094,Urbano +co186017,186017,co18094,Rural +co186018,186018,co18094,Rural +co183010,183010,co18150,Urbano +co183027,183027,co18150,Rural +co183017,183017,co18150,Rural +co183018,183018,co18150,Rural +co183019,183019,co18150,Rural +co186050,186050,co18205,Urbano +co186059,186059,co18205,Rural +co186057,186057,co18205,Rural +co186058,186058,co18205,Rural +co181010,181010,co18247,Urbano +co181017,181017,co18247,Rural +co181018,181018,co18247,Rural +co181019,181019,co18247,Rural +co181030,181030,co18256,Urbano +co181037,181037,co18256,Rural +co181039,181039,co18256,Rural +co181038,181038,co18256,Rural +co180009,180009,co18001,Rural +co180017,180017,co18001,Rural +co180002,180002,co18001,Urbano +co180008,180008,co18001,Rural +co180001,180001,co18001,Urbano +co180007,180007,co18001,Rural +co181059,181059,co18410,Rural +co181050,181050,co18410,Urbano +co181067,181067,co18410,Rural +co181058,181058,co18410,Rural +co181057,181057,co18410,Rural +co185030,185030,co18460,Urbano +co185037,185037,co18460,Rural +co185038,185038,co18460,Rural +co185010,185010,co18479,Urbano +co185017,185017,co18479,Rural +co185018,185018,co18479,Rural +co182050,182050,co18592,Urbano +co182057,182057,co18592,Rural +co182059,182059,co18592,Rural +co182058,182058,co18592,Rural +co186070,186070,co18610,Urbano +co186077,186077,co18610,Rural +co186078,186078,co18610,Rural +co182010,182010,co18753,Urbano +co182017,182017,co18753,Rural +co182018,182018,co18753,Rural +co182019,182019,co18753,Rural +co184010,184010,co18756,Urbano +co184019,184019,co18756,Rural +co184018,184018,co18756,Rural +co184017,184017,co18756,Rural +co185070,185070,co18785,Urbano +co185078,185078,co18785,Rural +co185077,185077,co18785,Rural +co185050,185050,co18860,Urbano +co185058,185058,co18860,Rural +co185057,185057,co18860,Rural +co856010,856010,co85010,Urbano +co856017,856017,co85010,Rural +co856018,856018,co85010,Rural +co856019,856019,co85010,Rural +co856030,856030,co85015,Urbano +co856038,856038,co85015,Rural +co856037,856037,co85015,Rural +co852010,852010,co85125,Urbano +co852017,852017,co85125,Rural +co852019,852019,co85125,Rural +co852018,852018,co85125,Rural +co851010,851010,co85136,Urbano +co851017,851017,co85136,Rural +co854018,854018,co85139,Rural +co854010,854010,co85139,Urbano +co854019,854019,co85139,Rural +co854017,854017,co85139,Rural +co855010,855010,co85162,Urbano +co855017,855017,co85162,Rural +co855018,855018,co85162,Rural +co851070,851070,co85225,Urbano +co851078,851078,co85225,Rural +co851077,851077,co85225,Rural +co853050,853050,co85230,Urbano +co853059,853059,co85230,Rural +co853057,853057,co85230,Rural +co853058,853058,co85230,Rural +co852030,852030,co85250,Urbano +co852037,852037,co85250,Rural +co852038,852038,co85250,Rural +co852039,852039,co85250,Rural +co852057,852057,co85263,Rural +co852058,852058,co85263,Rural +co852050,852050,co85263,Urbano +co856050,856050,co85279,Urbano +co856057,856057,co85279,Rural +co856058,856058,co85279,Rural +co855050,855050,co85300,Urbano +co855058,855058,co85300,Rural +co855057,855057,co85300,Rural +co851038,851038,co85315,Rural +co851037,851037,co85315,Rural +co851030,851030,co85315,Urbano +co853030,853030,co85325,Urbano +co853037,853037,co85325,Rural +co853038,853038,co85325,Rural +co853039,853039,co85325,Rural +co851050,851050,co85400,Urbano +co851057,851057,co85400,Rural +co851058,851058,co85400,Rural +co854030,854030,co85410,Urbano +co854037,854037,co85410,Rural +co854038,854038,co85410,Rural +co854039,854039,co85410,Rural +co853019,853019,co85430,Rural +co853018,853018,co85430,Rural +co853010,853010,co85430,Urbano +co853017,853017,co85430,Rural +co855039,855039,co85440,Rural +co855037,855037,co85440,Rural +co855038,855038,co85440,Rural +co855030,855030,co85440,Urbano +co850009,850009,co85001,Rural +co850002,850002,co85001,Urbano +co850008,850008,co85001,Rural +co850007,850007,co85001,Rural +co850001,850001,co85001,Urbano +co194080,194080,co19022,Urbano +co194088,194088,co19022,Rural +co194089,194089,co19022,Rural +co194087,194087,co19022,Rural +co195560,195560,co19050,Urbano +co195567,195567,co19050,Rural +co195530,195530,co19075,Urbano +co195539,195539,co19075,Rural +co195538,195538,co19075,Rural +co195537,195537,co19075,Rural +co195547,195547,co19075,Rural +co195001,195001,co19100,Urbano +co195017,195017,co19100,Rural +co195007,195007,co19100,Rural +co195009,195009,co19100,Rural +co195019,195019,co19100,Rural +co195008,195008,co19100,Rural +co195018,195018,co19100,Rural +co191001,191001,co19110,Urbano +co191008,191008,co19110,Rural +co191009,191009,co19110,Rural +co191017,191017,co19110,Rural +co191007,191007,co19110,Rural +co190501,190501,co19130,Urbano +co190518,190518,co19130,Rural +co190517,190517,co19130,Rural +co190507,190507,co19130,Rural +co190509,190509,co19130,Rural +co190508,190508,co19130,Rural +co192040,192040,co19137,Urbano +co192047,192047,co19137,Rural +co192057,192057,co19137,Rural +co192048,192048,co19137,Rural +co192049,192049,co19137,Rural +co191070,191070,co19142,Urbano +co191078,191078,co19142,Rural +co191079,191079,co19142,Rural +co191088,191088,co19142,Rural +co191077,191077,co19142,Rural +co191087,191087,co19142,Rural +co191560,191560,co19212,Urbano +co191568,191568,co19212,Rural +co191567,191567,co19212,Rural +co191569,191569,co19212,Rural +co193570,193570,co19256,Urbano +co193588,193588,co19256,Rural +co193589,193589,co19256,Rural +co193597,193597,co19256,Rural +co193577,193577,co19256,Rural +co193579,193579,co19256,Rural +co193587,193587,co19256,Rural +co193578,193578,co19256,Rural +co195040,195040,co19290,Urbano +co195047,195047,co19290,Rural +co196001,196001,co19318,Urbano +co196007,196007,co19318,Rural +co196009,196009,co19318,Rural +co196008,196008,co19318,Rural +co192548,192548,co19355,Rural +co192539,192539,co19355,Rural +co192537,192537,co19355,Rural +co192531,192531,co19355,Urbano +co192547,192547,co19355,Rural +co192538,192538,co19355,Rural +co192029,192029,co19364,Rural +co192020,192020,co19364,Urbano +co192028,192028,co19364,Rural +co192027,192027,co19364,Rural +co194001,194001,co19392,Urbano +co194007,194007,co19392,Rural +co194008,194008,co19392,Rural +co194020,194020,co19397,Urbano +co194029,194029,co19397,Rural +co194027,194027,co19397,Rural +co194037,194037,co19397,Rural +co194038,194038,co19397,Rural +co194028,194028,co19397,Rural +co196060,196060,co19418,Urbano +co196068,196068,co19418,Rural +co196067,196067,co19418,Rural +co195060,195060,co19450,Urbano +co195067,195067,co19450,Rural +co195068,195068,co19450,Rural +co195069,195069,co19450,Rural +co191520,191520,co19455,Urbano +co191528,191528,co19455,Rural +co191529,191529,co19455,Rural +co191527,191527,co19455,Rural +co190567,190567,co19473,Rural +co190557,190557,co19473,Rural +co190559,190559,co19473,Rural +co190558,190558,co19473,Rural +co190550,190550,co19473,Urbano +co191540,191540,co19513,Urbano +co191547,191547,co19513,Rural +co192501,192501,co19517,Urbano +co192508,192508,co19517,Rural +co192518,192518,co19517,Rural +co192517,192517,co19517,Rural +co192507,192507,co19517,Rural +co192509,192509,co19517,Rural +co195501,195501,co19532,Urbano +co195507,195507,co19532,Rural +co195508,195508,co19532,Rural +co195509,195509,co19532,Rural +co194550,194550,co19533,Urbano +co194557,194557,co19533,Rural +co194558,194558,co19533,Rural +co190530,190530,co19548,Urbano +co190548,190548,co19548,Rural +co190538,190538,co19548,Rural +co190547,190547,co19548,Rural +co190539,190539,co19548,Rural +co190537,190537,co19548,Rural +co190001,190001,co19001,Urbano +co190008,190008,co19001,Rural +co190002,190002,co19001,Urbano +co190009,190009,co19001,Rural +co190018,190018,co19001,Rural +co190007,190007,co19001,Rural +co190017,190017,co19001,Rural +co190004,190004,co19001,Urbano +co190003,190003,co19001,Urbano +co191501,191501,co19573,Urbano +co191507,191507,co19573,Rural +co193001,193001,co19585,Urbano +co193007,193007,co19585,Rural +co193008,193008,co19585,Rural +co193009,193009,co19585,Rural +co193550,193550,co19622,Urbano +co193558,193558,co19622,Rural +co193557,193557,co19622,Rural +co194501,194501,co19693,Urbano +co194508,194508,co19693,Rural +co194509,194509,co19693,Rural +co194507,194507,co19693,Rural +co194520,194520,co19701,Urbano +co194528,194528,co19701,Rural +co194527,194527,co19701,Rural +co191030,191030,co19698,Urbano +co191048,191048,co19698,Rural +co191049,191049,co19698,Rural +co191038,191038,co19698,Rural +co191037,191037,co19698,Rural +co191039,191039,co19698,Rural +co191047,191047,co19698,Rural +co192070,192070,co19743,Urbano +co192078,192078,co19743,Rural +co192079,192079,co19743,Rural +co192077,192077,co19743,Rural +co192087,192087,co19743,Rural +co193501,193501,co19760,Urbano +co193508,193508,co19760,Rural +co193507,193507,co19760,Rural +co190580,190580,co19780,Urbano +co190597,190597,co19780,Rural +co190588,190588,co19780,Rural +co190589,190589,co19780,Rural +co190587,190587,co19780,Rural +co194060,194060,co19785,Urbano +co194067,194067,co19785,Rural +co194068,194068,co19785,Rural +co193520,193520,co19807,Urbano +co193527,193527,co19807,Rural +co193528,193528,co19807,Rural +co193537,193537,co19807,Rural +co193529,193529,co19807,Rural +co196030,196030,co19809,Urbano +co196038,196038,co19809,Rural +co196037,196037,co19809,Rural +co192001,192001,co19821,Urbano +co192008,192008,co19821,Rural +co192009,192009,co19821,Rural +co192007,192007,co19821,Rural +co192570,192570,co19824,Urbano +co192577,192577,co19824,Rural +co192578,192578,co19824,Rural +co192579,192579,co19824,Rural +co191060,191060,co19845,Urbano +co191067,191067,co19845,Rural +co205010,205010,co20011,Urbano +co205018,205018,co20011,Rural +co205017,205017,co20011,Rural +co202050,202050,co20013,Urbano +co202057,202057,co20013,Rural +co202058,202058,co20013,Rural +co201040,201040,co20032,Urbano +co201047,201047,co20032,Rural +co201048,201048,co20032,Rural +co203001,203001,co20045,Urbano +co203007,203007,co20045,Rural +co201027,201027,co20060,Rural +co201020,201020,co20060,Urbano +co201050,201050,co20175,Urbano +co201057,201057,co20175,Rural +co201058,201058,co20175,Rural +co203040,203040,co20178,Urbano +co203048,203048,co20178,Rural +co203047,203047,co20178,Rural +co203060,203060,co20228,Urbano +co203067,203067,co20228,Rural +co201010,201010,co20238,Urbano +co201017,201017,co20238,Rural +co201018,201018,co20238,Rural +co201030,201030,co20250,Urbano +co201037,201037,co20250,Rural +co201038,201038,co20250,Rural +co205001,205001,co20295,Urbano +co205008,205008,co20295,Rural +co205007,205007,co20295,Rural +co205030,205030,co20310,Urbano +co205037,205037,co20310,Rural +co204060,204060,co20383,Urbano +co204068,204068,co20383,Rural +co204067,204067,co20383,Rural +co203020,203020,co20400,Urbano +co203027,203027,co20400,Rural +co202010,202010,co20621,Urbano +co202018,202018,co20621,Rural +co202017,202017,co20621,Rural +co202001,202001,co20443,Urbano +co202007,202007,co20443,Rural +co204001,204001,co20517,Urbano +co204007,204007,co20517,Rural +co204047,204047,co20550,Rural +co204040,204040,co20550,Urbano +co201001,201001,co20570,Urbano +co201007,201007,co20570,Rural +co201008,201008,co20570,Rural +co205040,205040,co20614,Urbano +co205047,205047,co20614,Rural +co205048,205048,co20614,Rural +co205070,205070,co20710,Urbano +co205077,205077,co20710,Rural +co205078,205078,co20710,Rural +co202030,202030,co20750,Urbano +co202038,202038,co20750,Rural +co202037,202037,co20750,Rural +co205050,205050,co20770,Urbano +co205057,205057,co20770,Rural +co205058,205058,co20770,Rural +co205059,205059,co20770,Rural +co204020,204020,co20787,Urbano +co204027,204027,co20787,Rural +co204028,204028,co20787,Rural +co200018,200018,co20001,Rural +co200009,200009,co20001,Rural +co200017,200017,co20001,Rural +co200004,200004,co20001,Urbano +co200008,200008,co20001,Rural +co200005,200005,co20001,Urbano +co200001,200001,co20001,Urbano +co200002,200002,co20001,Urbano +co200003,200003,co20001,Urbano +co200007,200007,co20001,Rural +co278010,278010,co27006,Urbano +co278017,278017,co27006,Rural +co278018,278018,co27006,Rural +co276070,276070,co27025,Urbano +co276078,276078,co27025,Rural +co276077,276077,co27025,Rural +co272010,272010,co27050,Urbano +co272017,272017,co27050,Rural +co272018,272018,co27050,Rural +co271050,271050,co27073,Urbano +co271057,271057,co27073,Rural +co271058,271058,co27073,Rural +co276030,276030,co27075,Urbano +co276037,276037,co27075,Rural +co276038,276038,co27075,Rural +co275030,275030,co27077,Urbano +co275037,275037,co27077,Rural +co275038,275038,co27077,Rural +co277050,277050,co27099,Urbano +co277057,277057,co27099,Rural +co277030,277030,co27150,Urbano +co277037,277037,co27150,Rural +co277038,277038,co27150,Rural +co272020,272020,co27160,Urbano +co272027,272027,co27160,Rural +co273030,273030,co27205,Urbano +co273037,273037,co27205,Rural +co273038,273038,co27205,Rural +co272040,272040,co27135,Urbano +co272048,272048,co27135,Rural +co272047,272047,co27135,Rural +co271010,271010,co27245,Urbano +co271018,271018,co27245,Rural +co271017,271017,co27245,Rural +co275050,275050,co27250,Urbano +co275057,275057,co27250,Rural +co275058,275058,co27250,Rural +co274010,274010,co27361,Urbano +co274018,274018,co27361,Rural +co274017,274017,co27361,Rural +co274019,274019,co27361,Rural +co276010,276010,co27372,Urbano +co276019,276019,co27372,Rural +co276017,276017,co27372,Rural +co276018,276018,co27372,Rural +co271030,271030,co27413,Urbano +co271037,271037,co27413,Rural +co270070,270070,co27425,Urbano +co270078,270078,co27425,Rural +co270077,270077,co27425,Rural +co275010,275010,co27430,Urbano +co275017,275017,co27430,Rural +co275018,275018,co27430,Rural +co274030,274030,co27450,Urbano +co274038,274038,co27450,Rural +co274037,274037,co27450,Rural +co274039,274039,co27450,Rural +co273050,273050,co27491,Urbano +co273058,273058,co27491,Rural +co273057,273057,co27491,Rural +co276050,276050,co27495,Urbano +co276057,276057,co27495,Rural +co276058,276058,co27495,Rural +co270002,270002,co27001,Urbano +co270001,270001,co27001,Urbano +co270008,270008,co27001,Rural +co270007,270007,co27001,Rural +co270009,270009,co27001,Rural +co273010,273010,co27580,Urbano +co273017,273017,co27580,Rural +co272050,272050,co27600,Urbano +co272058,272058,co27600,Rural +co272057,272057,co27600,Rural +co278050,278050,co27615,Urbano +co277010,277010,co27615,Urbano +co278057,278057,co27615,Rural +co278058,278058,co27615,Rural +co277017,277017,co27615,Rural +co277018,277018,co27615,Rural +co273070,273070,co27660,Urbano +co273077,273077,co27660,Rural +co273078,273078,co27660,Rural +co274050,274050,co27745,Urbano +co274058,274058,co27745,Rural +co274057,274057,co27745,Rural +co271070,271070,co27787,Urbano +co271077,271077,co27787,Rural +co278030,278030,co27800,Urbano +co278038,278038,co27800,Rural +co278037,278037,co27800,Rural +co272030,272030,co27810,Urbano +co272037,272037,co27810,Rural +co233530,233530,co23068,Urbano +co233538,233538,co23068,Rural +co233539,233539,co23068,Rural +co233537,233537,co23068,Rural +co233028,233028,co23079,Rural +co233027,233027,co23079,Rural +co233020,233020,co23079,Urbano +co235040,235040,co23090,Urbano +co235047,235047,co23090,Rural +co235048,235048,co23090,Rural +co230550,230550,co23162,Urbano +co230557,230557,co23162,Rural +co230558,230558,co23162,Rural +co230559,230559,co23162,Rural +co232010,232010,co23168,Urbano +co232017,232017,co23168,Rural +co232018,232018,co23168,Rural +co232050,232050,co23182,Urbano +co232058,232058,co23182,Rural +co232059,232059,co23182,Rural +co232057,232057,co23182,Rural +co232520,232520,co23189,Urbano +co232538,232538,co23189,Rural +co232527,232527,co23189,Rural +co232528,232528,co23189,Rural +co232537,232537,co23189,Rural +co232529,232529,co23189,Rural +co230501,230501,co23300,Urbano +co230507,230507,co23300,Rural +co233507,233507,co23350,Rural +co233501,233501,co23350,Urbano +co231029,231029,co23417,Rural +co231039,231039,co23417,Rural +co231027,231027,co23417,Rural +co231047,231047,co23417,Rural +co231020,231020,co23417,Urbano +co231028,231028,co23417,Rural +co231038,231038,co23417,Rural +co231037,231037,co23417,Rural +co231048,231048,co23417,Rural +co235020,235020,co23419,Urbano +co235028,235028,co23419,Rural +co235027,235027,co23419,Rural +co231007,231007,co23500,Rural +co231001,231001,co23500,Urbano +co231008,231008,co23500,Rural +co232008,232008,co23464,Rural +co232001,232001,co23464,Urbano +co232007,232007,co23464,Rural +co234007,234007,co23466,Rural +co234001,234001,co23466,Urbano +co234008,234008,co23466,Rural +co230017,230017,co23001,Rural +co230004,230004,co23001,Urbano +co230007,230007,co23001,Rural +co230002,230002,co23001,Urbano +co230001,230001,co23001,Urbano +co230029,230029,co23001,Rural +co230003,230003,co23001,Urbano +co230009,230009,co23001,Rural +co230027,230027,co23001,Rural +co230008,230008,co23001,Rural +co230019,230019,co23001,Rural +co230028,230028,co23001,Rural +co230018,230018,co23001,Rural +co233040,233040,co23555,Urbano +co233047,233047,co23555,Rural +co233049,233049,co23555,Rural +co233057,233057,co23555,Rural +co233048,233048,co23555,Rural +co233001,233001,co23570,Urbano +co233008,233008,co23570,Rural +co233007,233007,co23570,Rural +co233009,233009,co23570,Rural +co235001,235001,co23574,Urbano +co235008,235008,co23574,Rural +co235007,235007,co23574,Rural +co234038,234038,co23580,Rural +co234030,234030,co23580,Urbano +co234037,234037,co23580,Rural +co234039,234039,co23580,Rural +co231540,231540,co23586,Urbano +co231547,231547,co23586,Rural +co232549,232549,co23660,Rural +co232540,232540,co23660,Urbano +co232558,232558,co23660,Rural +co232547,232547,co23660,Rural +co232548,232548,co23660,Rural +co232559,232559,co23660,Rural +co232557,232557,co23660,Rural +co232030,232030,co23670,Urbano +co232038,232038,co23670,Rural +co232039,232039,co23670,Rural +co231520,231520,co23672,Urbano +co231528,231528,co23672,Rural +co231527,231527,co23672,Rural +co231501,231501,co23675,Urbano +co231509,231509,co23675,Rural +co231508,231508,co23675,Rural +co231507,231507,co23675,Rural +co232501,232501,co23678,Urbano +co232508,232508,co23678,Rural +co232517,232517,co23678,Rural +co232509,232509,co23678,Rural +co232507,232507,co23678,Rural +co234010,234010,co23682,Urbano +co234017,234017,co23682,Rural +co230538,230538,co23686,Rural +co230527,230527,co23686,Rural +co230520,230520,co23686,Urbano +co230529,230529,co23686,Rural +co230528,230528,co23686,Rural +co230537,230537,co23686,Rural +co234517,234517,co23807,Rural +co234507,234507,co23807,Rural +co234509,234509,co23807,Rural +co234518,234518,co23807,Rural +co234508,234508,co23807,Rural +co234501,234501,co23807,Urbano +co232027,232027,co23815,Rural +co232020,232020,co23815,Urbano +co234539,234539,co23855,Rural +co234530,234530,co23855,Urbano +co234537,234537,co23855,Rural +co234538,234538,co23855,Rural +co252850,252850,co25001,Urbano +co252857,252857,co25001,Rural +co253207,253207,co25019,Rural +co253201,253201,co25019,Urbano +co252647,252647,co25035,Rural +co252640,252640,co25035,Urbano +co252648,252648,co25035,Rural +co253048,253048,co25040,Rural +co253040,253040,co25040,Urbano +co253047,253047,co25040,Rural +co252650,252650,co25599,Urbano +co252657,252657,co25599,Rural +co252001,252001,co25053,Urbano +co252007,252007,co25053,Rural +co252008,252008,co25053,Rural +co253260,253260,co25086,Urbano +co253267,253267,co25086,Rural +co253220,253220,co25095,Urbano +co253227,253227,co25095,Rural +co253001,253001,co25099,Urbano +co253007,253007,co25099,Rural +co252040,252040,co25120,Urbano +co252047,252047,co25120,Rural +co253020,253020,co25123,Urbano +co253027,253027,co25123,Rural +co250240,250240,co25126,Urbano +co250247,250247,co25126,Rural +co253460,253460,co25148,Urbano +co253468,253468,co25148,Rural +co253467,253467,co25148,Rural +co251827,251827,co25151,Rural +co251820,251820,co25151,Urbano +co250420,250420,co25154,Urbano +co250428,250428,co25154,Rural +co250427,250427,co25154,Rural +co253240,253240,co25168,Urbano +co253247,253247,co25168,Rural +co250001,250001,co25175,Urbano +co250002,250002,co25175,Urbano +co250007,250007,co25175,Rural +co250008,250008,co25175,Rural +co251801,251801,co25178,Urbano +co251807,251807,co25178,Rural +co251808,251808,co25178,Rural +co251620,251620,co25181,Urbano +co251627,251627,co25181,Rural +co251628,251628,co25181,Rural +co250801,250801,co25183,Urbano +co250808,250808,co25183,Rural +co250807,250807,co25183,Rural +co250408,250408,co25200,Rural +co250401,250401,co25200,Urbano +co250407,250407,co25200,Rural +co250010,250010,co25214,Urbano +co250017,250017,co25214,Rural +co250450,250450,co25224,Urbano +co250457,250457,co25224,Rural +co252630,252630,co25245,Urbano +co252637,252637,co25245,Rural +co252638,252638,co25245,Rural +co254027,254027,co25258,Rural +co254020,254020,co25258,Urbano +co250210,250210,co25260,Urbano +co250217,250217,co25260,Rural +co253058,253058,co25269,Rural +co253052,253052,co25269,Urbano +co253051,253051,co25269,Urbano +co253057,253057,co25269,Rural +co251640,251640,co25279,Urbano +co251648,251648,co25279,Rural +co251647,251647,co25279,Rural +co251830,251830,co25281,Urbano +co251837,251837,co25281,Rural +co250020,250020,co25286,Urbano +co250027,250027,co25286,Rural +co250620,250620,co25288,Urbano +co250627,250627,co25288,Rural +co252219,252219,co25290,Rural +co252218,252218,co25290,Rural +co252211,252211,co25290,Urbano +co252217,252217,co25290,Rural +co252212,252212,co25290,Urbano +co251250,251250,co25293,Urbano +co251257,251257,co25293,Rural +co251020,251020,co25295,Urbano +co251027,251027,co25295,Rural +co251230,251230,co25297,Urbano +co251237,251237,co25297,Rural +co251238,251238,co25297,Rural +co251240,251240,co25299,Urbano +co251247,251247,co25299,Rural +co252431,252431,co25307,Urbano +co252437,252437,co25307,Rural +co252432,252432,co25307,Urbano +co252257,252257,co25312,Rural +co252250,252250,co25312,Urbano +co250610,250610,co25317,Urbano +co250617,250617,co25317,Rural +co250618,250618,co25317,Rural +co253448,253448,co25320,Rural +co253449,253449,co25320,Rural +co253440,253440,co25320,Urbano +co253447,253447,co25320,Rural +co251210,251210,co25322,Urbano +co251218,251218,co25322,Rural +co251217,251217,co25322,Rural +co252820,252820,co25324,Urbano +co252827,252827,co25324,Rural +co251060,251060,co25326,Urbano +co251067,251067,co25326,Rural +co253210,253210,co25328,Urbano +co253217,253217,co25328,Rural +co251850,251850,co25335,Urbano +co251857,251857,co25335,Rural +co251860,251860,co25339,Urbano +co251867,251867,co25339,Rural +co252810,252810,co25368,Urbano +co252817,252817,co25368,Rural +co251220,251220,co25372,Urbano +co251227,251227,co25372,Rural +co251201,251201,co25377,Urbano +co251208,251208,co25377,Rural +co251207,251207,co25377,Rural +co252601,252601,co25386,Urbano +co252607,252607,co25386,Rural +co252608,252608,co25386,Rural +co253808,253808,co25394,Rural +co253807,253807,co25394,Rural +co253801,253801,co25394,Urbano +co253640,253640,co25398,Urbano +co253647,253647,co25398,Rural +co253648,253648,co25398,Rural +co253610,253610,co25402,Urbano +co253618,253618,co25402,Rural +co253617,253617,co25402,Rural +co250601,250601,co25407,Urbano +co250607,250607,co25407,Rural +co250608,250608,co25407,Rural +co250840,250840,co25426,Urbano +co250847,250847,co25426,Rural +co250848,250848,co25426,Rural +co250038,250038,co25430,Rural +co250037,250037,co25430,Rural +co250030,250030,co25430,Urbano +co250830,250830,co25436,Urbano +co250837,250837,co25436,Rural +co251420,251420,co25438,Urbano +co251427,251427,co25438,Rural +co251428,251428,co25438,Rural +co250040,250040,co25473,Urbano +co250047,250047,co25473,Rural +co252837,252837,co25483,Rural +co252830,252830,co25483,Urbano +co251030,251030,co25486,Urbano +co251038,251038,co25486,Rural +co251037,251037,co25486,Rural +co252401,252401,co25488,Urbano +co252407,252407,co25488,Rural +co252408,252408,co25488,Rural +co253630,253630,co25489,Urbano +co253637,253637,co25489,Rural +co253620,253620,co25491,Urbano +co253627,253627,co25491,Rural +co254001,254001,co25513,Urbano +co254007,254007,co25513,Rural +co254008,254008,co25513,Rural +co254040,254040,co25518,Urbano +co254047,254047,co25518,Rural +co252010,252010,co25524,Urbano +co252017,252017,co25524,Rural +co251401,251401,co25530,Urbano +co251407,251407,co25530,Rural +co252201,252201,co25535,Urbano +co252207,252207,co25535,Rural +co252208,252208,co25535,Rural +co253480,253480,co25572,Urbano +co253487,253487,co25572,Rural +co252801,252801,co25580,Urbano +co252807,252807,co25580,Rural +co253427,253427,co25592,Rural +co253420,253420,co25592,Urbano +co251840,251840,co25594,Urbano +co251847,251847,co25594,Rural +co253030,253030,co25596,Urbano +co253037,253037,co25596,Rural +co252417,252417,co25612,Rural +co252410,252410,co25612,Urbano +co252620,252620,co25645,Urbano +co252627,252627,co25645,Rural +co252020,252020,co25649,Urbano +co252028,252028,co25649,Rural +co252027,252027,co25649,Rural +co254050,254050,co25653,Urbano +co254057,254057,co25653,Rural +co253601,253601,co25658,Urbano +co253607,253607,co25658,Rural +co253608,253608,co25658,Rural +co253250,253250,co25662,Urbano +co253257,253257,co25662,Rural +co253258,253258,co25662,Rural +co253401,253401,co25718,Urbano +co253407,253407,co25718,Rural +co253408,253408,co25718,Rural +co251050,251050,co25736,Urbano +co251058,251058,co25736,Rural +co251057,251057,co25736,Rural +co250077,250077,co25740,Rural +co250078,250078,co25740,Rural +co250070,250070,co25740,Urbano +co252240,252240,co25743,Urbano +co252248,252248,co25743,Rural +co252247,252247,co25743,Rural +co250647,250647,co25745,Rural +co250640,250640,co25745,Urbano +co250051,250051,co25754,Urbano +co250057,250057,co25754,Rural +co250052,250052,co25754,Urbano +co250054,250054,co25754,Urbano +co250055,250055,co25754,Urbano +co250053,250053,co25754,Urbano +co250058,250058,co25754,Rural +co251001,251001,co25758,Urbano +co251007,251007,co25758,Rural +co251008,251008,co25758,Rural +co250228,250228,co25769,Rural +co250220,250220,co25769,Urbano +co250227,250227,co25769,Rural +co251040,251040,co25772,Urbano +co251047,251047,co25772,Rural +co251048,251048,co25772,Rural +co253660,253660,co25777,Urbano +co253667,253667,co25777,Rural +co250630,250630,co25779,Urbano +co250637,250637,co25779,Rural +co250440,250440,co25781,Urbano +co250447,250447,co25781,Rural +co250237,250237,co25785,Rural +co250230,250230,co25785,Urbano +co250410,250410,co25793,Urbano +co250418,250418,co25793,Rural +co250417,250417,co25793,Rural +co252610,252610,co25797,Urbano +co252617,252617,co25797,Rural +co250201,250201,co25799,Urbano +co250207,250207,co25799,Rural +co250208,250208,co25799,Rural +co252230,252230,co25805,Urbano +co252237,252237,co25805,Rural +co250820,250820,co25807,Urbano +co250827,250827,co25807,Rural +co252840,252840,co25815,Urbano +co252847,252847,co25815,Rural +co252848,252848,co25815,Rural +co251010,251010,co25817,Urbano +co251017,251017,co25817,Rural +co253820,253820,co25823,Urbano +co253827,253827,co25823,Rural +co251260,251260,co25839,Urbano +co251267,251267,co25839,Rural +co251268,251268,co25839,Rural +co251601,251601,co25841,Urbano +co251607,251607,co25841,Rural +co251810,251810,co25845,Urbano +co251817,251817,co25845,Rural +co253430,253430,co25851,Urbano +co253437,253437,co25851,Rural +co252037,252037,co25506,Rural +co252030,252030,co25506,Urbano +co253650,253650,co25862,Urbano +co253658,253658,co25862,Rural +co253657,253657,co25862,Rural +co253230,253230,co25867,Urbano +co253237,253237,co25867,Rural +co250430,250430,co25843,Urbano +co250437,250437,co25843,Rural +co254030,254030,co25871,Urbano +co254037,254037,co25871,Rural +co250810,250810,co25873,Urbano +co250817,250817,co25873,Rural +co250818,250818,co25873,Rural +co253418,253418,co25875,Rural +co253410,253410,co25875,Urbano +co253417,253417,co25875,Rural +co252660,252660,co25878,Urbano +co252667,252667,co25878,Rural +co252668,252668,co25878,Rural +co253840,253840,co25885,Urbano +co253848,253848,co25885,Rural +co253847,253847,co25885,Rural +co253010,253010,co25898,Urbano +co253017,253017,co25898,Rural +co250251,250251,co25899,Urbano +co250258,250258,co25899,Rural +co250252,250252,co25899,Urbano +co250257,250257,co25899,Rural +co944010,944010,co94343,Urbano +co944019,944019,co94343,Rural +co944018,944018,co94343,Rural +co944017,944017,co94343,Rural +co941010,941010,co94886,Urbano +co941017,941017,co94886,Rural +co941018,941018,co94886,Rural +co942057,942057,co94885,Rural +co940017,940017,co94001,Rural +co940009,940009,co94001,Rural +co940027,940027,co94001,Rural +co940001,940001,co94001,Urbano +co940007,940007,co94001,Rural +co940019,940019,co94001,Rural +co940018,940018,co94001,Rural +co940008,940008,co94001,Rural +co940028,940028,co94001,Rural +co944058,944058,co94663,Rural +co944057,944057,co94663,Rural +co944059,944059,co94663,Rural +co943059,943059,co94888,Rural +co943067,943067,co94888,Rural +co943057,943057,co94888,Rural +co943058,943058,co94888,Rural +co943018,943018,co94887,Rural +co943019,943019,co94887,Rural +co943017,943017,co94887,Rural +co941039,941039,co94884,Rural +co941038,941038,co94884,Rural +co941037,941037,co94884,Rural +co941047,941047,co94884,Rural +co942010,942010,co94883,Urbano +co942017,942017,co94883,Rural +co942018,942018,co94883,Rural +co953001,953001,co95015,Urbano +co953009,953009,co95015,Rural +co953018,953018,co95015,Rural +co953007,953007,co95015,Rural +co953008,953008,co95015,Rural +co953017,953017,co95015,Rural +co951001,951001,co95025,Urbano +co951008,951008,co95025,Rural +co951007,951007,co95025,Rural +co951017,951017,co95025,Rural +co951009,951009,co95025,Rural +co952001,952001,co95200,Urbano +co952007,952007,co95200,Rural +co952017,952017,co95200,Rural +co952008,952008,co95200,Rural +co952009,952009,co95200,Rural +co950001,950001,co95001,Urbano +co950007,950007,co95001,Rural +co950009,950009,co95001,Rural +co950008,950008,co95001,Rural +co417079,417079,co41006,Rural +co417087,417087,co41006,Rural +co417078,417078,co41006,Rural +co417070,417070,co41006,Urbano +co417077,417077,co41006,Rural +co417088,417088,co41006,Rural +co414040,414040,co41013,Urbano +co414047,414047,co41013,Rural +co411001,411001,co41016,Urbano +co411007,411007,co41016,Rural +co411008,411008,co41016,Rural +co413040,413040,co41020,Urbano +co413047,413047,co41020,Rural +co413048,413048,co41020,Rural +co416020,416020,co41026,Urbano +co416027,416027,co41026,Rural +co411060,411060,co41078,Urbano +co411067,411067,co41078,Rural +co413020,413020,co41132,Urbano +co413028,413028,co41132,Rural +co413027,413027,co41132,Rural +co411080,411080,co41206,Urbano +co411088,411088,co41206,Rural +co411087,411087,co41206,Rural +co417001,417001,co41244,Urbano +co417007,417007,co41244,Rural +co414027,414027,co41298,Rural +co414028,414028,co41298,Rural +co414029,414029,co41298,Rural +co414020,414020,co41298,Urbano +co414001,414001,co41306,Urbano +co414008,414008,co41306,Rural +co414007,414007,co41306,Rural +co414009,414009,co41306,Rural +co416040,416040,co41319,Urbano +co416047,416047,co41319,Rural +co416048,416048,co41319,Rural +co413060,413060,co41349,Urbano +co413067,413067,co41349,Rural +co412060,412060,co41357,Urbano +co412067,412067,co41357,Rural +co412068,412068,co41357,Rural +co418048,418048,co41359,Rural +co418049,418049,co41359,Rural +co418040,418040,co41359,Urbano +co418047,418047,co41359,Rural +co415080,415080,co41378,Urbano +co415088,415088,co41378,Rural +co415087,415087,co41378,Rural +co415078,415078,co41396,Rural +co415077,415077,co41396,Rural +co415068,415068,co41396,Rural +co415060,415060,co41396,Urbano +co416067,416067,co41396,Rural +co415069,415069,co41396,Rural +co415020,415020,co41483,Urbano +co415027,415027,co41483,Rural +co410010,410010,co41001,Urbano +co410004,410004,co41001,Urbano +co410005,410005,co41001,Urbano +co410003,410003,co41001,Urbano +co410009,410009,co41001,Rural +co410017,410017,co41001,Rural +co410006,410006,co41001,Urbano +co410018,410018,co41001,Rural +co410007,410007,co41001,Rural +co410002,410002,co41001,Urbano +co410001,410001,co41001,Urbano +co410008,410008,co41001,Rural +co418001,418001,co41503,Urbano +co418007,418007,co41503,Rural +co418008,418008,co41503,Rural +co415040,415040,co41518,Urbano +co415047,415047,co41518,Rural +co412001,412001,co41524,Urbano +co412008,412008,co41524,Rural +co412007,412007,co41524,Rural +co417067,417067,co41530,Rural +co417060,417060,co41530,Urbano +co414060,414060,co41548,Urbano +co414067,414067,co41548,Rural +co414068,414068,co41548,Rural +co417038,417038,co41551,Rural +co417048,417048,co41551,Rural +co417037,417037,co41551,Rural +co417047,417047,co41551,Rural +co417039,417039,co41551,Rural +co417030,417030,co41551,Urbano +co413001,413001,co41615,Urbano +co413008,413008,co41615,Rural +co413007,413007,co41615,Rural +co418020,418020,co41660,Urbano +co418028,418028,co41660,Rural +co418027,418027,co41660,Rural +co418060,418060,co41668,Urbano +co418068,418068,co41668,Rural +co418077,418077,co41668,Rural +co418069,418069,co41668,Rural +co418067,418067,co41668,Rural +co412020,412020,co41676,Urbano +co412027,412027,co41676,Rural +co416080,416080,co41770,Urbano +co416089,416089,co41770,Rural +co416088,416088,co41770,Rural +co416087,416087,co41770,Rural +co416001,416001,co41791,Urbano +co416007,416007,co41791,Rural +co411040,411040,co41799,Urbano +co411048,411048,co41799,Rural +co411047,411047,co41799,Rural +co412040,412040,co41801,Urbano +co412047,412047,co41801,Rural +co415001,415001,co41797,Urbano +co415007,415007,co41797,Rural +co415008,415008,co41797,Rural +co417010,417010,co41807,Urbano +co417017,417017,co41807,Rural +co417018,417018,co41807,Rural +co411020,411020,co41872,Urbano +co411027,411027,co41872,Rural +co411028,411028,co41872,Rural +co412087,412087,co41885,Rural +co412080,412080,co41885,Urbano +co443001,443001,co44035,Urbano +co443007,443007,co44035,Rural +co443008,443008,co44035,Rural +co443009,443009,co44035,Rural +co443040,443040,co44078,Urbano +co443048,443048,co44078,Rural +co443049,443049,co44078,Rural +co443047,443047,co44078,Rural +co446001,446001,co44090,Urbano +co446008,446008,co44090,Rural +co446017,446017,co44090,Rural +co446007,446007,co44090,Rural +co446009,446009,co44090,Rural +co444001,444001,co44098,Urbano +co444007,444007,co44098,Rural +co444008,444008,co44098,Rural +co444050,444050,co44110,Urbano +co444057,444057,co44110,Rural +co444010,444010,co44279,Urbano +co444017,444017,co44279,Rural +co444018,444018,co44279,Rural +co443020,443020,co44378,Urbano +co443028,443028,co44378,Rural +co443027,443027,co44378,Rural +co445040,445040,co44420,Urbano +co445047,445047,co44420,Rural +co442001,442001,co44430,Urbano +co442007,442007,co44430,Rural +co442009,442009,co44430,Rural +co442008,442008,co44430,Rural +co441001,441001,co44560,Urbano +co441008,441008,co44560,Rural +co441018,441018,co44560,Rural +co441017,441017,co44560,Rural +co441009,441009,co44560,Rural +co441007,441007,co44560,Rural +co440001,440001,co44001,Urbano +co440002,440002,co44001,Urbano +co440003,440003,co44001,Urbano +co440017,440017,co44001,Rural +co440008,440008,co44001,Rural +co440009,440009,co44001,Rural +co440007,440007,co44001,Rural +co444037,444037,co44650,Rural +co444030,444030,co44650,Urbano +co444038,444038,co44650,Rural +co441020,441020,co44847,Urbano +co441037,441037,co44847,Rural +co441048,441048,co44847,Rural +co441039,441039,co44847,Rural +co441058,441058,co44847,Rural +co441027,441027,co44847,Rural +co441029,441029,co44847,Rural +co441049,441049,co44847,Rural +co441047,441047,co44847,Rural +co441059,441059,co44847,Rural +co441057,441057,co44847,Rural +co441028,441028,co44847,Rural +co441038,441038,co44847,Rural +co445020,445020,co44855,Urbano +co445027,445027,co44855,Rural +co445008,445008,co44874,Rural +co445007,445007,co44874,Rural +co445001,445001,co44874,Urbano +co472040,472040,co47030,Urbano +co472047,472047,co47030,Rural +co472007,472007,co47053,Rural +co472008,472008,co47053,Rural +co472001,472001,co47053,Urbano +co475010,475010,co47058,Urbano +co475017,475017,co47058,Rural +co475018,475018,co47058,Rural +co475019,475019,co47058,Rural +co476020,476020,co47161,Urbano +co476027,476027,co47161,Rural +co476060,476060,co47170,Urbano +co476068,476068,co47170,Rural +co476067,476067,co47170,Rural +co478002,478002,co47189,Urbano +co478007,478007,co47189,Rural +co478008,478008,co47189,Rural +co478001,478001,co47189,Urbano +co476030,476030,co47205,Urbano +co476037,476037,co47205,Rural +co473040,473040,co47245,Urbano +co473048,473048,co47245,Rural +co473049,473049,co47245,Rural +co473047,473047,co47245,Rural +co476007,476007,co47258,Rural +co476008,476008,co47258,Rural +co476001,476001,co47258,Urbano +co478060,478060,co47268,Urbano +co478067,478067,co47268,Rural +co472020,472020,co47288,Urbano +co472028,472028,co47288,Rural +co472027,472027,co47288,Rural +co473020,473020,co47318,Urbano +co473029,473029,co47318,Rural +co473028,473028,co47318,Rural +co473027,473027,co47318,Rural +co475020,475020,co47460,Urbano +co475028,475028,co47460,Rural +co475027,475027,co47460,Rural +co476040,476040,co47541,Urbano +co476047,476047,co47541,Rural +co476048,476048,co47541,Rural +co474047,474047,co47545,Rural +co474048,474048,co47545,Rural +co474040,474040,co47545,Urbano +co477050,477050,co47551,Urbano +co477057,477057,co47551,Rural +co477058,477058,co47551,Rural +co475030,475030,co47555,Urbano +co475038,475038,co47555,Rural +co475037,475037,co47555,Rural +co478048,478048,co47570,Rural +co478040,478040,co47570,Urbano +co478047,478047,co47570,Rural +co477020,477020,co47605,Urbano +co477027,477027,co47605,Rural +co475001,475001,co47660,Urbano +co475007,475007,co47660,Rural +co475008,475008,co47660,Rural +co477040,477040,co47675,Urbano +co477047,477047,co47675,Rural +co473007,473007,co47692,Rural +co473008,473008,co47692,Rural +co473001,473001,co47692,Urbano +co474060,474060,co47703,Urbano +co474068,474068,co47703,Rural +co474067,474067,co47703,Rural +co474020,474020,co47707,Urbano +co474028,474028,co47707,Rural +co474027,474027,co47707,Rural +co474001,474001,co47720,Urbano +co474007,474007,co47720,Rural +co470009,470009,co47001,Rural +co470001,470001,co47001,Urbano +co470005,470005,co47001,Urbano +co470007,470007,co47001,Rural +co470002,470002,co47001,Urbano +co470003,470003,co47001,Urbano +co470004,470004,co47001,Urbano +co470017,470017,co47001,Rural +co470008,470008,co47001,Rural +co470006,470006,co47001,Urbano +co477001,477001,co47745,Urbano +co477007,477007,co47745,Rural +co477009,477009,co47745,Rural +co477008,477008,co47745,Rural +co475057,475057,co47798,Rural +co475050,475050,co47798,Urbano +co476050,476050,co47960,Urbano +co476058,476058,co47960,Rural +co476057,476057,co47960,Rural +co478020,478020,co47980,Urbano +co478027,478027,co47980,Rural +co478037,478037,co47980,Rural +co478029,478029,co47980,Rural +co478028,478028,co47980,Rural +co507008,507008,co50006,Rural +co507017,507017,co50006,Rural +co507007,507007,co50006,Rural +co507001,507001,co50006,Urbano +co507009,507009,co50006,Rural +co501007,501007,co50110,Rural +co501001,501001,co50110,Urbano +co501011,501011,co50124,Urbano +co501018,501018,co50124,Rural +co501017,501017,co50124,Rural +co507041,507041,co50150,Urbano +co507048,507048,co50150,Rural +co507047,507047,co50150,Rural +co506001,506001,co50223,Urbano +co506007,506007,co50223,Rural +co506008,506008,co50223,Rural +co501021,501021,co50226,Urbano +co501028,501028,co50226,Rural +co501027,501027,co50226,Rural +co501041,501041,co50245,Urbano +co501047,501047,co50245,Rural +co506047,506047,co50251,Rural +co506048,506048,co50251,Rural +co506041,506041,co50251,Urbano +co506021,506021,co50270,Urbano +co506027,506027,co50270,Rural +co504021,504021,co50287,Urbano +co504027,504027,co50287,Rural +co504028,504028,co50287,Rural +co504001,504001,co50313,Urbano +co504007,504007,co50313,Rural +co504008,504008,co50313,Rural +co507051,507051,co50318,Urbano +co507057,507057,co50318,Rural +co507058,507058,co50318,Rural +co505021,505021,co50350,Urbano +co505027,505027,co50350,Rural +co505028,505028,co50350,Rural +co506067,506067,co50400,Rural +co506068,506068,co50400,Rural +co506061,506061,co50400,Urbano +co503021,503021,co50325,Urbano +co503028,503028,co50325,Rural +co503027,503027,co50325,Rural +co503037,503037,co50325,Rural +co503029,503029,co50325,Rural +co505001,505001,co50330,Urbano +co505007,505007,co50330,Rural +co505008,505008,co50330,Rural +co503041,503041,co50450,Urbano +co503047,503047,co50450,Rural +co502058,502058,co50568,Rural +co502041,502041,co50568,Urbano +co502057,502057,co50568,Rural +co502047,502047,co50568,Rural +co502048,502048,co50568,Rural +co502059,502059,co50568,Rural +co502049,502049,co50568,Rural +co503001,503001,co50577,Urbano +co503008,503008,co50577,Rural +co503007,503007,co50577,Rural +co502001,502001,co50573,Urbano +co502008,502008,co50573,Rural +co502009,502009,co50573,Rural +co502007,502007,co50573,Rural +co503061,503061,co50590,Urbano +co503068,503068,co50590,Rural +co503067,503067,co50590,Rural +co501031,501031,co50606,Urbano +co501038,501038,co50606,Rural +co501037,501037,co50606,Rural +co507011,507011,co50680,Urbano +co507019,507019,co50680,Rural +co504047,504047,co50683,Rural +co504048,504048,co50683,Rural +co504041,504041,co50683,Urbano +co501051,501051,co50686,Urbano +co501057,501057,co50686,Rural +co507037,507037,co50689,Rural +co507027,507027,co50689,Rural +co507029,507029,co50689,Rural +co507028,507028,co50689,Rural +co507021,507021,co50689,Urbano +co505041,505041,co50370,Urbano +co505048,505048,co50370,Rural +co505047,505047,co50370,Rural +co500004,500004,co50001,Urbano +co500009,500009,co50001,Rural +co500001,500001,co50001,Urbano +co500003,500003,co50001,Urbano +co500017,500017,co50001,Rural +co500002,500002,co50001,Urbano +co500008,500008,co50001,Rural +co500005,500005,co50001,Urbano +co500007,500007,co50001,Rural +co504061,504061,co50711,Urbano +co504068,504068,co50711,Rural +co504067,504067,co50711,Rural +co524540,524540,co52022,Urbano +co524547,524547,co52022,Rural +co526007,526007,co52036,Rural +co526001,526001,co52036,Urbano +co520578,520578,co52051,Rural +co520577,520577,co52051,Rural +co520570,520570,co52051,Urbano +co528069,528069,co52079,Rural +co528068,528068,co52079,Rural +co528078,528078,co52079,Rural +co528077,528077,co52079,Rural +co528060,528060,co52079,Urbano +co528067,528067,co52079,Rural +co521087,521087,co52083,Rural +co521080,521080,co52083,Urbano +co520501,520501,co52110,Urbano +co520509,520509,co52110,Rural +co520507,520507,co52110,Rural +co520517,520517,co52110,Rural +co520518,520518,co52110,Rural +co520508,520508,co52110,Rural +co522001,522001,co52240,Urbano +co522007,522007,co52240,Rural +co521067,521067,co52203,Rural +co521060,521060,co52203,Urbano +co522548,522548,co52207,Rural +co522540,522540,co52207,Urbano +co522547,522547,co52207,Rural +co523087,523087,co52210,Rural +co523080,523080,co52210,Urbano +co524009,524009,co52215,Rural +co524007,524007,co52215,Rural +co524001,524001,co52215,Urbano +co524008,524008,co52215,Rural +co524560,524560,co52224,Urbano +co524567,524567,co52224,Rural +co525007,525007,co52227,Rural +co525008,525008,co52227,Rural +co525009,525009,co52227,Rural +co525001,525001,co52227,Urbano +co526567,526567,co52233,Rural +co526568,526568,co52233,Rural +co526560,526560,co52233,Urbano +co527537,527537,co52250,Rural +co527520,527520,co52250,Urbano +co527528,527528,co52250,Rural +co527529,527529,co52250,Rural +co527527,527527,co52250,Rural +co522088,522088,co52254,Rural +co522087,522087,co52254,Rural +co522080,522080,co52254,Urbano +co527037,527037,co52256,Rural +co527038,527038,co52256,Rural +co527030,527030,co52256,Urbano +co527039,527039,co52256,Rural +co520539,520539,co52258,Rural +co520537,520537,co52258,Rural +co520530,520530,co52258,Urbano +co520538,520538,co52258,Rural +co522060,522060,co52260,Urbano +co522067,522067,co52260,Rural +co522068,522068,co52260,Rural +co528560,528560,co52520,Urbano +co528567,528567,co52520,Rural +co528568,528568,co52520,Rural +co523520,523520,co52287,Urbano +co523527,523527,co52287,Rural +co523528,523528,co52287,Rural +co524588,524588,co52317,Rural +co524587,524587,co52317,Rural +co524580,524580,co52317,Urbano +co525508,525508,co52320,Rural +co525507,525507,co52320,Rural +co525501,525501,co52320,Urbano +co524501,524501,co52323,Urbano +co524507,524507,co52323,Rural +co523060,523060,co52352,Urbano +co523067,523067,co52352,Rural +co523068,523068,co52352,Rural +co523028,523028,co52354,Rural +co523020,523020,co52354,Urbano +co523027,523027,co52354,Rural +co524060,524060,co52356,Urbano +co524068,524068,co52356,Rural +co524061,524061,co52356,Urbano +co524069,524069,co52356,Rural +co524078,524078,co52356,Rural +co524077,524077,co52356,Rural +co524067,524067,co52356,Rural +co521028,521028,co52378,Rural +co521027,521027,co52378,Rural +co521020,521020,co52378,Urbano +co522048,522048,co52381,Rural +co522040,522040,co52381,Urbano +co522047,522047,co52381,Rural +co526507,526507,co52385,Rural +co526501,526501,co52385,Urbano +co527547,527547,co52390,Rural +co527540,527540,co52390,Urbano +co527548,527548,co52390,Rural +co521528,521528,co52399,Rural +co521527,521527,co52399,Rural +co521529,521529,co52399,Rural +co521520,521520,co52399,Urbano +co527067,527067,co52405,Rural +co527068,527068,co52405,Rural +co527060,527060,co52405,Urbano +co522508,522508,co52411,Rural +co522501,522501,co52411,Urbano +co522507,522507,co52411,Rural +co526527,526527,co52418,Rural +co526520,526520,co52418,Urbano +co526529,526529,co52418,Rural +co526528,526528,co52418,Rural +co528001,528001,co52427,Urbano +co528017,528017,co52427,Rural +co528009,528009,co52427,Rural +co528007,528007,co52427,Rural +co528008,528008,co52427,Rural +co525068,525068,co52435,Rural +co525060,525060,co52435,Urbano +co525067,525067,co52435,Rural +co525069,525069,co52435,Rural +co527580,527580,co52473,Urbano +co527588,527588,co52473,Rural +co527589,527589,co52473,Rural +co527587,527587,co52473,Rural +co522027,522027,co52480,Rural +co522020,522020,co52480,Urbano +co527569,527569,co52490,Rural +co527567,527567,co52490,Rural +co527568,527568,co52490,Rural +co527560,527560,co52490,Urbano +co523047,523047,co52506,Rural +co523040,523040,co52506,Urbano +co520038,520038,co52001,Rural +co520018,520018,co52001,Rural +co520002,520002,co52001,Urbano +co520029,520029,co52001,Rural +co520039,520039,co52001,Rural +co520006,520006,co52001,Urbano +co520027,520027,co52001,Rural +co520003,520003,co52001,Urbano +co520007,520007,co52001,Rural +co520019,520019,co52001,Rural +co520001,520001,co52001,Urbano +co520017,520017,co52001,Rural +co520009,520009,co52001,Rural +co520028,520028,co52001,Rural +co520010,520010,co52001,Urbano +co520037,520037,co52001,Rural +co520004,520004,co52001,Urbano +co520008,520008,co52001,Rural +co527001,527001,co52540,Urbano +co527007,527007,co52540,Rural +co527009,527009,co52540,Rural +co527008,527008,co52540,Rural +co524039,524039,co52560,Rural +co524038,524038,co52560,Rural +co524030,524030,co52560,Urbano +co524037,524037,co52560,Rural +co526020,526020,co52565,Urbano +co526027,526027,co52565,Rural +co523548,523548,co52573,Rural +co523547,523547,co52573,Rural +co523540,523540,co52573,Urbano +co524527,524527,co52585,Rural +co524520,524520,co52585,Urbano +co524528,524528,co52585,Rural +co525039,525039,co52612,Rural +co525047,525047,co52612,Rural +co525037,525037,co52612,Rural +co525038,525038,co52612,Rural +co525030,525030,co52612,Urbano +co528037,528037,co52621,Rural +co528030,528030,co52621,Urbano +co528039,528039,co52621,Rural +co528038,528038,co52621,Rural +co528047,528047,co52621,Rural +co526049,526049,co52678,Rural +co526057,526057,co52678,Rural +co526047,526047,co52678,Rural +co526058,526058,co52678,Rural +co526048,526048,co52678,Rural +co526040,526040,co52678,Urbano +co528528,528528,co52835,Rural +co528537,528537,co52835,Rural +co528519,528519,co52835,Rural +co528518,528518,co52835,Rural +co528527,528527,co52835,Rural +co528538,528538,co52835,Rural +co528539,528539,co52835,Rural +co528501,528501,co52835,Urbano +co528508,528508,co52835,Rural +co528502,528502,co52835,Urbano +co528517,528517,co52835,Rural +co528529,528529,co52835,Rural +co528507,528507,co52835,Rural +co528503,528503,co52835,Urbano +co528509,528509,co52835,Rural +co521007,521007,co52685,Rural +co521001,521001,co52685,Urbano +co521050,521050,co52019,Urbano +co520557,520557,co52019,Rural +co521548,521548,co52687,Rural +co521547,521547,co52687,Rural +co521549,521549,co52687,Rural +co521540,521540,co52687,Urbano +co521047,521047,co52693,Rural +co521048,521048,co52693,Rural +co521040,521040,co52693,Urbano +co521508,521508,co52694,Rural +co521507,521507,co52694,Rural +co521501,521501,co52694,Urbano +co522527,522527,co52683,Rural +co522520,522520,co52683,Urbano +co527507,527507,co52696,Rural +co527508,527508,co52696,Rural +co527501,527501,co52696,Urbano +co525579,525579,co52699,Rural +co525570,525570,co52699,Urbano +co525577,525577,co52699,Rural +co525578,525578,co52699,Rural +co525558,525558,co52720,Rural +co525557,525557,co52720,Rural +co525550,525550,co52720,Urbano +co521567,521567,co52786,Rural +co521569,521569,co52786,Rural +co521560,521560,co52786,Urbano +co521568,521568,co52786,Rural +co523507,523507,co52788,Rural +co523501,523501,co52788,Urbano +co523508,523508,co52788,Rural +co525537,525537,co52838,Rural +co525528,525528,co52838,Rural +co525520,525520,co52838,Urbano +co525529,525529,co52838,Rural +co525527,525527,co52838,Rural +co523008,523008,co52885,Rural +co523007,523007,co52885,Rural +co523001,523001,co52885,Urbano +co546070,546070,co54003,Urbano +co546078,546078,co54003,Rural +co546077,546077,co54003,Rural +co546079,546079,co54003,Rural +co544550,544550,co54051,Urbano +co544557,544557,co54051,Rural +co544558,544558,co54051,Rural +co543010,543010,co54099,Urbano +co543018,543018,co54099,Rural +co543017,543017,co54099,Rural +co545557,545557,co54109,Rural +co545550,545550,co54109,Urbano +co545558,545558,co54109,Rural +co546030,546030,co54128,Urbano +co546037,546037,co54128,Rural +co546038,546038,co54128,Rural +co544010,544010,co54125,Urbano +co544017,544017,co54125,Rural +co541070,541070,co54172,Urbano +co541077,541077,co54172,Rural +co544030,544030,co54174,Urbano +co544037,544037,co54174,Rural +co544038,544038,co54174,Rural +co547050,547050,co54206,Urbano +co547057,547057,co54206,Rural +co547058,547058,co54206,Rural +co547059,547059,co54206,Rural +co540019,540019,co54001,Rural +co540018,540018,co54001,Rural +co540011,540011,co54001,Urbano +co540006,540006,co54001,Urbano +co540005,540005,co54001,Urbano +co540013,540013,co54001,Urbano +co540002,540002,co54001,Urbano +co540004,540004,co54001,Urbano +co540008,540008,co54001,Rural +co540017,540017,co54001,Rural +co540003,540003,co54001,Urbano +co540001,540001,co54001,Urbano +co540010,540010,co54001,Urbano +co540007,540007,co54001,Rural +co544520,544520,co54223,Urbano +co544528,544528,co54223,Rural +co544529,544529,co54223,Rural +co544527,544527,co54223,Rural +co544517,544517,co54239,Rural +co544510,544510,co54239,Urbano +co547070,547070,co54245,Urbano +co547078,547078,co54245,Rural +co547077,547077,co54245,Rural +co547079,547079,co54245,Rural +co548050,548050,co54250,Urbano +co548058,548058,co54250,Rural +co548057,548057,co54250,Rural +co545510,545510,co54261,Urbano +co545518,545518,co54261,Rural +co545517,545517,co54261,Rural +co545050,545050,co54313,Urbano +co545057,545057,co54313,Rural +co546510,546510,co54344,Urbano +co546517,546517,co54344,Rural +co542017,542017,co54347,Rural +co542018,542018,co54347,Rural +co542010,542010,co54347,Urbano +co546050,546050,co54385,Urbano +co546058,546058,co54385,Rural +co546057,546057,co54385,Rural +co546530,546530,co54398,Urbano +co546537,546537,co54398,Rural +co542050,542050,co54377,Urbano +co542058,542058,co54377,Rural +co542057,542057,co54377,Rural +co541010,541010,co54405,Urbano +co541017,541017,co54405,Rural +co541018,541018,co54405,Rural +co545070,545070,co54418,Urbano +co545077,545077,co54418,Rural +co544070,544070,co54480,Urbano +co544077,544077,co54480,Rural +co546552,546552,co54498,Urbano +co546559,546559,co54498,Rural +co546551,546551,co54498,Urbano +co546558,546558,co54498,Rural +co546557,546557,co54498,Rural +co543050,543050,co54518,Urbano +co543057,543057,co54518,Rural +co543058,543058,co54518,Rural +co543030,543030,co54520,Urbano +co543038,543038,co54520,Rural +co543037,543037,co54520,Rural +co548030,548030,co54553,Urbano +co548037,548037,co54553,Rural +co541050,541050,co54599,Urbano +co541057,541057,co54599,Rural +co544570,544570,co54660,Urbano +co544577,544577,co54660,Rural +co544578,544578,co54660,Rural +co547010,547010,co54670,Urbano +co547018,547018,co54670,Rural +co547017,547017,co54670,Rural +co545010,545010,co54673,Urbano +co545017,545017,co54673,Rural +co545030,545030,co54680,Urbano +co545037,545037,co54680,Rural +co545530,545530,co54720,Urbano +co545538,545538,co54720,Rural +co545539,545539,co54720,Rural +co545537,545537,co54720,Rural +co544050,544050,co54743,Urbano +co544057,544057,co54743,Rural +co544058,544058,co54743,Rural +co547030,547030,co54800,Urbano +co547038,547038,co54800,Rural +co547037,547037,co54800,Rural +co547039,547039,co54800,Rural +co548010,548010,co54810,Urbano +co548017,548017,co54810,Rural +co548018,548018,co54810,Rural +co542030,542030,co54820,Urbano +co542038,542038,co54820,Rural +co542037,542037,co54820,Rural +co546010,546010,co54871,Urbano +co546017,546017,co54871,Rural +co541030,541030,co54874,Urbano +co541038,541038,co54874,Rural +co861040,861040,co86219,Urbano +co861047,861047,co86219,Rural +co864001,864001,co86573,Urbano +co864009,864009,co86573,Rural +co864008,864008,co86573,Rural +co864007,864007,co86573,Rural +co860001,860001,co86001,Urbano +co860007,860007,co86001,Rural +co860008,860008,co86001,Rural +co862001,862001,co86320,Urbano +co862007,862007,co86320,Rural +co862008,862008,co86320,Rural +co862060,862060,co86568,Urbano +co862068,862068,co86568,Rural +co862067,862067,co86568,Rural +co862069,862069,co86568,Rural +co862080,862080,co86569,Urbano +co862087,862087,co86569,Rural +co863001,863001,co86571,Urbano +co863008,863008,co86571,Rural +co863007,863007,co86571,Rural +co861001,861001,co86755,Urbano +co861007,861007,co86755,Rural +co861008,861008,co86755,Rural +co862040,862040,co86757,Urbano +co862047,862047,co86757,Rural +co861060,861060,co86760,Urbano +co861067,861067,co86760,Rural +co861068,861068,co86760,Rural +co861020,861020,co86749,Urbano +co861027,861027,co86749,Rural +co862020,862020,co86865,Urbano +co862027,862027,co86865,Rural +co862028,862028,co86865,Rural +co861080,861080,co86885,Urbano +co861087,861087,co86885,Rural +co861088,861088,co86885,Rural +co630007,630007,co63001,Rural +co630003,630003,co63001,Urbano +co630004,630004,co63001,Urbano +co630008,630008,co63001,Rural +co630002,630002,co63001,Urbano +co630001,630001,co63001,Urbano +co632040,632040,co63111,Urbano +co632047,632047,co63111,Rural +co632001,632001,co63130,Urbano +co632007,632007,co63130,Rural +co632008,632008,co63130,Rural +co631001,631001,co63190,Urbano +co631008,631008,co63190,Rural +co631007,631007,co63190,Rural +co632020,632020,co63212,Urbano +co632027,632027,co63212,Rural +co634001,634001,co63272,Urbano +co634008,634008,co63272,Rural +co634007,634007,co63272,Rural +co632080,632080,co63302,Urbano +co632087,632087,co63302,Rural +co633020,633020,co63401,Urbano +co633027,633027,co63401,Rural +co633007,633007,co63470,Rural +co633008,633008,co63470,Rural +co633001,633001,co63470,Urbano +co632060,632060,co63548,Urbano +co632067,632067,co63548,Rural +co634027,634027,co63594,Rural +co634020,634020,co63594,Urbano +co631020,631020,co63690,Urbano +co631027,631027,co63690,Rural +co631028,631028,co63690,Rural +co663030,663030,co66045,Urbano +co663038,663038,co66045,Rural +co663037,663037,co66045,Rural +co662010,662010,co66075,Urbano +co662017,662017,co66075,Rural +co664047,664047,co66088,Rural +co664048,664048,co66088,Rural +co664040,664040,co66088,Urbano +co661002,661002,co66170,Urbano +co661007,661007,co66170,Rural +co661008,661008,co66170,Rural +co661001,661001,co66170,Urbano +co664010,664010,co66318,Urbano +co664017,664017,co66318,Rural +co664018,664018,co66318,Rural +co662030,662030,co66383,Urbano +co662037,662037,co66383,Rural +co662001,662001,co66400,Urbano +co662007,662007,co66400,Rural +co661040,661040,co66440,Urbano +co661047,661047,co66440,Rural +co661048,661048,co66440,Rural +co664020,664020,co66456,Urbano +co664028,664028,co66456,Rural +co664027,664027,co66456,Rural +co660001,660001,co66001,Urbano +co660009,660009,co66001,Rural +co660008,660008,co66001,Rural +co660002,660002,co66001,Urbano +co660005,660005,co66001,Urbano +co660007,660007,co66001,Rural +co660004,660004,co66001,Urbano +co660003,660003,co66001,Urbano +co660006,660006,co66001,Urbano +co660017,660017,co66001,Rural +co663011,663011,co66572,Urbano +co663017,663017,co66572,Rural +co663018,663018,co66572,Rural +co664008,664008,co66594,Rural +co664007,664007,co66594,Rural +co664001,664001,co66594,Urbano +co661027,661027,co66682,Rural +co661028,661028,co66682,Rural +co661020,661020,co66682,Urbano +co663001,663001,co66687,Urbano +co663008,663008,co66687,Rural +co663007,663007,co66687,Rural +co685521,685521,co68013,Urbano +co685527,685527,co68013,Rural +co684531,684531,co68020,Urbano +co684537,684537,co68020,Rural +co682051,682051,co68051,Urbano +co682058,682058,co68051,Rural +co682057,682057,co68051,Rural +co684517,684517,co68077,Rural +co684511,684511,co68077,Urbano +co684041,684041,co68079,Urbano +co684047,684047,co68079,Rural +co684048,684048,co68079,Rural +co687032,687032,co68081,Urbano +co687033,687033,co68081,Urbano +co687039,687039,co68081,Rural +co687047,687047,co68081,Rural +co687031,687031,co68081,Urbano +co687038,687038,co68081,Rural +co687037,687037,co68081,Rural +co686501,686501,co68092,Urbano +co686508,686508,co68092,Rural +co686507,686507,co68092,Rural +co685001,685001,co68101,Urbano +co685007,685007,co68101,Rural +co685008,685008,co68101,Rural +co685009,685009,co68101,Rural +co680008,680008,co68001,Rural +co680004,680004,co68001,Urbano +co680003,680003,co68001,Urbano +co680007,680007,co68001,Rural +co680011,680011,co68001,Urbano +co680006,680006,co68001,Urbano +co680001,680001,co68001,Urbano +co680005,680005,co68001,Urbano +co680002,680002,co68001,Urbano +co683501,683501,co68121,Urbano +co683507,683507,co68121,Rural +co680511,680511,co68132,Urbano +co680517,680517,co68132,Rural +co681541,681541,co68147,Urbano +co681548,681548,co68147,Rural +co681547,681547,co68147,Rural +co681521,681521,co68152,Urbano +co681528,681528,co68152,Rural +co681529,681529,co68152,Rural +co681527,681527,co68152,Rural +co682061,682061,co68160,Urbano +co682067,682067,co68160,Rural +co681501,681501,co68162,Urbano +co681508,681508,co68162,Rural +co681509,681509,co68162,Rural +co681507,681507,co68162,Rural +co682551,682551,co68167,Urbano +co682558,682558,co68167,Rural +co682559,682559,co68167,Rural +co682557,682557,co68167,Rural +co680551,680551,co68169,Urbano +co680557,680557,co68169,Rural +co683001,683001,co68176,Urbano +co683007,683007,co68176,Rural +co685557,685557,co68179,Rural +co685551,685551,co68179,Urbano +co686041,686041,co68190,Urbano +co686058,686058,co68190,Rural +co686057,686057,co68190,Rural +co686049,686049,co68190,Rural +co686047,686047,co68190,Rural +co686048,686048,co68190,Rural +co681511,681511,co68207,Urbano +co681519,681519,co68207,Rural +co681518,681518,co68207,Rural +co681517,681517,co68207,Rural +co683531,683531,co68209,Urbano +co683537,683537,co68209,Rural +co683071,683071,co68211,Urbano +co683077,683077,co68211,Rural +co682531,682531,co68217,Urbano +co682538,682538,co68217,Rural +co682537,682537,co68217,Rural +co682539,682539,co68217,Rural +co682041,682041,co68229,Urbano +co682047,682047,co68229,Rural +co682048,682048,co68229,Rural +co686561,686561,co68235,Urbano +co686577,686577,co68235,Rural +co686567,686567,co68235,Rural +co686568,686568,co68235,Rural +co686569,686569,co68235,Rural +co683061,683061,co68245,Urbano +co683067,683067,co68245,Rural +co685027,685027,co68250,Rural +co685021,685021,co68250,Urbano +co687501,687501,co68255,Urbano +co687509,687509,co68255,Rural +co687507,687507,co68255,Rural +co687508,687508,co68255,Rural +co682541,682541,co68264,Urbano +co682547,682547,co68264,Rural +co682548,682548,co68264,Rural +co682549,682549,co68264,Rural +co681561,681561,co68266,Urbano +co681567,681567,co68266,Rural +co684541,684541,co68271,Urbano +co684547,684547,co68271,Rural +co681007,681007,co68276,Rural +co681002,681002,co68276,Urbano +co681008,681008,co68276,Rural +co681004,681004,co68276,Urbano +co681003,681003,co68276,Urbano +co681001,681001,co68276,Urbano +co684051,684051,co68296,Urbano +co684057,684057,co68296,Rural +co684058,684058,co68296,Rural +co683031,683031,co68298,Urbano +co683038,683038,co68298,Rural +co683037,683037,co68298,Rural +co683039,683039,co68298,Rural +co685547,685547,co68327,Rural +co685541,685541,co68327,Urbano +co687558,687558,co68307,Rural +co687557,687557,co68307,Rural +co687541,687541,co68307,Urbano +co687549,687549,co68307,Rural +co687547,687547,co68307,Rural +co687542,687542,co68307,Urbano +co687548,687548,co68307,Rural +co681031,681031,co68318,Urbano +co681048,681048,co68318,Rural +co681047,681047,co68318,Rural +co683051,683051,co68320,Urbano +co683057,683057,co68320,Rural +co683017,683017,co68322,Rural +co683011,683011,co68322,Urbano +co684501,684501,co68324,Urbano +co684507,684507,co68324,Rural +co683571,683571,co68344,Urbano +co683578,683578,co68344,Rural +co684551,684551,co68368,Urbano +co684557,684557,co68368,Rural +co684011,684011,co68370,Urbano +co684017,684017,co68370,Rural +co685061,685061,co68377,Urbano +co685067,685067,co68377,Rural +co685511,685511,co68397,Urbano +co685517,685517,co68397,Rural +co685518,685518,co68397,Rural +co686021,686021,co68385,Urbano +co686027,686027,co68385,Rural +co686029,686029,co68385,Rural +co686028,686028,co68385,Rural +co687571,687571,co68406,Urbano +co687578,687578,co68406,Rural +co687577,687577,co68406,Rural +co687579,687579,co68406,Rural +co687587,687587,co68406,Rural +co684001,684001,co68418,Urbano +co684009,684009,co68418,Rural +co684008,684008,co68418,Rural +co684007,684007,co68418,Rural +co681531,681531,co68425,Urbano +co681538,681538,co68425,Rural +co681537,681537,co68425,Rural +co682011,682011,co68432,Urbano +co682017,682017,co68432,Rural +co682018,682018,co68432,Rural +co680561,680561,co68444,Urbano +co680567,680567,co68444,Rural +co680568,680568,co68444,Rural +co682501,682501,co68464,Urbano +co682508,682508,co68464,Rural +co682507,682507,co68464,Rural +co682509,682509,co68464,Rural +co682031,682031,co68468,Urbano +co682038,682038,co68468,Rural +co682037,682037,co68468,Rural +co682567,682567,co68498,Rural +co682561,682561,co68498,Urbano +co682568,682568,co68498,Rural +co683021,683021,co68500,Urbano +co683029,683029,co68500,Rural +co683019,683019,co68500,Rural +co683027,683027,co68500,Rural +co683028,683028,co68500,Rural +co682521,682521,co68502,Urbano +co682528,682528,co68502,Rural +co682527,682527,co68502,Rural +co682529,682529,co68502,Rural +co682519,682519,co68502,Rural +co683581,683581,co68522,Urbano +co683587,683587,co68522,Rural +co683541,683541,co68524,Urbano +co683547,683547,co68524,Rural +co683527,683527,co68533,Rural +co683528,683528,co68533,Rural +co683521,683521,co68533,Urbano +co681012,681012,co68547,Urbano +co681017,681017,co68547,Rural +co681027,681027,co68547,Rural +co681011,681011,co68547,Urbano +co681019,681019,co68547,Rural +co681018,681018,co68547,Rural +co683511,683511,co68549,Urbano +co683518,683518,co68549,Rural +co683517,683517,co68549,Rural +co684521,684521,co68572,Urbano +co684527,684527,co68572,Rural +co686001,686001,co68573,Urbano +co686007,686007,co68573,Rural +co686008,686008,co68573,Rural +co687061,687061,co68575,Urbano +co687067,687067,co68575,Rural +co687069,687069,co68575,Rural +co687068,687068,co68575,Rural +co687511,687511,co68615,Urbano +co687519,687519,co68615,Rural +co687517,687517,co68615,Rural +co687527,687527,co68615,Rural +co687518,687518,co68615,Rural +co687007,687007,co68655,Rural +co687008,687008,co68655,Rural +co687001,687001,co68655,Urbano +co682001,682001,co68669,Urbano +co682008,682008,co68669,Rural +co682007,682007,co68669,Rural +co682009,682009,co68669,Rural +co685531,685531,co68673,Urbano +co685537,685537,co68673,Rural +co684031,684031,co68679,Urbano +co684037,684037,co68679,Rural +co684039,684039,co68679,Rural +co684038,684038,co68679,Rural +co682511,682511,co68682,Urbano +co682517,682517,co68682,Rural +co682021,682021,co68684,Urbano +co682027,682027,co68684,Rural +co681551,681551,co68686,Urbano +co681557,681557,co68686,Rural +co686531,686531,co68689,Urbano +co686539,686539,co68689,Rural +co686537,686537,co68689,Rural +co686538,686538,co68689,Rural +co686547,686547,co68689,Rural +co681021,681021,co68705,Urbano +co681038,681038,co68705,Rural +co681037,681037,co68705,Rural +co685501,685501,co68720,Urbano +co685507,685507,co68720,Rural +co683561,683561,co68745,Urbano +co683568,683568,co68745,Rural +co683577,683577,co68745,Rural +co683569,683569,co68745,Rural +co683567,683567,co68745,Rural +co683557,683557,co68755,Rural +co683551,683551,co68755,Urbano +co683558,683558,co68755,Rural +co683041,683041,co68770,Urbano +co683048,683048,co68770,Rural +co683049,683049,co68770,Rural +co683047,683047,co68770,Rural +co685041,685041,co68773,Urbano +co685048,685048,co68773,Rural +co685047,685047,co68773,Rural +co685049,685049,co68773,Rural +co680501,680501,co68780,Urbano +co680507,680507,co68780,Rural +co680541,680541,co68820,Urbano +co680548,680548,co68820,Rural +co680547,680547,co68820,Rural +co682571,682571,co68855,Urbano +co682577,682577,co68855,Rural +co682578,682578,co68855,Rural +co685561,685561,co68861,Urbano +co685569,685569,co68861,Rural +co685567,685567,co68861,Rural +co685568,685568,co68861,Rural +co680531,680531,co68867,Urbano +co680527,680527,co68867,Rural +co684021,684021,co68872,Urbano +co684027,684027,co68872,Rural +co684028,684028,co68872,Rural +co684069,684069,co68895,Rural +co684061,684061,co68895,Urbano +co684067,684067,co68895,Rural +co684068,684068,co68895,Rural +co702030,702030,co70110,Urbano +co702037,702037,co70110,Rural +co704010,704010,co70124,Urbano +co704018,704018,co70124,Rural +co704017,704017,co70124,Rural +co701017,701017,co70230,Rural +co701010,701010,co70230,Urbano +co707030,707030,co70204,Urbano +co707037,707037,co70204,Rural +co705039,705039,co70215,Rural +co705038,705038,co70215,Rural +co705037,705037,co70215,Rural +co705030,705030,co70215,Urbano +co706057,706057,co70221,Rural +co706050,706050,co70221,Urbano +co705058,705058,co70233,Rural +co705057,705057,co70233,Rural +co705050,705050,co70233,Urbano +co702050,702050,co70235,Urbano +co702057,702057,co70235,Rural +co703070,703070,co70265,Urbano +co703078,703078,co70265,Rural +co703077,703077,co70265,Rural +co704057,704057,co70400,Rural +co704050,704050,co70400,Urbano +co701050,701050,co70418,Urbano +co701058,701058,co70418,Rural +co701057,701057,co70418,Rural +co703050,703050,co70429,Urbano +co703058,703058,co70429,Rural +co703057,703057,co70429,Rural +co701078,701078,co70473,Rural +co701077,701077,co70473,Rural +co701070,701070,co70473,Urbano +co701030,701030,co70508,Urbano +co701038,701038,co70508,Rural +co701037,701037,co70508,Rural +co706030,706030,co70523,Urbano +co706037,706037,co70523,Rural +co705079,705079,co70670,Rural +co705078,705078,co70670,Rural +co705077,705077,co70670,Rural +co705070,705070,co70670,Urbano +co703010,703010,co70678,Urbano +co703017,703017,co70678,Rural +co703018,703018,co70678,Rural +co705010,705010,co70702,Urbano +co705018,705018,co70702,Rural +co705017,705017,co70702,Rural +co702070,702070,co70742,Urbano +co702078,702078,co70742,Rural +co702077,702077,co70742,Rural +co704037,704037,co70708,Rural +co704038,704038,co70708,Rural +co704030,704030,co70708,Urbano +co707018,707018,co70713,Rural +co707017,707017,co70713,Rural +co707010,707010,co70713,Urbano +co702010,702010,co70717,Urbano +co702017,702017,co70717,Rural +co702018,702018,co70717,Rural +co706018,706018,co70820,Rural +co706017,706017,co70820,Rural +co706010,706010,co70820,Urbano +co700007,700007,co70001,Rural +co700008,700008,co70001,Rural +co700003,700003,co70001,Urbano +co700017,700017,co70001,Rural +co700001,700001,co70001,Urbano +co700002,700002,co70001,Urbano +co700009,700009,co70001,Rural +co703030,703030,co70771,Urbano +co703038,703038,co70771,Rural +co703037,703037,co70771,Rural +co707050,707050,co70823,Urbano +co707057,707057,co70823,Rural +co734560,734560,co73024,Urbano +co734567,734567,co73024,Rural +co730527,730527,co73026,Rural +co730528,730528,co73026,Rural +co730520,730520,co73026,Urbano +co731001,731001,co73030,Urbano +co731007,731007,co73030,Rural +co730540,730540,co73043,Urbano +co730547,730547,co73043,Rural +co730548,730548,co73043,Rural +co732060,732060,co73055,Urbano +co732067,732067,co73055,Rural +co732068,732068,co73055,Rural +co735050,735050,co73067,Urbano +co735058,735058,co73067,Rural +co735057,735057,co73067,Rural +co732507,732507,co73124,Rural +co732508,732508,co73124,Rural +co732501,732501,co73124,Urbano +co733590,733590,co73148,Urbano +co733597,733597,co73148,Rural +co731520,731520,co73152,Urbano +co731528,731528,co73152,Rural +co731527,731527,co73152,Rural +co735569,735569,co73168,Rural +co735567,735567,co73168,Rural +co735568,735568,co73168,Rural +co735560,735560,co73168,Urbano +co733501,733501,co73200,Urbano +co733508,733508,co73200,Rural +co733507,733507,co73200,Rural +co735020,735020,co73217,Urbano +co735029,735029,co73217,Rural +co735028,735028,co73217,Rural +co735027,735027,co73217,Rural +co735037,735037,co73217,Rural +co734040,734040,co73226,Urbano +co734047,734047,co73226,Rural +co734048,734048,co73226,Rural +co734540,734540,co73236,Urbano +co734547,734547,co73236,Rural +co733529,733529,co73268,Rural +co733528,733528,co73268,Rural +co733520,733520,co73268,Urbano +co733527,733527,co73268,Rural +co732001,732001,co73270,Urbano +co732008,732008,co73270,Rural +co732007,732007,co73270,Rural +co733510,733510,co73275,Urbano +co733517,733517,co73275,Rural +co731560,731560,co73283,Urbano +co731567,731567,co73283,Rural +co731568,731568,co73283,Rural +co733549,733549,co73319,Rural +co733540,733540,co73319,Urbano +co733547,733547,co73319,Rural +co733558,733558,co73319,Rural +co733548,733548,co73319,Rural +co733557,733557,co73319,Rural +co731540,731540,co73347,Urbano +co731548,731548,co73347,Rural +co731547,731547,co73347,Rural +co732040,732040,co73349,Urbano +co732047,732047,co73349,Rural +co732048,732048,co73349,Rural +co730010,730010,co73001,Urbano +co730006,730006,co73001,Urbano +co730019,730019,co73001,Rural +co730001,730001,co73001,Urbano +co730017,730017,co73001,Rural +co730007,730007,co73001,Rural +co730002,730002,co73001,Urbano +co730005,730005,co73001,Urbano +co730018,730018,co73001,Rural +co730004,730004,co73001,Urbano +co730003,730003,co73001,Urbano +co730008,730008,co73001,Rural +co730009,730009,co73001,Rural +co734028,734028,co73352,Rural +co734027,734027,co73352,Rural +co734020,734020,co73352,Urbano +co731020,731020,co73408,Urbano +co731027,731027,co73408,Rural +co731048,731048,co73411,Rural +co731040,731040,co73411,Urbano +co731047,731047,co73411,Rural +co732020,732020,co73443,Urbano +co732027,732027,co73443,Rural +co732028,732028,co73443,Rural +co734001,734001,co73449,Urbano +co734007,734007,co73449,Rural +co731060,731060,co73461,Urbano +co731067,731067,co73461,Rural +co735001,735001,co73483,Urbano +co735007,735007,co73483,Rural +co735008,735008,co73483,Rural +co735501,735501,co73504,Urbano +co735517,735517,co73504,Rural +co735509,735509,co73504,Rural +co735507,735507,co73504,Rural +co735508,735508,co73504,Rural +co731580,731580,co73520,Urbano +co731587,731587,co73520,Rural +co730501,730501,co73547,Urbano +co730507,730507,co73547,Rural +co735070,735070,co73555,Urbano +co735077,735077,co73555,Rural +co735078,735078,co73555,Rural +co734520,734520,co73563,Urbano +co734528,734528,co73563,Rural +co734527,734527,co73563,Rural +co734501,734501,co73585,Urbano +co734508,734508,co73585,Rural +co734509,734509,co73585,Rural +co734507,734507,co73585,Rural +co735580,735580,co73616,Urbano +co735587,735587,co73616,Rural +co735589,735589,co73616,Rural +co735588,735588,co73616,Rural +co735550,735550,co73622,Urbano +co735557,735557,co73622,Rural +co733040,733040,co73624,Urbano +co733047,733047,co73624,Rural +co733048,733048,co73624,Rural +co733578,733578,co73671,Rural +co733577,733577,co73671,Rural +co733570,733570,co73671,Urbano +co735530,735530,co73675,Urbano +co735538,735538,co73675,Rural +co735537,735537,co73675,Rural +co733001,733001,co73678,Urbano +co733008,733008,co73678,Rural +co733007,733007,co73678,Rural +co730560,730560,co73686,Urbano +co730567,730567,co73686,Rural +co730568,730568,co73686,Rural +co733580,733580,co73770,Urbano +co733588,733588,co73770,Rural +co733587,733587,co73770,Rural +co733020,733020,co73854,Urbano +co733027,733027,co73854,Rural +co730580,730580,co73861,Urbano +co730588,730588,co73861,Rural +co730587,730587,co73861,Rural +co731501,731501,co73870,Urbano +co731507,731507,co73870,Rural +co731508,731508,co73870,Rural +co734060,734060,co73873,Urbano +co734068,734068,co73873,Rural +co734067,734067,co73873,Rural +co762040,762040,co76020,Urbano +co762047,762047,co76020,Rural +co763010,763010,co76036,Urbano +co763017,763017,co76036,Rural +co762018,762018,co76041,Rural +co762010,762010,co76041,Urbano +co762017,762017,co76041,Rural +co761510,761510,co76054,Urbano +co761517,761517,co76054,Rural +co761001,761001,co76100,Urbano +co761008,761008,co76100,Rural +co761007,761007,co76100,Rural +co764501,764501,co76109,Urbano +co764507,764507,co76109,Rural +co764504,764504,co76109,Urbano +co764517,764517,co76109,Rural +co764508,764508,co76109,Rural +co764503,764503,co76109,Urbano +co764502,764502,co76109,Urbano +co764509,764509,co76109,Rural +co763008,763008,co76113,Rural +co763007,763007,co76113,Rural +co763001,763001,co76113,Urbano +co762547,762547,co76122,Rural +co762540,762540,co76122,Urbano +co762548,762548,co76122,Rural +co760008,760008,co76001,Rural +co760030,760030,co76001,Urbano +co760026,760026,co76001,Urbano +co760002,760002,co76001,Urbano +co760001,760001,co76001,Urbano +co760007,760007,co76001,Rural +co760004,760004,co76001,Urbano +co760025,760025,co76001,Urbano +co760045,760045,co76001,Urbano +co760006,760006,co76001,Urbano +co760022,760022,co76001,Urbano +co760014,760014,co76001,Urbano +co760009,760009,co76001,Rural +co760050,760050,co76001,Urbano +co760020,760020,co76001,Urbano +co760031,760031,co76001,Urbano +co760013,760013,co76001,Urbano +co760044,760044,co76001,Urbano +co760043,760043,co76001,Urbano +co760011,760011,co76001,Urbano +co760015,760015,co76001,Urbano +co760003,760003,co76001,Urbano +co760012,760012,co76001,Urbano +co760036,760036,co76001,Urbano +co760046,760046,co76001,Urbano +co760041,760041,co76001,Urbano +co760023,760023,co76001,Urbano +co760035,760035,co76001,Urbano +co760024,760024,co76001,Urbano +co760034,760034,co76001,Urbano +co760032,760032,co76001,Urbano +co760021,760021,co76001,Urbano +co760016,760016,co76001,Urbano +co760010,760010,co76001,Urbano +co760040,760040,co76001,Urbano +co760042,760042,co76001,Urbano +co760033,760033,co76001,Urbano +co760537,760537,co76126,Rural +co760530,760530,co76126,Urbano +co760538,760538,co76126,Rural +co763570,763570,co76130,Urbano +co763578,763578,co76130,Rural +co763577,763577,co76130,Rural +co763579,763579,co76130,Rural +co762021,762021,co76147,Urbano +co762022,762022,co76147,Urbano +co762027,762027,co76147,Rural +co760520,760520,co76233,Urbano +co760527,760527,co76233,Rural +co760529,760529,co76233,Rural +co760528,760528,co76233,Rural +co762001,762001,co76243,Urbano +co762008,762008,co76243,Rural +co762007,762007,co76243,Rural +co761501,761501,co76246,Urbano +co761507,761507,co76246,Rural +co761508,761508,co76246,Rural +co763520,763520,co76248,Urbano +co763527,763527,co76248,Rural +co763528,763528,co76248,Rural +co761560,761560,co76250,Urbano +co761567,761567,co76250,Rural +co763568,763568,co76275,Rural +co763560,763560,co76275,Urbano +co763567,763567,co76275,Rural +co763517,763517,co76306,Rural +co763510,763510,co76306,Urbano +co763518,763518,co76306,Rural +co763501,763501,co76318,Urbano +co763508,763508,co76318,Rural +co763507,763507,co76318,Rural +co763047,763047,co76111,Rural +co763041,763041,co76111,Urbano +co763042,763042,co76111,Urbano +co763048,763048,co76111,Rural +co763049,763049,co76111,Rural +co764001,764001,co76364,Urbano +co764008,764008,co76364,Rural +co764007,764007,co76364,Rural +co760510,760510,co76377,Urbano +co760518,760518,co76377,Rural +co760517,760517,co76377,Rural +co761548,761548,co76400,Rural +co761547,761547,co76400,Rural +co761540,761540,co76400,Urbano +co762510,762510,co76403,Urbano +co762517,762517,co76403,Rural +co762501,762501,co76497,Urbano +co762507,762507,co76497,Rural +co763537,763537,co76520,Rural +co763532,763532,co76520,Urbano +co763531,763531,co76520,Urbano +co763533,763533,co76520,Urbano +co763538,763538,co76520,Rural +co763539,763539,co76520,Rural +co763547,763547,co76520,Rural +co763558,763558,co76563,Rural +co763550,763550,co76563,Urbano +co763557,763557,co76563,Rural +co760540,760540,co76606,Urbano +co760547,760547,co76606,Rural +co760548,760548,co76606,Rural +co761030,761030,co76616,Urbano +co761038,761038,co76616,Rural +co761037,761037,co76616,Rural +co761558,761558,co76622,Rural +co761550,761550,co76622,Urbano +co761557,761557,co76622,Rural +co763030,763030,co76670,Urbano +co763037,763037,co76670,Rural +co763038,763038,co76670,Rural +co762538,762538,co76736,Rural +co762530,762530,co76736,Urbano +co762537,762537,co76736,Rural +co761520,761520,co76823,Urbano +co761527,761527,co76823,Rural +co761528,761528,co76823,Rural +co761020,761020,co76828,Urbano +co761027,761027,co76828,Rural +co761028,761028,co76828,Rural +co763029,763029,co76834,Rural +co763028,763028,co76834,Rural +co763022,763022,co76834,Urbano +co763023,763023,co76834,Urbano +co763027,763027,co76834,Rural +co763021,763021,co76834,Urbano +co762030,762030,co76845,Urbano +co762037,762037,co76845,Rural +co761537,761537,co76863,Rural +co761530,761530,co76863,Urbano +co760550,760550,co76869,Urbano +co760557,760557,co76869,Rural +co761040,761040,co76890,Urbano +co761047,761047,co76890,Rural +co761048,761048,co76890,Rural +co760507,760507,co76892,Rural +co760502,760502,co76892,Urbano +co760501,760501,co76892,Urbano +co760508,760508,co76892,Rural +co762527,762527,co76895,Rural +co762520,762520,co76895,Urbano +co762528,762528,co76895,Rural +co973001,973001,co97161,Urbano +co973007,973007,co97161,Rural +co973008,973008,co97161,Rural +co970001,970001,co97001,Urbano +co970007,970007,co97001,Rural +co970008,970008,co97001,Rural +co970009,970009,co97001,Rural +co972007,972007,co97511,Rural +co972008,972008,co97511,Rural +co973047,973047,co97777,Rural +co973048,973048,co97777,Rural +co972040,972040,co97666,Urbano +co972047,972047,co97666,Rural +co972048,972048,co97666,Rural +co971007,971007,co97889,Rural +co971008,971008,co97889,Rural +co991001,991001,co99773,Urbano +co991008,991008,co99773,Rural +co991017,991017,co99773,Rural +co991018,991018,co99773,Rural +co991047,991047,co99773,Rural +co991058,991058,co99773,Rural +co991007,991007,co99773,Rural +co991019,991019,co99773,Rural +co991029,991029,co99773,Rural +co991009,991009,co99773,Rural +co991059,991059,co99773,Rural +co991039,991039,co99773,Rural +co991049,991049,co99773,Rural +co991038,991038,co99773,Rural +co991028,991028,co99773,Rural +co991057,991057,co99773,Rural +co991048,991048,co99773,Rural +co991037,991037,co99773,Rural +co991027,991027,co99773,Rural +co992001,992001,co99524,Urbano +co992008,992008,co99524,Rural +co992017,992017,co99524,Rural +co992007,992007,co99524,Rural +co992018,992018,co99524,Rural +co992009,992009,co99524,Rural +co990001,990001,co99001,Urbano +co990017,990017,co99001,Rural +co990008,990008,co99001,Rural +co990007,990007,co99001,Rural +co990009,990009,co99001,Rural +co990018,990018,co99001,Rural +co992050,992050,co99624,Urbano +co995007,995007,co99624,Rural +co995008,995008,co99624,Rural +co995009,995009,co99624,Rural \ No newline at end of file diff --git a/l10n_co_base_location/data/res.country.state.csv b/l10n_co_base_location/data/res.country.state.csv new file mode 100644 index 0000000..662ee81 --- /dev/null +++ b/l10n_co_base_location/data/res.country.state.csv @@ -0,0 +1,34 @@ +id,numeric_code +base.state_co_01,05 +base.state_co_02,08 +base.state_co_03,11 +base.state_co_04,13 +base.state_co_05,15 +base.state_co_06,17 +base.state_co_07,18 +base.state_co_08,19 +base.state_co_09,20 +base.state_co_10,23 +base.state_co_11,25 +base.state_co_12,27 +base.state_co_13,41 +base.state_co_14,44 +base.state_co_15,47 +base.state_co_16,50 +base.state_co_17,52 +base.state_co_18,54 +base.state_co_19,63 +base.state_co_20,66 +base.state_co_21,68 +base.state_co_22,70 +base.state_co_23,73 +base.state_co_24,76 +base.state_co_25,81 +base.state_co_26,85 +base.state_co_27,86 +base.state_co_28,88 +base.state_co_29,91 +base.state_co_30,94 +base.state_co_31,95 +base.state_co_32,97 +base.state_co_33,99 diff --git a/l10n_co_base_location/i18n/es.po b/l10n_co_base_location/i18n/es.po new file mode 100644 index 0000000..9466b71 --- /dev/null +++ b/l10n_co_base_location/i18n/es.po @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_base_location +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:44+0000\n" +"PO-Revision-Date: 2021-07-01 14:44+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_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city +msgid "City" +msgstr "Ciudad" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__code +msgid "City Code" +msgstr "Código de Ciudad" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city_zip +msgid "City/locations completion object" +msgstr "Autocompletado de objetos a partir de ciudades/ubicaciones" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country +msgid "Country" +msgstr "País" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_users__country_code +msgid "Country Code" +msgstr "Código de País" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country_state +msgid "Country state" +msgstr "Provincia" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__numeric_code +msgid "Numeric Code" +msgstr "Código Numérico" + +#. module: l10n_co_base_location +#: model_terms:ir.ui.view,arch_db:l10n_co_base_location.res_country_state_search +msgid "States" +msgstr "Estados" + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,help:l10n_co_base_location.field_res_users__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" +"EL código ISO del país en dos caracteres.\n" +"Puede utilizar este campo para la búsqueda rápida." + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_city__code +msgid "The official code for the city" +msgstr "El código oficial de la ciudad." + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__type +msgid "Type" +msgstr "Tipo" diff --git a/l10n_co_base_location/i18n/es_CO.po b/l10n_co_base_location/i18n/es_CO.po new file mode 100644 index 0000000..9466b71 --- /dev/null +++ b/l10n_co_base_location/i18n/es_CO.po @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_base_location +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:44+0000\n" +"PO-Revision-Date: 2021-07-01 14:44+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_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city +msgid "City" +msgstr "Ciudad" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__code +msgid "City Code" +msgstr "Código de Ciudad" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city_zip +msgid "City/locations completion object" +msgstr "Autocompletado de objetos a partir de ciudades/ubicaciones" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country +msgid "Country" +msgstr "País" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_users__country_code +msgid "Country Code" +msgstr "Código de País" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country_state +msgid "Country state" +msgstr "Provincia" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__numeric_code +msgid "Numeric Code" +msgstr "Código Numérico" + +#. module: l10n_co_base_location +#: model_terms:ir.ui.view,arch_db:l10n_co_base_location.res_country_state_search +msgid "States" +msgstr "Estados" + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,help:l10n_co_base_location.field_res_users__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" +"EL código ISO del país en dos caracteres.\n" +"Puede utilizar este campo para la búsqueda rápida." + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_city__code +msgid "The official code for the city" +msgstr "El código oficial de la ciudad." + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__type +msgid "Type" +msgstr "Tipo" diff --git a/l10n_co_base_location/i18n/l10n_co_base_location.pot b/l10n_co_base_location/i18n/l10n_co_base_location.pot new file mode 100644 index 0000000..e5d41c4 --- /dev/null +++ b/l10n_co_base_location/i18n/l10n_co_base_location.pot @@ -0,0 +1,107 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_co_base_location +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-07-01 14:44+0000\n" +"PO-Revision-Date: 2021-07-01 14:44+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_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city +msgid "City" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__code +msgid "City Code" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_city_zip +msgid "City/locations completion object" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_partner +msgid "Contact" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country +msgid "Country" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_users__country_code +msgid "Country Code" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model,name:l10n_co_base_location.model_res_country_state +msgid "Country state" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__display_name +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__id +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner__id +msgid "ID" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state____last_update +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_partner____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_country_state__numeric_code +msgid "Numeric Code" +msgstr "" + +#. module: l10n_co_base_location +#: model_terms:ir.ui.view,arch_db:l10n_co_base_location.res_country_state_search +msgid "States" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_partner__country_code +#: model:ir.model.fields,help:l10n_co_base_location.field_res_users__country_code +msgid "" +"The ISO country code in two chars. \n" +"You can use this field for quick search." +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,help:l10n_co_base_location.field_res_city__code +msgid "The official code for the city" +msgstr "" + +#. module: l10n_co_base_location +#: model:ir.model.fields,field_description:l10n_co_base_location.field_res_city_zip__type +msgid "Type" +msgstr "" diff --git a/l10n_co_base_location/models/__init__.py b/l10n_co_base_location/models/__init__.py new file mode 100644 index 0000000..b5b06f2 --- /dev/null +++ b/l10n_co_base_location/models/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import res_city +from . import res_city_zip +from . import res_country_state +from . import res_country +from . import res_partner diff --git a/l10n_co_base_location/models/res_city.py b/l10n_co_base_location/models/res_city.py new file mode 100644 index 0000000..ec4c3e4 --- /dev/null +++ b/l10n_co_base_location/models/res_city.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResCity(models.Model): + _inherit = "res.city" + + code = fields.Char( + string='City Code', + help="The official code for the city") diff --git a/l10n_co_base_location/models/res_city_zip.py b/l10n_co_base_location/models/res_city_zip.py new file mode 100644 index 0000000..309adf2 --- /dev/null +++ b/l10n_co_base_location/models/res_city_zip.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResCityZip(models.Model): + _inherit = "res.city.zip" + + type = fields.Char(string='Type') diff --git a/l10n_co_base_location/models/res_country.py b/l10n_co_base_location/models/res_country.py new file mode 100644 index 0000000..6d92ab5 --- /dev/null +++ b/l10n_co_base_location/models/res_country.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api + + +class ResCountry(models.Model): + _inherit = 'res.country' + + def name_get(self): + res = [] + + for record in self: + name = u'%s [%s]' % (record.name or '', record.code or '') + res.append((record.id, name)) + + return res diff --git a/l10n_co_base_location/models/res_country_state.py b/l10n_co_base_location/models/res_country_state.py new file mode 100644 index 0000000..ff92b94 --- /dev/null +++ b/l10n_co_base_location/models/res_country_state.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResCountryState(models.Model): + _inherit = "res.country.state" + + numeric_code = fields.Char(string='Numeric Code', size=2) diff --git a/l10n_co_base_location/models/res_partner.py b/l10n_co_base_location/models/res_partner.py new file mode 100644 index 0000000..691bd17 --- /dev/null +++ b/l10n_co_base_location/models/res_partner.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + country_code = fields.Char(related='country_id.code', store=False) diff --git a/l10n_co_base_location/static/description/icon.png b/l10n_co_base_location/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/l10n_co_base_location/static/description/icon.png differ diff --git a/l10n_co_base_location/views/res_city_views.xml b/l10n_co_base_location/views/res_city_views.xml new file mode 100644 index 0000000..3df5e5e --- /dev/null +++ b/l10n_co_base_location/views/res_city_views.xml @@ -0,0 +1,22 @@ + + + + res.city + + + + + + + + + + res.city + + + + + + + + diff --git a/l10n_co_base_location/views/res_city_zip_views.xml b/l10n_co_base_location/views/res_city_zip_views.xml new file mode 100644 index 0000000..1c72432 --- /dev/null +++ b/l10n_co_base_location/views/res_city_zip_views.xml @@ -0,0 +1,12 @@ + + + + res.city.zip + + + + + + + + diff --git a/l10n_co_base_location/views/res_country_state_views.xml b/l10n_co_base_location/views/res_country_state_views.xml new file mode 100644 index 0000000..5f3c990 --- /dev/null +++ b/l10n_co_base_location/views/res_country_state_views.xml @@ -0,0 +1,21 @@ + + + + res.country.state + + + + + + + + + + res.country.state + + + + + + + diff --git a/l10n_co_base_location/views/res_partner_views.xml b/l10n_co_base_location/views/res_partner_views.xml new file mode 100644 index 0000000..bda3cf6 --- /dev/null +++ b/l10n_co_base_location/views/res_partner_views.xml @@ -0,0 +1,10 @@ + + + + res.partner + + + + + + diff --git a/l10n_co_hr_e_payroll/README.rst b/l10n_co_hr_e_payroll/README.rst new file mode 100644 index 0000000..60843fa --- /dev/null +++ b/l10n_co_hr_e_payroll/README.rst @@ -0,0 +1,40 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +============================= +Colombian Account E-Invoicing +============================= + +Configuacion del Server: + +Configurar "server_wide_modules" en el archivo de configuracion para que el modulo funcione correctamente. +Ejemplo: +server_wide_modules = web,web_kanban,l10n_co_hr_e_payroll + +Configuacion: + +1) Configurar Secuencias DIAN, principalmente la clave técnica: + +.. image:: https://raw.githubusercontent.com/odooloco/l10n-colombia/10.0/l10n_co_account_e_invoicing/static/images/ir_sequence.png + +2) Configurar datos de la compañía: + +.. image:: https://raw.githubusercontent.com/odooloco/l10n-colombia/10.0/l10n_co_account_e_invoicing/static/images/res_company.png + +3) Hacer pruebas con las facturas: + +.. image:: https://raw.githubusercontent.com/odooloco/l10n-colombia/10.0/l10n_co_account_e_invoicing/static/images/account_invoice.png + +4) Resultados: + +.. image:: https://raw.githubusercontent.com/odooloco/l10n-colombia/10.0/l10n_co_account_e_invoicing/static/images/dian_document.png + + +Credits +======= + +Contributors +------------ + +* Joan Marín diff --git a/l10n_co_hr_e_payroll/__init__.py b/l10n_co_hr_e_payroll/__init__.py new file mode 100644 index 0000000..a23b3d4 --- /dev/null +++ b/l10n_co_hr_e_payroll/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/l10n_co_hr_e_payroll/__manifest__.py b/l10n_co_hr_e_payroll/__manifest__.py new file mode 100644 index 0000000..ee144e1 --- /dev/null +++ b/l10n_co_hr_e_payroll/__manifest__.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Colombian Hr E-Payroll", + "category": "E-Payroll", + "version": "14.0.1.0.0", + "author": "Avancys SAS", + "website": "https://www.avancys.com/", + "license": "AGPL-3", + "summary": "Colombian Hr E-Payroll", + "depends": [ + "hr_avancys", + "account_fiscal_year", + "l10n_co_base_location", + "l10n_co_partner_person_type", + "l10n_co_sequence_resolution" + ], + 'external_dependencies': { + 'python': [ + 'OpenSSL', + 'xades', + ], + }, + "data": [ + 'security/ir.model.access.csv', + 'data/hr_employee_subtype_data.xml', + 'data/hr_employee_type_data.xml', + "data/hr.payslip.concept.epayroll.type.csv", + "data/ir_cron_data.xml", + 'data/ir_module_category_data.xml', + "data/res_groups_data.xml", + "views/account_fiscal_year_views.xml", + #"views/hr_contract_type_views.xml", + "views/hr_employee_views.xml", + "views/hr_payslip_concept_epayroll_type_views.xml", + "views/hr_payslip_concept_epayroll_type_code_views.xml", + "views/hr_payslip_dian_document_views.xml", + "views/hr_payslip_views.xml", + "views/res_company_views.xml", + "wizard/create_hr_payslip_dian_document_views.xml", + "wizard/process_hr_payslip_dian_document_views.xml" + ], + "installable": True, +} diff --git a/l10n_co_hr_e_payroll/data/email_template_data.xml b/l10n_co_hr_e_payroll/data/email_template_data.xml new file mode 100644 index 0000000..fb34a45 --- /dev/null +++ b/l10n_co_hr_e_payroll/data/email_template_data.xml @@ -0,0 +1,47 @@ + + + + E-Payroll - Send by Email + ${object.company_id.epayroll_email} + ${object.company_id.epayroll_email} + ${object.company_id.partner_id.ref_num};${object.company_id.name};${object.number};${object.company_id.name}; + + ${object.employee_id.partner_id.email or object.company_id.epayroll_partner_no_email}${',' + object.company_id.epayroll_receives_all_emails if object.company_id.epayroll_receives_all_emails else ''} + + ${object.employee_id.partner_id.lang} + +

Señor(es), ${object.employee_id.partner_id.name}

+ +
+ +

Le informamos que ha recibido un documento doporte de nomina electrónica de ${object.company_id.name}:

+ +
+ +

Número: ${object.number}

+ + +
+ +

Si tiene inquietud respecto a la información contenida en el documento doporte de nomina electrónica, responda este correo electrónico.

+ +
+ +

Si pasados tres (3) días hábiles siguientes a la recepción del documento doporte de nomina electrónica, no se ha recibido rechazo del documento doporte de nomina electrónica, el sistema la dará por aceptada.

+ +


+ + + +
+ +

Cordialmente, ${object.company_id.name}

+ ]]>
+
+
diff --git a/l10n_co_hr_e_payroll/data/hr.payslip.concept.epayroll.type.csv b/l10n_co_hr_e_payroll/data/hr.payslip.concept.epayroll.type.csv new file mode 100644 index 0000000..fec096e --- /dev/null +++ b/l10n_co_hr_e_payroll/data/hr.payslip.concept.epayroll.type.csv @@ -0,0 +1,69 @@ +id,code,name,type +hr_payslip_concept_epayroll_type_earned_basico,Basico,Salario Basico,earned +hr_payslip_concept_epayroll_type_earned_excluirdias,ExcluirDias,Excluir Días,earned +hr_payslip_concept_epayroll_type_earned_auxiliotransporte,AuxilioTransporte,Auxilio Transporte,earned +hr_payslip_concept_epayroll_type_earned_viaticomanualojs,ViaticoManuAlojS,Viáticos Manutención/Alojamiento Salarial,earned +hr_payslip_concept_epayroll_type_earned_viaticomanualojns,ViaticoManuAlojNS,Viáticos Manutención/Alojamiento No Salarial,earned +hr_payslip_concept_epayroll_type_earned_heds,HEDs,Hora Extra Diurna,earned +hr_payslip_concept_epayroll_type_earned_hens,HENs,Hora Extra Nocturna,earned +hr_payslip_concept_epayroll_type_earned_hrns,HRNs,Hora Recargo Nocturno,earned +hr_payslip_concept_epayroll_type_earned_heddfs,HEDDFs,Hora Extra Diurna Dominical y Festivos,earned +hr_payslip_concept_epayroll_type_earned_hrddfs,HRDDFs,Hora Recargo Diurno Dominical y Festivos,earned +hr_payslip_concept_epayroll_type_earned_hendfs,HENDFs,Hora Extra Nocturna Dominical y Festivos,earned +hr_payslip_concept_epayroll_type_earned_hrndfs,HRNDFs,Hora Recargo Nocturno Dominical y Festivos,earned +hr_payslip_concept_epayroll_type_earned_vacacionescomunes,VacacionesComunes,Vacaciones Comunes,earned +hr_payslip_concept_epayroll_type_earned_vacacionescomunesdias,VacacionesComunesDias,Vacaciones Comunes Días,earned +hr_payslip_concept_epayroll_type_earned_vacacionescompensadas,VacacionesCompensadas,Vacaciones Compensadas,earned +hr_payslip_concept_epayroll_type_earned_primas,PrimaS,Prima Salarial,earned +hr_payslip_concept_epayroll_type_earned_primans,PrimaNS,Prima No Salarial,earned +hr_payslip_concept_epayroll_type_earned_cesantias,Cesantias,Cesantias,earned +hr_payslip_concept_epayroll_type_earned_interesescesantias,InteresesCesantias,Intereses de Cesantias,earned +hr_payslip_concept_epayroll_type_earned_incapacidad1,Incapacidad1,Incapacidad Común,earned +hr_payslip_concept_epayroll_type_earned_incapacidad2,Incapacidad2,Incapacidad Profesional,earned +hr_payslip_concept_epayroll_type_earned_incapacidad3,Incapacidad3,Incapacidad Laboral,earned +hr_payslip_concept_epayroll_type_earned_licenciamp,LicenciaMP,Licencia Materna o Paterna,earned +hr_payslip_concept_epayroll_type_earned_licenciar,LicenciaR,Licencia Remunerada,earned +hr_payslip_concept_epayroll_type_earned_licencianr,LicenciaNR,Licencia No Remunerada,earned +hr_payslip_concept_epayroll_type_earned_bonificacions,BonificacionS,Bonificación Salarial,earned +hr_payslip_concept_epayroll_type_earned_bonificacionns,BonificacionNS,Bonificación No Salarial,earned +hr_payslip_concept_epayroll_type_earned_auxilios,AuxilioS,Auxilio Salarial,earned +hr_payslip_concept_epayroll_type_earned_auxilions,AuxilioNS,Auxilio No Salarial,earned +hr_payslip_concept_epayroll_type_earned_huelgaslegales,HuelgasLegales,Huelgas Legales,earned +hr_payslip_concept_epayroll_type_earned_otroconceptos,OtroConceptoS,Otro Concepto Salarial,earned +hr_payslip_concept_epayroll_type_earned_otroconceptons,OtroConceptoNS,Otro Concepto No Salarial,earned +hr_payslip_concept_epayroll_type_earned_compensaciono,CompensacionO,Compensación Ordinaria,earned +hr_payslip_concept_epayroll_type_earned_compensacione,CompensacionE,Compensación Extraordinaria,earned +hr_payslip_concept_epayroll_type_earned_bonoepctvs,BonoEPCTVS,BonoEPCTV Salarial,earned +hr_payslip_concept_epayroll_type_earned_bonoepctvns,BonoEPCTVNS,BonoEPCTV No Salarial,earned +hr_payslip_concept_epayroll_type_earned_bonoepctvalimentacions,BonoEPCTVAlimentacionS,BonoEPCTV Para Alimentación Salarial,earned +hr_payslip_concept_epayroll_type_earned_bonoepctvalimentacionns,BonoEPCTVAlimentacionNS,BonoEPCTV Para Alimentación No Salarial,earned +hr_payslip_concept_epayroll_type_earned_comisiones,Comisiones,Comisiones,earned +hr_payslip_concept_epayroll_type_earned_pagosterceros,PagosTerceros,Pagos a Terceros,earned +hr_payslip_concept_epayroll_type_earned_anticipos,Anticipos,Anticipos de Nómina,earned +hr_payslip_concept_epayroll_type_earned_dotacion,Dotacion,Dotacion,earned +hr_payslip_concept_epayroll_type_earned_apoyosost,ApoyoSost,Apoyo a Sostenimiento ,earned +hr_payslip_concept_epayroll_type_earned_teletrabajo,Teletrabajo,Teletrabajo,earned +hr_payslip_concept_epayroll_type_earned_bonifretiro,BonifRetiro,Bonificación por Retiro,earned +hr_payslip_concept_epayroll_type_earned_indemnizacion,Indemnizacion,Indemnizacion,earned +hr_payslip_concept_epayroll_type_earned_reintegro,Reintegro,Reintegro,earned +hr_payslip_concept_epayroll_type_deduction_salud,Salud,Salud,deduction +hr_payslip_concept_epayroll_type_deduction_fondopension,FondoPension,Fondo de Pensión,deduction +hr_payslip_concept_epayroll_type_deduction_fondosp,FondoSP,Fondo de Solidaridad Pensional,deduction +hr_payslip_concept_epayroll_type_deduction_fondosub,FondoSub,Fondo de Subsistencia,deduction +hr_payslip_concept_epayroll_type_deduction_sindicatos,Sindicatos,Sindicatos,deduction +hr_payslip_concept_epayroll_type_deduction_sancionpublic,SancionPublic,Sanción Pública,deduction +hr_payslip_concept_epayroll_type_deduction_sancionpriv,SancionPriv,Sanción Privada,deduction +hr_payslip_concept_epayroll_type_deduction_libranzas,Libranzas,Libranzas,deduction +hr_payslip_concept_epayroll_type_deduction_pagosterceros,PagosTerceros,Deduccion por Pagos a Terceros,deduction +hr_payslip_concept_epayroll_type_deduction_anticipos,Anticipos,Deduccion por Anticipos de Nómina,deduction +hr_payslip_concept_epayroll_type_deduction_otrasdeducciones,OtrasDeducciones,Otras Deducciones,deduction +hr_payslip_concept_epayroll_type_deduction_pensionvoluntaria,PensionVoluntaria,Pension Voluntaria,deduction +hr_payslip_concept_epayroll_type_deduction_retencionfuente,RetencionFuente,Retención en la Fuente,deduction +hr_payslip_concept_epayroll_type_deduction_afc,AFC,Ahorro Fomento a la Contrucción,deduction +hr_payslip_concept_epayroll_type_deduction_cooperativa,Cooperativa,Cooperativa,deduction +hr_payslip_concept_epayroll_type_deduction_embargofiscal,EmbargoFiscal,Embargo Fiscal,deduction +hr_payslip_concept_epayroll_type_deduction_plancomplementarios,PlanComplementarios,Planes Complementarios de Salud,deduction +hr_payslip_concept_epayroll_type_deduction_educacion,Educacion,Educación,deduction +hr_payslip_concept_epayroll_type_deduction_reintegro,Reintegro,Reintegro,deduction +hr_payslip_concept_epayroll_type_deduction_deuda,Deuda,Deuda,deduction +hr_payslip_concept_epayroll_type_total_comprobantetotal,ComprobanteTotal,Total a Pagar,total diff --git a/l10n_co_hr_e_payroll/data/hr_employee_subtype_data.xml b/l10n_co_hr_e_payroll/data/hr_employee_subtype_data.xml new file mode 100644 index 0000000..9156ccc --- /dev/null +++ b/l10n_co_hr_e_payroll/data/hr_employee_subtype_data.xml @@ -0,0 +1,11 @@ + + + + 00 + No Aplica + + + 01 + Dependiente pensionado por vejez activo + + diff --git a/l10n_co_hr_e_payroll/data/hr_employee_type_data.xml b/l10n_co_hr_e_payroll/data/hr_employee_type_data.xml new file mode 100644 index 0000000..232999a --- /dev/null +++ b/l10n_co_hr_e_payroll/data/hr_employee_type_data.xml @@ -0,0 +1,67 @@ + + + + Dependiente + 01 + + + Servicio domestico + 02 + + + Madre comunitaria + 04 + + + Aprendices del Sena en etapa lectiva + 12 + + + Funcionarios públicos sin tope máximo de ibc + 18 + + + Aprendices del SENA en etapa productiva + 19 + + + Estudiantes de postgrado en salud + 21 + + + Profesor de establecimiento particular + 22 + + + Estudiantes aportes solo riesgos laborales + 23 + + + Dependiente entidades o universidades públicas con régimen especial en salud + 30 + + + Cooperados o pre cooperativas de trabajo asociado + 31 + + + Trabajador dependiente de entidad beneficiaria del sistema general de participaciones - aportes patronales + 47 + + + Trabajador de tiempo parcial + 51 + + + Pre pensionado de entidad en liquidación + 54 + + + Pre pensionado con aporte voluntario a salud + 56 + + + Estudiantes de prácticas laborales en el sector público + 58 + + diff --git a/l10n_co_hr_e_payroll/data/ir_cron_data.xml b/l10n_co_hr_e_payroll/data/ir_cron_data.xml new file mode 100644 index 0000000..7685da6 --- /dev/null +++ b/l10n_co_hr_e_payroll/data/ir_cron_data.xml @@ -0,0 +1,15 @@ + + + + Process Hr Payslip DIAN Documents + + + 1 + + days + -1 + + code + model.cron_process_hr_payslip_dian_documents() + + diff --git a/l10n_co_hr_e_payroll/data/ir_module_category_data.xml b/l10n_co_hr_e_payroll/data/ir_module_category_data.xml new file mode 100644 index 0000000..938a906 --- /dev/null +++ b/l10n_co_hr_e_payroll/data/ir_module_category_data.xml @@ -0,0 +1,6 @@ + + + + E-Payroll + + diff --git a/l10n_co_hr_e_payroll/data/res_groups_data.xml b/l10n_co_hr_e_payroll/data/res_groups_data.xml new file mode 100644 index 0000000..7ecec25 --- /dev/null +++ b/l10n_co_hr_e_payroll/data/res_groups_data.xml @@ -0,0 +1,23 @@ + + + + View DIAN Documents + + + + + View 'Send E-Payroll to DIAN?' Field + + + + + View 'Accepted/Rejected' Fields + + + + + View 'Employee Type' Field + + + + diff --git a/l10n_co_hr_e_payroll/models/__init__.py b/l10n_co_hr_e_payroll/models/__init__.py new file mode 100644 index 0000000..3d1e700 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_fiscal_year +from . import res_company +from . import res_partner +from . import hr_contract_type +from . import hr_employee_epayroll_subtype +from . import hr_employee_epayroll_type +from . import hr_employee +from . import hr_payslip_concept_epayroll_type_code +from . import hr_payslip_concept_epayroll_type +from . import hr_payslip_dian_document +from . import hr_payslip_dian_document_line +from . import hr_payslip +from . import ir_sequence diff --git a/l10n_co_hr_e_payroll/models/account_fiscal_year.py b/l10n_co_hr_e_payroll/models/account_fiscal_year.py new file mode 100644 index 0000000..aef911d --- /dev/null +++ b/l10n_co_hr_e_payroll/models/account_fiscal_year.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class AccountFiscalYear(models.Model): + _inherit = 'account.fiscal.year' + + nie_sent = fields.Integer(string='NIE Sent', default=0) + niae_sent = fields.Integer(string='NIAE Sent', default=0) diff --git a/l10n_co_hr_e_payroll/models/date_range.py b/l10n_co_hr_e_payroll/models/date_range.py new file mode 100644 index 0000000..69d2a25 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/date_range.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models, fields + + +class DateRange(models.Model): + _inherit = 'date.range' + + nie_sent = fields.Integer(string='NIE Sent', default=0) + niae_sent = fields.Integer(string='NIAE Sent', default=0) + diff --git a/l10n_co_hr_e_payroll/models/global_functions.py b/l10n_co_hr_e_payroll/models/global_functions.py new file mode 100644 index 0000000..5c7e485 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/global_functions.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import hashlib +from os import path +from uuid import uuid4 +from base64 import b64encode, b64decode +from io import BytesIO +from datetime import datetime, timedelta +import OpenSSL.crypto as crypto +from lxml import etree +from jinja2 import Environment, FileSystemLoader +from pgxades import XAdESContext, PolicyId, template +import xmlsig +from qrcode import QRCode, constants +from odoo import _ +from odoo.exceptions import ValidationError + + +def get_software_security_code(IdSoftware, Pin, NroDocumentos): + uncoded_value = (IdSoftware + ' + ' + Pin + ' + ' + NroDocumentos) + software_security_code = IdSoftware + Pin + NroDocumentos + software_security_code = hashlib.sha384(software_security_code.encode('utf-8')) + + return { + 'SoftwareSecurityCodeUncoded': uncoded_value, + 'SoftwareSecurityCode': software_security_code.hexdigest()} + + +def get_cune( + NumNE, + FecNE, + HorNE, + ValDev, + ValDed, + ValTolNE, + NitNE, + DocEmp, + TipoXML, + SoftwarePIN, + TipoAmb): + # CUNE = SHA-384(NumNE + FecNE + HorNE + ValDev + ValDed + ValTolNE + NitNE + # + DocEmp + TipoXML + Software-Pin + TipAmb) + uncoded_value = (NumNE + ' + ' + FecNE + ' + ' + HorNE + ' + ' + ValDev + ' + ' + + ValDed + ' + ' + ValTolNE + ' + ' + NitNE + ' + ' + DocEmp + + ' + ' + TipoXML + ' + ' + SoftwarePIN + ' + ' + TipoAmb) + CUNE = ( + NumNE + FecNE + HorNE + ValDev + ValDed + ValTolNE + NitNE + DocEmp + TipoXML + + SoftwarePIN + TipoAmb) + CUNE = hashlib.sha384(CUNE.encode('utf-8')) + + return { + 'CUNEUncoded': uncoded_value, + 'CUNE': CUNE.hexdigest()} + + +# https://stackoverflow.com/questions/38432809/dynamic-xml-template-generation-using-get-template-jinja2 +def get_template_xml(values, template_name): + base_path = path.dirname(path.dirname(__file__)) + env = Environment(loader=FileSystemLoader(path.join(base_path, 'templates'))) + template_xml = env.get_template('{}.xml'.format(template_name)) + xml = template_xml.render(values) + + return xml.replace('&', '&').encode('utf-8') + + +def get_pkcs12(certificate_file, certificate_password): + msg = _("The certificate password or certificate file is not valid.\n\n" + "Exception: %s") + + try: + return crypto.load_pkcs12(b64decode(certificate_file), certificate_password) + except Exception as e: + raise ValidationError(msg % e) + + +# https://www.decalage.info/en/python/lxml-c14n +def get_xml_with_c14n(xml): + if not isinstance(xml, etree._Element): + xml = etree.fromstring(xml.encode('utf-8')) + + out = BytesIO() + xml.getroottree().write_c14n(out) + value = b64encode(out.getvalue()).decode("utf-8") + out.close() + + return value + + +# https://github.com/etobella/python-xades +def get_xml_with_signature( + xml_without_signature, + signature_policy_url, + signature_policy_file, + signature_policy_description, + certificate_file, + certificate_password): + # https://lxml.de/tutorial.html + # root = etree.fromstring(response.content) + # root = etree.tostring(root, encoding='utf-8') + # parser = etree.XMLParser(encoding='utf-8', remove_blank_text=True) + ds = "http://www.w3.org/2000/09/xmldsig#" + ext = "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" + parser = etree.XMLParser(remove_comments=True, remove_blank_text=True) + root = etree.fromstring(xml_without_signature, parser=parser) + signature_id = "xmldsig-{}".format(uuid4()) + signature = xmlsig.template.create( + xmlsig.constants.TransformInclC14N, + xmlsig.constants.TransformRsaSha512, + signature_id) + + # Complememto para añadir atributo faltante + for element in root.iter("{%s}SignatureValue" % ds): + element.attrib['Id'] = signature_id + "-sigvalue" + + ref = xmlsig.template.add_reference( + signature, + xmlsig.constants.TransformSha512, + uri="", + name=signature_id + "-ref0") + xmlsig.template.add_transform(ref, xmlsig.constants.TransformEnveloped) + sp = xmlsig.template.add_reference( + signature, + xmlsig.constants.TransformSha512, + uri="#" + signature_id + "-signedprops", + uri_type="http://uri.etsi.org/01903#SignedProperties") + xmlsig.template.add_transform(sp, xmlsig.constants.TransformInclC14N) + xmlsig.template.add_reference( + signature, + xmlsig.constants.TransformSha512, + uri="#" + signature_id + "-keyinfo") + ki = xmlsig.template.ensure_key_info(signature, name=signature_id + "-keyinfo") + data = xmlsig.template.add_x509_data(ki) + xmlsig.template.x509_data_add_certificate(data) + xmlsig.template.x509_data_add_subject_name(data) + serial = xmlsig.template.x509_data_add_issuer_serial(data) + xmlsig.template.x509_issuer_serial_add_issuer_name(serial) + xmlsig.template.x509_issuer_serial_add_serial_number(serial) + xmlsig.template.add_key_value(ki) + qualifying = template.create_qualifying_properties(signature) + props = template.create_signed_properties( + qualifying, name=signature_id + "-signedprops") + template.add_claimed_role(props, "supplier") + policy = PolicyId() + policy.id = signature_policy_url + policy.name = signature_policy_description + policy.remote = b64decode(signature_policy_file) + policy.hash_method = xmlsig.constants.TransformSha512 + ctx = XAdESContext(policy) + ctx.load_pkcs12(get_pkcs12(certificate_file, certificate_password)) + root.append(signature) + ctx.sign(signature) + ctx.verify(signature) + root.remove(signature) + + for element in root.iter("{%s}ExtensionContent" % ext): + element.append(signature) + + return get_xml_with_c14n(root) + + +def get_xml_soap_values(certificate_file, certificate_password): + Created = datetime.utcnow() + Expires = Created + timedelta(seconds=60000) + Created = Created.strftime("%Y-%m-%dT%H:%M:%S.001Z") + Expires = Expires.strftime("%Y-%m-%dT%H:%M:%S.001Z") + # https://github.com/mit-dig/idm/blob/master/idm_query_functions.py#L151 + pkcs12 = get_pkcs12(certificate_file, certificate_password) + cert = pkcs12.get_certificate() + der = b64encode(crypto.dump_certificate(crypto.FILETYPE_ASN1, cert)).decode('utf-8') + + return { + 'Created': Created, + 'Expires': Expires, + 'Id': uuid4(), + 'BinarySecurityToken': der} + + +def get_xml_soap_with_signature( + xml_soap_without_signature, Id, certificate_file, certificate_password): + wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" + wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" + X509v3 = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" + parser = etree.XMLParser(remove_comments=True, remove_blank_text=True) + root = etree.fromstring(xml_soap_without_signature, parser=parser) + signature_id = "{}".format(Id) + signature = xmlsig.template.create( + xmlsig.constants.TransformExclC14N, + xmlsig.constants.TransformRsaSha256, # solo me ha funcionado con esta + "SIG-" + signature_id) + ref = xmlsig.template.add_reference( + signature, xmlsig.constants.TransformSha256, uri="#id-" + signature_id) + xmlsig.template.add_transform(ref, xmlsig.constants.TransformExclC14N) + ki = xmlsig.template.ensure_key_info(signature, name="KI-" + signature_id) + ctx = xmlsig.SignatureContext() + ctx.load_pkcs12(get_pkcs12(certificate_file, certificate_password)) + + for element in root.iter("{%s}Security" % wsse): + element.append(signature) + + ki_str = etree.SubElement(ki, "{%s}SecurityTokenReference" % wsse) + ki_str.attrib["{%s}Id" % wsu] = "STR-" + signature_id + ki_str_reference = etree.SubElement(ki_str, "{%s}Reference" % wsse) + ki_str_reference.attrib['URI'] = "#X509-" + signature_id + ki_str_reference.attrib['ValueType'] = X509v3 + ctx.sign(signature) + ctx.verify(signature) + + return root + + +def get_qr_image(data): + qr_code = QRCode( + version=1, + error_correction=constants.ERROR_CORRECT_L, + box_size=20, + border=4) + qr_code.add_data(data) + qr_code.make(fit=True) + image = qr_code.make_image() + temp = BytesIO() + image.save(temp, format="PNG") + qr_image = b64encode(temp.getvalue()).decode('utf-8') + temp.close() + + return qr_image diff --git a/l10n_co_hr_e_payroll/models/hr_contract_type.py b/l10n_co_hr_e_payroll/models/hr_contract_type.py new file mode 100644 index 0000000..6e7a70d --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_contract_type.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrContractType(models.Model): + _inherit = 'hr.contract.type' + + epayroll_type = fields.Selection( + selection=[ + ('1', 'Termino Fijo'), + ('2', 'Término Indefinido'), + ('3', 'Obra o Labor'), + ('4', 'Aprendizaje'), + ('5', 'Prácticas o Pasantías')], + string='E-Payroll Type', + default=False) diff --git a/l10n_co_hr_e_payroll/models/hr_employee.py b/l10n_co_hr_e_payroll/models/hr_employee.py new file mode 100644 index 0000000..51fd95a --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_employee.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrEmployee(models.Model): + _inherit = 'hr.employee' + + epayroll_type_id = fields.Many2one( + comodel_name='hr.employee.epayroll.type', string='E-Payroll Type') + epayroll_subtype_id = fields.Many2one( + comodel_name='hr.employee.epayroll.subtype', string='E-Payroll Subtype') diff --git a/l10n_co_hr_e_payroll/models/hr_employee_epayroll_subtype.py b/l10n_co_hr_e_payroll/models/hr_employee_epayroll_subtype.py new file mode 100644 index 0000000..c471143 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_employee_epayroll_subtype.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrEmployeeEpayrollSubtype(models.Model): + _name = 'hr.employee.epayroll.subtype' + _description = 'E-Payroll Subtypes of the Employee' + + code = fields.Char(string='Code') + name = fields.Char(string='Name') diff --git a/l10n_co_hr_e_payroll/models/hr_employee_epayroll_type.py b/l10n_co_hr_e_payroll/models/hr_employee_epayroll_type.py new file mode 100644 index 0000000..98ac1a5 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_employee_epayroll_type.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrEmployeeEpayrollType(models.Model): + _name = 'hr.employee.epayroll.type' + _description = 'E-Payroll Types of the Employee' + + code = fields.Char(string='Code') + name = fields.Char(string='Name') diff --git a/l10n_co_hr_e_payroll/models/hr_payslip.py b/l10n_co_hr_e_payroll/models/hr_payslip.py new file mode 100644 index 0000000..9bb396c --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_payslip.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, timedelta +from pytz import timezone +from uuid import uuid4 +from odoo import api, models, fields, SUPERUSER_ID, _ +from odoo.exceptions import ValidationError + + +class HrPayslip(models.Model): + _inherit = "hr.payslip" + ''' + @api.model + def _default_operation_type(self): + user = self.env['res.users'].search([('id', '=', self.env.user.id)]) + view_operation_type_field = False + + if (user.has_group('l10n_co_hr_e_payroll.group_view_operation_type_field') + and self.env.user.id != SUPERUSER_ID): + view_operation_type_field = True + + if 'type' in self._context.keys(): + if self._context['type'] == 'out_invoice' and not view_operation_type_field: + return '10' + elif self._context['type'] == 'in_invoice': + return '10' + else: + return False + elif not view_operation_type_field: + return '10' + else: + return False + + @api.model + def _default_invoice_type_code(self): + user = self.env['res.users'].search([('id', '=', self.env.user.id)]) + view_invoice_type_field = False + + if (user.has_group('l10n_co_hr_e_payroll.group_view_invoice_type_field') + and self.env.user.id != SUPERUSER_ID): + view_invoice_type_field = True + + if 'type' in self._context.keys(): + if self._context['type'] == 'out_invoice' and not view_invoice_type_field: + return '01' + elif self._context['type'] == 'in_invoice': + return '05' + else: + return False + elif not view_invoice_type_field: + return '01' + else: + return False + ''' + + @api.model + def _default_send_epayroll_to_dian(self): + return self.env.user.company_id.send_epayroll_to_dian or '0' + + def _compute_warn_certificate(self): + warn_remaining_certificate = False + warn_inactive_certificate = False + + if self.company_id.epayroll_enabled: + warn_inactive_certificate = True + + if (self.company_id.epayroll_certificate_file + and self.company_id.epayroll_certificate_password + and self.company_id.epayroll_certificate_date): + remaining_days = self.company_id.epayroll_certificate_remaining_days or 0 + today = fields.Date.context_today(self) + date_to = self.company_id.epayroll_certificate_date + days = (date_to - today).days + warn_inactive_certificate = False + + if days < remaining_days: + if days < 0: + warn_inactive_certificate = True + else: + warn_remaining_certificate = True + + self.warn_inactive_certificate = warn_inactive_certificate + self.warn_remaining_certificate = warn_remaining_certificate + + @api.depends('journal_id') + def _compute_sequence_resolution_id(self): + sequence_resolution_id = False + + if self.journal_id.sequence_id.dian_type == "e-payroll": + sequence_resolution_id = self.journal_id.sequence_id + + self.sequence_resolution_id = sequence_resolution_id + + def _compute_dbname(self): + self.dbname = self._cr.dbname + + warn_remaining_certificate = fields.Boolean( + string="Warn About Remainings?", + compute="_compute_warn_certificate", + store=False) + warn_inactive_certificate = fields.Boolean( + string="Warn About Inactive Certificate?", + compute="_compute_warn_certificate", + store=False) + sequence_resolution_id = fields.Many2one( + comodel_name='ir.sequence', + string='Sequence Resolution', + compute='_compute_sequence_resolution_id', + store=False) + dbname = fields.Char(string="DB Name", compute="_compute_dbname", store=False) + send_epayroll_to_dian = fields.Selection( + selection=[('0', 'Immediately'), ('1', 'After 1 Day'), ('2', 'After 2 Days')], + string='Send E-Payroll to DIAN?', + default=_default_send_epayroll_to_dian, + copy=False) + access_token = fields.Char(string='Access token', copy=False) + is_accepted_rejected = fields.Boolean(string='Is Accepted/Rejected?', copy=False) + accepted_rejected_datetime = fields.Datetime( + string='Datetime of Accepted/Rejected', copy=False) + dian_document_state = fields.Selection( + selection=[ + ('pending', 'No Transferido'), + ('done', 'Emitido'), + ('exception', 'Excepción de Envio'), + ('dian_reject', 'Rechazado DIAN'), + ('dian_accept', 'Aceptado DIAN'), + ('customer_reject', 'Rechazado Cliente'), + ('customer_accept', 'Aceptado Cliente')], + string='DIAN Document State', + default='pending', + readonly=True, + copy=False) + dian_document_ids = fields.Many2many( + comodel_name="hr.payslip.dian.document", + relation="hr_payslip_dian_document_hr_payslip_rel", + column1="payslip_id", + column2="dian_document_id", + string="DIAN Documents") + + def close_slip(self): + res = super(HrPayslip, self).close_slip() + + for payslip_id in self: + if payslip_id.company_id.epayroll_create_dian_document: + payslip_id.action_set_dian_document() + + return res + + def action_set_dian_document(self): + for payslip_id in self: + if not payslip_id.company_id.epayroll_enabled: + return True + + if not payslip_id.dian_document_ids.filtered(lambda d: d.state != 'cancel'): + return True + + # if payslip_id.journal_id.sequence_id.dian_type != "e-payroll": + # return True + + if payslip_id.dian_document_ids.filtered(lambda d: d.state != 'cancel'): + return True + + if (not payslip_id.send_epayroll_to_dian + and payslip_id.company_id.send_epayroll_to_dian): + payslip_id.send_epayroll_to_dian = payslip_id.company_id.send_epayroll_to_dian + + xml_filename = False + zipped_filename = False + ar_xml_filename = False + ad_zipped_filename = False + + for dian_document_id in payslip_id.dian_document_ids: + xml_filename = dian_document_id.xml_filename + zipped_filename = dian_document_id.zipped_filename + ar_xml_filename = dian_document_id.ar_xml_filename + ad_zipped_filename = dian_document_id.ad_zipped_filename + break + + dian_document_id = self.env['hr.payslip.dian.document'].create({ + 'payslip_ids': [(4, [payslip_id.id])], + 'send_type': 'payslip', + 'xml_type': '102', + 'company_id': payslip_id.company_id.id, + 'send_epayroll_to_dian': payslip_id.send_epayroll_to_dian, + 'xml_filename': xml_filename, + 'zipped_filename': zipped_filename, + 'ar_xml_filename': ar_xml_filename, + 'ad_zipped_filename': ad_zipped_filename}) + + set_files = dian_document_id.action_set_files() + + if payslip_id.send_epayroll_to_dian != '0': + continue + + if set_files: + dian_document_id.action_send_zipped_file() + else: + dian_document_id.send_failure_mail() + + return True + + def action_process_dian_document(self): + for payslip_id in self: + dian_document = payslip_id.dian_document_ids.filtered( + lambda d: d.state not in ('cancel', 'done')) + + if dian_document: + dian_document.action_process() + + return True + + def action_restart_dian_document_state(self): + for payslip_id in self: + payslip_id.dian_document_state = 'pending' + + return True diff --git a/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type.py b/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type.py new file mode 100644 index 0000000..cfbb7c9 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrPayslipConceptEpayrollType(models.Model): + _name = 'hr.payslip.concept.epayroll.type' + _description = 'E-Payroll Types of the Concepts' + + code = fields.Char(string='Code') + name = fields.Char(string='Name') + type = fields.Selection( + selection=[ + ('earned', 'Devengado'), + ('deduction', 'Deducción'), + ('total', 'Total')], + string='Type', + default=False) + epayroll_type_code_ids = fields.One2many( + comodel_name='hr.payslip.concept.epayroll.type.code', + inverse_name='epayroll_type_id', + string='Codes') diff --git a/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type_code.py b/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type_code.py new file mode 100644 index 0000000..5ce571d --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_payslip_concept_epayroll_type_code.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class HrPayslipConceptEpayrollTypeCode(models.Model): + _name = 'hr.payslip.concept.epayroll.type.code' + _description = 'Codes of the E-Payroll Types of the Concepts' + + epayroll_type_id = fields.Many2one( + comodel_name='hr.payslip.concept.epayroll.type', + string='E-Payroll Type of the Concept') + code = fields.Char(string='Code') + name = fields.Char(string='Name') diff --git a/l10n_co_hr_e_payroll/models/hr_payslip_dian_document.py b/l10n_co_hr_e_payroll/models/hr_payslip_dian_document.py new file mode 100644 index 0000000..6b6a775 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_payslip_dian_document.py @@ -0,0 +1,1277 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import pytz +from uuid import uuid4 +from dateutil import tz +from urllib import request +from io import BytesIO +from datetime import datetime +from base64 import b64encode, b64decode +from zipfile import ZipFile +import ssl +from pytz import timezone +from requests import post, exceptions +from lxml import etree +from . import global_functions +from odoo import models, api, fields, _ +from odoo.exceptions import ValidationError +import logging + +_logger = logging.getLogger(__name__) +ssl._create_default_https_context = ssl._create_unverified_context + +DIAN = { + 'wsdl-hab': 'https://vpfe-hab.dian.gov.co/WcfDianCustomerServices.svc?wsdl', + 'wsdl': 'https://vpfe.dian.gov.co/WcfDianCustomerServices.svc?wsdl', + 'catalogo-hab': 'https://catalogo-vpfe-hab.dian.gov.co/document/searchqr?documentkey={}', + 'catalogo': 'https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey={}'} + + +class HrPayslipDianDocument(models.Model): + _name = "hr.payslip.dian.document" + _description = 'DIAN Documents' + + def _compute_warn_certificate(self): + warn_remaining_certificate = False + warn_inactive_certificate = False + + if self.company_id.epayroll_enabled: + warn_inactive_certificate = True + + if (self.company_id.epayroll_certificate_file + and self.company_id.epayroll_certificate_password + and self.company_id.epayroll_certificate_date): + remaining_days = self.company_id.epayroll_certificate_remaining_days or 0 + today = fields.Date.context_today(self) + date_to = self.company_id.epayroll_certificate_date + days = (date_to - today).days + warn_inactive_certificate = False + + if days < remaining_days: + if days < 0: + warn_inactive_certificate = True + else: + warn_remaining_certificate = True + + self.warn_inactive_certificate = warn_inactive_certificate + self.warn_remaining_certificate = warn_remaining_certificate + + def _compute_dbname(self): + self.dbname = self._cr.dbname + + def _compute_qr_image(self): + self.qr_image = global_functions.get_qr_image(self._get_qr_data()) + + @api.model + def _default_send_epayroll_to_dian(self): + return self.env.user.company_id.send_epayroll_to_dian or '0' + + def go_to_dian_document(self): + return { + 'type': 'ir.actions.act_window', + 'name': 'Dian Document', + 'view_mode': 'form', + 'res_model': self._name, + 'res_id': self.id, + 'target': 'current'} + + warn_remaining_certificate = fields.Boolean( + string="Warn About Remainings?", + compute="_compute_warn_certificate", + store=False) + warn_inactive_certificate = fields.Boolean( + string="Warn About Inactive Certificate?", + compute="_compute_warn_certificate", + store=False) + dbname = fields.Char(string="DB Name", compute="_compute_dbname", store=False) + state = fields.Selection( + selection=[ + ('draft', 'Draft'), + ('sent', 'Sent'), + ('done', 'Done'), + ('cancel', 'Cancelled')], + string='State', + readonly=True, + default='draft') + name = fields.Char(string='Name', copy=False) + date_start = fields.Date(string='Start Date') + date_end = fields.Date(string='End Date') + employee_id = fields.Many2one(comodel_name='hr.employee', string='Employee') + contract_id = fields.Many2one(comodel_name='hr.contract', string='Contract') + payslip_ids = fields.Many2many( + comodel_name="hr.payslip", + relation="hr_payslip_dian_document_hr_payslip_rel", + column1="dian_document_id", + column2="payslip_id", + string="Payslips") + payslip_datetime = fields.Datetime(string='Payslip Datetime', copy=False) + send_epayroll_to_dian = fields.Selection( + selection=[('0', 'Immediately'), ('1', 'After 1 Day'), ('2', 'After 2 Days')], + string='Send E-Payroll to DIAN?', + default=_default_send_epayroll_to_dian, + copy=False) + access_token = fields.Char(string='Access token', copy=False) + is_accepted_rejected = fields.Boolean(string='Is Accepted/Rejected?', copy=False) + accepted_rejected_datetime = fields.Datetime( + string='Datetime of Accepted/Rejected', copy=False) + send_type = fields.Selection( + selection=[ + ('xml', 'XML'), + ('payslip', 'Payslip')], + string='Send Type', + default=False) + xml_base_filename = fields.Char(string='XML Base Filename') + xml_base_file = fields.Binary(string='XML Base File') + company_id = fields.Many2one(comodel_name='res.company', string='Company') + note_type = fields.Selection( + selection=[ + ('1', 'Reemplazar'), + ('2', 'Eliminar')], + string='Note Type', + default=False) + xml_type = fields.Selection( + selection=[ + ('102', 'NominaIndividual'), + ('103', 'NominaIndividualDeAjuste')], + string='XML Type', + default=False) + related_dian_document_id = fields.Many2one( + comodel_name='hr.payslip.dian.document', string='Related DIAN Document') + invoice_url = fields.Char(string='Invoice Url') + cune_uncoded = fields.Char(string='CUNE Uncoded') + cune = fields.Char(string='CUNE') + software_security_code_uncoded = fields.Char(string='SoftwareSecurityCode Uncoded') + software_security_code = fields.Char(string='SoftwareSecurityCode') + epayroll_profile_execution_id = fields.Selection( + string='Destination Environment of Document', + related='company_id.epayroll_profile_execution_id', + store=False) + xml_filename = fields.Char(string='Invoice XML Filename') + xml_file = fields.Binary(string='Invoice XML File') + zipped_filename = fields.Char(string='Zipped Filename') + zipped_file = fields.Binary(string='Zipped File') + ar_xml_filename = fields.Char(string='ApplicationResponse XML Filename') + ar_xml_file = fields.Binary(string='ApplicationResponse XML File') + validation_datetime = fields.Datetime(string='Validation Datetime', default=False) + ad_zipped_filename = fields.Char(string='AttachedDocument Zipped Filename') + ad_zipped_file = fields.Binary(string='AttachedDocument Zipped File') + mail_sent = fields.Boolean(string='Mail Sent?') + zip_key = fields.Char(string='ZipKey') + get_status_zip_status_code = fields.Selection( + selection=[ + ('2', 'Test set it is found Accepted'), + ('00', 'Processed Correctly'), + ('66', 'NSU not found'), + ('90', 'TrackId not found'), + ('99', 'Validations contain errors in mandatory fields'), + ('other', 'Other')], + string='Status Code', + default=False) + get_status_zip_response = fields.Text(string='Response') + qr_image = fields.Binary("QR Code", compute='_compute_qr_image') + dian_document_line_ids = fields.One2many( + comodel_name='hr.payslip.dian.document.line', + inverse_name='dian_document_id', + string='DIAN Document Lines') + + def _set_filenames(self): + msg1 = _("The document type of '%s' is not NIT") + msg2 = _("'%s' does not have a document type established.") + msg3 = _("'%s' does not have a identification document established.") + msg4 = _('There is no fiscal year corresponding to the date of your invoice.') + + if self.company_id.partner_id.ref_type_id: + if self.company_id.partner_id.ref_type_id.code_dian != '31': + raise ValidationError(msg1 % self.company_id.partner_id.name) + else: + raise ValidationError(msg2 % self.company_id.partner_id.name) + + if not self.company_id.partner_id.ref_num: + raise ValidationError(msg3) + + date_invoice = fields.Date.today() + date_invoice = datetime.strftime(date_invoice, '%Y-%m-%d %H:%M:%S') + fiscal_year_id = self.env['account.fiscal.year'].search([ + ('date_from', '<=', date_invoice), ('date_to', '>=', date_invoice)]) + + if not fiscal_year_id or fiscal_year_id.company_id != self.company_id: + raise ValidationError(msg4) + else: + # Regla: el consecutivo se iniciará en “00000001” cada primero de enero. + zip_sent = fiscal_year_id.nie_sent + fiscal_year_id.niae_sent + + # nnnnnnnnnn: NIT del Sujeto Obligado sin DV, de diez (10) dígitos alineados a + # la derecha y relleno con ceros a la izquierda. + nnnnnnnnnn = self.company_id.partner_id.ref_num.zfill(10) + # aa: Dos (2) últimos dígitos año calendario + aa = date_invoice[2:4] + # dddddddd: consecutivo de archivos enviados, de ocho (8) dígitos hexadecimales + # alineados a la derecha y ajustado a la izquierda con ceros, en el rango: + # 00000001 <= FFFFFFFF + + if self.xml_type == '102': + xml_filename_prefix = 'nie' + fiscal_year_id.nie_sent += 1 + name = fiscal_year_id.nie_sent + elif self.xml_type == '103': + xml_filename_prefix = 'niae' + fiscal_year_id.niae_sent += 1 + name = fiscal_year_id.niae_sent + else: + raise ValidationError("ERROR: TODO 2.0") + + dddddddd = hex(name).replace('0x', '') + dddddddd = dddddddd.zfill(8) + zdddddddd = hex(zip_sent + 1).replace('0x', '').zfill(8) + name = nnnnnnnnnn + aa + str(name) + nnnnnnnnnnaadddddddd = nnnnnnnnnn + aa + dddddddd + zaradnnnnnnnnnnaadddddddd = nnnnnnnnnn + aa + zdddddddd + self.write({ + 'name': xml_filename_prefix + name, + 'xml_filename': xml_filename_prefix + nnnnnnnnnnaadddddddd + '.xml', + 'zipped_filename': 'z' + zaradnnnnnnnnnnaadddddddd + '.zip', + 'ar_xml_filename': 'ar' + zaradnnnnnnnnnnaadddddddd + '.xml', + 'ad_zipped_filename': 'ad' + zaradnnnnnnnnnnaadddddddd + '.zip'}) + + return True + + def _get_concepts(self): + msg = _("Concept '%s' is not Classified in E-Payroll.") + epayroll_type_obj = self.env['hr.payslip.concept.epayroll.type'] + epayroll_type_earned_ids = epayroll_type_obj.search([('type', '=', 'earned')]) + epayroll_type_deduction_ids = epayroll_type_obj.search( + [('type', '=', 'deduction')]) + Basico = {'DiasTrabajados': 0, 'SueldoTrabajado': 0.00} + Transporte = [] + HED = [] + HEN = [] + HRN = [] + HEDDF = [] + HRDDF = [] + HENDF = [] + HRNDF = [] + Vacaciones = {} + Primas = {} + Cesantias = {} + Incapacidades = [] + Licencias = {} + Bonificaciones = [] + Auxilios = [] + HuelgasLegales = [] + OtrosConceptos = [] + Compensaciones = {} + BonoEPCTV = [] + Comisiones = [] + PagosTerceros = [] + Anticipos = [] + Dotacion = False + ApoyoSost = False + Teletrabajo = False + BonifRetiro = False + Indemnizacion = False + Reintegro = False + DevengadosTotal = 0.00 + earning_ids = self.env['hr.payslip.line'] + deduction_ids = self.env['hr.payslip.line'] + + for payslip_id in self.payslip_ids: + earning_ids |= payslip_id.earnings_ids + deduction_ids |= payslip_id.deductions_ids + + for earning_id in earning_ids: + name = earning_id.name + total = earning_id.total + qty = earning_id.qty + rate = earning_id.rate + + if name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Basico').epayroll_type_code_ids]: + Basico['DiasTrabajados'] += qty + Basico['SueldoTrabajado'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'AuxilioTransporte').epayroll_type_code_ids]: + if Transporte: + for transporte in Transporte: + transporte['AuxilioTransporte'] += total + else: + Transporte.append({'AuxilioTransporte': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'ViaticoManuAlojS').epayroll_type_code_ids]: + Transporte.append({'ViaticoManuAlojS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'ViaticoManuAlojNS').epayroll_type_code_ids]: + Transporte.append({'ViaticoManuAlojNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HEDs').epayroll_type_code_ids]: + HED.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HENs').epayroll_type_code_ids]: + HEN.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HRNs').epayroll_type_code_ids]: + HRN.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HEDDFs').epayroll_type_code_ids]: + HEDDF.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HRDDFs').epayroll_type_code_ids]: + HRDDF.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HENDFs').epayroll_type_code_ids]: + HENDF.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HRNDFs').epayroll_type_code_ids]: + HRNDF.append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'VacacionesComunes').epayroll_type_code_ids]: + if 'VacacionesComunes' not in Vacaciones.keys(): + Vacaciones['VacacionesComunes'] = [] + + Vacaciones['VacacionesComunes'].append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'VacacionesCompensadas').epayroll_type_code_ids]: + if 'VacacionesCompensadas' not in Vacaciones.keys(): + Vacaciones['VacacionesCompensadas'] = [] + + Vacaciones['VacacionesCompensadas'].append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'PrimaS').epayroll_type_code_ids]: + if 'Cantidad' not in Primas.keys(): + Primas['Cantidad'] = 0.00 + + if 'Pago' not in Primas.keys(): + Primas['Pago'] = 0.00 + + Primas['Cantidad'] += qty + Primas['Pago'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'PrimaNS').epayroll_type_code_ids]: + if 'PagoNS' not in Primas.keys(): + Primas['PagoNS'] = 0.00 + + Primas['PagoNS'] += total + elif (name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Cesantias').epayroll_type_code_ids] + or name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'InteresesCesantias').epayroll_type_code_ids]): + if not Cesantias: + Cesantias = { + 'Pago': 0.00, 'Porcentaje': 0.00, 'PagoIntereses': 0.00} + + if name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Cesantias').epayroll_type_code_ids]: + Cesantias['Pago'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code =='InteresesCesantias').epayroll_type_code_ids]: + Cesantias['Porcentaje'] = rate + Cesantias['PagoIntereses'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Incapacidad1').epayroll_type_code_ids]: + Incapacidades.append({'Cantidad': qty, 'Tipo': 1, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Incapacidad2').epayroll_type_code_ids]: + Incapacidades.append({'Cantidad': qty, 'Tipo': 2, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Incapacidad3').epayroll_type_code_ids]: + Incapacidades.append({'Cantidad': qty, 'Tipo': 3, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'LicenciaMP').epayroll_type_code_ids]: + if 'LicenciaMP' not in Licencias.keys(): + Licencias['LicenciaMP'] = [] + + Licencias['LicenciaMP'].append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'LicenciaR').epayroll_type_code_ids]: + if 'LicenciaR' not in Licencias.keys(): + Licencias['LicenciaR'] = [] + + Licencias['LicenciaR'].append({'Cantidad': qty, 'Pago': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'LicenciaNR').epayroll_type_code_ids]: + if 'LicenciaNR' not in Licencias.keys(): + Licencias['LicenciaNR'] = [] + + Licencias['LicenciaNR'].append(qty) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonificacionS').epayroll_type_code_ids]: + Bonificaciones.append({'BonificacionS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonificacionNS').epayroll_type_code_ids]: + Bonificaciones.append({'BonificacionNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'AuxilioS').epayroll_type_code_ids]: + Auxilios.append({'AuxilioS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'AuxilioNS').epayroll_type_code_ids]: + Auxilios.append({'AuxilioNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'HuelgasLegales').epayroll_type_code_ids]: + HuelgasLegales.append(qty) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'OtroConceptoS').epayroll_type_code_ids]: + OtrosConceptos.append( + {'DescripcionConcepto': earning_id.name, 'ConceptoS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code =='OtroConceptoNS').epayroll_type_code_ids]: + OtrosConceptos.append( + {'DescripcionConcepto': earning_id.name, 'ConceptoNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'CompensacionO').epayroll_type_code_ids]: + if 'CompensacionO' not in Compensaciones.keys(): + Compensaciones['CompensacionO'] = 0.00 + + Compensaciones['CompensacionO'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'CompensacionE').epayroll_type_code_ids]: + if 'CompensacionE' not in Compensaciones.keys(): + Compensaciones['CompensacionE'] = 0.00 + + Compensaciones['CompensacionE'] += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonoEPCTVS').epayroll_type_code_ids]: + BonoEPCTV.append({'PagoS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonoEPCTVNS').epayroll_type_code_ids]: + BonoEPCTV.append({'PagoNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonoEPCTVAlimentacionS').epayroll_type_code_ids]: + BonoEPCTV.append({'PagoAlimentacionS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonoEPCTVAlimentacionNS').epayroll_type_code_ids]: + BonoEPCTV.append({'PagoAlimentacionNS': total}) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Comisiones').epayroll_type_code_ids]: + Comisiones.append(total) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'PagosTerceros').epayroll_type_code_ids]: + PagosTerceros.append(total) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Anticipos').epayroll_type_code_ids]: + Anticipos.append(total) + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Dotacion').epayroll_type_code_ids]: + Dotacion += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'ApoyoSost').epayroll_type_code_ids]: + ApoyoSost += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Teletrabajo').epayroll_type_code_ids]: + Teletrabajo += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'BonifRetiro').epayroll_type_code_ids]: + BonifRetiro += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Indemnizacion').epayroll_type_code_ids]: + Indemnizacion += total + elif name in [e.name for e in epayroll_type_earned_ids.filtered( + lambda e: e.code == 'Reintegro').epayroll_type_code_ids]: + Reintegro += total + else: + raise ValidationError(msg % earning_id.name) + + DevengadosTotal += total + + Devengados = {} + Devengados['Basico'] = Basico + Devengados['Transporte'] = Transporte + Devengados['HED'] = HED + Devengados['HEN'] = HEN + Devengados['HRN'] = HRN + Devengados['HEDDF'] = HEDDF + Devengados['HRDDF'] = HRDDF + Devengados['HENDF'] = HENDF + Devengados['HRNDF'] = HRNDF + Devengados['Vacaciones'] = Vacaciones + Devengados['Primas'] = Primas + Devengados['Cesantias'] = Cesantias + Devengados['Incapacidades'] = Incapacidades + Devengados['Licencias'] = Licencias + Devengados['Bonificaciones'] = Bonificaciones + Devengados['Auxilios'] = Auxilios + Devengados['HuelgasLegales'] = HuelgasLegales + Devengados['OtrosConceptos'] = OtrosConceptos + Devengados['Compensaciones'] = Compensaciones + Devengados['BonoEPCTV'] = BonoEPCTV + Devengados['Comisiones'] = Comisiones + Devengados['PagosTerceros'] = PagosTerceros + Devengados['Anticipos'] = Anticipos + Devengados['Dotacion'] = Dotacion + Devengados['ApoyoSost'] = ApoyoSost + Devengados['Teletrabajo'] = Teletrabajo + Devengados['BonifRetiro'] = BonifRetiro + Devengados['Indemnizacion'] = Indemnizacion + Devengados['Reintegro'] = Reintegro + Salud = {'Porcentaje': 0.00, 'Deduccion': 0.00} + FondoPension = {'Porcentaje': 0.00, 'Deduccion': 0.00} + FondoSP = {} + Sindicatos = [] + Sanciones = [] + Libranzas = [] + PagosTerceros = [] + Anticipos = [] + OtrasDeducciones = [] + PensionVoluntaria = False + RetencionFuente = False + AFC = False + Cooperativa = False + EmbargoFiscal = False + PlanComplementarios = False + Educacion = False + Reintegro = False + Deuda = False + DeduccionesTotal = 0.00 + + for deduction_id in deduction_ids: + name = deduction_id.name + total = deduction_id.total + rate = deduction_id.rate + + if name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Salud').epayroll_type_code_ids]: + Salud['Porcentaje'] = rate + Salud['Deduccion'] += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'FondoPension').epayroll_type_code_ids]: + FondoPension['Porcentaje'] = rate + FondoPension['Deduccion'] += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'FondoSP').epayroll_type_code_ids]: + if 'DeduccionSP' not in FondoSP.keys(): + FondoSP['DeduccionSP'] = 0.00 + + FondoSP['Porcentaje'] = rate + FondoSP['DeduccionSP'] += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'FondoSub').epayroll_type_code_ids]: + if 'DeduccionSub' not in FondoSP.keys(): + FondoSP['DeduccionSub'] = 0.00 + + FondoSP['PorcentajeSub'] = rate + FondoSP['DeduccionSub'] += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Sindicatos').epayroll_type_code_ids]: + Sindicatos.append({'Porcentaje': rate, 'Deduccion': total}) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'SancionPublic').epayroll_type_code_ids]: + Sanciones.append({'SancionPublic': total, 'SancionPriv': 0.00}) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'SancionPriv').epayroll_type_code_ids]: + Sanciones.append({'SancionPublic': 0.00, 'SancionPriv': total}) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Libranzas').epayroll_type_code_ids]: + Libranzas.append({'Descripcion': deduction_id.name, 'Deduccion': total}) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'PagosTerceros').epayroll_type_code_ids]: + PagosTerceros.append(total) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Anticipos').epayroll_type_code_ids]: + Anticipos.append(total) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'OtrasDeducciones').epayroll_type_code_ids]: + OtrasDeducciones.append(total) + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'PensionVoluntaria').epayroll_type_code_ids]: + PensionVoluntaria += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'RetencionFuente').epayroll_type_code_ids]: + RetencionFuente += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'AFC').epayroll_type_code_ids]: + AFC += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Cooperativa').epayroll_type_code_ids]: + Cooperativa += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'EmbargoFiscal').epayroll_type_code_ids]: + EmbargoFiscal += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'PlanComplementarios').epayroll_type_code_ids]: + PlanComplementarios += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Educacion').epayroll_type_code_ids]: + Educacion += total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Reintegro').epayroll_type_code_ids]: + Reintegro = total + elif name in [e.name for e in epayroll_type_deduction_ids.filtered( + lambda e: e.code == 'Deuda').epayroll_type_code_ids]: + Deuda += total + else: + raise ValidationError(msg % deduction_id.name) + + DeduccionesTotal += total + + Deducciones = {} + Deducciones['Salud'] = Salud + Deducciones['FondoPension'] = FondoPension + Deducciones['FondoSP'] = FondoSP + Deducciones['Sindicatos'] = Sindicatos + Deducciones['Sanciones'] = Sanciones + Deducciones['Libranzas'] = Libranzas + Deducciones['PagosTerceros'] = PagosTerceros + Deducciones['Anticipos'] = Anticipos + Deducciones['OtrasDeducciones'] = OtrasDeducciones + Deducciones['PensionVoluntaria'] = PensionVoluntaria + Deducciones['RetencionFuente'] = RetencionFuente + Deducciones['AFC'] = AFC + Deducciones['Cooperativa'] = Cooperativa + Deducciones['EmbargoFiscal'] = EmbargoFiscal + Deducciones['PlanComplementarios'] = PlanComplementarios + Deducciones['Educacion'] = Educacion + Deducciones['Reintegro'] = Reintegro + Deducciones['Deuda'] = Deuda + ComprobanteTotal = DevengadosTotal - DeduccionesTotal + + return { + 'Devengados': Devengados, + 'Deducciones': Deducciones, + 'DevengadosTotal': DevengadosTotal, + 'DeduccionesTotal': DeduccionesTotal, + 'ComprobanteTotal': ComprobanteTotal} + + def _get_qr_data(self): + employer = self.company_id.partner_id + employee = self.employee_id.partner_id + NumNE = self.name + payslip_datetime = self.payslip_datetime + FecNE = datetime.strftime(payslip_datetime, '%Y-%m-%d') + HorNE = datetime.strftime(payslip_datetime, '%H:%M:%S-05:00') + ValDev = '{:.2f}'.format(0) + ValDed = '{:.2f}'.format(0) + ValTolNE = '{:.2f}'.format(0) + DocAdq = '0' + + if self.note_type != '2': + concepts = self._get_concepts() + ValDev = '{:.2f}'.format(concepts['DevengadosTotal']) + ValDed = '{:.2f}'.format(concepts['DeduccionesTotal']) + ValTolNE = '{:.2f}'.format(concepts['ComprobanteTotal']) + DocAdq = employee.ref_num + + qr_data = "NumNE: " + (NumNE or _('WITHOUT VALIDATE')) + qr_data += "\nFecNE: " + FecNE + qr_data += "\nHorNE: " + HorNE + qr_data += "\nValDev: " + ValDev + qr_data += "\nValDed: " + ValDed + qr_data += "\nValTolNE: " + ValTolNE + qr_data += "\nNitNE: " + (employer.ref_num or '') + qr_data += "\nDocAdq: " + (DocAdq or '') + + if self.cune: + qr_data += "\nCUNE: " + self.cune + + qr_data += "\n\n" + (self.invoice_url or '') + + return qr_data + + def _create_token(self): + self.access_token = self.access_token or uuid4().hex + + def _get_xml_values(self): + msg1 = _("'%s' does not have a identification document established.") + provider = self.company_id.partner_id + employer = self.company_id.partner_id + employee = self.employee_id.partner_id + + if self.company_id.epayroll_have_technological_provider: + provider = self.company_id.epayroll_technological_provider_id + + if not employee.ref_type_id: + raise ValidationError(msg1 % employee.name) + + NumNE = self.name + payslip_datetime = self.payslip_datetime + FecNE = datetime.strftime(payslip_datetime, '%Y-%m-%d') + HorNE = datetime.strftime(payslip_datetime, '%H:%M:%S-05:00') + NitNE = employer.ref_num + TipoXML = self.xml_type + TipoAmb = self.company_id.epayroll_profile_execution_id + + if TipoXML == '102': + Prefijo = 'nie' + Consecutivo = NumNE.replace('nie', '') + elif TipoXML == '103': + Prefijo = 'niae' + Consecutivo = NumNE.replace('niae', '') + else: + raise ValidationError("ERROR: TODO 2.0") + + IdSoftware = self.company_id.epayroll_software_id + software_security_code = global_functions.get_software_security_code( + IdSoftware, + self.company_id.epayroll_software_pin, + NumNE) + + self.write({ + 'software_security_code_uncoded': software_security_code['SoftwareSecurityCodeUncoded'], + 'software_security_code': software_security_code['SoftwareSecurityCode']}) + + return { + 'FechaIngreso': self.contract_id.date_start, + 'FechaLiquidacionInicio': self.date_start, + 'FechaLiquidacionFin': self.date_end, + 'Prefijo': Prefijo, + 'Consecutivo': Consecutivo, + 'Numero': NumNE, + 'ProveedorXML': provider._get_partner_basic_values(), + 'SoftwareID': IdSoftware, + 'SoftwareSecurityCode': software_security_code['SoftwareSecurityCode'], + 'Ambiente': TipoAmb, + 'TipoXML': TipoXML, + 'FechaGen': FecNE, + 'HoraGen': HorNE, + 'Empleador': employer._get_partner_values()} + + def _get_individual_values(self): + xml_values = self._get_xml_values() + employee = self.employee_id.partner_id + xml_values['TipoTrabajador'] = self.employee_id.epayroll_type_id.code + xml_values['SubTipoTrabajador'] = self.employee_id.epayroll_subtype_id.code + xml_values['Trabajador'] = employee._get_employee_values(self.contract_id.wage) + xml_values['TipoContrato'] = self.contract_id.contract_type_id.epayroll_type + concepts = self._get_concepts() + xml_values['Devengados'] = concepts['Devengados'] + xml_values['Deducciones'] = concepts['Deducciones'] + xml_values['DevengadosTotal'] = '{:.2f}'.format(concepts['DevengadosTotal']) + xml_values['DeduccionesTotal'] = '{:.2f}'.format(concepts['DeduccionesTotal']) + xml_values['ComprobanteTotal'] = '{:.2f}'.format(concepts['ComprobanteTotal']) + cune = global_functions.get_cune( + xml_values['Numero'], + xml_values['FechaGen'], + xml_values['HoraGen'], + xml_values['DevengadosTotal'], + xml_values['DeduccionesTotal'], + xml_values['ComprobanteTotal'], + xml_values['Empleador']['NIT'], + xml_values['Trabajador']['NIT'], + xml_values['TipoXML'], + self.company_id.epayroll_software_pin, + xml_values['Ambiente']) + + if xml_values['Ambiente'] == '1': + QRCodeURL = DIAN['catalogo'] + else: + QRCodeURL = DIAN['catalogo-hab'] + + QRCodeURL = QRCodeURL.format(cune['CUNE']) + xml_values['UUID'] = cune['CUNE'] + xml_values['CodigoQR'] = QRCodeURL + + self.write({ + 'invoice_url': QRCodeURL, + 'cune_uncoded': cune['CUNEUncoded'], + 'cune': cune['CUNE']}) + + return xml_values + + def _get_individual_ajuste_reemplazar_values(self): + xml_values = self._get_individual_values() + + return xml_values + + def _get_individual_ajuste_eliminar_values(self): + xml_values = self._get_xml_values() + + cune = global_functions.get_cune( + xml_values['Numero'], + xml_values['FechaGen'], + xml_values['HoraGen'], + '0.00', + '0.00', + '0.00', + xml_values['Empleador']['NIT'], + '0', + xml_values['TipoXML'], + self.company_id.epayroll_software_pin, + xml_values['Ambiente']) + + if xml_values['Ambiente'] == '1': + QRCodeURL = DIAN['catalogo'] + else: + QRCodeURL = DIAN['catalogo-hab'] + + QRCodeURL = QRCodeURL.format(cune['CUNE']) + xml_values['UUID'] = cune['CUNE'] + xml_values['CodigoQR'] = QRCodeURL + + self.write({ + 'invoice_url': QRCodeURL, + 'cune_uncoded': cune['CUNEUncoded'], + 'cune': cune['CUNE']}) + + return xml_values + + def _get_individual_ajuste_values(self): + if self.note_type == '1': + xml_values = self._get_individual_ajuste_reemplazar_values() + elif self.note_type == '2': + xml_values = self._get_individual_ajuste_eliminar_values() + else: + raise ValidationError("ERROR: TODO 2.0") + + xml_values['TipoNota'] = self.note_type + xml_values['NumeroPred'] = self.related_dian_document_id.name + xml_values['CUNEPred'] = self.related_dian_document_id.cune + payslip_datetime = datetime.strftime( + self.related_dian_document_id.payslip_datetime, '%Y-%m-%d') + xml_values['FechaGenPred'] = payslip_datetime + + return xml_values + + def _get_xml_file(self): + if self.xml_type == '102': + xml_without_signature = global_functions.get_template_xml( + self._get_individual_values(), 'NominaIndividual') + elif self.xml_type == '103': + xml_without_signature = global_functions.get_template_xml( + self._get_individual_ajuste_values(), 'NominaIndividualDeAjuste') + else: + raise ValidationError("ERROR: TODO 2.0") + + xml_with_signature = global_functions.get_xml_with_signature( + xml_without_signature, + self.company_id.epayroll_signature_policy_url, + self.company_id.epayroll_signature_policy_file, + self.company_id.epayroll_signature_policy_description, + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + return xml_with_signature + + def _get_zipped_file(self): + output = BytesIO() + zipfile = ZipFile(output, mode='w') + zipfile_content = BytesIO() + xml_file = self._get_xml_file() + zipfile_content.write(b64decode(xml_file)) + zipfile.writestr(self.xml_filename, zipfile_content.getvalue()) + zipfile.close() + #zipfile_content.close() + #zipped_file = b64encode(output.getvalue()).decode('utf-8') + zipped_file = output.getvalue() + #output.close() + + return zipped_file + + def action_set_files(self): + if self.warn_inactive_certificate: + raise ValidationError(_("There is no an active certificate.")) + + if not self.name or not self.xml_filename or not self.zipped_filename: + self._set_filenames() + + self._create_token() + xml_file = self._get_xml_file() + + if xml_file: + zipped_file = self._get_zipped_file() + self.write({'xml_file': xml_file}) + self.write({'zipped_file': zipped_file}) + else: + return xml_file + + _logger.info(self.name + ": action_set_files()") + + return True + + def _get_ad_xml_values(self): + ProfileExecutionID = self.company_id.epayroll_profile_execution_id + ad_zipped_filename = self.ad_zipped_filename + ID = ad_zipped_filename.replace('.zip', '') + timezone = pytz.timezone(self.env.user.tz or 'America/Bogota') + from_zone = tz.gettz('UTC') + to_zone = tz.gettz(timezone.zone) + issue_datetime = datetime.now().replace(tzinfo=from_zone) + IssueDate = issue_datetime.astimezone(to_zone).strftime('%Y-%m-%d') + IssueTime = issue_datetime.astimezone(to_zone).strftime('%H:%M:%S-05:00') + ParentDocumentID = self.name + UUID = self.cune + employer = self.company_id.partner_id + employee = self.employee_id.partner_id + InvoiceCNDN = b64decode(self.xml_file).decode('utf-8') + + if self.ar_xml_file: + ApplicationResponse = b64decode(self.ar_xml_file).decode('utf-8') + else: + ApplicationResponse = 'NO ApplicationResponse' + + validation_datetime = self.validation_datetime + ValidationDate = datetime.strftime(validation_datetime, '%Y-%m-%d') + ValidationTime = datetime.strftime(validation_datetime, '%H:%M:%S-05:00') + + return { + 'ProfileExecutionID': ProfileExecutionID, + 'ID': ID, + 'IssueDate': IssueDate, + 'IssueTime': IssueTime, + 'ParentDocumentID': ParentDocumentID, + 'SenderParty': employer._get_partner_basic_values(), + 'ReceiverParty': employee._get_partner_basic_values(), + 'InvoiceCNDN': InvoiceCNDN, + 'UUID': UUID, + 'ApplicationResponse': ApplicationResponse, + 'ValidationDate': ValidationDate, + 'ValidationTime': ValidationTime} + + def _get_ad_xml_file(self): + return global_functions.get_template_xml( + self._get_ad_xml_values(), 'AttachedDocument') + + def _get_ad_zipped_file(self): + ad_zipped_filename = self.ad_zipped_filename + ad_xml_filename = ad_zipped_filename.replace('.zip', '.xml') + output = BytesIO() + zipfile = ZipFile(output, mode='w') + zipfile_content = BytesIO() + zipfile_content.write(self._get_ad_xml_file()) + zipfile.writestr(ad_xml_filename, zipfile_content.getvalue()) + #zipfile_content = BytesIO() + #zipfile_content.write(b64decode(self._get_pdf_file())) + #zipfile.writestr(self.name + '.pdf', zipfile_content.getvalue()) + zipfile_content.close() + zipfile.close() + ad_zipped_file = b64encode(output.getvalue()).decode('utf-8') + output.close() + + return ad_zipped_file + + def action_set_ad_zipped_file(self): + ad_zipped_file = self._get_ad_zipped_file() + + if ad_zipped_file: + self.write({'ad_zipped_file': ad_zipped_file}) + else: + return ad_zipped_file + + return True + + def _get_SendTestSetAsync_values(self): + xml_soap_values = global_functions.get_xml_soap_values( + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + xml_soap_values['fileName'] = self.zipped_filename.replace('.zip', '') + xml_soap_values['contentFile'] = b64encode(self.zipped_file).decode('utf-8') + xml_soap_values['testSetId'] = self.company_id.epayroll_test_set_id + + return xml_soap_values + + def _get_SendNominaSync_values(self): + xml_soap_values = global_functions.get_xml_soap_values( + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + xml_soap_values['fileName'] = self.zipped_filename.replace('.zip', '') + xml_soap_values['contentFile'] = b64encode(self.zipped_file).decode('utf-8') + + return xml_soap_values + + def _get_pdf_file(self): + template_id = self.env['ir.actions.report'].browse( + self.company_id.report_template_id.id) + pdf = template_id._render_qweb_pdf([self.invoice_id.id])[0] + b64_pdf = b64encode(pdf).decode('utf-8') + + return b64_pdf + + def action_send_mail(self): + msg = _("Your payslip has not been validated") + template_id = self.env.ref('l10n_co_hr_e_payroll.email_template_epayroll') + email_template = self.env['email.template'].browse(template_id.id) + + if not self.name: + raise ValidationError(msg) + + attachment = self.env['ir.attachment'].create({ + 'name': self.ad_zipped_filename, + 'datas': self.ad_zipped_file}) + email_template.attachment_ids = [(6, 0, attachment.id)] + email_template.send_mail(self.id, force_send=False) + self.write({'mail_sent': True}) + # attachment.unlink() + + return True + + def send_failure_mail(self): + msg1 = _("The notification group for e-invoice failures is not set.\n" + "You won't be notified if something goes wrong.\n" + "Please go to Settings > Company > Notification Group.") + subject = _('ALERT! Payslip %s was not sent to DIAN.') % self.name + msg_body = _( + '''Cordial Saludo,

La nomina ''' + + self.name + ''' del empleado ''' + + self.employee_id.partner_id + ''' no pudo ser ''' + '''enviada a la Dian según el protocolo establecido previamente. Por ''' + '''favor revise el estado de la misma en el menú Documentos Dian e ''' + '''intente reprocesarla según el procedimiento definido.''' + '''
''' + self.company_id.name + '''.''') + email_ids = self.company_id.notification_group_ids + + if email_ids: + email_to = '' + + for mail_id in email_ids: + email_to += mail_id.email.strip() + ',' + else: + raise ValidationError(msg1) + + mail_obj = self.env['mail.mail'] + msg_vals = { + 'subject': subject, + 'email_to': email_to, + 'body_html': msg_body} + msg_id = mail_obj.create(msg_vals) + msg_id.send() + + return True + + def _get_status_response(self, response, send_mail): + b = "http://schemas.datacontract.org/2004/07/DianResponse" + c = "http://schemas.microsoft.com/2003/10/Serialization/Arrays" + s = "http://www.w3.org/2003/05/soap-envelope" + to_return = True + strings = '' + status_code = 'other' + root = etree.fromstring(response.content) + + for element in root.iter("{%s}StatusCode" % b): + if element.text in ('0', '2', '00', '66', '90', '99'): + if element.text == '00': + self.write({'state': 'done'}) + + status_code = element.text + elif element.text is None: + status_code = element.text + + _logger.info(self.name + ": _get_status_response()") + + if status_code is None or status_code == '0': + if self.company_id.epayroll_profile_execution_id == '1': + return self._get_GetStatus(send_mail) + + return self.action_GetStatusZip() + + for element in root.iter("{%s}StatusMessage" % b): + strings = element.text or strings + + for element in root.iter("{%s}StatusDescription" % b): + if strings == '' and element.text: + strings = '- ' + element.text + elif element.text: + strings += '\n\n- ' + element.text + + for element in root.iter("{%s}XmlBase64Bytes" % b): + self.write({'ar_xml_file': element.text}) + + if status_code == '00': + if not self.ar_xml_file: + if self.company_id.epayroll_profile_execution_id == '1': + return self._get_GetStatus(send_mail) + + return self.action_GetStatusZip() + + self.write({'validation_datetime': datetime.now()}) + self.action_set_ad_zipped_file() + + # if not self.mail_sent and send_mail: + # self.action_send_mail() + + to_return = True + else: + #if send_mail: + # self.send_failure_mail() + + to_return = False + + for element in root.iter("{%s}string" % c): + if strings == '': + strings = '- ' + element.text + else: + strings += '\n\n- ' + element.text + + if strings == '': + for element in root.iter("{%s}Body" % s): + strings = etree.tostring( + element, xml_declaration=False, encoding='utf-8').decode('utf-8') + + if strings == '': + strings = etree.tostring( + root, xml_declaration=False, encoding='utf-8').decode('utf-8') + + self.write({ + 'get_status_zip_status_code': status_code, + 'get_status_zip_response': strings}) + + return to_return + + def _get_GetStatusZip_values(self): + xml_soap_values = global_functions.get_xml_soap_values( + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + xml_soap_values['trackId'] = self.zip_key + + return xml_soap_values + + def action_GetStatusZip(self): + wsdl = DIAN['wsdl-hab'] + + if self.company_id.epayroll_profile_execution_id == '1': + wsdl = DIAN['wsdl'] + + GetStatusZip_values = self._get_GetStatusZip_values() + GetStatusZip_values['To'] = wsdl.replace('?wsdl', '') + xml_soap_with_signature = global_functions.get_xml_soap_with_signature( + global_functions.get_template_xml(GetStatusZip_values, 'GetStatusZip'), + GetStatusZip_values['Id'], + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + response = post( + wsdl, + headers={'content-type': 'application/soap+xml;charset=utf-8'}, + data=etree.tostring(xml_soap_with_signature)) + + if response.status_code == 200: + return self._get_status_response(response, True) + elif response.status_code in (403, 500, 503, 507, 508): + self.env['hr.payslip.dian.document.line'].create({ + 'dian_document_id': self.id, + 'send_async_status_code': response.status_code, + 'send_async_reason': response.reason, + 'send_async_response': response.text}) + else: + raise ValidationError(response.status_code) + + return False + + def action_send_zipped_file(self): + msg1 = _( + "Unknown Error,\nStatus Code: %s,\nReason: %s,\n\nContact with your " + "administrator or you can choose a journal with a Contingency Checkbook " + "E-Invoicing sequence and change the Invoice Type to 'E-document of " + "transmission - type 03'.") + msg2 = _( + "Unknown Error: %s\n\nContact with your administrator or you can choose a " + "journal with a Contingency Checkbook E-Invoicing sequence and change the " + "Invoice Type to 'E-document of transmission - type 03'.") + b = "http://schemas.datacontract.org/2004/07/UploadDocumentResponse" + wsdl = DIAN['wsdl-hab'] + + if self.company_id.epayroll_profile_execution_id == '1': + wsdl = DIAN['wsdl'] + SendNominaSync_values = self._get_SendNominaSync_values() + SendNominaSync_values['To'] = wsdl.replace('?wsdl', '') + xml_soap_with_signature = global_functions.get_xml_soap_with_signature( + global_functions.get_template_xml( + SendNominaSync_values, 'SendNominaSync'), + SendNominaSync_values['Id'], + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + else: + SendTestSetAsync_values = self._get_SendTestSetAsync_values() + SendTestSetAsync_values['To'] = wsdl.replace('?wsdl', '') + xml_soap_with_signature = global_functions.get_xml_soap_with_signature( + global_functions.get_template_xml( + SendTestSetAsync_values, 'SendTestSetAsync'), + SendTestSetAsync_values['Id'], + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + try: + response = post( + wsdl, + headers={'content-type': 'application/soap+xml;charset=utf-8'}, + data=etree.tostring(xml_soap_with_signature)) + + if response.status_code == 200: + self.write({'state': 'sent'}) + + if self.company_id.epayroll_profile_execution_id == '1': + self._get_status_response(response, True) + else: + root = etree.fromstring(response.text.encode('utf-8')) + + for element in root.iter("{%s}ZipKey" % b): + self.write({'zip_key': element.text}) + self.action_GetStatusZip() + elif response.status_code in (403, 500, 503, 507, 508): + self.env['hr.payslip.dian.document.line'].create({ + 'dian_document_id': self.id, + 'send_async_status_code': response.status_code, + 'send_async_reason': response.reason, + 'send_async_response': response.text}) + else: + raise ValidationError(msg1 % (response.status_code, response.reason)) + except exceptions.RequestException as e: + raise ValidationError(msg2 % (e)) + + _logger.info(self.name + ": action_send_zipped_file()") + + return True + + def _get_GetStatus_values(self): + xml_soap_values = global_functions.get_xml_soap_values( + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + xml_soap_values['trackId'] = self.cune + + return xml_soap_values + + def _get_GetStatus(self, send_mail): + msg1 = _("Unknown Error,\nStatus Code: %s,\nReason: %s" + "\n\nContact with your administrator.") + msg2 = _("Unknown Error: %s\n\nContact with your administrator.") + wsdl = DIAN['wsdl-hab'] + + if self.company_id.epayroll_profile_execution_id == '1': + wsdl = DIAN['wsdl'] + + GetStatus_values = self._get_GetStatus_values() + GetStatus_values['To'] = wsdl.replace('?wsdl', '') + xml_soap_with_signature = global_functions.get_xml_soap_with_signature( + global_functions.get_template_xml(GetStatus_values, 'GetStatus'), + GetStatus_values['Id'], + self.company_id.epayroll_certificate_file, + self.company_id.epayroll_certificate_password) + + try: + response = post( + wsdl, + headers={'content-type': 'application/soap+xml;charset=utf-8'}, + data=etree.tostring(xml_soap_with_signature)) + + if response.status_code == 200: + return self._get_status_response(response, send_mail) + elif response.status_code in (403, 500, 503, 507, 508): + self.env['hr.payslip.dian.document.line'].create({ + 'dian_document_id': self.id, + 'send_async_status_code': response.status_code, + 'send_async_reason': response.reason, + 'send_async_response': response.text}) + else: + raise ValidationError(msg1 % (response.status_code, response.reason)) + except exceptions.RequestException as e: + raise ValidationError(msg2 % (e)) + + return False + + def action_GetStatus_without_send_mail(self): + return self._get_GetStatus(False) + + def action_process(self): + if self.zip_key: + to_return = self.action_GetStatusZip() + else: + to_return = self._get_GetStatus(True) + + if to_return: + return to_return + + if self.action_set_files(): + self.action_send_zipped_file() + else: + self.send_failure_mail() + + return True diff --git a/l10n_co_hr_e_payroll/models/hr_payslip_dian_document_line.py b/l10n_co_hr_e_payroll/models/hr_payslip_dian_document_line.py new file mode 100644 index 0000000..b5d4b0c --- /dev/null +++ b/l10n_co_hr_e_payroll/models/hr_payslip_dian_document_line.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class HrPayslipDianDocumentLine(models.Model): + _name = "hr.payslip.dian.document.line" + _description = 'DIAN Document Lines' + + dian_document_id = fields.Many2one( + comodel_name='hr.payslip.dian.document', + string='DIAN Document') + send_async_status_code = fields.Char(string='Status Code') + send_async_reason = fields.Char(string='Reason') + send_async_response = fields.Text(string='Response') diff --git a/l10n_co_hr_e_payroll/models/ir_sequence.py b/l10n_co_hr_e_payroll/models/ir_sequence.py new file mode 100644 index 0000000..9b9241c --- /dev/null +++ b/l10n_co_hr_e_payroll/models/ir_sequence.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models, _ + + +class IrSequence(models.Model): + _inherit = 'ir.sequence' + + dian_type = fields.Selection(selection_add=[('e-payroll', _('E-Payroll'))]) diff --git a/l10n_co_hr_e_payroll/models/res_company.py b/l10n_co_hr_e_payroll/models/res_company.py new file mode 100644 index 0000000..6d20b42 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/res_company.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime +from urllib import request +import ssl +from . import global_functions +from odoo import api, models, fields, _ +from odoo.exceptions import ValidationError +import logging +_logger = logging.getLogger(__name__) +ssl._create_default_https_context = ssl._create_unverified_context + + +class ResCompany(models.Model): + _inherit = "res.company" + + epayroll_enabled = fields.Boolean(string='E-Payroll Enabled') + send_epayroll_to_dian = fields.Selection( + selection=[('0', 'Immediately'), ('1', 'After 1 Day'), ('2', 'After 2 Days')], + string='Send E-Payroll to DIAN?', + default=False) + epayroll_profile_execution_id = fields.Selection( + selection=[('1', 'Production'), ('2', 'Test')], + string='Destination Environment of Document', + default='2', + required=True) + epayroll_create_dian_document = fields.Boolean( + string='Create DIAN Document When Validate?', default=False) + epayroll_have_technological_provider = fields.Boolean( + string='Do you have a technological provider?') + epayroll_technological_provider_id = fields.Many2one( + comodel_name='res.partner', string='Technological Provider') + epayroll_assignment_code = fields.Char(string='Assignment Code', size=3) + epayroll_test_set_id = fields.Char(string='Test Set ID') + epayroll_software_id = fields.Char(string='Software ID') + epayroll_software_pin = fields.Char(string='Software PIN') + epayroll_certificate_filename = fields.Char(string='Certificate Filename') + epayroll_certificate_file = fields.Binary(string='Certificate File') + epayroll_certificate_password = fields.Char(string='Certificate Password') + epayroll_certificate_date = fields.Date(string='Certificate Date Validity') + epayroll_certificate_remaining_days = fields.Integer( + string='Certificate Remaining Days', default=False) + epayroll_signature_policy_url = fields.Char( + string='Signature Policy URL', + default='https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf') + epayroll_signature_policy_filename = fields.Char(string='Signature Policy Filename') + epayroll_signature_policy_file = fields.Binary(string='Signature Policy File') + epayroll_signature_policy_description = fields.Char( + string='Signature Policy Description', + default='Política de firma para nóminas electrónicas de la República de Colombia.') + epayroll_email = fields.Char( + string='E-Payroll Email, From:', help="Enter the e-payroll sender's email.") + epayroll_employee_no_email = fields.Char( + string='Employee Without Email, To:', + help='Enter the email where the payslip will be sent when the employee does not have an email.') + epayroll_receives_all_emails = fields.Char(string='Mail That Receives All Emails') + + def write(self, vals): + msg = _('Invalid URL.') + + if vals.get('epayroll_signature_policy_url'): + try: + for company in self: + response = request.urlopen( + vals.get('epayroll_signature_policy_url'), timeout=2) + + if response.getcode() != 200: + raise ValidationError(msg) + except Exception as e: + raise ValidationError(msg % e) + + rec = super(ResCompany, self).write(vals) + + if (vals.get('epayroll_certificate_file') + or vals.get('epayroll_certificate_password')): + for company in self: + pkcs12 = global_functions.get_pkcs12( + company.epayroll_certificate_file, + company.epayroll_certificate_password) + x509 = pkcs12.get_certificate() + date = x509.get_notAfter() + company.epayroll_certificate_date = datetime.strptime( + date.decode("utf-8"), '%Y%m%d%H%M%SZ').date() + + return rec + + def action_process_hr_payslip_dian_documents(self): + for company_id in self: + dian_document_ids = self.env['hr.payslip.dian.document'].search( + [('state', '=', 'draft'), ('company_id', '=', company_id.id)], + order='name asc') + count = 0 + + for dian_document_id in dian_document_ids: + if count == 10: + break + + try: + dian_document_id.action_process() + except: + count -= 1 + dian_document_id.write({'state': 'sent'}) + #dian_document_id.invoice_id.write({'ei_state': 'supplier_rejec'}) + + count += 1 + _logger.info("{} -> {}: action_process_hr_payslip_dian_documents()".format( + count, dian_document_id.name)) + + dian_document_ids = self.env['hr.payslip.dian.document'].search([ + ('state', '=', 'sent'), ('company_id', '=', company_id.id)], + order='name asc') + + for dian_document_id in dian_document_ids: + if count == 10: + break + + try: + dian_document_id.action_process() + except: + count -= 1 + #dian_document_id.invoice_id.write({'ei_state': 'supplier_rejec'}) + + count += 1 + _logger.info("{} -> {}: action_process_hr_payslip_dian_documents()".format( + count, dian_document_id.name)) + + return True + + @api.model + def cron_process_hr_payslip_dian_documents(self): + for company_id in self.search([]): + company_id.action_process_hr_payslip_dian_documents() diff --git a/l10n_co_hr_e_payroll/models/res_partner.py b/l10n_co_hr_e_payroll/models/res_partner.py new file mode 100644 index 0000000..2503761 --- /dev/null +++ b/l10n_co_hr_e_payroll/models/res_partner.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Joan Marín +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, _ +from odoo.exceptions import ValidationError + + +class ResPartner(models.Model): + _inherit = "res.partner" + + def _get_partner_basic_values(self): + msg1 = _("'%s' does not have a DIAN document type established.") + msg2 = _("'%s' does not have a verification digit established.") + msg3 = _("'%s' does not have a identification document established.") + identification_document = self.ref_num + + if not self.ref_type_id: + raise ValidationError(msg1 % self.name) + + document_type_code = self.ref_type_id.code_dian + + if (document_type_code == '31' + and not self.verification_code + and str(self.verification_code) != '0'): + raise ValidationError(msg2 % self.name) + + if not identification_document: + raise ValidationError(msg3 % self.name) + + return { + 'TipoDocumento': document_type_code, + 'RazonSocial': self.name, + 'NIT': identification_document, + 'DV': self.verification_code} + + def _get_partner_values(self): + values = self._get_partner_basic_values() + msg1 = _("'%s' does not have a city established.") + msg2 = _("'%s' does not have a state established.") + msg3 = _("'%s' does not have a country established.") + + if self.country_id: + if self.country_id.code == 'CO': + if not self.city_id: + raise ValidationError(msg1 % self.name) + elif not self.state_id: + raise ValidationError(msg2 % self.name) + else: + raise ValidationError(msg3 % self.name) + + values['Pais'] = self.country_id.code + values['DepartamentoEstado'] = self.state_id.code or '' + values['MunicipioCiudad'] = self.state_id.code + self.city_id.code + values['Direccion'] = self.street or '' + + return values + + def _get_employee_values(self, wage): + values = self._get_partner_values() + values['Sueldo'] = wage + values['PrimerApellido'] = self.first_surname + values['SegundoApellido'] = self.second_surname or '' + values['PrimerNombre'] = self.first_name + + if self.second_name: + values['OtrosNombres'] = self.second_name + + return values diff --git a/l10n_co_hr_e_payroll/security/ir.model.access.csv b/l10n_co_hr_e_payroll/security/ir.model.access.csv new file mode 100644 index 0000000..40b94f1 --- /dev/null +++ b/l10n_co_hr_e_payroll/security/ir.model.access.csv @@ -0,0 +1,8 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_create_hr_payslip_dian_document_user,create_hr_payslip_dian_document_user,model_create_hr_payslip_dian_document,,1,1,1,0 +access_hr_employee_epayroll_subtype_user,hr_employee_epayroll_subtype_user,model_hr_employee_epayroll_subtype,,1,1,1,0 +access_hr_employee_epayroll_type_user,hr_employee_epayroll_type_user,model_hr_employee_epayroll_type,,1,1,1,0 +access_hr_payslip_concept_epayroll_type_code_user,hr_payslip_concept_epayroll_type_code_user,model_hr_payslip_concept_epayroll_type_code,,1,1,1,0 +access_hr_payslip_concept_epayroll_type_user,hr_payslip_concept_epayroll_type_user,model_hr_payslip_concept_epayroll_type,,1,1,1,0 +access_hr_payslip_dian_document_user,hr_payslip_dian_document_user,model_hr_payslip_dian_document,,1,1,1,0 +access_hr_payslip_dian_document_line_user,hr_payslip_dian_document_line_user,model_hr_payslip_dian_document_line,,1,1,1,0 diff --git a/l10n_co_hr_e_payroll/static/description/icon.png b/l10n_co_hr_e_payroll/static/description/icon.png new file mode 100644 index 0000000..6229278 Binary files /dev/null and b/l10n_co_hr_e_payroll/static/description/icon.png differ diff --git a/l10n_co_hr_e_payroll/templates/AttachedDocument.xml b/l10n_co_hr_e_payroll/templates/AttachedDocument.xml new file mode 100644 index 0000000..51825df --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/AttachedDocument.xml @@ -0,0 +1,70 @@ + + + UBL 2.1 + Documentos adjuntos + DIAN 2.1 + {{ProfileExecutionID}} + {{ID}} + {{IssueDate}} + {{IssueTime}} + Contenedor de Factura Electrónica + {{ParentDocumentID}} + + + {{SenderParty.RasonSocial}} + {{SenderParty.NIT}} + + + + + + {{ReceiverParty.RasonSocial}} + {{ReceiverParty.NIT}} + + + + + + text/xml + UTF-8 + + + + + 1 + + {{ParentDocumentID}} + {{UUID}} + {{ValidationDate}} + ApplicationResponse + + + text/xml + UTF-8 + + + + + Unidad Especial Dirección de Impuestos y Aduanas Nacionales + 02 + {{ValidationDate}} + {{ValidationTime}} + + + + \ No newline at end of file diff --git a/l10n_co_hr_e_payroll/templates/GetStatus.xml b/l10n_co_hr_e_payroll/templates/GetStatus.xml new file mode 100644 index 0000000..dde7540 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/GetStatus.xml @@ -0,0 +1,21 @@ + + + + + {{Created}} + {{Expires}} + + {{BinarySecurityToken}} + + http://wcf.dian.colombia/IWcfDianCustomerServices/GetStatus + {{To}} + + + + {{trackId}} + + + \ No newline at end of file diff --git a/l10n_co_hr_e_payroll/templates/GetStatusZip.xml b/l10n_co_hr_e_payroll/templates/GetStatusZip.xml new file mode 100644 index 0000000..8e89142 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/GetStatusZip.xml @@ -0,0 +1,21 @@ + + + + + {{Created}} + {{Expires}} + + {{BinarySecurityToken}} + + http://wcf.dian.colombia/IWcfDianCustomerServices/GetStatusZip + {{To}} + + + + {{trackId}} + + + \ No newline at end of file diff --git a/l10n_co_hr_e_payroll/templates/NominaIndividual.xml b/l10n_co_hr_e_payroll/templates/NominaIndividual.xml new file mode 100644 index 0000000..2d5f4a9 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/NominaIndividual.xml @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + {{CodigoQR}} + + + + + + + + + + + + + + {{FechaLiquidacionFin}} + + + + {% for Transporte in Devengados.Transporte %} + + {% endfor %} + + {% if Devengados.HED %} + + {% for HED in Devengados.HED %} + + {% endfor %} + + {% endif %} + {% if Devengados.HEN %} + + {% for HEN in Devengados.HEN %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRN %} + + {% for HRN in Devengados.HRN %} + + {% endfor %} + + {% endif %} + {% if Devengados.HEDDF %} + + {% for HEDDF in Devengados.HEDDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRDDF %} + + {% for HRDDF in Devengados.HRDDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HENDF %} + + {% for HENDF in Devengados.HENDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRNDF %} + + {% for HRNDF in Devengados.HRNDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.Vacaciones %} + + + {% for VacacionesComunes in Devengados.Vacaciones.VacacionesComunes %} + + {% endfor %} + {% for VacacionesCompensadas in Devengados.Vacaciones.VacacionesCompensadas %} + + {% endfor %} + + {% endif %} + {% if Devengados.Primas %} + + {% endif %} + {% if Devengados.Cesantias %} + + {% endif %} + {% if Devengados.Incapacidades %} + + + {% for Incapacidad in Devengados.Incapacidades %} + + {% endfor %} + + {% endif %} + {% if Devengados.Licencias %} + + + {% for LicenciaMP in Devengados.Licencias.LicenciaMP %} + + {% endfor %} + {% for LicenciaR in Devengados.Licencias.LicenciaR %} + + {% endfor %} + {% for LicenciaNR in Devengados.Licencias.LicenciaNR %} + + {% endfor %} + + {% endif %} + {% if Devengados.Bonificaciones %} + + {% for Bonificacion in Devengados.Bonificaciones %} + + {% endfor %} + + {% endif %} + {% if Devengados.Auxilios %} + + {% for Auxilio in Devengados.Auxilios %} + + {% endfor %} + + {% endif %} + {% if Devengados.HuelgasLegales %} + + + {% for HuelgaLegal in Devengados.HuelgasLegales %} + + {% endfor %} + + {% endif %} + {% if Devengados.OtrosConceptos %} + + {% for OtroConcepto in Devengados.OtrosConceptos %} + + {% endfor %} + + {% endif %} + {% if Devengados.Compensaciones %} + + + + + {% endif %} + {% if Devengados.BonoEPCTV %} + + {% for BonoEPCTV in Devengados.BonoEPCTV %} + + {% endfor %} + + {% endif %} + {% if Devengados.Comisiones %} + + {% for Comision in Devengados.Comisiones %} + {{Comision}} + {% endfor %} + + {% endif %} + {% if Devengados.PagosTerceros %} + + {% for PagoTercero in Devengados.PagosTerceros %} + {{PagoTercero}} + {% endfor %} + + {% endif %} + {% if Devengados.Anticipos %} + + {% for Anticipo in Devengados.Anticipos %} + {{Anticipo}} + {% endfor %} + + {% endif %} + {% if Devengados.Dotacion %} + {{Devengados.Dotacion}} + {% endif %} + {% if Devengados.ApoyoSost %} + {{Devengados.ApoyoSost}} + {% endif %} + {% if Devengados.Teletrabajo %} + {{Devengados.Teletrabajo}} + {% endif %} + {% if Devengados.BonifRetiro %} + {{Devengados.BonifRetiro}} + {% endif %} + {% if Devengados.Indemnizacion %} + {{Devengados.Indemnizacion}} + {% endif %} + {% if Devengados.Reintegro %} + {{Devengados.Reintegro}} + {% endif %} + + + + + {% if Deducciones.FondoSP %} + + {% endif %} + {% if Deducciones.Sindicatos %} + + {% for Sindicato in Deducciones.Sindicatos %} + + {% endfor %} + + {% endif %} + {% if Deducciones.Sanciones %} + + {% for Sancion in Deducciones.Sanciones %} + + {% endfor %} + + {% endif %} + {% if Deducciones.Libranzas %} + + {% for Libranza in Deducciones.Libranzas %} + + {% endfor %} + + {% endif %} + {% if Deducciones.PagosTerceros %} + + {% for PagoTercero in Deducciones.PagosTerceros %} + {{PagoTercero}} + {% endfor %} + + {% endif %} + {% if Deducciones.Anticipos %} + + {% for Anticipo in Deducciones.Anticipos %} + {{Anticipo}} + {% endfor %} + + {% endif %} + {% if Deducciones.OtrasDeducciones %} + + {% for OtraDeduccion in Deducciones.OtrasDeducciones %} + {{OtraDeduccion}} + {% endfor %} + + {% endif %} + {% if Deducciones.PensionVoluntaria %} + {{Deducciones.PensionVoluntaria}} + {% endif %} + {% if Deducciones.RetencionFuente %} + {{Deducciones.RetencionFuente}} + {% endif %} + {% if Deducciones.AFC %} + {{Deducciones.AFC}} + {% endif %} + {% if Deducciones.Cooperativa %} + {{Deducciones.Cooperativa}} + {% endif %} + {% if Deducciones.EmbargoFiscal %} + {{Deducciones.EmbargoFiscal}} + {% endif %} + {% if Deducciones.PlanComplementarios %} + {{Deducciones.PlanComplementarios}} + {% endif %} + {% if Deducciones.Educacion %} + {{Deducciones.Educacion}} + {% endif %} + {% if Deducciones.Reintegro %} + {{Deducciones.Reintegro}} + {% endif %} + {% if Deducciones.Deuda %} + {{Deducciones.Deuda}} + {% endif %} + + + {{DevengadosTotal}} + {{DeduccionesTotal}} + {{ComprobanteTotal}} + diff --git a/l10n_co_hr_e_payroll/templates/NominaIndividualDeAjuste.xml b/l10n_co_hr_e_payroll/templates/NominaIndividualDeAjuste.xml new file mode 100644 index 0000000..0283587 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/NominaIndividualDeAjuste.xml @@ -0,0 +1,461 @@ + + + + + + + + + {{TipoNota}} + {% if TipoNota == '1' %} + + + + + + + + + + {{CodigoQR}} + + + + + + + + + + + + + + {{FechaLiquidacionFin}} + + + + {% for Transporte in Devengados.Transporte %} + + {% endfor %} + + {% if Devengados.HED %} + + {% for HED in Devengados.HED %} + + {% endfor %} + + {% endif %} + {% if Devengados.HEN %} + + {% for HEN in Devengados.HEN %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRN %} + + {% for HRN in Devengados.HRN %} + + {% endfor %} + + {% endif %} + {% if Devengados.HEDDF %} + + {% for HEDDF in Devengados.HEDDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRDDF %} + + {% for HRDDF in Devengados.HRDDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HENDF %} + + {% for HENDF in Devengados.HENDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.HRNDF %} + + {% for HRNDF in Devengados.HRNDF %} + + {% endfor %} + + {% endif %} + {% if Devengados.Vacaciones %} + + + {% for VacacionesComunes in Devengados.Vacaciones.VacacionesComunes %} + + {% endfor %} + {% for VacacionesCompensadas in Vacaciones.VacacionesCompensadas %} + + {% endfor %} + + {% endif %} + {% if Devengados.Primas %} + {% endif %} + {% endif %} + {% if Devengados.Cesantias %} + + {% endif %} + {% if Devengados.Incapacidades %} + + + {% for Incapacidad in Devengados.Incapacidades %} + + {% endfor %} + + {% endif %} + {% if Devengados.Licencias %} + + + {% for LicenciaMP in Devengados.Licencias.LicenciaMP %} + + {% endfor %} + {% for LicenciaR in Devengados.Licencias.LicenciaR %} + + {% endfor %} + {% for LicenciaNR in Devengados.Licencias.LicenciaNR %} + + {% endfor %} + + {% endif %} + {% if Devengados.Bonificaciones %} + + {% for Bonificacion in Devengados.Bonificaciones %} + + {% endfor %} + + {% endif %} + {% if Devengados.Auxilios %} + + {% for Auxilio in Devengados.Auxilios %} + + {% endfor %} + + {% endif %} + {% if Devengados.HuelgasLegales %} + + + {% for HuelgaLegal in Devengados.HuelgasLegales %} + + {% endfor %} + + {% endif %} + {% if Devengados.OtrosConceptos %} + + {% for OtroConcepto in Devengados.OtrosConceptos %} + + {% endfor %} + + {% endif %} + {% if Devengados.Compensaciones %} + + + + + {% endif %} + {% if Devengados.BonoEPCTV %} + + {% for BonoEPCTV in Devengados.BonoEPCTV %} + + {% endfor %} + + {% endif %} + {% if Devengados.Comisiones %} + + {% for Comision in Devengados.Comisiones %} + {{Comision}} + {% endfor %} + + {% endif %} + {% if Devengados.PagosTerceros %} + + {% for PagoTercero in Devengados.PagosTerceros %} + {{PagoTercero}} + {% endfor %} + + {% endif %} + {% if Devengados.Anticipos %} + + {% for Anticipo in Devengados.Anticipos %} + {{Anticipo}} + {% endfor %} + + {% endif %} + {% if Devengados.Dotacion %} + {{Devengados.Dotacion}} + {% endif %} + {% if Devengados.ApoyoSost %} + {{Devengados.ApoyoSost}} + {% endif %} + {% if Devengados.Teletrabajo %} + {{Devengados.Teletrabajo}} + {% endif %} + {% if Devengados.BonifRetiro %} + {{Devengados.BonifRetiro}} + {% endif %} + {% if Devengados.Indemnizacion %} + {{Devengados.Indemnizacion}} + {% endif %} + {% if Devengados.Reintegro %} + {{Devengados.Reintegro}} + {% endif %} + + + + + {% if Deducciones.FondoSP %} + + {% endif %} + {% if Deducciones.Sindicatos %} + + {% for Sindicato in Deducciones.Sindicatos %} + + {% endfor %} + + {% endif %} + {% if Deducciones.Sanciones %} + + {% for Sancion in Deducciones.Sanciones %} + + {% endfor %} + + {% endif %} + {% if Deducciones.Libranzas %} + + {% for Libranza in Deducciones.Libranzas %} + + {% endfor %} + + {% endif %} + {% if Deducciones.PagosTerceros %} + + {% for PagoTercero in Deducciones.PagosTerceros %} + {{PagoTercero}} + {% endfor %} + + {% endif %} + {% if Deducciones.Anticipos %} + + {% for Anticipo in Deducciones.Anticipos %} + {{Anticipo}} + {% endfor %} + + {% endif %} + {% if Deducciones.OtrasDeducciones %} + + {% for OtraDeduccion in Deducciones.OtrasDeducciones %} + {{OtraDeduccion}} + {% endfor %} + + {% endif %} + {% if Deducciones.PensionVoluntaria %} + {{Deducciones.PensionVoluntaria}} + {% endif %} + {% if Deducciones.RetencionFuente %} + {{Deducciones.RetencionFuente}} + {% endif %} + {% if Deducciones.AFC %} + {{Deducciones.AFC}} + {% endif %} + {% if Deducciones.Cooperativa %} + {{Deducciones.Cooperativa}} + {% endif %} + {% if Deducciones.EmbargoFiscal %} + {{Deducciones.EmbargoFiscal}} + {% endif %} + {% if Deducciones.PlanComplementarios %} + {{Deducciones.PlanComplementarios}} + {% endif %} + {% if Deducciones.Educacion %} + {{Deducciones.Educacion}} + {% endif %} + {% if Deducciones.Reintegro %} + {{Deducciones.Reintegro}} + {% endif %} + {% if Deducciones.Deuda %} + {{Deducciones.Deuda}} + {% endif %} + + + {{DevengadosTotal}} + {{DeduccionesTotal}} + {{ComprobanteTotal}} + + {% endif %} + {% if TipoNota == '2' %} + + + + + + + {{CodigoQR}} + + + + + + {% endif %} + diff --git a/l10n_co_hr_e_payroll/templates/SendNominaSync.xml b/l10n_co_hr_e_payroll/templates/SendNominaSync.xml new file mode 100644 index 0000000..7100a51 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/SendNominaSync.xml @@ -0,0 +1,22 @@ + + + + + {{Created}} + {{Expires}} + + {{BinarySecurityToken}} + + http://wcf.dian.colombia/IWcfDianCustomerServices/SendNominaSync + {{To}} + + + + {{fileName}} + {{contentFile}} + + + \ No newline at end of file diff --git a/l10n_co_hr_e_payroll/templates/SendTestSetAsync.xml b/l10n_co_hr_e_payroll/templates/SendTestSetAsync.xml new file mode 100644 index 0000000..e6ce1e6 --- /dev/null +++ b/l10n_co_hr_e_payroll/templates/SendTestSetAsync.xml @@ -0,0 +1,23 @@ + + + + + {{Created}} + {{Expires}} + + {{BinarySecurityToken}} + + http://wcf.dian.colombia/IWcfDianCustomerServices/SendTestSetAsync + {{To}} + + + + {{fileName}} + {{contentFile}} + {{testSetId}} + + + \ No newline at end of file diff --git a/l10n_co_hr_e_payroll/views/account_fiscal_year_views.xml b/l10n_co_hr_e_payroll/views/account_fiscal_year_views.xml new file mode 100644 index 0000000..ed5e4ab --- /dev/null +++ b/l10n_co_hr_e_payroll/views/account_fiscal_year_views.xml @@ -0,0 +1,24 @@ + + + + account.fiscal.year + + + + + + + + + + + account.fiscal.year + + + + + + + + + diff --git a/l10n_co_hr_e_payroll/views/hr_contract_type_views.xml b/l10n_co_hr_e_payroll/views/hr_contract_type_views.xml new file mode 100644 index 0000000..30b22ec --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_contract_type_views.xml @@ -0,0 +1,12 @@ + + + + hr.contract.type + + + + + + + + diff --git a/l10n_co_hr_e_payroll/views/hr_employee_views.xml b/l10n_co_hr_e_payroll/views/hr_employee_views.xml new file mode 100644 index 0000000..37c28aa --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_employee_views.xml @@ -0,0 +1,15 @@ + + + + hr.employee + + + + + + + + + + + diff --git a/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_code_views.xml b/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_code_views.xml new file mode 100644 index 0000000..bb3d6fa --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_code_views.xml @@ -0,0 +1,27 @@ + + + + hr.payslip.concept.epayroll.type.code + + + + + + + + + + + Codes of the E-Payroll Types of the Concepts + ir.actions.act_window + hr.payslip.concept.epayroll.type.code + tree,form + + + + diff --git a/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_views.xml b/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_views.xml new file mode 100644 index 0000000..7f2fdec --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_payslip_concept_epayroll_type_views.xml @@ -0,0 +1,58 @@ + + + + hr.payslip.concept.epayroll.type + + + + + + + + + + + hr.payslip.concept.epayroll.type + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + E-Payroll Types of the Concepts + ir.actions.act_window + hr.payslip.concept.epayroll.type + tree,form + + + +
diff --git a/l10n_co_hr_e_payroll/views/hr_payslip_dian_document_views.xml b/l10n_co_hr_e_payroll/views/hr_payslip_dian_document_views.xml new file mode 100644 index 0000000..4730a96 --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_payslip_dian_document_views.xml @@ -0,0 +1,159 @@ + + + + hr.payslip.dian.document + + + + + + + + + + + + + + hr.payslip.dian.document + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + DIAN Documents + ir.actions.act_window + hr.payslip.dian.document + tree,form + + + +
diff --git a/l10n_co_hr_e_payroll/views/hr_payslip_views.xml b/l10n_co_hr_e_payroll/views/hr_payslip_views.xml new file mode 100644 index 0000000..30a7819 --- /dev/null +++ b/l10n_co_hr_e_payroll/views/hr_payslip_views.xml @@ -0,0 +1,50 @@ + + + + hr.payslip + + + + + + + + + + + +