diff --git a/facho/fe/__init__.py b/facho/fe/__init__.py index 3b4484b..9738869 100644 --- a/facho/fe/__init__.py +++ b/facho/fe/__init__.py @@ -3,4 +3,5 @@ from .fe import NAMESPACES from .fe import DianXMLExtensionSigner from .fe import DianXMLExtensionSoftwareSecurityCode from .fe import DianXMLExtensionCUFE +from .fe import DianXMLExtensionInvoiceAuthorization from .fe import DianZIP diff --git a/facho/fe/fe.py b/facho/fe/fe.py index 1c3b62f..e6b9a4e 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -217,7 +217,37 @@ class DianXMLExtensionSigner(FachoXMLExtension): return (dian_path, [signature]) +class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension): + # RESOLUCION 0004: pagina 106 + def __init__(self, authorization: str, + period_startdate: datetime, period_enddate: datetime, + prefix: str, from_: int, to: int): + self.authorization = authorization + self.period_startdate = period_startdate + self.period_enddate = period_enddate + self.prefix = prefix + self.from_ = from_ + self.to = to + + def build(self, fexml): + fexml.set_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceSource/cbc:IdentificationCode', 'CO') + + invoice_control = fexml.fragment('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceControl') + invoice_control.set_element('/sts:InvoiceControl/sts:InvoiceAuthorization', self.authorization) + invoice_control.set_element('/sts:InvoiceControl/sts:AuthorizationPeriod/cbc:StartDate', + self.period_startdate.strftime('%Y-%m-%d')) + invoice_control.set_element('/sts:InvoiceControl/sts:AuthorizationPeriod/cbc:EndDate', + self.period_enddate.strftime('%Y-%m-%d')) + invoice_control.set_element('/sts:InvoiceControl/sts:AuthorizedInvoices/sts:Prefix', + self.prefix) + invoice_control.set_element('/sts:InvoiceControl/sts:AuthorizedInvoices/sts:From', + self.from_) + invoice_control.set_element('/sts:InvoiceControl/sts:AuthorizedInvoices/sts:To', + self.to) + return '', [] + + class DianZIP: # RESOLUCION 0001: pagina 540 diff --git a/tests/test_fe.py b/tests/test_fe.py index 74f9bb9..92d783e 100644 --- a/tests/test_fe.py +++ b/tests/test_fe.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- # This file is part of facho. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. +from datetime import datetime import pytest from facho import fe @@ -53,3 +54,15 @@ def test_dian_extension_software_security_code(): xml.add_extension(security_code) content = xml.get_element_text('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:SoftwareSecurityCode') assert content is not None + +def test_dian_extension_invoice_authorization(): + invoice_authorization = '18762002346472' + inv_auth_ext = fe.DianXMLExtensionInvoiceAuthorization(invoice_authorization, + datetime(2017, 2, 23), + datetime(2019, 8, 23), + 'MD', 100001, 174999) + xml = fe.FeXML('Invoice', + 'http://www.dian.gov.co/contratos/facturaelectronica/v1') + xml.add_extension(inv_auth_ext) + auth = xml.get_element_text('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceControl/sts:InvoiceAuthorization') + assert auth == invoice_authorization