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:
330
facho/fe/fe.py
330
facho/fe/fe.py
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user