Fix: Formateo PEP8 (79 cols) y limpieza flake8 en paquete facho

- Líneas >79 cols reajustadas en todo el paquete
- Fix F821: etree.cleanup_namespaces(security) en signature.py (era 'header', NameError)
- Fix bug cune_xpath -> xpath en nomina/informacion_general() (NameError)
- Elimina clase TaxScheme duplicada en form/__init__.py
- Imports explícitos (F403/F405) y __all__ en form_xml/invoice.py, nomina
- Elimina imports y variables muertas (F401/F841), E712 (== None -> is None)
This commit is contained in:
2026-08-12 19:56:29 -05:00
parent 26ce89ca33
commit 4a7c2e2947
37 changed files with 1915 additions and 1103 deletions

View File

@@ -37,34 +37,48 @@ AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code']
SCHEME_AGENCY_ATTRS = {
'schemeAgencyName': 'CO, DIAN (Dirección de Impuestos y Aduanas Nacionales)',
'schemeAgencyID': '195'
}
'schemeAgencyName': 'CO, DIAN (Dirección de Impuestos y Aduanas'
' Nacionales)',
'schemeAgencyID': '195'}
# RESOLUCION 0001: pagina 516
POLICY_ID = 'https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf'
POLICY_NAME = u'Política de firma para facturas electrónicas de la República de Colombia.'
POLICY_ID = (
'https://facturaelectronica.dian.gov.co/politicadefirma/v2'
'/politicadefirmav2.pdf'
)
POLICY_NAME = (
u'Política de firma para facturas electrónicas de la República de '
u'Colombia.'
)
Bogota = tz.gettz('America/Bogota')
# NAMESPACES = {
# 'atd': 'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2',
# 'nomina': 'dian:gov:co:facturaelectronica:NominaIndividual',
# 'nominaajuste': 'dian:gov:co:facturaelectronica:NominaIndividualDeAjuste',
# 'nominaajuste': 'dian:gov:co:facturaelectronica:'
# 'NominaIndividualDeAjuste',
# 'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1',
# 'xs': 'http://www.w3.org/2001/XMLSchema-instance',
# 'cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',
# 'cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',
# 'cdt': 'urn:DocumentInformation:names:specification:ubl:colombia:schema:xsd:DocumentInformationAggregateComponents-1',
# 'xs': 'http://www.w3.org/2001/XMLSchema-instance',
# 'cac': 'urn:oasis:names:specification:ubl:schema:xsd:'
# 'CommonAggregateComponents-2',
# 'cbc': 'urn:oasis:names:specification:ubl:schema:xsd:'
# 'CommonBasicComponents-2',
# 'cdt': 'urn:DocumentInformation:names:specification:ubl:colombia:'
# 'schema:xsd:DocumentInformationAggregateComponents-1',
# 'clm54217': 'urn:un:unece:uncefact:codelist:specification:54217:2001',
# 'clmIANAMIMEMediaType': 'urn:un:unece:uncefact:codelist:specification:IANAMIMEMediaType:2003',
# 'ext': 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',
# 'qdt': 'urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2',
# 'clmIANAMIMEMediaType': 'urn:un:unece:uncefact:codelist:specification:'
# 'IANAMIMEMediaType:2003',
# 'ext': 'urn:oasis:names:specification:ubl:schema:xsd:'
# 'CommonExtensionComponents-2',
# 'qdt': 'urn:oasis:names:specification:ubl:schema:xsd:'
# 'QualifiedDatatypes-2',
# 'sts': 'dian:gov:co:facturaelectronica:Structures-2-1',
# 'udt': 'urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2',
# 'udt': 'urn:un:unece:uncefact:data:specification:'
# 'UnqualifiedDataTypesSchemaModule:2',
# 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
# 'xades': 'http://uri.etsi.org/01903/v1.3.2#',
# 'xades141': 'http://uri.etsi.org/01903/v1.4.1#',
# 'xades141': 'http://uri.etsi.org/01903/v1.4.1#',
# 'ds': 'http://www.w3.org/2000/09/xmldsig#',
# 'sig': 'http://www.w3.org/2000/09/xmldsig#',
# }
@@ -72,12 +86,19 @@ Bogota = tz.gettz('America/Bogota')
NAMESPACES = {
'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1',
'cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',
'cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',
'ext': 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',
'cac': (
'urn:oasis:names:specification:ubl:schema:xsd'
':CommonAggregateComponents-2'),
'cbc': 'urn:oasis:names:specification:ubl:schema:xsd'
':CommonBasicComponents-2',
'ext': (
'urn:oasis:names:specification:ubl:schema:xsd'
':CommonExtensionComponents-2'),
'qdt': 'urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2',
'sts': 'dian:gov:co:facturaelectronica:Structures-2-1',
'udt': 'urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2',
'udt': (
'urn:un:unece:uncefact:data:specification'
':UnqualifiedDataTypesSchemaModule:2'),
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'ds': 'http://www.w3.org/2000/09/xmldsig#',
'xades': 'http://uri.etsi.org/01903/v1.3.2#',
@@ -119,18 +140,21 @@ class FeXML(FachoXML):
return super().from_string(document, namespaces=NAMESPACES)
def tostring(self, **kw):
# MACHETE(bit4bit) la DIAN espera que la etiqueta raiz no este en un namespace
# MACHETE(bit4bit) la DIAN espera que la etiqueta raiz no este en un
# namespace
root_namespace = self.root_namespace()
root_localname = self.root_localname()
xmlns_name = {v: k for k, v in NAMESPACES.items()}[root_namespace]
if root_localname == 'Invoice':
urn_oasis = 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2'
urn_oasis = (
'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2')
if root_localname == 'CreditNote':
urn_oasis = 'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2'
urn_oasis = (
'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2')
return super().tostring(**kw)\
.replace(xmlns_name + ':', '')\
.replace('xmlns:'+xmlns_name, 'xmlns')\
.replace(root_namespace, urn_oasis)
.replace(xmlns_name + ':', '')\
.replace('xmlns:' + xmlns_name, 'xmlns')\
.replace(root_namespace, urn_oasis)
class DianXMLExtensionCUDFE(FachoXMLExtension):
@@ -149,9 +173,12 @@ class DianXMLExtensionCUDFE(FachoXMLExtension):
def _get_qrcode(self, cufe):
url_for = {
AMBIENTE_PRUEBAS: 'https://catalogo-vpfe-hab.dian.gov.co/document/searchqr?documentkey=',
AMBIENTE_PRODUCCION: 'https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey='
}
AMBIENTE_PRUEBAS: (
'https://catalogo-vpfe-hab.dian.gov.co/document/'
'searchqr?documentkey='),
AMBIENTE_PRODUCCION: (
'https://catalogo-vpfe.dian.gov.co/document/'
'searchqr?documentkey=')}
return url_for[self.tipo_ambiente] + cufe
def build(self, fachoxml):
@@ -162,21 +189,29 @@ class DianXMLExtensionCUDFE(FachoXMLExtension):
if self.schemeName() == "CUDS-SHA384":
if fachoxml.tag_document() == 'Invoice':
fachoxml.set_element('./cbc:ProfileID',
'DIAN 2.1: documento soporte en adquisiciones efectuadas a no obligados a facturar.')
fachoxml.set_element(
'./cbc:ProfileID',
'DIAN 2.1: documento soporte en adquisiciones '
'efectuadas a no obligados a facturar.')
else:
fachoxml.set_element('./cbc:ProfileID',
'DIAN 2.1: Nota de ajuste al documento soporte en adquisiciones efectuadas a sujetos no obligados a expedir factura o documento equivalente')
fachoxml.set_element(
'./cbc:ProfileID',
'DIAN 2.1: Nota de ajuste al documento soporte en '
'adquisiciones efectuadas a sujetos no obligados a '
'expedir factura o documento equivalente')
else:
fachoxml.set_element('./cbc:ProfileID', 'DIAN 2.1: Factura Electrónica de Venta')
fachoxml.set_element(
'./cbc:ProfileID',
'DIAN 2.1: Factura Electrónica de Venta')
# #DIAN 1.8.-2021: FAD03
# fachoxml.set_element('./cbc:ProfileID', 'DIAN 2.1: Factura Electrónica de Venta')
# fachoxml.set_element('./cbc:ProfileID',
# 'DIAN 2.1: Factura Electrónica de Venta')
fachoxml.set_element(
'./cbc:ProfileExecutionID', self._tipo_ambiente_int())
#DIAN 1.7.-2020: FAB36
# DIAN 1.7.-2020: FAB36
fachoxml.set_element(
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:QRCode',
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts'
':DianExtensions/sts:QRCode',
self._get_qrcode(cufe))
def issue_time(self, datetime_):
@@ -192,7 +227,8 @@ class DianXMLExtensionCUDFE(FachoXMLExtension):
build_vars['FecFac'] = self.issue_date(invoice.invoice_issue)
build_vars['HoraFac'] = self.issue_time(invoice.invoice_issue)
# PAG 601
build_vars['ValorBruto'] = invoice.invoice_legal_monetary_total.line_extension_amount
build_vars['ValorBruto'] = (
invoice.invoice_legal_monetary_total.line_extension_amount)
build_vars['ValorTotalPagar'
] = invoice.invoice_legal_monetary_total.payable_amount
ValorImpuestoPara = defaultdict(lambda: form.Amount(0.0))
@@ -204,7 +240,8 @@ class DianXMLExtensionCUDFE(FachoXMLExtension):
if subtotal.scheme is not None:
# TODO cual es la naturaleza de tax_scheme_ident?
codigo_impuesto = subtotal.scheme.code
ValorImpuestoPara.setdefault(codigo_impuesto, form.Amount(0.0))
ValorImpuestoPara.setdefault(
codigo_impuesto, form.Amount(0.0))
ValorImpuestoPara[codigo_impuesto] += subtotal.tax_amount
build_vars['ValorImpuestoPara'] = ValorImpuestoPara
@@ -225,7 +262,7 @@ class DianXMLExtensionCUDFE(FachoXMLExtension):
class DianXMLExtensionCUFE(DianXMLExtensionCUDFE):
def __init__(
self, invoice, clave_tecnica='', tipo_ambiente=AMBIENTE_PRUEBAS):
self, invoice, clave_tecnica='', tipo_ambiente=AMBIENTE_PRUEBAS):
self.tipo_ambiente = tipo_ambiente
self.clave_tecnica = clave_tecnica
self.invoice = invoice
@@ -244,26 +281,40 @@ class DianXMLExtensionCUFE(DianXMLExtensionCUDFE):
CodImpuesto2 = build_vars['CodImpuesto2']
CodImpuesto3 = build_vars['CodImpuesto3']
return [
'%s' % build_vars['NumFac'],
'%s' % build_vars['FecFac'],
'%s' % build_vars['HoraFac'],
form.Amount(build_vars['ValorBruto']).truncate_as_string(2),
'%s' %
build_vars['NumFac'],
'%s' %
build_vars['FecFac'],
'%s' %
build_vars['HoraFac'],
form.Amount(
build_vars['ValorBruto']).truncate_as_string(2),
CodImpuesto1,
build_vars['ValorImpuestoPara'].get(CodImpuesto1, form.Amount(0.0)).truncate_as_string(2),
build_vars['ValorImpuestoPara'].get(
CodImpuesto1,
form.Amount(0.0)).truncate_as_string(2),
CodImpuesto2,
build_vars['ValorImpuestoPara'].get(CodImpuesto2, form.Amount(0.0)).truncate_as_string(2),
build_vars['ValorImpuestoPara'].get(
CodImpuesto2,
form.Amount(0.0)).truncate_as_string(2),
CodImpuesto3,
build_vars['ValorImpuestoPara'].get(CodImpuesto3, form.Amount(0.0)).truncate_as_string(2),
build_vars['ValorImpuestoPara'].get(
CodImpuesto3,
form.Amount(0.0)).truncate_as_string(2),
build_vars['ValorTotalPagar'].truncate_as_string(2),
'%s' % build_vars['NitOFE'],
'%s' % build_vars['NumAdq'],
'%s' % build_vars['ClTec'],
'%d' % build_vars['TipoAmb'],
'%s' %
build_vars['NitOFE'],
'%s' %
build_vars['NumAdq'],
'%s' %
build_vars['ClTec'],
'%d' %
build_vars['TipoAmb'],
]
class DianXMLExtensionCUDE(DianXMLExtensionCUDFE):
def __init__(self, invoice, software_pin, tipo_ambiente = AMBIENTE_PRUEBAS):
def __init__(self, invoice, software_pin, tipo_ambiente=AMBIENTE_PRUEBAS):
self.tipo_ambiente = tipo_ambiente
self.software_pin = software_pin
self.invoice = invoice
@@ -282,26 +333,44 @@ class DianXMLExtensionCUDE(DianXMLExtensionCUDFE):
CodImpuesto2 = build_vars['CodImpuesto2']
CodImpuesto3 = build_vars['CodImpuesto3']
return [
'%s' % build_vars['NumFac'],
'%s' % build_vars['FecFac'],
'%s' % build_vars['HoraFac'],
form.Amount(build_vars['ValorBruto']).truncate_as_string(2),
'%s' %
build_vars['NumFac'],
'%s' %
build_vars['FecFac'],
'%s' %
build_vars['HoraFac'],
form.Amount(
build_vars['ValorBruto']).truncate_as_string(2),
CodImpuesto1,
form.Amount(build_vars['ValorImpuestoPara'].get(CodImpuesto1, 0.0)).truncate_as_string(2),
form.Amount(
build_vars['ValorImpuestoPara'].get(
CodImpuesto1,
0.0)).truncate_as_string(2),
CodImpuesto2,
form.Amount(build_vars['ValorImpuestoPara'].get(CodImpuesto2, 0.0)).truncate_as_string(2),
form.Amount(
build_vars['ValorImpuestoPara'].get(
CodImpuesto2,
0.0)).truncate_as_string(2),
CodImpuesto3,
form.Amount(build_vars['ValorImpuestoPara'].get(CodImpuesto3, 0.0)).truncate_as_string(2),
form.Amount(build_vars['ValorTotalPagar']).truncate_as_string(2),
'%s' % build_vars['NitOFE'],
'%s' % build_vars['NumAdq'],
'%s' % build_vars['Software-PIN'],
'%d' % build_vars['TipoAmb'],
form.Amount(
build_vars['ValorImpuestoPara'].get(
CodImpuesto3,
0.0)).truncate_as_string(2),
form.Amount(
build_vars['ValorTotalPagar']).truncate_as_string(2),
'%s' %
build_vars['NitOFE'],
'%s' %
build_vars['NumAdq'],
'%s' %
build_vars['Software-PIN'],
'%d' %
build_vars['TipoAmb'],
]
class DianXMLExtensionCUDS(DianXMLExtensionCUDFE):
def __init__(self, invoice, software_pin, tipo_ambiente = AMBIENTE_PRUEBAS):
def __init__(self, invoice, software_pin, tipo_ambiente=AMBIENTE_PRUEBAS):
self.tipo_ambiente = tipo_ambiente
self.software_pin = software_pin
self.invoice = invoice
@@ -317,20 +386,30 @@ class DianXMLExtensionCUDS(DianXMLExtensionCUDFE):
def formatVars(self):
build_vars = self.buildVars()
CodImpuesto1 = build_vars['CodImpuesto1']
CodImpuesto2 = build_vars['CodImpuesto2']
CodImpuesto3 = build_vars['CodImpuesto3']
return [
'%s' % build_vars['NumFac'],
'%s' % build_vars['FecFac'],
'%s' % build_vars['HoraFac'],
form.Amount(build_vars['ValorBruto']).truncate_as_string(2),
'%s' %
build_vars['NumFac'],
'%s' %
build_vars['FecFac'],
'%s' %
build_vars['HoraFac'],
form.Amount(
build_vars['ValorBruto']).truncate_as_string(2),
CodImpuesto1,
form.Amount(build_vars['ValorImpuestoPara'].get(CodImpuesto1, 0.0)).truncate_as_string(2),
form.Amount(build_vars['ValorTotalPagar']).truncate_as_string(2),
'%s' % build_vars['NitOFE'],
'%s' % build_vars['NumAdq'],
'%s' % build_vars['Software-PIN'],
'%d' % build_vars['TipoAmb'],
form.Amount(
build_vars['ValorImpuestoPara'].get(
CodImpuesto1,
0.0)).truncate_as_string(2),
form.Amount(
build_vars['ValorTotalPagar']).truncate_as_string(2),
'%s' %
build_vars['NitOFE'],
'%s' %
build_vars['NumAdq'],
'%s' %
build_vars['Software-PIN'],
'%d' %
build_vars['TipoAmb'],
]
@@ -344,15 +423,20 @@ class DianXMLExtensionSoftwareProvider(FachoXMLExtension):
def build(self, fexml):
software_provider = fexml.fragment(
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:SoftwareProvider')
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts'
':DianExtensions/sts:SoftwareProvider')
provider_id_attrs = SCHEME_AGENCY_ATTRS.copy()
provider_id_attrs.update({'schemeID': self.dv})
#DIAN 1.7.-2020: FAB23
# DIAN 1.7.-2020: FAB23
provider_id_attrs.update({'schemeName': '31'})
software_provider.set_element('/sts:SoftwareProvider/sts:ProviderID', self.nit,
**provider_id_attrs)
software_provider.set_element('/sts:SoftwareProvider/sts:SoftwareID', self.id_software,
**SCHEME_AGENCY_ATTRS)
software_provider.set_element(
'/sts:SoftwareProvider/sts:ProviderID',
self.nit,
**provider_id_attrs)
software_provider.set_element(
'/sts:SoftwareProvider/sts:SoftwareID',
self.id_software,
**SCHEME_AGENCY_ATTRS)
class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension):
@@ -364,7 +448,10 @@ class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension):
self.invoice_ident = invoice_ident
def build(self, fexml):
dian_path = './ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:SoftwareSecurityCode'
dian_path = (
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts'
':DianExtensions/sts:SoftwareSecurityCode'
)
code = str(self.id_software) + str(self.pin) + str(self.invoice_ident)
m = hashlib.sha384()
m.update(code.encode('utf-8'))
@@ -401,8 +488,8 @@ class DianXMLExtensionSigner:
xml = LXMLBuilder.from_string(document)
signature = self.sign_xml_element(xml)
fachoxml = FachoXML(xml,nsmap=NAMESPACES)
#DIAN 1.7.-2020: FAB01
fachoxml = FachoXML(xml, nsmap=NAMESPACES)
# DIAN 1.7.-2020: FAB01
extcontent = self._element_extension_content(fachoxml)
fachoxml.append_element(extcontent, signature)
@@ -418,8 +505,11 @@ class DianXMLExtensionSigner:
xml.append(signature)
ref = xmlsig.template.add_reference(
signature, xmlsig.constants.TransformSha256, uri="", name="xmldsig-%s-ref0" % (id_uuid)
)
signature,
xmlsig.constants.TransformSha256,
uri="",
name="xmldsig-%s-ref0" %
(id_uuid))
xmlsig.template.add_transform(ref, xmlsig.constants.TransformEnveloped)
id_keyinfo = "xmldsig-%s-KeyInfo" % (id_uuid)
@@ -438,9 +528,8 @@ class DianXMLExtensionSigner:
id_props = "xmldsig-%s-signedprops" % (id_uuid)
props_ref = xmlsig.template.add_reference(
signature, xmlsig.constants.TransformSha256, uri="#%s" % (id_props),
uri_type="http://uri.etsi.org/01903#SignedProperties"
)
signature, xmlsig.constants.TransformSha256, uri="#%s" %
(id_props), uri_type="http://uri.etsi.org/01903#SignedProperties")
xmlsig.template.add_transform(
props_ref, xmlsig.constants.TransformInclC14N)
@@ -481,7 +570,9 @@ class DianXMLExtensionAuthorizationProvider(FachoXMLExtension):
def build(self, fexml):
attrs = {'schemeID': '4', 'schemeName': '31'}
attrs.update(SCHEME_AGENCY_ATTRS)
authorization_provider = fexml.fragment('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider')
authorization_provider = fexml.fragment(
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts'
':DianExtensions/sts:AuthorizationProvider')
authorization_provider.set_element('./sts:AuthorizationProviderID',
'800197268',
**attrs)
@@ -490,12 +581,17 @@ class DianXMLExtensionAuthorizationProvider(FachoXMLExtension):
class DianXMLExtensionInvoiceSource(FachoXMLExtension):
# CAB13
def build(self, fexml):
dian_path = '/fe:CreditNote/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceSource/cbc:IdentificationCode'
dian_path = (
'/fe:CreditNote/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionCo'
'ntent/sts:DianExtensions/sts:InvoiceSource/cbc:IdentificationCode'
)
fexml.set_element(
dian_path, 'CO',
listAgencyID="6",
listAgencyName="United Nations Economic Commission for Europe",
listSchemeURI="urn:oasis:names:specification:ubl:codelist:gc:CountryIdentificationCode-2.1")
listSchemeURI=(
"urn:oasis:names:specification:ubl:codelist:gc:"
"CountryIdentificationCode-2.1"))
class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension):
@@ -512,28 +608,38 @@ class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension):
self.to = to
def build(self, fexml):
invoice_control = fexml.fragment('./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)
invoice_control = fexml.fragment(
'./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)
fexml.set_element(
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceSource/cbc:IdentificationCode',
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts'
':DianExtensions/sts:InvoiceSource/cbc:IdentificationCode',
'CO',
# DIAN 1.7.-2020: FAB15
listAgencyID="6",
# DIAN 1.7.-2020: FAB16
listAgencyName="United Nations Economic Commission for Europe",
# DIAN 1.7.-2020: FAB17
listSchemeURI="urn:oasis:names:specification:ubl:codelist:gc:CountryIdentificationCode-2.1")
listSchemeURI=(
"urn:oasis:names:specification:ubl:codelist:gc:"
"CountryIdentificationCode-2.1"))
class DianZIP:
@@ -576,7 +682,11 @@ class DianZIP:
class DianXMLExtensionSignerVerifier:
def __init__(self, pkcs12_path_or_bytes, passphrase=None, localpolicy=True):
def __init__(
self,
pkcs12_path_or_bytes,
passphrase=None,
localpolicy=True):
self._pkcs12_path_or_bytes = pkcs12_path_or_bytes
self._passphrase = None
self._localpolicy = localpolicy
@@ -610,5 +720,5 @@ class DianXMLExtensionSignerVerifier:
else:
ctx.verify(signature)
return True
except:
except BaseException:
return False