diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6522368 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,28 @@ +language: python + +python: + - 3.5 + +cache: pip + +addons: + apt: + packages: + - expect-dev + - python-lxml + +env: + - VERSION="11.0" LINT_CHECK="1" + - VERSION="11.0" ODOO_REPO="odoo/odoo" LINT_CHECK="0" + +install: + - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools + - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} + - pip install -r requirements.txt + - travis_install_nightly + +script: + - travis_run_tests + +after_success: + - travis_after_tests_success \ No newline at end of file diff --git a/README.rst b/README.rst index 8ed8d2d..0fabcf2 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,16 @@ +.. image:: https://travis-ci.org/svazquezco/l10n_co_electronic_invoice.svg?branch=11.0 + :target: https://travis-ci.org/svazquezco/l10n_co_electronic_invoice + :alt: Build Status + +.. image:: https://coveralls.io/repos/github/svazquezco/l10n_co_electronic_invoice/badge.svg + :target: https://coveralls.io/github/svazquezco/l10n_co_electronic_invoice + :alt: Coverage Status + .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 + ========================== l10n_co_electronic_invoice ========================== diff --git a/__manifest__.py b/__manifest__.py index 6a336ea..7047274 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright <2018> # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { @@ -18,6 +17,8 @@ ], 'data': [ + 'security/ir.model.access.csv', + 'data/account_tax_group_data.xml', 'views/account_invoice.xml', 'views/account_journal.xml', 'views/l10n_co_dian_resolution.xml', diff --git a/data/account_tax_group_data.xml b/data/account_tax_group_data.xml new file mode 100644 index 0000000..6122ad0 --- /dev/null +++ b/data/account_tax_group_data.xml @@ -0,0 +1,61 @@ + + + + + + IVA + 01 + + + + IC + 02 + + + + ICA + 03 + + + + INC + 04 + + + + ReteIva + 05 + + + + ReteFuente + 06 + + + + ReteICA + 06 + + + + ReteCREE + 07 + + + + FtoHorticultura + 08 + + + + Timbre + 20 + + + + Bolsas + 22 + + + + diff --git a/models/__init__.py b/models/__init__.py index 4a0eabd..96d4282 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,5 +1,6 @@ from . import account_invoice from . import account_journal +from . import account_tax_group from . import l10n_co_dian_resolution from . import l10n_co_electronic_invoice from . import res_company diff --git a/models/account_invoice.py b/models/account_invoice.py index d795f05..6bc8346 100644 --- a/models/account_invoice.py +++ b/models/account_invoice.py @@ -1,4 +1,8 @@ +# © 2018 Susana Vázquez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from odoo import api, fields, models +from odoo.exceptions import UserError class AccountInvoice(models.Model): @@ -9,3 +13,34 @@ class AccountInvoice(models.Model): 'invoice_id', 'Electronic invoice' ) + + def _prepare_einvoice_vals(self): + return { + 'invoice_id': self.id, + 'company_id': self.company_id.id, + } + + @api.multi + def invoice_validate(self): + res = super(AccountInvoice, self).invoice_validate() + for inv in self.filtered(lambda x: x.company_id.l10n_co_dian_enabled): + einv_vals = self._prepare_einvoice_vals() + einv = self.env['l10n.co.electronic.invoice'].create(einv_vals) + einv.validate_invoice() + einv.action_post_validate() + + return res + + @api.multi + def action_cancel(self): + res = super(AccountInvoice, self).action_cancel() + for inv in self.filtered(lambda x: x.l10n_co_dian_enabled): + invoice_sent_dian = inv.filtered( + lambda x: x.l10n_co_invoice_electronic_ids.state == 'done') + + if invoice_sent_dian: + raise UserError('Can\'t cancel invoice sent to DIAN') + + return res + + diff --git a/models/account_tax_group.py b/models/account_tax_group.py new file mode 100644 index 0000000..1a8a5d8 --- /dev/null +++ b/models/account_tax_group.py @@ -0,0 +1,9 @@ +from odoo import api, fields, models + + +class AccountTaxGroup(models.Model): + _inherit = 'account.tax.group' + + l10n_co_dian_code = fields.Integer( + 'Dian Code' + ) diff --git a/models/l10n_co_electronic_invoice.py b/models/l10n_co_electronic_invoice.py index c267c89..24f53e0 100644 --- a/models/l10n_co_electronic_invoice.py +++ b/models/l10n_co_electronic_invoice.py @@ -1,4 +1,24 @@ -from odoo import api, fields, models +import datetime +import hashlib +import logging +import os +import re +import requests +import pytz + +from jinja2 import Environment, FileSystemLoader +from lxml import etree + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +server_url = { + 'OPERACION': 'https://facturaelectronica.dian.gov.co/operacion/B2BIntegrationEngine/FacturaElectronica/facturaElectronica.wsdl', + 'HABILITACION':'https://facturaelectronica.dian.gov.co/habilitacion/B2BIntegrationEngine/FacturaElectronica/facturaElectronica.wsdl', +} class L10nCoElectronicInvoice(models.Model): @@ -6,9 +26,291 @@ class L10nCoElectronicInvoice(models.Model): invoice_id = fields.Many2one( 'account.invoice', string='Invoice', readonly=True) + company_id = fields.Many2one('res.company', 'Company', readonly=True) + invoice_time = fields.Char(compute='_get_co_current_datetime', + string='Invoice Time', readonly=True) send_date = fields.Date('Send Date') - request_send = fields.Date('Request Send') + request_send = fields.Char('Request Send') response_code = fields.Char('Response Code') validation_date = fields.Date('Validation Date') validation_response = fields.Char('Validation Response') validation_response_code = fields.Char('Validation Response Code') + qr_code = fields.Binary('QR code', readonly=True) + state = fields.Selection( + [('draft', 'Draft'), + ('error', 'Error'), + ('done', 'Send'), + ('cancel', 'Cancel')], + string='State', default='draft', readonly=True) + + def _hook_validation(self): + errors = [] + # TODO required fields for Colombian electronic invoices + # Company + if not self.company_id.partner_id.vat: + errors.append('Company - NIT') + if not self.company_id.partner_id.city: + errors.append('Company Partner - City') + if not self.company_id.partner_id.street: + errors.append('Company Partner - Street') + if not self.company_id.partner_id.country_id: + errors.append('Company Partner - Country') + # Partner + if not self.invoice_id.partner_id.vat: + errors.append('Partner - VAT') + # if not self.invoice_id.partner_id.city: + # errors.append('Partner - City') + if not self.invoice_id.partner_id.street: + errors.append('Partner - Street') + if not self.invoice_id.partner_id.country_id: + errors.append('Partner - Country') + + # Products + + return errors + + def _get_invoice_type(self): + types = { + 'out_invoice': ('f', 'Invoice'), + 'in_invoice': ('f', 'Invoice'), + 'out_refund': ('c', 'CreditNote'), + 'in_refund': ('d', 'DebitNote'), + } + return types.get(self.invoice_id.type) + + @staticmethod + def _get_format_vat(vat): + vat = ''.join(list(filter(str.isdigit, vat))) + return vat.rjust(10, '0') + + def _get_invoice_number(self): + invoice = self.invoice_id + prefix, suffix = invoice.journal_id.sequence_id._get_prefix_suffix() + seq_number = re.sub(prefix or '', '', + re.sub(suffix or '', '', invoice.number)) + return seq_number + + def _get_hex(self): + return format(int(self._get_invoice_number()), 'x').rjust(10, '0') + + def _get_file_name(self): + file_name = '%s_%s%s%s' % ( + 'face', + self._get_invoice_type()[0], + self._get_format_vat(self.invoice_id.company_id.partner_id.vat), + self._get_hex() + ) + return file_name + + @staticmethod + def _get_co_current_datetime(): + tz = pytz.timezone('America/Bogota') + return datetime.datetime.now(tz=tz) + + def _get_format_current_date(self, format_date="%Y-%m-%dT%H:%M:%S"): + return self._get_co_current_datetime().strftime(format_date) + + @staticmethod + def _change_date_format(date, format_date="%Y-%m-%dT%H:%M:%S"): + datetime_date = fields.Date.from_string(date) + return datetime_date.strftime(format_date) + + @staticmethod + def _get_template_xml(values, template_name): + base_path = os.path.dirname(os.path.dirname(__file__)) + env = Environment( + loader=FileSystemLoader( + os.path.join(base_path, 'template'))) + template = env.get_template('{}.xml'.format(template_name)) + xml = template.render(values) + xml = xml.replace('&', '&') + return xml + + # TODO + def _get_invoice_type_code(self): + invoice_type_code = { + 1: 'Factura de Venta', + 2: 'Factura de Exportación', + 3: 'Factura de Contingecia' + } + return 1 + + def _prepare_cufe_values(self, technical_key): + NumFac = self.invoice_id.number + FecFac = self._change_date_format(self.invoice_id.date, "%Y%m%dT%H%M%S") + ValFac = str(self.invoice_id.amount_untaxed) + CodImp1 = '01' + ValImp1 = '' + CodImp2 = '02' + ValImp2 = '' + CodImp3 = '03' + ValImp3 = '' + ValImp = str(self.invoice_id.amount_tax) + NitOFE = self._get_format_vat(self.company_id.partner_id.vat) + TipAdq = '' + NumAdq = self._get_format_vat(self.invoice_id.partner_id.vat) + ClTec = technical_key + + return ''.join([NumFac, FecFac, ValFac,CodImp1, ValImp1, CodImp2, + ValImp2, CodImp3, ValImp3, ValImp, NitOFE, TipAdq, + NumAdq, ClTec]) + + def _cufe_generator(self, technical_key): + if self._get_invoice_type_code() not in (1, 2): + return + + values = self._prepare_cufe_values(technical_key) + cufe = hashlib.sha1(values.encode('utf-8')) + return cufe.hexdigest() + + def _prepare_party_legal_entity(self): + return { + 'CorporateRegistrationScheme': { + 'CorporateRegistrationTypeCode': '', + } + } + + def _prepare_accounting_supplier_party_values(self): + supplier = self.company_id.partner_id \ + if self.invoice_id.type in ('out_invoice', 'out_refund') \ + else self.invoice_id.partner_id + + return { + 'AdditionalAccountID': '2' if supplier.company_type == 'company' + else '1', + 'PartyTaxScheme': '', + 'PartyLegalEntity': '', + 'ID': supplier.vat, + 'Name': supplier.name, + 'CityName': supplier.city, + 'Line': supplier.street, + 'IdentificationCode': supplier.country_id.code, + 'TaxLevelCode': 'TODO', + 'TaxSchemaName': 'TODO', + 'RegistrationName': supplier.vat, + } + + def _prepare_accounting_customer_party_values(self): + customer = self.company_id.partner_id \ + if self.invoice_id.type in ('in_invoice', 'in_refund') \ + else self.invoice_id.partner_id + + return { + 'AdditionalAccountID': '2' if customer.company_type == 'company' else '1', + 'ID': customer.vat, + 'TaxLevelCode': 'TODO', + 'TaxSchemaName': 'TODO', + } + + def _prepare_xml_values(self): + # dian_resolution = self.invoice_id.journal_id.l10n_co_dian_resolution + dian_resolution = self.env['l10n.co.dian.resolution'].browse(1) + values = { + 'DocumentType': self._get_invoice_type(), + 'InvoiceAuthorization': dian_resolution.resolution_number, + 'StartDate': dian_resolution.start_date, + 'EndDate': dian_resolution.end_date, + 'Prefix': dian_resolution.prefix, + 'From': dian_resolution.range_from, + 'To': dian_resolution.range_to, + 'ProviderID': self.company_id.partner_id.vat, + 'SoftwareID': self.company_id.l10n_co_software_id, + 'SoftwareSecurityCode': 'TODO', + 'ID': self.invoice_id.number, + 'UUID': self._cufe_generator(dian_resolution.technical_key), + 'IssueDate': self.invoice_id.date_invoice, + 'IssueTime': self.invoice_time, + 'InvoiceTypeCode': self._get_invoice_type_code(), + 'DocumentCurrencyCode': self.invoice_id.currency_id.name, + 'AccountingSupplierParty': + self._prepare_accounting_supplier_party_values(), + 'AccountingCustomerParty': + self._prepare_accounting_customer_party_values(), + } + + return values + + def _get_xml_without_sing(self): + values = self._prepare_xml_values() + return self._get_template_xml(values, 'dian') + + def _get_signature(self, xml_without_signed): + digest1 = hashlib.sha256(self.xml_without_signed.encode()) + print(digest1.hexdigest()) + values = { + 'Id': '', + 'data_xml_signature_ref_zero': '', + 'data_public_certificate_base': '', + 'data_xml_keyinfo_base': '', + 'data_xml_politics': '', + 'data_xml_SignedProperties_base': '', + 'signing_time': self._get_format_current_date(), + 'DigestValue': '', + 'IssuerName': '', + 'SerialNumber': '', + 'IdSignature': '', + 'IdReference_zero': '', + 'URIReference_keyinfo': '', + 'URIReference_signedprops': '', + 'IdSignatureValue': '', + 'IdKeyInfo': '', + 'IdSignedProperties': '', + 'Target': '', + 'SignatureValue': '', + } + return self._get_template_xml(values, 'signature') + + def _create_xml(self): + xml_without_signed = self._get_xml_without_sing() + signature = self._get_signature(xml_without_signed) + xml_signed = signature + xml_without_signed + print(xml_without_signed) + return xml_without_signed + + def _get_server_url(self): + service_provider = self.company_id.l10n_co_service_provider + return server_url['OPERACION'] if service_provider == 'dian' \ + else server_url['HABILITACION'] + + def _action_send_xml(self): + # file_name = self._get_file_name() + header = {'content-type': 'text/xml'} + try: + response = requests.post(self._get_server_url(), + data=self.request_send, + headers=header) + # self.response_code = 0 + self.send_date = self._get_co_current_datetime() + print(response) + except Exception as e: + print(e) + _logger.error('DIAN Error', exc_info=True) + + @api.multi + def action_post_validate(self): + self.request_send = self._create_xml() + self._action_send_xml() + + @api.multi + def validate_invoice(self): + self.ensure_one() + errors = self._hook_validation() + if len(errors) > 0: + raise UserError("Please set values of following fields %s " + % errors) + + @api.multi + def action_cancel(self): + pass + + @api.multi + def action_back_to_draft(self): + pass + + @api.model + def create(self, vals): + vals['invoice_time'] = self._change_date_format( + fields.Date.to_string(self._get_co_current_datetime()), + "%H:%M:%S" + ) + return super(L10nCoElectronicInvoice, self).create(vals) diff --git a/models/res_company.py b/models/res_company.py index 196a334..821bebd 100644 --- a/models/res_company.py +++ b/models/res_company.py @@ -4,6 +4,7 @@ class ResCompany(models.Model): _inherit = 'res.company' + l10n_co_dian_enabled = fields.Boolean('DIAN - Electronic invoice') l10n_co_dian_id = fields.Char('DIAN id') l10n_co_software_id = fields.Char('Software Id') l10n_co_pin = fields.Char('PIN') diff --git a/requirements.txt b/requirements.txt index e69de29..26f64e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,4 @@ +jinja2 +lxml +pytz +requests diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 97dd8b9..1161e1e 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1 +1,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_l10n_co_electronic_invoice,access_l10n_co_electronic_invoice,model_l10n_co_electronic_invoice,base.group_user,1,0,0,0 +access_account_journal_dian_resolutions,access_account_journal_dian_resolutions,model_account_journal_dian_resolutions,base.group_user,1,0,0,0 +access_l10n_co_dian_resolution,access_l10n_co_dian_resolution,model_l10n_co_dian_resolution,base.group_user,1,0,0,0 + + diff --git a/static/xsd/DIAN_UBL.xsd b/static/xsd/DIAN_UBL.xsd new file mode 100755 index 0000000..9b8d1af --- /dev/null +++ b/static/xsd/DIAN_UBL.xsd @@ -0,0 +1,2779 @@ + + + + + + + + + + + + Debe usar como mínimo extensiones definidas por + DIAN para toda factura electrónica + + + + + + + Debe marcar UBL 2.0 (versión base de UBL usada + para crear este perfil) + + + + + + + 2017-oct-20: Precisando la descripción del Invoice que se utilizó para conformar el XML; la precisión se hace a través de los atributos + + + + + + + 1.5 - Versión del Formato: Indicar versión del + documento. Debe usarse "DIAN 1.0" + + + + + + + 1.1 Número de documento: Número de factura o factura cambiaria. + Incluye prefijo + consecutivo de factura. + No se permiten caracteres adicionales como espacios o guiones. + + + + + + + 1.10 - CUFE: Obligatorio si es factura nacional. + Codigo Unico de Facturacion Electronica. Campo + que verifica la integridad de la información + recibida, es un campo generado por el sistema + Numeración de facturación, está pendiente + definir su contenido. Esta Encriptado. La + factura electrónica tiene una firma electrónica + basada en firma digital según la política de + firma propuesta. La integridad de la factura ya + viene asegurada por la firma digital, no es + necesaria ninguna medida más para asegurar que + ningún campo ha sido alterado + + + + + + + 1.7 Fecha de emisión: Fecha de emisión de la + factura a efectos fiscales + + + + + + + 1.7 (Hora) de emisión + + + + + + + 2017-oct-20: Tipo de Factura, código: facturas de venta, y transcripciones; tipo = 1 para factura de venta; tipo = 2 para factura de venta de bienes o servicios exportados; tipo = 3 para la transcripción de datos al formato UBL-Invoice-DIAN desde la factura de venta expedida por talonario en ocasión de una contingencia del sistema de factura electrónica del OFE (i.e. obligado a facturar electrónicamente). Véase el Artículo 8 de la Resolución 0055-2016 que modificó el Numeral 1 del Artículo 11 de la Resolución 0019-2016. - Se había anunciado de manera informal que sería utilizado en tipo = 4 para informar a la autoridad TAC (i.e. tributaria, aduanera y cambiaria), por transcripción de datos, las facturas de los bienes y servicios adquiridos en el exterior e importados al territorio aduanero nacional. Este tipo de factura de importación no entrará por ahora en operación. + + + + + + + 1.11 Información adicional: Texto libre, + relativo al documento + + + + + + + 9.10 Divisa de la Factura: Divisa consolidada + aplicable a toda la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 1.8 Periodo de Facturación: Intervalo de fechas + a las que referencia la factura + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (despacho): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (recepción): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (origen): Referencia + a un documento + + + + + + + 3.1.1 Referencia Documento (contrato): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento: Referencia a un + documento + + + + + + + 2.1 - Obligado a Facturar: + + + + + + + 2.2 - Adquirente: + + + + + + + 11.5 - Receptor del Pago: Participante, Entidad, + Departamento, Unidad, destinatario de la + factura. Suele coincidir con el obligado a + facturar Ver composición en la estructura común + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10 - 2.1.10 Datos Términos de Entrega: + Agrupación de campos relativos al transporte o + entrega de los bienes. Se presenta nuevos + participantes relativos a la entrega, como el + transportista + + + + + + + 2.2.10 - Medios de Transporte + + + + + + + 12.1 - Datos del Pago: Información relativa al + pago de la factura. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 6.1.1 - Anticipo: Elemento raíz compuesto + utilizado para informar de un anticipo. + + + + + + + 5.1.1 Cargo - Elemento raíz compuesto utilizado + para informar de un cargo. / 4.1.1 Descuento: + Elemento raíz compuesto utilizado para informar + de un descuento + + + + + + + 9.11 Tasa Cambio Peso Colombiano: Tasa de cambio + de moneda extranjera a peso colombiano (COP). + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 7.1.1 - Impuesto Retenido: Elemento raíz + compuesto utilizado para informar de un impuesto + retenido. / 8.1.1 - Impuesto: Elemento raíz + compuesto utilizado para informar de un + impuesto. + + + + + + + 9 - Datos Importes Totales: Agrupación de campos + relativos a los importes totales aplicables a la + factura. Estos importes son calculados teniendo + en cuenta las líneas de factura y elementos a + nivel de factura, como descuentos, cargos, + impuestos, etc + + + + + + + 13.1.1 - Línea de Factura: Elemento que agrupa + todos los campos de una línea de factura + + + + + + + + + + + Debe usar como mínimo extensiones definidas por + DIAN para toda factura electrónica + + + + + + + Debe marcar UBL 2.0 (versión base de UBL usada + para crear este perfil) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 1.5 - Versión del Formato: Indicar versión del + documento. Debe usarse "DIAN 1.0" + + + + + + + 1.1 Número de documento: Número de factura o + factura cambiaria. + + + + + + + 1.10 - CUFE: Obligatorio si es factura nacional. + Codigo Unico de Facturacion Electronica. Campo + que verifica la integridad de la información + recibida, es un campo generado por el sistema + Numeración de facturación, está pendiente + definir su contenido. Esta Encriptado. La + factura electrónica tiene una firma electrónica + basada en firma digital según la política de + firma propuesta. La integridad de la factura ya + viene asegurada por la firma digital, no es + necesaria ninguna medida más para asegurar que + ningún campo ha sido alterado + + + + + + + 1.7 Fecha de emisión: Fecha de emisión de la + factura a efectos fiscales + + + + + + + 1.7 (Hora) de emisión + + + + + + + 1.11 Información adicional: Texto libre, + relativo al documento + + + + + + + 9.10 Divisa de la Factura: Divisa consolidada + aplicable a toda la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 1.8 Periodo de Facturación: Intervalo de fechas + a las que referencia la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (despacho): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (recepción): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (contrato): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento: Referencia a un + documento + + + + + + + 2.1 - Obligado a Facturar: + + + + + + + 2.2 - Adquirente: + + + + + + + 11.5 - Receptor del Pago: Participante, Entidad, + Departamento, Unidad, destinatario de la + factura. Suele coincidir con el obligado a + facturar Ver composición en la estructura común + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 7.1.1 - Impuesto Retenido: Elemento raíz + compuesto utilizado para informar de un impuesto + retenido. / 8.1.1 - Impuesto: Elemento raíz + compuesto utilizado para informar de un + impuesto. + + + + + + + 9 - Datos Importes Totales: Agrupación de campos + relativos a los importes totales aplicables a la + factura. Estos importes son calculados teniendo + en cuenta las líneas de factura y elementos a + nivel de factura, como descuentos, cargos, + impuestos, etc + + + + + + + 13.1.1 - Línea de Factura (nota crédito): + Elemento que agrupa todos los campos de una + línea de factura + + + + + + + + + + + Debe usar como mínimo extensiones definidas por + DIAN para toda factura electrónica + + + + + + + Debe marcar UBL 2.0 (versión base de UBL usada + para crear este perfil) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 1.5 - Versión del Formato: Indicar versión del + documento. Debe usarse "DIAN 1.0" + + + + + + + 1.1 Número de documento: Número de factura o + factura cambiaria. + + + + + + + 1.10 - CUFE: Obligatorio si es factura nacional. + Codigo Unico de Facturacion Electronica. Campo + que verifica la integridad de la información + recibida, es un campo generado por el sistema + Numeración de facturación, está pendiente + definir su contenido. Esta Encriptado. La + factura electrónica tiene una firma electrónica + basada en firma digital según la política de + firma propuesta. La integridad de la factura ya + viene asegurada por la firma digital, no es + necesaria ninguna medida más para asegurar que + ningún campo ha sido alterado + + + + + + + 1.7 Fecha de emisión: Fecha de emisión de la + factura a efectos fiscales + + + + + + + 1.7 (Hora) de emisión + + + + + + + 1.11 Información adicional: Texto libre, + relativo al documento + + + + + + + 9.10 Divisa de la Factura: Divisa consolidada + aplicable a toda la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 1.8 Periodo de Facturación: Intervalo de fechas + a las que referencia la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (orden): Referencia a + un documento + + + + + + + 3.1.1 Referencia Documento (despacho): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (recepción): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento (contrato): + Referencia a un documento + + + + + + + 3.1.1 Referencia Documento: Referencia a un + documento + + + + + + + 2.1 - Obligado a Facturar: + + + + + + + 2.2 - Adquirente: + + + + + + + 11.5 - Receptor del Pago: Participante, Entidad, + Departamento, Unidad, destinatario de la + factura. Suele coincidir con el obligado a + facturar Ver composición en la estructura común + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 6.1.1 - Anticipo: Elemento raíz compuesto + utilizado para informar de un anticipo. + + + + + + + 9.11 Tasa Cambio Peso Colombiano: Tasa de cambio + de moneda extranjera a peso colombiano (COP). + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 7.1.1 - Impuesto Retenido: Elemento raíz + compuesto utilizado para informar de un impuesto + retenido. / 8.1.1 - Impuesto: Elemento raíz + compuesto utilizado para informar de un + impuesto. + + + + + + + 9 - Datos Importes Totales: Agrupación de campos + relativos a los importes totales aplicables a la + factura. Estos importes son calculados teniendo + en cuenta las líneas de factura y elementos a + nivel de factura, como descuentos, cargos, + impuestos, etc + + + + + + + 13.1.1 - Línea de Factura (debit): Elemento que + agrupa todos los campos de una línea de factura + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Tipo: Debe referenciar a una lista de códigos con los siguientes valores: +• persona natural +• jurídica +• gran contribuyente +• otros + + + 2017-ago-10: los valores válidos son "1" y "2" para el concepto de "tipo de organización jurídica" que utiliza el Código de Comercio: "persona jurídica" y "persona natural o física" + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Estructura requerida para describir al obligado + a facturar + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Tipo: Debe referenciar a una lista de códigos con los siguientes valores: +• persona natural +• jurídica +• gran contribuyente +• otros + + + 2017-ago-10: los valores válidos son "1" y "2" para el concepto de "tipo de organización jurídica" + que utiliza el Código de Comercio: "persona jurídica" y "persona natural o física" + + + + + + + Estructura requerida para describir al + adquiriente + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + + + + + + Opcional no usado por la DIAN, las partes + pueden definir un significado o simplemente + omitirlo + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.3.1 - Identificador fiscal: Número completo + de Identificación Tributaria o similar. En + Colombia, el NIT + + + + + + + 2.1.10 / 2.2.10 - Nombre Comercial: Nombre + comercial, por ejemplo, si es una persona física + el nombre de su establecimiento, debe incluir la + referencia completa + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.1.16 / 2.2.16 - Dirección: + + + + + + + Estructura necesaria para describir el régimen + + + + + + + Estructura necesaria para describir la + información legal de la empresa + + + + + + + 17 - Personas de Contacto: Personas de contacto + asociadas al participante. + + + + + + + Estructura necesaria cuando el participante es + una persona natural o física + + 2017-ago-10: cambió la cardinalidad del atributo @maxOccurs de "1" a "unbounded" + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + 2.2.6.1 - Identificador único DUNS: + Identificador único de una dirección basado en + DUNS (Duns & Bradstreet). + + + + + + + 2.2.6.3 - Dirección: Texto Libre para establecer + una dirección. No se recomienda detallar en + otros campos más detallados conceptos como + número de edificio, letra, escalera, etc. Mejor + en una línea libre porque la diversidad de datos + es muy grande. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.6.8 - Sub-División del País: Nombre de la + Subdivisión territorial de un país Estado, + Departamento + + + + + + + 2.2.6.8 - Sub-División del País (código): Nombre + de la Subdivisión territorial de un país Estado, + Departamento + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Estructura requerida para adicionar detalles a + la dirección + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.6.2 - Identificador postal: Identificador + Postal, Apartado postal o aéreo, PO Box + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.6.8 - Sub-División del País: Nombre de la + Subdivisión territorial de un país Estado, + Departamento. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.6.11 - Sub-División Municipio: Subdivisión + de una ciudad, municipio, etc., por ejemplo un + distrito administrativo o similar. + + + + + + + 2.2.6.10 - Municipio: Nombre de la ciudad, + municipio, etc. + + + + + + + 2.2.6.12 - Código Postal: Código Postal + + + + + + + 6.2.2.8 - Sub-División del País: Nombre de la + Subdivisión territorial de un país Estado, + Departamento + + + + + + + 6.2.2.8 - Sub-División del País (código): Nombre + de la Subdivisión territorial de un país Estado, + Departamento + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + Opcional no usado por la DIAN, las partes + pueden definir un significado o simplemente + omitirlo + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.6.3 - Dirección: Texto Libre para establecer + una dirección. No se recomienda detallar en + otros campos más detallados conceptos como + número de edificio, letra, escalera, etc. Mejor + en una línea libre porque la diversidad de datos + es muy grande. / 2.2.6.4 - Dirección 2: Texto + Libre para establecer una dirección (extensión) + / 2.2.6.5 - Dirección 3: Texto Libre para + establecer una dirección (extensión) + + + + + + + 2.2.6.6 - Código País: Código del País relativo + a la dirección, se recomienda establecer como + Obligatorio si es distinto del nacional + (Colombia). Utilizar una lista de códigos + externa y estandarizada, como la iso ISO 3166-1 + alfa2 o alfa3. / 2.2.6.7 - Nombre del País: + Nombre del país relativo a la dirección. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.3.8 - Régimen: Régimen al que pertenece. + Debe referenciar a una lista de códigos con los + valores correspondientes, por ejemplo: • Común • + Simplificado • No aplica + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + No usado por la DIAN, las partes pueden definir + un significado o simplemente poner un elemento + vacío ya que es obligatorio en UBL + + + + + + + + + + + 2.2.3.4 - Razón Social: Obligatorio en caso de + ser una persona jurídica. Razón social de la + empresa + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + 2.2.3.5 - Nombre: Obligatorio si es una persona + natural. Nombre completo del participante + + + + + + + 2.2.3.6 - Primer Apellido: Obligatorio si es una + persona natural. Primer apellido completo del + participante, en caso de ser persona natural y + 2.2.3.7 - Segundo Apellido: Segundo apellido + completo del participante, en caso de ser + persona natural + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Indica que el elemento es un Cargo (5.1.1) y no + un descuento (4.1.1) + + + + + + + 4.1.1.1 / 5.1.1.1 - Razón (código): Obligatorio + si es factura internacional. Texto libre para + informar de la razón del descuento. Se puede + sustituir por una referencia a una lista de + códigos + + + + + + + 4.1.1.1 / 5.1.1.1 - Razón (texto): Obligatorio + si es factura internacional. Texto libre para + informar de la razón del descuento. Se puede + sustituir por una referencia a una lista de + códigos + + + + + + + 4.1.1.2 / 5.1.1.2 - Porcentaje: Porcentaje a + aplicar. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 4.1.1.3 / 5.1.1.3 - Valor Descuento: Importe + total a descontar. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 4.1.1.4 / 5.1.1.4 - Información adicional: Texto + libre para la añadir información adicional + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 6.1.1.2 - Importe Anticipo: Importe del anticipo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 6.1.1.1 - Fecha: Fecha en formato reconocido del + anticipo + + + + + + + 6.1.1.1 - Fecha (hora): Fecha en formato + reconocido del anticipo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + 7.1.1.4 - Importe Impuesto: Importe del impuesto + retenido + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Indica que el elemento es un Impuesto retenido + (7.1.1) y no un impuesto (8.1.1) + + + + + + + Estructura requerida por UBL para representar la + información requerida por la factura electrónica + DIAN + + + + + + + + + + + 7.1.1.1 / 8.1.1.1 - Base Imponible: Base + Imponible sobre la que se calcula la retención + de impuesto + + + + + + + 7.1.1.4 / 8.1.1.4 - Importe Impuesto (detalle): + Importe del impuesto retenido + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 7.1.1.3 / 8.1.1.3 - Porcentaje: Porcentaje a + aplicar + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 7.1.1.2 - Tipo: Tipo o clase impuesto. Concepto + fiscal por el que se tributa. Debería si un + campo que referencia a una lista de códigos. En + la lista deberían aparecer los impuestos + estatales o nacionales + + + + + + + + + + + 9.4 - Total Importe bruto antes de impuestos: + Total importe bruto, suma de los importes brutos + de las líneas de la factura. + + + + + + + 9.5 - Total Base Imponible (Importe + Bruto+Cargos-Descuentos): Base imponible para el + cálculo de los impuestos. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 9.1 - Total de Descuentos: Suma de todos los + descuentos presentes + + + + + + + 9.2 - Total de Cargos: Suma de todos los cargos + presentes + + + + + + + 9.3 - Total de Anticipos: Suma de todos los + anticipos presentes + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 9.8 - Total de Factura: Total importe bruto + + Total Impuestos-Total Impuesto Retenidos + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10.1 - Fecha/Hora de Entrega (fecha) + + + + + + + 10.1 - Fecha/Hora de Entrega (hora) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 2.2.10.1 - Identificación del Transporte: + Matrícula del camión, número del vagón, nombre + del barco…. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10.8 - Consignador: Ver composición en la + estructura común Información de un participante + secundario (REF-PART-SEC) / 10.9 - + Consignatario: Ver composición en la estructura + común Información de un participante secundario + (REF-PART-SEC) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10.7 - Transportista + + + + + + + Estructura requerida para la información del + despacho + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10.3 - Fecha/Hora de Expedición o despacho + (fecha) + + + + + + + 10.3 - Fecha/Hora de Expedición o despacho + (hora) + + + + + + + 10.6 - Origen de la expedición o Despacho (SHIP + FROM party) + + + + + + 10.8 - Consignador + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Método de pago de costes de transporte: Se + utilizar para indicar cómo se pagan los costes + del transporte (por ejemplo, Portes Debidos, + Portes Pagados) + + Puede ser un texto libre que entiendan el + comprador y vendedor o codificarlo en una lista, + por ejemplo + http://www.unece.org/trade/untdid/d01b/tred/tred4215.htm + + + + + + + 2.2.10.2 - Condiciones de Entrega: Obligatorio + cuando sea una factura internacional….Se + recomienda utilizar los INCOTERMS (International + Commercial Terms), utilizando la codificación + estándar de 3 letras, por ejemplo…. CIF = Coste, + seguro, flete en el destino indicado CIP = + Flete, porte, seguro hasta destino CPT = Flete, + porte pagado hasta destino DAF = Entrega en la + frontera - lugar indicado FCA = Franco en el + transporte - Punto indicado EXW = En la fábrica + + Esta campo debería pertenecer a una lista de + códigos. Se aconseja utilizar los incoterms + 2010, + http://www.iccwbo.org/products-and-services/trade-facilitation/incoterms-2010/the-incoterms-rules/ + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 10.5 - Destino Expedición o Despacho (ShipTO + party) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + + 13.1.1.1 - Número de Línea: Número de Línea + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.16 - Información Adicional: Texto libre + para añadir información adicional al artículo. + + + + + + + 13.1.1.9 - Cantidad: Cantidad del artículo + solicitado. Número de unidades + servidas/prestadas. + + + + + + + 13.1.1.12 - Costo Total: Coste Total. Resultado: + Unidad de Medida x Precio Unidad. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.2 - Número de Línea de Pedido: Número de + la Línea de Pedido al que hace pertenece el + artículo que corresponde a la línea de factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.17 - Referencia Documentos: Texto libre + para añadir información adicional al artículo. + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Estructura necesaria para describir las + características del artículo o servicio + + + + + + + Estructura necesaria para describir los precios + de artículo o servicio + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + 13.1.1.3 - Descripción: Descripción del artículo + que pertenece a la línea de la factura + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.7 - Datos Técnicos: Datos técnicos + asociados al artículo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.4 - Marca: Marca del artículo, + obligatorio si la factura es internacional + + + + + + + 13.1.1.5 - Modelo: Modelo del artículo, + obligatorio si la factura es internacional + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.6 - Referencia: Referencia del artículo + + + + + + + 13.1.1.8 - Identificador de artículo: Código + identificador del artículo, por ejemplo el GTIN + (Global Trade Item Number). Este campo debería + referenciar a una lista de códigos. Se admite + varias ocurrencias, por si se quieren incluir + varias codificaciones. Ver composición en la + estructura común Identificador (REF-ID). Valores + Ejemplo: • GTIN UCC(Uniform Commercial Code)-12 + dígitos • GTIN EAN(European Article + Number)/UCC-13 dígitos • GTIN EAN/UCC-14 dígitos + • GTIN EAN/UCC-8 dígitos • Otros + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.13 - Estado de la Mercancía: Estado de la + mercancía, podría ser una referencia a una lista + de códigos o un texto libre. Obligatorio si el + estado es distinto a nueva + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.14- Periodo Servicio: Información sobre + el periodo de prestación de un servicio y + 13.1.1.15 - Fecha Transacción: Fecha concreta de + prestación del servicio o entrega del bien + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + 13.1.1.11 - Precio Unitario: Precio unitario de + la unidad de bien o servicio servido/prestado, + en la moneda indicada en la Cabecera de la + Factura. Siempre sin Impuestos + + + + + + + 13.1.1.10 - Unidad de Medida: Unidad en la que + está referida la Cantidad. Debe referenciar a + una lista de códigos. Recomendaciones 20 y 21 de + UN/CEFACT + (http://www.unece.org/cefact/recommendations/rec_index.html) + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + 13.1.1.14 - Periodo Servicio: Información sobre + el periodo de prestación de un servicio + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + Opcional no usado por la DIAN, las partes pueden + definir un significado o simplemente omitirlo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/xsd/DIAN_UBL_Structures.xsd b/static/xsd/DIAN_UBL_Structures.xsd new file mode 100755 index 0000000..d1dec29 --- /dev/null +++ b/static/xsd/DIAN_UBL_Structures.xsd @@ -0,0 +1,167 @@ + + + + + + + + 1.3 - Datos Resolución de + Numeración de Facturas + + + + + + + 1.3.1.2 - Número autorización: Número o código + de la resolución otorgada para la numeración + + + + + + + 1.3.1.3 - Fecha Autorización: Fecha Autorización + de la numeración + + + + + + + + + + + + Prefijo (no incluido en + documento de + recomendaciones)) + + + + + + + 1.3.1.1 - Rango de Numeración (mínimo): Rango de + numeración otorgado, valor mínimo y máximo + + 20170810: cambio de tipo de dato de "int" a "long" + + + + + + 1.3.1.1 - Rango de Numeración (máximo): Rango de + numeración otorgado, valor mínimo y máximo + + + 20170810: cambio de tipo de dato de "int" a "long" + + + + + + + + + + + 2.3 - Prestador de servicios: Datos del + Prestador de Servicios y el software utilizado + en la emisión de la factura. Un Obligado a + facturar puede ser también Prestador de + Servicios para sí mismo u otros, en cuyo caso + será Proveedor Tecnológico + + + + + + + 2.33 - Identificador Software: Identificador de + la + habilitación como software habilitado para la + emisión de facturas + + + + + + + + + + 9.6 - Total impuestos repercutidos: + Suma de todos los impuestos repercutidos + + + + + + 9.7 - Total impuestos retenidos: + Suma de todos los impuestos retenidos + + + + + + 9.12 - Total de Factura Peso Colombiano: + Obligatorio si es una factura con divisa extranjera + + + + + + + + + 2.1.12 - 2.1.12 Información Financiera + + + + + + 12.3 - Cesionario: Información relativa al pago de la factura. + + + + + 12.4 - Datos del Pago: Datos del Pago + + + + + 12.5 - Cláusula Cesión: Texto libre, explicativo sobre la cláusula de cesión + + + + + + 12.6 - Referencia Documentación Factoring: Referencia a un documento + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/template/dian.xml b/template/dian.xml new file mode 100644 index 0000000..ae66e2e --- /dev/null +++ b/template/dian.xml @@ -0,0 +1,147 @@ + + + + + + {{ Signature }} + + + {{ InvoiceAuthorization}} + + {{ StartDate }} + {{ EndDate }} + + + {{ Prefix }} + {{ From }} + {{ To }} + + + + CO + + + {{ ProviderID }} + {{ SoftwareID }} + + {{ SoftwareSecurityCode }} + + + + + UBL 2.0 + DIAN 1.0 + {{ ID }} + {{ UUID }} + {{ IssueDate }} + {{ IssueTime }} + {{ InvoiceTypeCode }} + {{ DocumentCurrencyCode }} + + {{ Supplier.AdditionalAccountID}} + + + {{ Supplier.ID }} + + + {{ Supplier.Name }} + + + + {{ Supplier.CityName }} + + {{ Supplier.Line }} + + + {{ Supplier.IdentificationCode }} + + + + + {{ Supplier.TaxLevelCode }} + + {{ Supplier.TaxSchemaName}} + + + + {{ Supplier.RegistrationName }} + + + + + {{ Customer.AdditionalAccountID }} + + + {{ Customer.ID}} + + + + + + + + + + + + {{ Customer.TaxLevelCode }} + + + + + + + Si la factura electrónica será utilizada como soporte de un crédito fiscal por el adquiriente de los + bienes o servicios, entonces deberán incluirse todas las informaciones del RUT, en forma similar a + las que se diligencian para el vendedor de los B / S. + Si la factura electrónica será registrada en el REFEL, entonces deberán incluirse las informaciones + que hayan sido reglamentadas por el MinCIT. + + + + + + 29036.16 + false + + 181476 + 29036.16 + 16 + + + 01 + + + + + + 7513.1 + false + + 181476 + 7513.1 + 4.14 + + + 03 + + + + + + 181476 + 36549.26 + 218025.26 + + + 1 + 852 + 181476 + + Línea-1 PRUE980006782 fos0001_900373117_68a25_R9000000500017996-PRUE-A.bat_cufe + + + 213 + + + diff --git a/template/signature.xml b/template/signature.xml new file mode 100644 index 0000000..b4b331a --- /dev/null +++ b/template/signature.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + {{ digestValue }} + + + + %(data_xml_keyinfo_base)s + + + + %(data_xml_SignedProperties_base)s + + + %(SignatureValue)s + + + %(data_public_certificate_base)s + + + + + + + %(data_xml_SigningTime)s + + + + + %(CertDigestDigestValue)s + + + %(IssuerName)s + %(SerialNumber)s + + + + + + + https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf + Politica de firma para facturas electronicas de la Republica de Colombia + + + + %(data_xml_politics)s + + + + + + supplier + + + + + + + \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py index 8bc2970..e54888d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1,3 @@ from . import test_dian_resolution +from . import test_electronic_invoice + diff --git a/tests/test_dian_resolution.py b/tests/test_dian_resolution.py index 6ba6f85..23dacfc 100644 --- a/tests/test_dian_resolution.py +++ b/tests/test_dian_resolution.py @@ -7,6 +7,8 @@ class TestL10nCoDianResolution(TransactionCase): def setUp(self): + super(TestL10nCoDianResolution, self).setUp() + self.dian_resolution = self.env.ref('l10n.co.dian.resolution') self.resolution_fe = self.dian_resolution.create({ 'name': 'Resolution FE', diff --git a/tests/test_electronic_invoice.py b/tests/test_electronic_invoice.py new file mode 100644 index 0000000..34c9f5f --- /dev/null +++ b/tests/test_electronic_invoice.py @@ -0,0 +1,119 @@ +import mock + +from odoo import fields + +from odoo.tests.common import TransactionCase +from odoo.exceptions import UserError + + +class TestL10nCoElectronicInvoice(TransactionCase): + + def setUp(self): + super(TestL10nCoElectronicInvoice, self).setUp() + + self.l10n_co_einvoice = self.env['l10n.co.electronic.invoice'] + self.main_company = self.env.ref('base.main_company') + self.currency = self.env.ref('base.COP') + + self.receivable_account = self.env['account.account'].create(dict( + code='10000000', + name='Account test', + reconcile=True, + user_type_id=self.env.ref( + 'account.data_account_type_receivable').id, + company_id=self.main_company.id, + )) + + self.partner = self.env['res.partner'].create(dict( + name='PartnerTest', + company_type='company', + vat='8355990', + is_company=True, + property_account_receivable_id=self.receivable_account.id, + )) + + self.product = self.env['product.product'].create(dict( + name='Product test', + )) + + self.journal = self.env['account.journal'].create(dict( + name='Journal Test', + code='FE', + type='sale', + default_debit_account_id=self.receivable_account.id, + default_credit_account_id=self.receivable_account.id, + )) + + invoice_line = [ + (0, 0, + { + 'product_id': self.product.id, + 'quantity': 10.0, + 'account_id': self.receivable_account.id, + 'name': 'product test', + 'price_unit': 10, + } + ) + ] + + self.invoice = self.env['account.invoice'].create(dict( + name='Invoice Test', + journal_id=self.journal.id, + partner_id=self.partner.id, + account_id=self.receivable_account.id, + invoice_line_ids=invoice_line, + )) + + self.electronic_invoice = self.l10n_co_einvoice.create(dict( + invoice_id=self.invoice.id, + company_id=self.main_company.id, + )) + + def test_get_file_name(self): + self.main_company.vat = '98765432' + self.invoice.action_invoice_open() + file_name = self.electronic_invoice._get_file_name() + + self.assertEquals(len(file_name), 26) + self.assertEquals(file_name, 'face_f00987654320000000001') + + def test_create_electronic_invoice(self): + einvoice = self.l10n_co_einvoice.create(dict( + invoice_id=self.invoice.id, + company_id=self.main_company.id, + )) + + self.assertTrue(einvoice) + self.assertEqual(einvoice.invoice_id.id, self.invoice.id) + self.assertEqual(einvoice.company_id.id, self.invoice.company_id.id) + + # def test_prepare_cufe_values(self): + # res = self.l10n_co_einvoice._prepare_cufe_values( + # '693ff6f2a553c3646a063436fd4dd9ded0311471') + # + # self.assertEqual(res, ('323200000129201508120611311109376.00010.' + # '000245928.1603107165.721296705.207000853' + # '7131800199436693ff6f2a553c3646a063436fd4' + # 'dd9ded0311471')) + + @mock.patch('odoo.addons.l10n_co_electronic_invoice.models.l10n_co_electronic_invoice.L10nCoElectronicInvoice._prepare_cufe_values') # noqa + def test_cufe_generator(self, cufe_values): + def _prepare_cufe_values(technical_key): + return ('323200000129201508120611311109376.00010.000245928.' + '1603107165.721296705.2070008537131800199436693ff6f2' + 'a553c3646a063436fd4dd9ded0311471') + + cufe_values.side_effect = _prepare_cufe_values + res = self.l10n_co_einvoice._cufe_generator('') + + self.assertEqual(res, '77c35e565a8d8f9178f2c0cb422b067091c1d760') + + + + + + + + + + diff --git a/views/account_invoice.xml b/views/account_invoice.xml index 4ed5d86..03b885c 100644 --- a/views/account_invoice.xml +++ b/views/account_invoice.xml @@ -8,7 +8,7 @@ - + diff --git a/views/l10n_co_electronic_invoice.xml b/views/l10n_co_electronic_invoice.xml index 77b910b..cfd997a 100644 --- a/views/l10n_co_electronic_invoice.xml +++ b/views/l10n_co_electronic_invoice.xml @@ -7,6 +7,7 @@ + @@ -22,14 +23,21 @@ l10n.co.electronic.invoice
- - + + + + + + + + + - + diff --git a/views/res_company.xml b/views/res_company.xml index bbf1f24..d2a8f02 100644 --- a/views/res_company.xml +++ b/views/res_company.xml @@ -8,8 +8,11 @@ - - + + + + +