diff --git a/facho/facho.py b/facho/facho.py index 9f7101e..25cd59d 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -164,8 +164,8 @@ class FachoXML: def _path_xpath_for(self, xpath): return self._normalize_xpath(self._translate_xpath_for(xpath)) - def placeholder_for(self, xpath): - return self.find_or_create_element(xpath) + def placeholder_for(self, xpath, append=False): + return self.find_or_create_element(xpath, append) def replacement_for(self, xpath, new_xpath, content, **attrs): elem = self.get_element(xpath) diff --git a/facho/fe/fe.py b/facho/fe/fe.py index 906dc13..2b5c0b8 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -40,7 +40,7 @@ NAMESPACES = { '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': 'http://www.dian.gov.co/contratos/facturaelectronica/v1/Structures', + 'sts': 'dian:gov:co:facturaelectronica:Structures-2-1', '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#', @@ -358,12 +358,14 @@ class DianXMLExtensionAuthorizationProvider(FachoXMLExtension): # RESOLUCION 0004: pagina 176 def build(self, fexml): - dian_path = './ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider/sts:AuthorizationProviderID' - fexml.set_element(dian_path, '800197268') - attrs = {'schemeID': '4', 'schemeName': '31'} attrs.update(SCHEME_AGENCY_ATTRS) - fexml.set_attributes(dian_path, **attrs) + + authorization_provider = fexml.fragment('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider') + authorization_provider.set_element('./sts:AuthorizationProviderID', + '800197268', + **attrs) + class DianXMLExtensionInvoiceSource(FachoXMLExtension): @@ -390,16 +392,6 @@ class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension): self.to = to def build(self, fexml): - fexml.set_element('./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" - ) - 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', @@ -413,6 +405,16 @@ class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension): 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', + '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" + ) + class DianZIP: diff --git a/facho/fe/form_xml/invoice.py b/facho/fe/form_xml/invoice.py index 3170da0..b0eb6ae 100644 --- a/facho/fe/form_xml/invoice.py +++ b/facho/fe/form_xml/invoice.py @@ -11,8 +11,12 @@ class DIANInvoiceXML(fe.FeXML): def __init__(self, invoice, tag_document = 'Invoice'): super().__init__(tag_document, 'http://www.dian.gov.co/contratos/facturaelectronica/v1') - self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent') - + self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceControl') + self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:InvoiceSource') + self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:SoftwareProvider') + self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:SoftwareSecurityCode') + self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider/sts:AuthorizationProviderID') + # ZE02 se requiere existencia para firmar ublextension = self.fragment('./ext:UBLExtensions/ext:UBLExtension', append=True) extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent')