Feat: Attachment, ParentDocumentLine
This commit is contained in:
parent
9b33b4486c
commit
3a385c63e3
@ -5,11 +5,12 @@ __all__ = ['AttachedDocument']
|
|||||||
|
|
||||||
class AttachedDocument():
|
class AttachedDocument():
|
||||||
|
|
||||||
def __init__(self, invoice, id):
|
def __init__(self, invoice, DIANInvoiceXML, id):
|
||||||
self.schema =\
|
self.schema =\
|
||||||
'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2'
|
'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2'
|
||||||
self.id = id
|
self.id = id
|
||||||
self.invoice = invoice
|
self.invoice = invoice
|
||||||
|
self.DIANInvoiceXML = DIANInvoiceXML
|
||||||
self.attached_document_invoice = self.attached_document_invoice()
|
self.attached_document_invoice = self.attached_document_invoice()
|
||||||
|
|
||||||
# self.fexml.placeholder_for(
|
# self.fexml.placeholder_for(
|
||||||
@ -43,7 +44,8 @@ class AttachedDocument():
|
|||||||
|
|
||||||
# DIAN 1.9.-2023: AE05
|
# DIAN 1.9.-2023: AE05
|
||||||
self.fexml.set_element(
|
self.fexml.set_element(
|
||||||
'./cbc:IssueDate', self.invoice.invoice_issue.strftime('%Y-%m-%d'))
|
'./cbc:IssueDate',
|
||||||
|
self.invoice.invoice_issue.strftime('%Y-%m-%d'))
|
||||||
|
|
||||||
# DIAN 1.9.-2023: AE06
|
# DIAN 1.9.-2023: AE06
|
||||||
self.fexml.set_element(
|
self.fexml.set_element(
|
||||||
@ -163,11 +165,63 @@ class AttachedDocument():
|
|||||||
# DIAN 1.9.-2023: AE37
|
# DIAN 1.9.-2023: AE37
|
||||||
self.fexml.set_element(
|
self.fexml.set_element(
|
||||||
'./cac:Attachment/cac:ExternalReference/cbc:Description',
|
'./cac:Attachment/cac:ExternalReference/cbc:Description',
|
||||||
' ')
|
self._build_attachment(self.DIANInvoiceXML)
|
||||||
|
)
|
||||||
|
|
||||||
|
def _build_attachment(self, DIANInvoiceXML):
|
||||||
|
document = (
|
||||||
|
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
|
||||||
|
) + DIANInvoiceXML.tostring()
|
||||||
|
attachment = "<![CDATA[{}]]>".format(
|
||||||
|
document)
|
||||||
|
|
||||||
|
return attachment
|
||||||
|
|
||||||
def set_parent_document_line_reference(self):
|
def set_parent_document_line_reference(self):
|
||||||
self.fexml.placeholder_for(
|
self.fexml.placeholder_for(
|
||||||
'./cac:ParentDocumentLineReference')
|
'./cac:ParentDocumentLineReference')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cbc:LineID', 1)
|
||||||
|
self.fexml.placeholder_for(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cbc:ID',
|
||||||
|
'1234')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cbc:UUID',
|
||||||
|
'1234',
|
||||||
|
schemeName="CUFE-SHA384")
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cbc:IssueDate',
|
||||||
|
'2024-11-28')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cbc:DocumentType',
|
||||||
|
'ApplicationResponse')
|
||||||
|
self.fexml.placeholder_for(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:MimeCode',
|
||||||
|
'text/xml')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:EncodingCode',
|
||||||
|
'UTF-8')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:Description',
|
||||||
|
' ')
|
||||||
|
self.fexml.placeholder_for(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:ResultOfVerification')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:ResultOfVerification/cbc:ValidatorID',
|
||||||
|
'Unidad Especial Dirección de Impuestos y Aduanas Nacionales')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:ResultOfVerification/cbc:ValidationResultCode',
|
||||||
|
'02')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:ResultOfVerification/cbc:ValidationDate',
|
||||||
|
'2024-11-28')
|
||||||
|
self.fexml.set_element(
|
||||||
|
'./cac:ParentDocumentLineReference/cac:DocumentReference/cac:ResultOfVerification/cbc:ValidationTime',
|
||||||
|
'10:35:11-05:00')
|
||||||
|
|
||||||
def toFachoXML(self):
|
def toFachoXML(self):
|
||||||
return self.fexml
|
return self.fexml
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from .. import fe
|
from .. import fe
|
||||||
from ..form import *
|
from ..form import *
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from .attached_document import AttachedDocument
|
||||||
|
|
||||||
__all__ = ['DIANInvoiceXML']
|
__all__ = ['DIANInvoiceXML']
|
||||||
|
|
||||||
@ -21,79 +22,147 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
# ZE02 se requiere existencia para firmar
|
# ZE02 se requiere existencia para firmar
|
||||||
ublextension = self.fragment('./ext:UBLExtensions/ext:UBLExtension', append=True)
|
ublextension = self.fragment('./ext:UBLExtensions/ext:UBLExtension', append=True)
|
||||||
extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent')
|
extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent')
|
||||||
self.attach_invoice(invoice)
|
self.attach_invoice = self.attach_invoice(invoice)
|
||||||
|
|
||||||
|
# self.attach_document = self.attached_document_invoice(attach_invoice)
|
||||||
|
|
||||||
|
def attach_invoice(fexml, invoice):
|
||||||
|
"""adiciona etiquetas a FEXML y retorna FEXML
|
||||||
|
en caso de fallar validacion retorna None"""
|
||||||
|
|
||||||
|
fexml.placeholder_for('./ext:UBLExtensions')
|
||||||
|
fexml.set_element('./cbc:UBLVersionID', 'UBL 2.1')
|
||||||
|
fexml.set_element(
|
||||||
|
'./cbc:CustomizationID', invoice.invoice_operation_type)
|
||||||
|
fexml.placeholder_for('./cbc:ProfileID')
|
||||||
|
fexml.placeholder_for('./cbc:ProfileExecutionID')
|
||||||
|
fexml.set_element('./cbc:ID', invoice.invoice_ident)
|
||||||
|
fexml.placeholder_for('./cbc:UUID')
|
||||||
|
fexml.set_element('./cbc:IssueDate', invoice.invoice_issue.strftime('%Y-%m-%d'))
|
||||||
|
# DIAN 1.7.-2020: FAD10
|
||||||
|
fexml.set_element('./cbc:IssueTime', invoice.invoice_issue.strftime('%H:%M:%S-05:00'))
|
||||||
|
fexml.set_element(
|
||||||
|
'./cbc:%sTypeCode' % (fexml.tag_document()),
|
||||||
|
invoice.invoice_type_code,
|
||||||
|
listAgencyID='195',
|
||||||
|
listAgencyName='No matching global declaration available for the validation root',
|
||||||
|
listURI='http://www.dian.gov.co')
|
||||||
|
fexml.set_element('./cbc:DocumentCurrencyCode', 'COP')
|
||||||
|
fexml.set_element('./cbc:LineCountNumeric', len(invoice.invoice_lines))
|
||||||
|
if fexml.tag_document() == 'Invoice':
|
||||||
|
fexml.set_element('./cac:%sPeriod/cbc:StartDate' % (
|
||||||
|
fexml.tag_document()),
|
||||||
|
invoice.invoice_period_start.strftime(
|
||||||
|
'%Y-%m-%d'))
|
||||||
|
fexml.set_element('./cac:%sPeriod/cbc:EndDate' % (
|
||||||
|
fexml.tag_document()),
|
||||||
|
invoice.invoice_period_end.strftime('%Y-%m-%d'))
|
||||||
|
fexml.set_billing_reference(invoice)
|
||||||
|
fexml.customize(invoice)
|
||||||
|
fexml.set_supplier(invoice)
|
||||||
|
fexml.set_customer(invoice)
|
||||||
|
fexml.set_payment_mean(invoice)
|
||||||
|
fexml.set_invoice_totals(invoice)
|
||||||
|
fexml.set_legal_monetary(invoice)
|
||||||
|
fexml.set_invoice_lines(invoice)
|
||||||
|
fexml.set_allowance_charge(invoice)
|
||||||
|
|
||||||
|
return fexml
|
||||||
|
|
||||||
|
def attached_document_invoice(fexml, invoice):
|
||||||
|
attach_invoice = fexml.attach_invoice(invoice)
|
||||||
|
attached_document = AttachedDocument(
|
||||||
|
invoice, '123', attach_invoice)
|
||||||
|
|
||||||
|
return attached_document
|
||||||
|
|
||||||
def set_supplier(fexml, invoice):
|
def set_supplier(fexml, invoice):
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty')
|
fexml.placeholder_for('./cac:AccountingSupplierParty')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ02
|
# DIAN 1.7.-2020: CAJ02
|
||||||
# DIAN 1.7.-2020: FAJ02
|
# DIAN 1.7.-2020: FAJ02
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cbc:AdditionalAccountID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cbc:AdditionalAccountID',
|
||||||
invoice.invoice_supplier.organization_code)
|
invoice.invoice_supplier.organization_code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ06
|
# DIAN 1.7.-2020: CAJ06
|
||||||
# DIAN 1.7.-2020: FAJ06
|
# DIAN 1.7.-2020: FAJ06
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name',
|
||||||
invoice.invoice_supplier.name)
|
invoice.invoice_supplier.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ07, CAJ08
|
# DIAN 1.7.-2020: CAJ07, CAJ08
|
||||||
# DIAN 1.7.-2020: FAJ07
|
# DIAN 1.7.-2020: FAJ07
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ08
|
# DIAN 1.7.-2020: FAJ08
|
||||||
# DIAN 1.7.-2020: CAJ09
|
# DIAN 1.7.-2020: CAJ09
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID',
|
||||||
invoice.invoice_supplier.address.city.code)
|
invoice.invoice_supplier.address.city.code)
|
||||||
# DIAN 1.7.-2020: FAJ09
|
# DIAN 1.7.-2020: FAJ09
|
||||||
# DIAN 1.7.-2020: CAJ10
|
# DIAN 1.7.-2020: CAJ10
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName',
|
||||||
invoice.invoice_supplier.address.city.name)
|
invoice.invoice_supplier.address.city.name)
|
||||||
# DIAN 1.7.-2020: FAJ11
|
# DIAN 1.7.-2020: FAJ11
|
||||||
# DIAN 1.7.-2020: CAJ11
|
# DIAN 1.7.-2020: CAJ11
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity',
|
||||||
invoice.invoice_supplier.address.countrysubentity.name)
|
invoice.invoice_supplier.address.countrysubentity.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ12
|
# DIAN 1.7.-2020: FAJ12
|
||||||
# DIAN 1.7.-2020: CAJ12
|
# DIAN 1.7.-2020: CAJ12
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode',
|
||||||
invoice.invoice_supplier.address.countrysubentity.code)
|
invoice.invoice_supplier.address.countrysubentity.code)
|
||||||
# DIAN 1.7.-2020: FAJ14
|
# DIAN 1.7.-2020: FAJ14
|
||||||
# DIAN 1.7.-2020: CAJ13, CAJ14
|
# DIAN 1.7.-2020: CAJ13, CAJ14
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line',
|
||||||
invoice.invoice_supplier.address.street)
|
invoice.invoice_supplier.address.street)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ16
|
# DIAN 1.7.-2020: FAJ16
|
||||||
# DIAN 1.7.-2020: CAJ16, CAJ16
|
# DIAN 1.7.-2020: CAJ16, CAJ16
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode',
|
||||||
invoice.invoice_supplier.address.country.code)
|
invoice.invoice_supplier.address.country.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ17
|
# DIAN 1.7.-2020: FAJ17
|
||||||
# DIAN 1.7.-2020: CAJ17
|
# DIAN 1.7.-2020: CAJ17
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name',
|
||||||
invoice.invoice_supplier.address.country.name,
|
invoice.invoice_supplier.address.country.name,
|
||||||
# DIAN 1.7.-2020: FAJ18
|
# DIAN 1.7.-2020: FAJ18
|
||||||
languageID='es')
|
languageID='es')
|
||||||
|
|
||||||
supplier_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy()
|
supplier_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy()
|
||||||
supplier_company_id_attrs.update({'schemeID': invoice.invoice_supplier.ident.dv,
|
supplier_company_id_attrs.update({
|
||||||
'schemeName': invoice.invoice_supplier.ident.type_fiscal})
|
'schemeID': invoice.invoice_supplier.ident.dv,
|
||||||
|
'schemeName': invoice.invoice_supplier.ident.type_fiscal
|
||||||
|
})
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ19
|
# DIAN 1.7.-2020: FAJ19
|
||||||
# DIAN 1.7.-2020: CAJ19
|
# DIAN 1.7.-2020: CAJ19
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ20
|
# DIAN 1.7.-2020: FAJ20
|
||||||
# DIAN 1.7.-2020: CAJ20
|
# DIAN 1.7.-2020: CAJ20
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName',
|
||||||
invoice.invoice_supplier.legal_name)
|
invoice.invoice_supplier.legal_name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ21
|
# DIAN 1.7.-2020: FAJ21
|
||||||
# DIAN 1.7.-2020: CAJ21
|
# DIAN 1.7.-2020: CAJ21
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID',
|
||||||
invoice.invoice_supplier.ident,
|
invoice.invoice_supplier.ident,
|
||||||
# DIAN 1.7.-2020: FAJ22,FAJ23,FAJ24,FAJ25
|
# DIAN 1.7.-2020: FAJ22,FAJ23,FAJ24,FAJ25
|
||||||
**supplier_company_id_attrs)
|
**supplier_company_id_attrs)
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
|
||||||
# DIAN 1.7.-2020: FAJ26
|
# DIAN 1.7.-2020: FAJ26
|
||||||
# DIAN 1.7.-2020: CAJ26
|
# DIAN 1.7.-2020: CAJ26
|
||||||
invoice.invoice_supplier.responsability_code,
|
invoice.invoice_supplier.responsability_code,
|
||||||
@ -102,30 +171,36 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
listName=invoice.invoice_supplier.responsability_regime_code)
|
listName=invoice.invoice_supplier.responsability_regime_code)
|
||||||
# DIAN 1.7.-2020: FAJ28
|
# DIAN 1.7.-2020: FAJ28
|
||||||
# DIAN 1.7.-2020: CAJ28
|
# DIAN 1.7.-2020: CAJ28
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ29
|
# DIAN 1.7.-2020: FAJ29
|
||||||
# DIAN 1.7.-2020: CAJ29
|
# DIAN 1.7.-2020: CAJ29
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID',
|
||||||
invoice.invoice_supplier.address.city.code)
|
invoice.invoice_supplier.address.city.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ30
|
# DIAN 1.7.-2020: FAJ30
|
||||||
# DIAN 1.7.-2020: CAJ30
|
# DIAN 1.7.-2020: CAJ30
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName', invoice.invoice_supplier.address.city.name)
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName', invoice.invoice_supplier.address.city.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ31
|
# DIAN 1.7.-2020: FAJ31
|
||||||
# DIAN 1.7.-2020: CAJ31
|
# DIAN 1.7.-2020: CAJ31
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity',
|
||||||
invoice.invoice_supplier.address.countrysubentity.name)
|
invoice.invoice_supplier.address.countrysubentity.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ32
|
# DIAN 1.7.-2020: FAJ32
|
||||||
# DIAN 1.7.-2020: CAJ32
|
# DIAN 1.7.-2020: CAJ32
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode',
|
||||||
invoice.invoice_supplier.address.countrysubentity.code)
|
invoice.invoice_supplier.address.countrysubentity.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ33,FAJ34
|
# DIAN 1.7.-2020: FAJ33,FAJ34
|
||||||
# DIAN 1.7.-2020: CAJ33,CAJ34
|
# DIAN 1.7.-2020: CAJ33,CAJ34
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line',
|
||||||
invoice.invoice_supplier.address.street)
|
invoice.invoice_supplier.address.street)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ35,FAJ36
|
# DIAN 1.7.-2020: FAJ35,FAJ36
|
||||||
@ -135,106 +210,129 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ37,FAJ38
|
# DIAN 1.7.-2020: FAJ37,FAJ38
|
||||||
# DIAN 1.7.-2020: CAJ37,CAJ38
|
# DIAN 1.7.-2020: CAJ37,CAJ38
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name',
|
||||||
invoice.invoice_supplier.address.country.name,
|
invoice.invoice_supplier.address.country.name,
|
||||||
languageID='es')
|
languageID='es')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ39
|
# DIAN 1.7.-2020: FAJ39
|
||||||
# DIAN 1.7.-2020: CAJ39
|
# DIAN 1.7.-2020: CAJ39
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ40
|
# DIAN 1.7.-2020: CAJ40
|
||||||
# DIAN 1.7.-2020: FAJ40
|
# DIAN 1.7.-2020: FAJ40
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID',
|
||||||
invoice.invoice_customer.tax_scheme.code)
|
invoice.invoice_customer.tax_scheme.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ41
|
# DIAN 1.7.-2020: CAJ41
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name',
|
||||||
invoice.invoice_customer.tax_scheme.name)
|
invoice.invoice_customer.tax_scheme.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ42
|
# DIAN 1.7.-2020: FAJ42
|
||||||
# DIAN 1.7.-2020: CAJ42
|
# DIAN 1.7.-2020: CAJ42
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ43
|
# DIAN 1.7.-2020: FAJ43
|
||||||
# DIAN 1.7.-2020: CAJ43
|
# DIAN 1.7.-2020: CAJ43
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName',
|
||||||
invoice.invoice_supplier.legal_name)
|
invoice.invoice_supplier.legal_name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ44,FAJ45,FAJ46,FAJ47,FAJ48
|
# DIAN 1.7.-2020: FAJ44,FAJ45,FAJ46,FAJ47,FAJ48
|
||||||
# DIAN 1.7.-2020: CAJ44,CAJ45,CAJ46,CAJ47,CAJ48
|
# DIAN 1.7.-2020: CAJ44,CAJ45,CAJ46,CAJ47,CAJ48
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID',
|
||||||
invoice.invoice_supplier.ident,
|
invoice.invoice_supplier.ident,
|
||||||
**supplier_company_id_attrs)
|
**supplier_company_id_attrs)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ49
|
# DIAN 1.7.-2020: FAJ49
|
||||||
# DIAN 1.7.-2020: CAJ49
|
# DIAN 1.7.-2020: CAJ49
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ50
|
# DIAN 1.7.-2020: FAJ50
|
||||||
# DIAN 1.7.-2020: CAJ50
|
# DIAN 1.7.-2020: CAJ50
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID',
|
||||||
invoice.invoice_ident_prefix)
|
invoice.invoice_ident_prefix)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAJ67
|
# DIAN 1.7.-2020: CAJ67
|
||||||
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:Contact')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:Contact')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAJ71
|
# DIAN 1.7.-2020: FAJ71
|
||||||
# DIAN 1.7.-2020: CAJ71
|
# DIAN 1.7.-2020: CAJ71
|
||||||
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail',
|
||||||
invoice.invoice_supplier.email)
|
invoice.invoice_supplier.email)
|
||||||
|
|
||||||
|
|
||||||
def set_customer(fexml, invoice):
|
def set_customer(fexml, invoice):
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty')
|
fexml.placeholder_for('./cac:AccountingCustomerParty')
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cbc:AdditionalAccountID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cbc:AdditionalAccountID',
|
||||||
invoice.invoice_customer.organization_code)
|
invoice.invoice_customer.organization_code)
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID',
|
||||||
invoice.invoice_customer.ident)
|
invoice.invoice_customer.ident)
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name',
|
||||||
invoice.invoice_customer.name)
|
invoice.invoice_customer.name)
|
||||||
|
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation')
|
||||||
customer_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy()
|
customer_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy()
|
||||||
# DIAN 1.7.-2020: FAK25
|
# DIAN 1.7.-2020: FAK25
|
||||||
# DIAN 1.7.-2020: CAK25
|
# DIAN 1.7.-2020: CAK25
|
||||||
customer_company_id_attrs.update({'schemeID': invoice.invoice_customer.ident.dv,
|
customer_company_id_attrs.update({
|
||||||
|
'schemeID': invoice.invoice_customer.ident.dv,
|
||||||
'schemeName': invoice.invoice_customer.ident.type_fiscal})
|
'schemeName': invoice.invoice_customer.ident.type_fiscal})
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK07
|
# DIAN 1.7.-2020: FAK07
|
||||||
# DIAN 1.7.-2020: CAK07
|
# DIAN 1.7.-2020: CAK07
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK08
|
# DIAN 1.7.-2020: FAK08
|
||||||
# DIAN 1.7.-2020: CAK08
|
# DIAN 1.7.-2020: CAK08
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID',
|
||||||
invoice.invoice_customer.address.city.code)
|
invoice.invoice_customer.address.city.code)
|
||||||
# DIAN 1.7.-2020: FAK09
|
# DIAN 1.7.-2020: FAK09
|
||||||
# DIAN 1.7.-2020: CAK09
|
# DIAN 1.7.-2020: CAK09
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName', invoice.invoice_customer.address.city.name)
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName', invoice.invoice_customer.address.city.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK11
|
# DIAN 1.7.-2020: FAK11
|
||||||
# DIAN 1.7.-2020: CAK11
|
# DIAN 1.7.-2020: CAK11
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity',
|
||||||
invoice.invoice_customer.address.countrysubentity.name)
|
invoice.invoice_customer.address.countrysubentity.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK12
|
# DIAN 1.7.-2020: FAK12
|
||||||
# DIAN 1.7.-2020: CAK12
|
# DIAN 1.7.-2020: CAK12
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode',
|
||||||
invoice.invoice_customer.address.countrysubentity.code)
|
invoice.invoice_customer.address.countrysubentity.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK13, CAK14
|
# DIAN 1.7.-2020: CAK13, CAK14
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line',
|
||||||
invoice.invoice_customer.address.street)
|
invoice.invoice_customer.address.street)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK16
|
# DIAN 1.7.-2020: CAK16
|
||||||
# DIAN 1.7.-2020: FAK16
|
# DIAN 1.7.-2020: FAK16
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode',
|
||||||
invoice.invoice_customer.address.country.code)
|
invoice.invoice_customer.address.country.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK17
|
# DIAN 1.7.-2020: FAK17
|
||||||
# DIAN 1.7.-2020: CAK17
|
# DIAN 1.7.-2020: CAK17
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name',
|
||||||
invoice.invoice_customer.address.country.name,
|
invoice.invoice_customer.address.country.name,
|
||||||
# DIAN 1.7.-2020: FAK18
|
# DIAN 1.7.-2020: FAK18
|
||||||
# DIAN 1.7.-2020: CAK18
|
# DIAN 1.7.-2020: CAK18
|
||||||
@ -242,22 +340,26 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
|
|
||||||
# DIAN 1.7.-2020: FAK17,FAK19
|
# DIAN 1.7.-2020: FAK17,FAK19
|
||||||
# DIAN 1.7.-2020: CAK19
|
# DIAN 1.7.-2020: CAK19
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK17,FAK20
|
# DIAN 1.7.-2020: FAK17,FAK20
|
||||||
# DIAN 1.7.-2020: CAK20
|
# DIAN 1.7.-2020: CAK20
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName',
|
||||||
invoice.invoice_customer.legal_name)
|
invoice.invoice_customer.legal_name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK21
|
# DIAN 1.7.-2020: CAK21
|
||||||
# DIAN 1.7.-2020: FAK21
|
# DIAN 1.7.-2020: FAK21
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID',
|
||||||
invoice.invoice_customer.ident,
|
invoice.invoice_customer.ident,
|
||||||
# DIAN 1.7.-2020: CAK22, CAK23, CAK24, CAK25
|
# DIAN 1.7.-2020: CAK22, CAK23, CAK24, CAK25
|
||||||
**customer_company_id_attrs)
|
**customer_company_id_attrs)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK26
|
# DIAN 1.7.-2020: CAK26
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
|
||||||
# DIAN 1.7.-2020: FAK26
|
# DIAN 1.7.-2020: FAK26
|
||||||
invoice.invoice_customer.responsability_code,
|
invoice.invoice_customer.responsability_code,
|
||||||
# DIAN 1.7.-2020: FAK27
|
# DIAN 1.7.-2020: FAK27
|
||||||
@ -266,98 +368,121 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
|
|
||||||
# DIAN 1.7.-2020: FAK28
|
# DIAN 1.7.-2020: FAK28
|
||||||
# DIAN 1.7.-2020: CAK28
|
# DIAN 1.7.-2020: CAK28
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK29
|
# DIAN 1.7.-2020: FAK29
|
||||||
# DIAN 1.7.-2020: CAK29
|
# DIAN 1.7.-2020: CAK29
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID',
|
||||||
invoice.invoice_customer.address.city.code)
|
invoice.invoice_customer.address.city.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK30
|
# DIAN 1.7.-2020: FAK30
|
||||||
# DIAN 1.7.-2020: CAK30
|
# DIAN 1.7.-2020: CAK30
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName',
|
||||||
invoice.invoice_customer.address.city.name)
|
invoice.invoice_customer.address.city.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK31
|
# DIAN 1.7.-2020: FAK31
|
||||||
# DIAN 1.7.-2020: CAK31
|
# DIAN 1.7.-2020: CAK31
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity',
|
||||||
invoice.invoice_customer.address.countrysubentity.name)
|
invoice.invoice_customer.address.countrysubentity.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK32
|
# DIAN 1.7.-2020: FAK32
|
||||||
# DIAN 1.7.-2020: CAK32
|
# DIAN 1.7.-2020: CAK32
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode',
|
||||||
invoice.invoice_customer.address.countrysubentity.code)
|
invoice.invoice_customer.address.countrysubentity.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK33
|
# DIAN 1.7.-2020: FAK33
|
||||||
# DIAN 1.7.-2020: CAK33
|
# DIAN 1.7.-2020: CAK33
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK34
|
# DIAN 1.7.-2020: FAK34
|
||||||
# DIAN 1.7.-2020: CAK34
|
# DIAN 1.7.-2020: CAK34
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line',
|
||||||
invoice.invoice_customer.address.street)
|
invoice.invoice_customer.address.street)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK35
|
# DIAN 1.7.-2020: CAK35
|
||||||
# DIAN 1.7.-2020: FAK35
|
# DIAN 1.7.-2020: FAK35
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK36
|
# DIAN 1.7.-2020: CAK36
|
||||||
# DIAN 1.7.-2020: FAK36
|
# DIAN 1.7.-2020: FAK36
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode',
|
||||||
invoice.invoice_customer.address.country.code)
|
invoice.invoice_customer.address.country.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK37
|
# DIAN 1.7.-2020: CAK37
|
||||||
# DIAN 1.7.-2020: FAK37
|
# DIAN 1.7.-2020: FAK37
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name', invoice.invoice_customer.address.country.name)
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name', invoice.invoice_customer.address.country.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK38
|
# DIAN 1.7.-2020: FAK38
|
||||||
# DIAN 1.7.-2020: CAK38
|
# DIAN 1.7.-2020: CAK38
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode',
|
||||||
invoice.invoice_customer.address.country.code,
|
invoice.invoice_customer.address.country.code,
|
||||||
languageID='es')
|
languageID='es')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK39
|
# DIAN 1.7.-2020: CAK39
|
||||||
# DIAN 1.7.-2020: FAK39
|
# DIAN 1.7.-2020: FAK39
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK40 Machete Construir Validación
|
# DIAN 1.7.-2020: CAK40 Machete Construir Validación
|
||||||
# DIAN 1.7.-2020: FAK40
|
# DIAN 1.7.-2020: FAK40
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID',
|
||||||
invoice.invoice_customer.tax_scheme.code)
|
invoice.invoice_customer.tax_scheme.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK41
|
# DIAN 1.7.-2020: FAK41
|
||||||
# DIAN 1.7.-2020: CAK41 Machete Construir Validación
|
# DIAN 1.7.-2020: CAK41 Machete Construir Validación
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name',
|
||||||
invoice.invoice_customer.tax_scheme.name)
|
invoice.invoice_customer.tax_scheme.name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK42
|
# DIAN 1.7.-2020: FAK42
|
||||||
# DIAN 1.7.-2020: CAK42
|
# DIAN 1.7.-2020: CAK42
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK43
|
# DIAN 1.7.-2020: FAK43
|
||||||
# DIAN 1.7.-2020: CAK43
|
# DIAN 1.7.-2020: CAK43
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName',
|
||||||
invoice.invoice_customer.legal_name)
|
invoice.invoice_customer.legal_name)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: CAK44
|
# DIAN 1.7.-2020: CAK44
|
||||||
# DIAN 1.7.-2020: FAK44,FAK45,FAK46,FAK47,FAK48
|
# DIAN 1.7.-2020: FAK44,FAK45,FAK46,FAK47,FAK48
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID',
|
||||||
invoice.invoice_customer.ident,
|
invoice.invoice_customer.ident,
|
||||||
**customer_company_id_attrs)
|
**customer_company_id_attrs)
|
||||||
|
|
||||||
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity')
|
fexml.placeholder_for(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity')
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAK55
|
# DIAN 1.7.-2020: FAK55
|
||||||
# DIAN 1.7.-2020: CAK51, CAK55
|
# DIAN 1.7.-2020: CAK51, CAK55
|
||||||
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail',
|
fexml.set_element(
|
||||||
|
'./cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail',
|
||||||
invoice.invoice_customer.email)
|
invoice.invoice_customer.email)
|
||||||
|
|
||||||
|
|
||||||
def set_payment_mean(fexml, invoice):
|
def set_payment_mean(fexml, invoice):
|
||||||
payment_mean = invoice.invoice_payment_mean
|
payment_mean = invoice.invoice_payment_mean
|
||||||
fexml.set_element('./cac:PaymentMeans/cbc:ID', payment_mean.id)
|
fexml.set_element(
|
||||||
fexml.set_element('./cac:PaymentMeans/cbc:PaymentMeansCode', payment_mean.code)
|
'./cac:PaymentMeans/cbc:ID', payment_mean.id)
|
||||||
fexml.set_element('./cac:PaymentMeans/cbc:PaymentDueDate', payment_mean.due_at.strftime('%Y-%m-%d'))
|
fexml.set_element(
|
||||||
fexml.set_element('./cac:PaymentMeans/cbc:PaymentID', payment_mean.payment_id)
|
'./cac:PaymentMeans/cbc:PaymentMeansCode', payment_mean.code)
|
||||||
|
fexml.set_element(
|
||||||
|
'./cac:PaymentMeans/cbc:PaymentDueDate', payment_mean.due_at.strftime('%Y-%m-%d'))
|
||||||
|
fexml.set_element(
|
||||||
|
'./cac:PaymentMeans/cbc:PaymentID', payment_mean.payment_id)
|
||||||
|
|
||||||
def set_element_amount_for(fexml, xml, xpath, amount):
|
def set_element_amount_for(fexml, xml, xpath, amount):
|
||||||
if not isinstance(amount, Amount):
|
if not isinstance(amount, Amount):
|
||||||
@ -506,36 +631,43 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
next_append = index > 0
|
next_append = index > 0
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAS01
|
# DIAN 1.7.-2020: FAS01
|
||||||
line = fexml.fragment('./cac:WithholdingTaxTotal', append=next_append)
|
line = fexml.fragment(
|
||||||
|
'./cac:WithholdingTaxTotal', append=next_append)
|
||||||
# DIAN 1.7.-2020: FAU06
|
# DIAN 1.7.-2020: FAU06
|
||||||
tax_amount = amount_of['tax_amount']
|
tax_amount = amount_of['tax_amount']
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'/cac:WithholdingTaxTotal/cbc:TaxAmount',
|
'/cac:WithholdingTaxTotal/cbc:TaxAmount',
|
||||||
tax_amount)
|
tax_amount)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAS05
|
# DIAN 1.7.-2020: FAS05
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
||||||
amount_of['taxable_amount'])
|
amount_of['taxable_amount'])
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAU06
|
# DIAN 1.7.-2020: FAU06
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxAmount',
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxAmount',
|
||||||
amount_of['tax_amount'])
|
amount_of['tax_amount'])
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAS07
|
# DIAN 1.7.-2020: FAS07
|
||||||
if percent_for[cod_impuesto]:
|
if percent_for[cod_impuesto]:
|
||||||
line.set_element('/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:Percent',
|
line.set_element(
|
||||||
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:Percent',
|
||||||
percent_for[cod_impuesto])
|
percent_for[cod_impuesto])
|
||||||
|
|
||||||
|
|
||||||
if percent_for[cod_impuesto]:
|
if percent_for[cod_impuesto]:
|
||||||
line.set_element('/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent',
|
line.set_element(
|
||||||
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent',
|
||||||
percent_for[cod_impuesto])
|
percent_for[cod_impuesto])
|
||||||
|
|
||||||
line.set_element('/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID',
|
line.set_element(
|
||||||
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID',
|
||||||
cod_impuesto)
|
cod_impuesto)
|
||||||
line.set_element('/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name',
|
line.set_element(
|
||||||
|
'/cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name',
|
||||||
'ReteRenta')
|
'ReteRenta')
|
||||||
|
|
||||||
# abstract method
|
# abstract method
|
||||||
@ -547,82 +679,115 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
return 'Invoiced'
|
return 'Invoiced'
|
||||||
|
|
||||||
def set_invoice_line_tax(fexml, line, invoice_line):
|
def set_invoice_line_tax(fexml, line, invoice_line):
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'./cac:TaxTotal/cbc:TaxAmount',
|
'./cac:TaxTotal/cbc:TaxAmount',
|
||||||
invoice_line.tax_amount)
|
invoice_line.tax_amount)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAX05
|
# DIAN 1.7.-2020: FAX05
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'./cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
'./cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
||||||
invoice_line.taxable_amount)
|
invoice_line.taxable_amount)
|
||||||
|
|
||||||
for subtotal in invoice_line.tax.subtotals:
|
for subtotal in invoice_line.tax.subtotals:
|
||||||
line.set_element('./cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount', subtotal.tax_amount, currencyID='COP')
|
line.set_element(
|
||||||
|
'./cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount',
|
||||||
|
subtotal.tax_amount,
|
||||||
|
currencyID='COP')
|
||||||
|
|
||||||
if subtotal.percent is not None:
|
if subtotal.percent is not None:
|
||||||
line.set_element('./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', '%0.2f' % round(subtotal.percent, 2))
|
line.set_element(
|
||||||
|
'./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', '%0.2f' % round(subtotal.percent, 2))
|
||||||
|
|
||||||
if subtotal.scheme is not None:
|
if subtotal.scheme is not None:
|
||||||
# DIAN 1.7.-2020: FAX15
|
# DIAN 1.7.-2020: FAX15
|
||||||
line.set_element('./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', subtotal.scheme.code)
|
line.set_element(
|
||||||
line.set_element('./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', subtotal.scheme.name)
|
'./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', subtotal.scheme.code)
|
||||||
|
line.set_element(
|
||||||
|
'./cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', subtotal.scheme.name)
|
||||||
|
|
||||||
def set_invoice_line_withholding(fexml, line, invoice_line):
|
def set_invoice_line_withholding(fexml, line, invoice_line):
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'./cac:WithholdingTaxTotal/cbc:TaxAmount',
|
'./cac:WithholdingTaxTotal/cbc:TaxAmount',
|
||||||
invoice_line.withholding_amount)
|
invoice_line.withholding_amount)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FAX05
|
# DIAN 1.7.-2020: FAX05
|
||||||
fexml.set_element_amount_for(line,
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxableAmount',
|
||||||
invoice_line.withholding_taxable_amount)
|
invoice_line.withholding_taxable_amount)
|
||||||
|
|
||||||
for subtotal in invoice_line.withholding.subtotals:
|
for subtotal in invoice_line.withholding.subtotals:
|
||||||
line.set_element('./cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxAmount', subtotal.tax_amount, currencyID='COP')
|
line.set_element(
|
||||||
|
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cbc:TaxAmount',
|
||||||
|
subtotal.tax_amount,
|
||||||
|
currencyID='COP')
|
||||||
|
|
||||||
if subtotal.percent is not None:
|
if subtotal.percent is not None:
|
||||||
line.set_element('./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', '%0.2f' % round(subtotal.percent, 2))
|
line.set_element(
|
||||||
|
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', '%0.2f' % round(subtotal.percent, 2))
|
||||||
|
|
||||||
if subtotal.scheme is not None:
|
if subtotal.scheme is not None:
|
||||||
# DIAN 1.7.-2020: FAX15
|
# DIAN 1.7.-2020: FAX15
|
||||||
line.set_element('./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', subtotal.scheme.code)
|
line.set_element(
|
||||||
line.set_element('./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', subtotal.scheme.name)
|
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', subtotal.scheme.code)
|
||||||
|
line.set_element(
|
||||||
|
'./cac:WithholdingTaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', subtotal.scheme.name)
|
||||||
|
|
||||||
def set_invoice_lines(fexml, invoice):
|
def set_invoice_lines(fexml, invoice):
|
||||||
next_append = False
|
next_append = False
|
||||||
for index, invoice_line in enumerate(invoice.invoice_lines):
|
for index, invoice_line in enumerate(invoice.invoice_lines):
|
||||||
line = fexml.fragment('./cac:%sLine' % (fexml.tag_document()), append=next_append)
|
line = fexml.fragment(
|
||||||
|
'./cac:%sLine' % (fexml.tag_document()),
|
||||||
|
append=next_append)
|
||||||
next_append = True
|
next_append = True
|
||||||
|
|
||||||
line.set_element('./cbc:ID', index + 1)
|
line.set_element('./cbc:ID', index + 1)
|
||||||
line.set_element('./cbc:%sQuantity' % (fexml.tag_document_concilied()), invoice_line.quantity, unitCode = 'NAR')
|
line.set_element(
|
||||||
fexml.set_element_amount_for(line,
|
'./cbc:%sQuantity' % (
|
||||||
|
fexml.tag_document_concilied()),
|
||||||
|
invoice_line.quantity,
|
||||||
|
unitCode='NAR')
|
||||||
|
fexml.set_element_amount_for(
|
||||||
|
line,
|
||||||
'./cbc:LineExtensionAmount',
|
'./cbc:LineExtensionAmount',
|
||||||
invoice_line.total_amount)
|
invoice_line.total_amount)
|
||||||
|
|
||||||
if not isinstance(invoice_line.tax, TaxTotalOmit):
|
if not isinstance(
|
||||||
|
invoice_line.tax, TaxTotalOmit):
|
||||||
fexml.set_invoice_line_tax(line, invoice_line)
|
fexml.set_invoice_line_tax(line, invoice_line)
|
||||||
|
|
||||||
if not isinstance(invoice_line.withholding, WithholdingTaxTotalOmit):
|
if not isinstance(
|
||||||
|
invoice_line.withholding, WithholdingTaxTotalOmit):
|
||||||
fexml.set_invoice_line_withholding(line, invoice_line)
|
fexml.set_invoice_line_withholding(line, invoice_line)
|
||||||
|
|
||||||
line.set_element('./cac:Item/cbc:Description', invoice_line.item.description)
|
line.set_element(
|
||||||
|
'./cac:Item/cbc:Description', invoice_line.item.description)
|
||||||
|
|
||||||
line.set_element('./cac:Item/cac:StandardItemIdentification/cbc:ID',
|
line.set_element(
|
||||||
|
'./cac:Item/cac:StandardItemIdentification/cbc:ID',
|
||||||
invoice_line.item.id,
|
invoice_line.item.id,
|
||||||
schemeID=invoice_line.item.scheme_id,
|
schemeID=invoice_line.item.scheme_id,
|
||||||
schemeName=invoice_line.item.scheme_name,
|
schemeName=invoice_line.item.scheme_name,
|
||||||
schemeAgencyID=invoice_line.item.scheme_agency_id)
|
schemeAgencyID=invoice_line.item.scheme_agency_id)
|
||||||
|
|
||||||
line.set_element('./cac:Price/cbc:PriceAmount', invoice_line.price.amount, currencyID=invoice_line.price.amount.currency.code)
|
line.set_element(
|
||||||
|
'./cac:Price/cbc:PriceAmount',
|
||||||
|
invoice_line.price.amount,
|
||||||
|
currencyID=invoice_line.price.amount.currency.code)
|
||||||
|
|
||||||
# DIAN 1.7.-2020: FBB04
|
# DIAN 1.7.-2020: FBB04
|
||||||
line.set_element('./cac:Price/cbc:BaseQuantity',
|
line.set_element(
|
||||||
|
'./cac:Price/cbc:BaseQuantity',
|
||||||
invoice_line.price.quantity,
|
invoice_line.price.quantity,
|
||||||
unitCode=invoice_line.quantity.code)
|
unitCode=invoice_line.quantity.code)
|
||||||
|
|
||||||
for idx, charge in enumerate(invoice_line.allowance_charge):
|
for idx, charge in enumerate(invoice_line.allowance_charge):
|
||||||
next_append_charge = idx > 0
|
next_append_charge = idx > 0
|
||||||
fexml.append_allowance_charge(line, index + 1, charge, append=next_append_charge)
|
fexml.append_allowance_charge(
|
||||||
|
line, index + 1, charge, append=next_append_charge)
|
||||||
|
|
||||||
def set_allowance_charge(fexml, invoice):
|
def set_allowance_charge(fexml, invoice):
|
||||||
for idx, charge in enumerate(invoice.invoice_allowance_charge):
|
for idx, charge in enumerate(invoice.invoice_allowance_charge):
|
||||||
@ -650,46 +815,6 @@ class DIANInvoiceXML(fe.FeXML):
|
|||||||
fexml.set_element_amount_for(
|
fexml.set_element_amount_for(
|
||||||
line, './cbc:BaseAmount', charge.base_amount)
|
line, './cbc:BaseAmount', charge.base_amount)
|
||||||
|
|
||||||
def attach_invoice(fexml, invoice):
|
|
||||||
"""adiciona etiquetas a FEXML y retorna FEXML
|
|
||||||
en caso de fallar validacion retorna None"""
|
|
||||||
|
|
||||||
fexml.placeholder_for('./ext:UBLExtensions')
|
|
||||||
fexml.set_element('./cbc:UBLVersionID', 'UBL 2.1')
|
|
||||||
fexml.set_element('./cbc:CustomizationID', invoice.invoice_operation_type)
|
|
||||||
fexml.placeholder_for('./cbc:ProfileID')
|
|
||||||
fexml.placeholder_for('./cbc:ProfileExecutionID')
|
|
||||||
fexml.set_element('./cbc:ID', invoice.invoice_ident)
|
|
||||||
fexml.placeholder_for('./cbc:UUID')
|
|
||||||
fexml.set_element('./cbc:IssueDate', invoice.invoice_issue.strftime('%Y-%m-%d'))
|
|
||||||
#DIAN 1.7.-2020: FAD10
|
|
||||||
fexml.set_element('./cbc:IssueTime', invoice.invoice_issue.strftime('%H:%M:%S-05:00'))
|
|
||||||
fexml.set_element('./cbc:%sTypeCode' % (fexml.tag_document()),
|
|
||||||
invoice.invoice_type_code,
|
|
||||||
listAgencyID='195',
|
|
||||||
listAgencyName='No matching global declaration available for the validation root',
|
|
||||||
listURI='http://www.dian.gov.co')
|
|
||||||
fexml.set_element('./cbc:DocumentCurrencyCode', 'COP')
|
|
||||||
fexml.set_element('./cbc:LineCountNumeric', len(invoice.invoice_lines))
|
|
||||||
if fexml.tag_document() == 'Invoice':
|
|
||||||
fexml.set_element('./cac:%sPeriod/cbc:StartDate' % (
|
|
||||||
fexml.tag_document()),
|
|
||||||
invoice.invoice_period_start.strftime('%Y-%m-%d'))
|
|
||||||
|
|
||||||
fexml.set_element('./cac:%sPeriod/cbc:EndDate' % (
|
|
||||||
fexml.tag_document()),
|
|
||||||
invoice.invoice_period_end.strftime('%Y-%m-%d'))
|
|
||||||
fexml.set_billing_reference(invoice)
|
|
||||||
fexml.customize(invoice)
|
|
||||||
fexml.set_supplier(invoice)
|
|
||||||
fexml.set_customer(invoice)
|
|
||||||
fexml.set_payment_mean(invoice)
|
|
||||||
fexml.set_invoice_totals(invoice)
|
|
||||||
fexml.set_legal_monetary(invoice)
|
|
||||||
fexml.set_invoice_lines(invoice)
|
|
||||||
fexml.set_allowance_charge(invoice)
|
|
||||||
return fexml
|
|
||||||
|
|
||||||
def customize(fexml, invoice):
|
def customize(fexml, invoice):
|
||||||
"""adiciona etiquetas a FEXML y retorna FEXML
|
"""adiciona etiquetas a FEXML y retorna FEXML
|
||||||
en caso de fallar validacion retorna None"""
|
en caso de fallar validacion retorna None"""
|
||||||
|
@ -8,13 +8,29 @@ import pytest
|
|||||||
from facho.fe import form_xml
|
from facho.fe import form_xml
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import helpers
|
import helpers
|
||||||
|
|
||||||
from fixtures import simple_invoice
|
from fixtures import simple_invoice
|
||||||
|
|
||||||
|
simple_invoice = simple_invoice
|
||||||
|
|
||||||
|
def test_xml_with_required_elements(simple_invoice):
|
||||||
|
|
||||||
|
DIANInvoiceXML = form_xml.DIANInvoiceXML(
|
||||||
|
simple_invoice)
|
||||||
|
|
||||||
|
doc = form_xml.AttachedDocument(
|
||||||
|
simple_invoice,
|
||||||
|
DIANInvoiceXML,
|
||||||
|
id='123')
|
||||||
|
|
||||||
def test_xml_with_required_elements():
|
|
||||||
doc = form_xml.AttachedDocument(simple_invoice, id='123')
|
|
||||||
xml = doc.toFachoXML()
|
xml = doc.toFachoXML()
|
||||||
|
|
||||||
|
DIANInvoiceXML = form_xml.DIANInvoiceXML(
|
||||||
|
simple_invoice, 'Invoice').attach_invoice
|
||||||
|
|
||||||
|
attached_document = (
|
||||||
|
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
|
||||||
|
) + DIANInvoiceXML.tostring()
|
||||||
|
|
||||||
assert xml.get_element_text(
|
assert xml.get_element_text(
|
||||||
'/atd:AttachedDocument/cbc:UBLVersionID') == 'UBL 2.1'
|
'/atd:AttachedDocument/cbc:UBLVersionID') == 'UBL 2.1'
|
||||||
assert xml.get_element_text(
|
assert xml.get_element_text(
|
||||||
@ -70,5 +86,41 @@ def test_xml_with_required_elements():
|
|||||||
'/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name'
|
'/atd:AttachedDocument/cac:ReceiverParty/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name'
|
||||||
) == 'IVA'
|
) == 'IVA'
|
||||||
|
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:Attachment/cac:ExternalReference/cbc:MimeCode'
|
||||||
|
) == "text/xml"
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:Attachment/cac:ExternalReference/cbc:EncodingCode'
|
||||||
|
) == "UTF-8"
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:Attachment/cac:ExternalReference/cbc:Description'
|
||||||
|
) == "<![CDATA[{}]]>".format(attached_document)
|
||||||
|
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cbc:LineID'
|
||||||
|
) == '1'
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cbc:ID'
|
||||||
|
) == '1234'
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cbc:UUID'
|
||||||
|
) == '1234'
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cbc:IssueDate'
|
||||||
|
) == '2024-11-28'
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cbc:DocumentType'
|
||||||
|
) == 'ApplicationResponse'
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:MimeCode'
|
||||||
|
) == 'text/xml'
|
||||||
|
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:EncodingCode'
|
||||||
|
) == "UTF-8"
|
||||||
|
assert xml.get_element_text(
|
||||||
|
'/atd:AttachedDocument/cac:ParentDocumentLineReference/cac:DocumentReference/cac:Attachment/cac:ExternalReference/cbc:Description'
|
||||||
|
) == " "
|
||||||
|
|
||||||
with open("output.xml", "w") as fh:
|
with open("output.xml", "w") as fh:
|
||||||
fh.write(xml.tostring())
|
fh.write(xml.tostring())
|
||||||
|
Loading…
Reference in New Issue
Block a user