diff --git a/facho/fe/form_xml/attached_document.py b/facho/fe/form_xml/attached_document.py index 18b368e..8c46cb9 100644 --- a/facho/fe/form_xml/attached_document.py +++ b/facho/fe/form_xml/attached_document.py @@ -6,10 +6,164 @@ __all__ = ['AttachedDocument'] class AttachedDocument(): def __init__(self, id): - schema =\ + self.schema =\ 'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2' - self.fexml = fe.FeXML('AttachedDocument', schema) - self.fexml.set_element('./cbc:ID', id) + self.id = id + self.attached_document_invoice = self.attached_document_invoice() + + # self.fexml.placeholder_for( + # './ext:UBLExtension/ext:ExtensionContent/ds:Signature') + # self.fexml.set_element('./ext:UBLExtension/ext:ExtensionContent/ds:Signature', None, Id=id) + # + + def attached_document_invoice(self): + self.fexml = fe.FeXML( + 'AttachedDocument', self.schema) + + # DIAN 1.9.-2023: AE02 + self.fexml.set_element( + './cbc:UBLVersionID', 'UBL 2.1') + + # DIAN 1.9.-2023: AE03 + self.fexml.set_element( + './cbc:CustomizationID', 'Documentos adjuntos') + + # DIAN 1.9.-2023: AE04 + self.fexml.set_element( + './cbc:ProfileID', 'Factura Electrónica de Venta') + + # DIAN 1.9.-2023: AE04a + self.fexml.set_element( + './cbc:ProfileExecutionID', '1') + + # DIAN 1.9.-2023: AE04b + self.fexml.set_element( + './cbc:ID', self.id) + + # DIAN 1.9.-2023: AE05 + self.fexml.set_element( + './cbc:IssueDate', '2024-12-07') + + # DIAN 1.9.-2023: AE06 + self.fexml.set_element( + './cbc:IssueTime', '12:16:07-05:00') + + # DIAN 1.9.-2023: AE08 + self.fexml.set_element( + './cbc:DocumentType', 'Contenedor de Factura Electrónica') + + # DIAN 1.9.-2023: AE08a + self.fexml.set_element( + './cbc:ParentDocumentID', 'FE60247') + + # DIAN 1.9.-2023: AE09 + self.set_sender_party() + + # DIAN 1.9.-2023: AE20 + self.set_receiver_party() + # DIAN 1.9.-2023: AE33 + self.set_attachment() + self.set_parent_document_line_reference() + + def set_sender_party(self): + # DIAN 1.9.-2023: AE09 + self.fexml.placeholder_for( + './cac:SenderParty') + # DIAN 1.9.-2023: AE10 + self.fexml.placeholder_for( + './cac:SenderParty/cac:PartyTaxScheme') + # DIAN 1.9.-2023: AE11 + self.fexml.set_element( + './cac:SenderParty/cac:PartyTaxScheme/cbc:RegistrationName', + 'CASCOS MEDELLIN') + # DIAN 1.9.-2023: AE12 + # DIAN 1.9.-2023: AE13 + # DIAN 1.9.-2023: AE14 + # DIAN 1.9.-2023: AE15 + self.fexml.set_element( + './cac:SenderParty/cac:PartyTaxScheme/cbc:CompanyID', '900795506', + schemeAgencyID='195', + schemeID='0', + schemeName='31') + + # DIAN 1.9.-2023: AE16 + self.fexml.set_element( + './cac:SenderParty/cac:PartyTaxScheme/cbc:TaxLevelCode', + 'R-99-PN') + + # DIAN 1.9.-2023: AE18 + self.fexml.placeholder_for( + './cac:SenderParty/cac:PartyTaxScheme/cac:TaxScheme') + + # DIAN 1.9.-2023: AE19 + self.fexml.set_element( + './cac:SenderParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID', + '01') + + # DIAN 1.9.-2023: AE20 + self.fexml.set_element( + './cac:SenderParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name', + 'IVA') + + def set_receiver_party(self): + # DIAN 1.9.-2023: AE21 + self.fexml.placeholder_for( + './cac:ReceiverParty') + # DIAN 1.9.-2023: AE22 + self.fexml.placeholder_for( + './cac:ReceiverParty/cac:PartyTaxScheme') + # DIAN 1.9.-2023: AE23 + self.fexml.set_element( + './cac:ReceiverParty/cac:PartyTaxScheme/cbc:RegistrationName', + 'CASCOS MEDELLIN') + # DIAN 1.9.-2023: AE24 + # DIAN 1.9.-2023: AE25 + # DIAN 1.9.-2023: AE26 + # DIAN 1.9.-2023: AE27 + self.fexml.set_element( + './cac:ReceiverParty/cac:PartyTaxScheme/cbc:CompanyID', '900795506', + schemeAgencyID='195', + schemeID='0', + schemeName='31') + # DIAN 1.9.-2023: AE28 + self.fexml.set_element( + './cac:ReceiverParty/cac:PartyTaxScheme/cbc:TaxLevelCode', + 'R-99-PN') + # DIAN 1.9.-2023: AE30 + self.fexml.placeholder_for( + './cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme') + # DIAN 1.9.-2023: AE31 + self.fexml.set_element( + './cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID', + '01') + # DIAN 1.9.-2023: AE32 + self.fexml.set_element( + './cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name', + 'IVA') + + def set_attachment(self): + # DIAN 1.9.-2023: AE33 + self.fexml.placeholder_for( + './cac:Attachment') + # DIAN 1.9.-2023: AE34 + self.fexml.placeholder_for( + './cac:Attachment/cac:ExternalReference') + # DIAN 1.9.-2023: AE35 + self.fexml.set_element( + './cac:Attachment/cac:ExternalReference/cbc:MimeCode', + 'text/xml') + # DIAN 1.9.-2023: AE36 + self.fexml.set_element( + './cac:Attachment/cac:ExternalReference/cbc:EncodingCode', + 'UTF-8') + # DIAN 1.9.-2023: AE37 + self.fexml.set_element( + './cac:Attachment/cac:ExternalReference/cbc:Description', + ' ') + + def set_parent_document_line_reference(self): + self.fexml.placeholder_for( + './cac:ParentDocumentLineReference') def toFachoXML(self): return self.fexml diff --git a/tests/test_attached_document.py b/tests/test_attached_document.py index d4fe299..6b802fb 100644 --- a/tests/test_attached_document.py +++ b/tests/test_attached_document.py @@ -13,4 +13,58 @@ import helpers def test_xml_with_required_elements(): doc = form_xml.AttachedDocument(id='123') xml = doc.toFachoXML() - assert xml.get_element_text('/atd:AttachedDocument/cbc:ID') == '123' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:UBLVersionID') == 'UBL 2.1' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:CustomizationID') == 'Documentos adjuntos' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:ProfileID') == 'Factura Electrónica de Venta' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:ProfileExecutionID') == '1' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:ID') == '123' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:IssueDate') == '2024-12-07' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:IssueTime') == '12:16:07-05:00' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:DocumentType' + ) == 'Contenedor de Factura Electrónica' + assert xml.get_element_text( + '/atd:AttachedDocument/cbc:ParentDocumentID' + ) == 'FE60247' + + assert xml.get_element_text( + '/atd:AttachedDocument/cac:SenderParty/cac:PartyTaxScheme/cbc:RegistrationName' + ) == 'CASCOS MEDELLIN' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:SenderParty/cac:PartyTaxScheme/cbc:CompanyID' + ) == '900795506' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:SenderParty/cac:PartyTaxScheme/cbc:TaxLevelCode' + ) == 'R-99-PN' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:SenderParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID' + ) == '01' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:SenderParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name' + ) == 'IVA' + + assert xml.get_element_text( + '/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cbc:RegistrationName' + ) == 'CASCOS MEDELLIN' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cbc:CompanyID' + ) == '900795506' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cbc:TaxLevelCode' + ) == 'R-99-PN' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID' + ) == '01' + assert xml.get_element_text( + '/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name' + ) == 'IVA' + + # with open("output.xml", "w") as fh: + # fh.write(xml.tostring())