Fix: Formateo PEP8

This commit is contained in:
sinergia 2024-08-14 12:50:53 -05:00
parent 9f7349ccee
commit fb44498e53
6 changed files with 445 additions and 303 deletions

View File

@ -2,13 +2,14 @@ from .. import fe
__all__ = ['AttachedDocument'] __all__ = ['AttachedDocument']
class AttachedDocument(): class AttachedDocument():
def __init__(self, id): def __init__(self, id):
schema = 'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2' schema =\
'urn:oasis:names:specification:ubl:schema:xsd:AttachedDocument-2'
self.fexml = fe.FeXML('AttachedDocument', schema) self.fexml = fe.FeXML('AttachedDocument', schema)
self.fexml.set_element('./cbc:ID', id) self.fexml.set_element('./cbc:ID', id)
def toFachoXML(self): def toFachoXML(self):
return self.fexml return self.fexml

View File

@ -1,9 +1,10 @@
from .. import fe # from .. import fe
from ..form import * # from ..form import *
from .invoice import DIANInvoiceXML from .invoice import DIANInvoiceXML
__all__ = ['DIANCreditNoteXML'] __all__ = ['DIANCreditNoteXML']
class DIANCreditNoteXML(DIANInvoiceXML): class DIANCreditNoteXML(DIANInvoiceXML):
""" """
DianInvoiceXML mapea objeto form.Invoice a XML segun DianInvoiceXML mapea objeto form.Invoice a XML segun

View File

@ -1,9 +1,10 @@
from .. import fe # from .. import fe
from ..form import * # from ..form import *
from .invoice import DIANInvoiceXML from .invoice import DIANInvoiceXML
__all__ = ['DIANDebitNoteXML'] __all__ = ['DIANDebitNoteXML']
class DIANDebitNoteXML(DIANInvoiceXML): class DIANDebitNoteXML(DIANInvoiceXML):
""" """
DianInvoiceXML mapea objeto form.Invoice a XML segun DianInvoiceXML mapea objeto form.Invoice a XML segun
@ -19,19 +20,24 @@ class DIANDebitNoteXML(DIANInvoiceXML):
def tag_document_concilied(fexml): def tag_document_concilied(fexml):
return 'Debited' return 'Debited'
#DIAN 1.7.-2020: DAU03 # DIAN 1.7.-2020: DAU03
def set_legal_monetary(fexml, invoice): def set_legal_monetary(fexml, invoice):
fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:LineExtensionAmount', fexml.set_element_amount(
'./cac:RequestedMonetaryTotal/cbc:LineExtensionAmount',
invoice.invoice_legal_monetary_total.line_extension_amount) invoice.invoice_legal_monetary_total.line_extension_amount)
fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:TaxExclusiveAmount', fexml.set_element_amount(
'./cac:RequestedMonetaryTotal/cbc:TaxExclusiveAmount',
invoice.invoice_legal_monetary_total.tax_exclusive_amount) invoice.invoice_legal_monetary_total.tax_exclusive_amount)
fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:TaxInclusiveAmount', fexml.set_element_amount(
'./cac:RequestedMonetaryTotal/cbc:TaxInclusiveAmount',
invoice.invoice_legal_monetary_total.tax_inclusive_amount) invoice.invoice_legal_monetary_total.tax_inclusive_amount)
fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:ChargeTotalAmount', fexml.set_element_amount(
'./cac:RequestedMonetaryTotal/cbc:ChargeTotalAmount',
invoice.invoice_legal_monetary_total.charge_total_amount) invoice.invoice_legal_monetary_total.charge_total_amount)
fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:PayableAmount', fexml.set_element_amount(
'./cac:RequestedMonetaryTotal/cbc:PayableAmount',
invoice.invoice_legal_monetary_total.payable_amount) invoice.invoice_legal_monetary_total.payable_amount)

View File

@ -1,219 +1,263 @@
from .. import fe from .. import fe
from ..form import * from ..form import (
from datetime import datetime, date Amount, DebitNoteDocumentReference, CreditNoteDocumentReference,
from .attached_document import * InvoiceDocumentReference, TaxTotalOmit, WithholdingTaxTotalOmit
)
from collections import defaultdict
from datetime import datetime
# from .attached_document import *
__all__ = ['DIANSupportDocumentXML'] __all__ = ['DIANSupportDocumentXML']
class DIANSupportDocumentXML(fe.FeXML): class DIANSupportDocumentXML(fe.FeXML):
""" """
DianSupportDocumentXML mapea objeto form.Invoice a XML segun DianSupportDocumentXML mapea objeto form.Invoice a XML segun
lo indicado para él Documento soporte en adquisiciones efectuadas con sujetos no obligados a expedir factura de venta o documento equivalente. lo indicado para él Documento soporte en adquisiciones efectuadas con sujetos no obligados a expedir factura de venta o documento equivalente.
""" """
def __init__(self, invoice, tag_document = 'Invoice'): def __init__(self, invoice, tag_document='Invoice'):
super().__init__(tag_document, 'http://www.dian.gov.co/contratos/facturaelectronica/v1') super().__init__(tag_document, 'http://www.dian.gov.co/contratos/facturaelectronica/v1')
#DIAN 1.1.-2021: DSAB03 # DIAN 1.1.-2021: DSAB03
#DIAN 1.1.-2021: NSAB03 # DIAN 1.1.-2021: NSAB03
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:InvoiceControl')
#DIAN 1.1.-2021: DSAB13 # DIAN 1.1.-2021: DSAB13
#DIAN 1.1.-2021: NSAB13 # DIAN 1.1.-2021: NSAB13
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:InvoiceSource')
#DIAN 1.1.-2021: DSAB18 # DIAN 1.1.-2021: DSAB18
#DIAN 1.1.-2021: NSAB18 # DIAN 1.1.-2021: NSAB18
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:SoftwareProvider')
#DIAN 1.1.-2021: DSAB27 # DIAN 1.1.-2021: DSAB27
#DIAN 1.1.-2021: NSAB27 # DIAN 1.1.-2021: NSAB27
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:SoftwareSecurityCode')
#DIAN 1.1.-2021: DSAB30 DSAB31 # DIAN 1.1.-2021: DSAB30 DSAB31
#DIAN 1.1.-2021: NSAB30 NSAB31 # DIAN 1.1.-2021: NSAB30 NSAB31
self.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider/sts:AuthorizationProviderID') self.placeholder_for(
'./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sts:DianExtensions/sts:AuthorizationProvider/sts:AuthorizationProviderID')
#ZE02 se requiere existencia para firmar # ZE02 se requiere existencia para firmar
#DIAN 1.1.-2021: DSAA02 DSAB01 # DIAN 1.1.-2021: DSAA02 DSAB01
#DIAN 1.1.-2021: NSAA02 NSAB01 # DIAN 1.1.-2021: NSAA02 NSAB01
ublextension = self.fragment('./ext:UBLExtensions/ext:UBLExtension', append=True) ublextension = self.fragment(
#DIAN 1.1.-2021: DSAB02 './ext:UBLExtensions/ext:UBLExtension', append=True)
#DIAN 1.1.-2021: NSAB02 # DIAN 1.1.-2021: DSAB02
extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent') # DIAN 1.1.-2021: NSAB02
extcontent = ublextension.find_or_create_element(
'/ext:UBLExtension/ext:ExtensionContent')
self.attach_invoice(invoice) self.attach_invoice(invoice)
def set_supplier(fexml, invoice): def set_supplier(fexml, invoice):
#DIAN 1.1.-2021: DSAJ01 # DIAN 1.1.-2021: DSAJ01
#DIAN 1.1.-2021: NSAB01 # DIAN 1.1.-2021: NSAB01
fexml.placeholder_for('./cac:AccountingSupplierParty') fexml.placeholder_for('./cac:AccountingSupplierParty')
#DIAN 1.1.-2021: DSAJ02 # DIAN 1.1.-2021: DSAJ02
#DIAN 1.1.-2021: NSAJ02 # DIAN 1.1.-2021: NSAJ02
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.1.-2021: DSAJ07 DSAJ08 # DIAN 1.1.-2021: DSAJ07 DSAJ08
#DIAN 1.1.-2021: NSAJ07 NSAJ08 # DIAN 1.1.-2021: NSAJ07 NSAJ08
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address') fexml.placeholder_for(
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address')
#DIAN 1.1.-2021: DSAJ09 # DIAN 1.1.-2021: DSAJ09
#DIAN 1.1.-2021: NSAJ09 # DIAN 1.1.-2021: NSAJ09
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.1.-2021: DSAJ10 # DIAN 1.1.-2021: DSAJ10
#DIAN 1.1.-2021: NSAJ10 # DIAN 1.1.-2021: NSAJ10
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.1.-2021: DSAJ73 # DIAN 1.1.-2021: DSAJ73
#DIAN 1.1.-2021: NSAJ73 # DIAN 1.1.-2021: NSAJ73
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:PostalZone', fexml.set_element(
'./cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:PostalZone',
invoice.invoice_supplier.address.postalzone.code) invoice.invoice_supplier.address.postalzone.code)
#DIAN 1.1.-2021: DSAJ11 # DIAN 1.1.-2021: DSAJ11
#DIAN 1.1.-2021: NSAJ11 # DIAN 1.1.-2021: NSAJ11
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.1.-2021: DSAJ12 # DIAN 1.1.-2021: DSAJ12
#DIAN 1.1.-2021: NSAJ12 # DIAN 1.1.-2021: NSAJ12
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.1.-2021: NSAJ13 NSAJ14 # DIAN 1.1.-2021: NSAJ13 NSAJ14
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.1.-2021: DSAJ15 DSAJ16 # DIAN 1.1.-2021: DSAJ15 DSAJ16
#DIAN 1.1.-2021: NSAJ15 NSAJ16 # DIAN 1.1.-2021: NSAJ15 NSAJ16
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.1.-2021: DSAJ17 # DIAN 1.1.-2021: DSAJ17
#DIAN 1.1.-2021: NSAJ17 # DIAN 1.1.-2021: NSAJ17
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.1.-2021: DSAJ18 # DIAN 1.1.-2021: DSAJ18
#DIAN 1.1.-2021: NSAJ18 # # DIAN 1.1.-2021: NSAJ18
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(
{
'schemeID': invoice.invoice_supplier.ident.dv,
'schemeName': invoice.invoice_supplier.ident.type_fiscal}) 'schemeName': invoice.invoice_supplier.ident.type_fiscal})
#DIAN 1.1.-2021: DSAJ19 # DIAN 1.1.-2021: DSAJ19
#DIAN 1.1.-2021: NSAJ19 # DIAN 1.1.-2021: NSAJ19
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme') fexml.placeholder_for(
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme')
#DIAN 1.1.-2021: DSAJ20 # DIAN 1.1.-2021: DSAJ20
#DIAN 1.1.-2021: NSAJ20 # DIAN 1.1.-2021: NSAJ20
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.1.-2021: DSAJ21 # DIAN 1.1.-2021: DSAJ21
#DIAN 1.1.-2021: NSAJ21 # DIAN 1.1.-2021: NSAJ21
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.1.-2021: DSAJ22 DSAJ23 DSAJ24 DSAJ25 # DIAN 1.1.-2021: DSAJ22 DSAJ23 DSAJ24 DSAJ25
#DIAN 1.1.-2021: NSAJ22 NSAJ23 NSAJ24 NSAJ25 # DIAN 1.1.-2021: NSAJ22 NSAJ23 NSAJ24 NSAJ25
**supplier_company_id_attrs) **supplier_company_id_attrs)
#DIAN 1.1.-2021: DSAJ26 # DIAN 1.1.-2021: DSAJ26
#DIAN 1.1.-2021: NSAJ26 # DIAN 1.1.-2021: NSAJ26
fexml.set_element('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode', fexml.set_element(
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
invoice.invoice_supplier.responsability_code, invoice.invoice_supplier.responsability_code,
listName=invoice.invoice_supplier.responsability_regime_code) listName=invoice.invoice_supplier.responsability_regime_code)
#DIAN 1.1.-2021: DSAJ39 # DIAN 1.1.-2021: DSAJ39
#DIAN 1.1.-2021: NSAJ39 # DIAN 1.1.-2021: NSAJ39
fexml.placeholder_for('./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme') fexml.placeholder_for(
'./cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
#DIAN 1.1.-2021: DSAJ40 # DIAN 1.1.-2021: DSAJ40
#DIAN 1.1.-2021: NSAJ40 # DIAN 1.1.-2021: NSAJ40
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.1.-2021: DSAJ41 # DIAN 1.1.-2021: DSAJ41
#DIAN 1.1.-2021: NSAJ41 # DIAN 1.1.-2021: NSAJ41
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)
def set_customer(fexml, invoice): def set_customer(fexml, invoice):
#DIAN 1.1.-2021: DSAK01 # DIAN 1.1.-2021: DSAK01
#DIAN 1.1.-2021: NSAK01 # DIAN 1.1.-2021: NSAK01
fexml.placeholder_for('./cac:AccountingCustomerParty') fexml.placeholder_for('./cac:AccountingCustomerParty')
#DIAN 1.1.-2021: DSAK02 # DIAN 1.1.-2021: DSAK02
#DIAN 1.1.-2021: NSAK02 # DIAN 1.1.-2021: NSAK02
fexml.set_element('./cac:AccountingCustomerParty/cbc:AdditionalAccountID', fexml.set_element(
'./cac:AccountingCustomerParty/cbc:AdditionalAccountID',
invoice.invoice_customer.organization_code) invoice.invoice_customer.organization_code)
#DIAN 1.1.-2021: DSAK03 # DIAN 1.1.-2021: DSAK03
#DIAN 1.1.-2021: NSAK03 # DIAN 1.1.-2021: NSAK03
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party') fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party')
#DIAN 1.1.-2021: DSAK19 # DIAN 1.1.-2021: DSAK19
#DIAN 1.1.-2021: NSAK19 # DIAN 1.1.-2021: NSAK19
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme') fexml.placeholder_for(
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme')
#DIAN 1.1.-2021: DSAK20 # DIAN 1.1.-2021: DSAK20
#DIAN 1.1.-2021: NSAK20 # DIAN 1.1.-2021: NSAK20
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)
customer_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy() customer_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy()
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.1.-2021: DSAK21 # DIAN 1.1.-2021: DSAK21
#DIAN 1.1.-2021: NSAK21 # DIAN 1.1.-2021: NSAK21
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.1.-2021: DSAK22 DSAK23 DSAK24 DSAK25 # DIAN 1.1.-2021: DSAK22 DSAK23 DSAK24 DSAK25
#DIAN 1.1.-2021: NSAK22 NSAK23 NSAK24 NSAK25 # DIAN 1.1.-2021: NSAK22 NSAK23 NSAK24 NSAK25
**customer_company_id_attrs) **customer_company_id_attrs)
#DIAN 1.1.-2021: DSAK26 # DIAN 1.1.-2021: DSAK26
#DIAN 1.1.-2021: NSAK26 # DIAN 1.1.-2021: NSAK26
fexml.set_element('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode', fexml.set_element(
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode',
invoice.invoice_customer.responsability_code) invoice.invoice_customer.responsability_code)
#DIAN 1.1.-2021: DSAK39 # DIAN 1.1.-2021: DSAK39
#DIAN 1.1.-2021: NSAK39 # DIAN 1.1.-2021: NSAK39
fexml.placeholder_for('./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme') fexml.placeholder_for(
'./cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme')
#DIAN 1.1.-2021: DSAK40 # DIAN 1.1.-2021: DSAK40
#DIAN 1.1.-2021: NSAK40 # DIAN 1.1.-2021: NSAK40
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.1.-2021: DSAK41 # DIAN 1.1.-2021: DSAK41
#DIAN 1.1.-2021: NSAK41 # DIAN 1.1.-2021: NSAK41
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)
def set_payment_mean(fexml, invoice): def set_payment_mean(fexml, invoice):
payment_mean = invoice.invoice_payment_mean payment_mean = invoice.invoice_payment_mean
#DIAN 1.1.-2021: DSAN01 DSAN02 # DIAN 1.1.-2021: DSAN01 DSAN02
#DIAN 1.1.-2021: NSAN02 NSAN02 # DIAN 1.1.-2021: NSAN02 NSAN02
fexml.set_element('./cac:PaymentMeans/cbc:ID', payment_mean.id) fexml.set_element('./cac:PaymentMeans/cbc:ID', payment_mean.id)
#DIAN 1.1.-2021: DSAN03 # DIAN 1.1.-2021: DSAN03
#DIAN 1.1.-2021: NSAN03 # DIAN 1.1.-2021: NSAN03
fexml.set_element('./cac:PaymentMeans/cbc:PaymentMeansCode', payment_mean.code) fexml.set_element(
'./cac:PaymentMeans/cbc:PaymentMeansCode',
payment_mean.code)
#DIAN 1.1.-2021: DSAN04 # DIAN 1.1.-2021: DSAN04
#DIAN 1.1.-2021: NSAN04 # DIAN 1.1.-2021: NSAN04
fexml.set_element('./cac:PaymentMeans/cbc:PaymentDueDate', payment_mean.due_at.strftime('%Y-%m-%d')) fexml.set_element(
'./cac:PaymentMeans/cbc:PaymentDueDate',
payment_mean.due_at.strftime('%Y-%m-%d'))
#DIAN 1.1.-2021: DSAN05 # DIAN 1.1.-2021: DSAN05
#DIAN 1.1.-2021: NSAN05 # DIAN 1.1.-2021: NSAN05
fexml.set_element('./cac:PaymentMeans/cbc:PaymentID', payment_mean.payment_id) 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):
@ -228,40 +272,47 @@ class DIANSupportDocumentXML(fe.FeXML):
fexml.set_element(xpath, amount, currencyID=amount.currency.code) fexml.set_element(xpath, amount, currencyID=amount.currency.code)
def set_legal_monetary(fexml, invoice): def set_legal_monetary(fexml, invoice):
#DIAN 1.1.-2021: DSAU01 DSAU02 DSAU03 # DIAN 1.1.-2021: DSAU01 DSAU02 DSAU03
#DIAN 1.1.-2021: NSAU01 NSAU02 NSAU03 # DIAN 1.1.-2021: NSAU01 NSAU02 NSAU03
fexml.set_element_amount('./cac:LegalMonetaryTotal/cbc:LineExtensionAmount', fexml.set_element_amount(
'./cac:LegalMonetaryTotal/cbc:LineExtensionAmount',
invoice.invoice_legal_monetary_total.line_extension_amount) invoice.invoice_legal_monetary_total.line_extension_amount)
#DIAN 1.1.-2021: DSAU04 DSAU05 # DIAN 1.1.-2021: DSAU04 DSAU05
#DIAN 1.1.-2021: NSAU04 NSAU05 # DIAN 1.1.-2021: NSAU04 NSAU05
fexml.set_element_amount('./cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount', fexml.set_element_amount(
'./cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount',
invoice.invoice_legal_monetary_total.tax_exclusive_amount) invoice.invoice_legal_monetary_total.tax_exclusive_amount)
#DIAN 1.1.-2021: DSAU06 DSAU07 # DIAN 1.1.-2021: DSAU06 DSAU07
#DIAN 1.1.-2021: NSAU06 DSAU07 # DIAN 1.1.-2021: NSAU06 DSAU07
fexml.set_element_amount('./cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount', fexml.set_element_amount(
'./cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount',
invoice.invoice_legal_monetary_total.tax_inclusive_amount) invoice.invoice_legal_monetary_total.tax_inclusive_amount)
#DIAN 1.1.-2021: DSAU10 DSAU11 # DIAN 1.1.-2021: DSAU10 DSAU11
#DIAN 1.1.-2021: NSAU10 DSAU11 # DIAN 1.1.-2021: NSAU10 DSAU11
fexml.set_element_amount('./cac:LegalMonetaryTotal/cbc:ChargeTotalAmount', fexml.set_element_amount(
'./cac:LegalMonetaryTotal/cbc:ChargeTotalAmount',
invoice.invoice_legal_monetary_total.charge_total_amount) invoice.invoice_legal_monetary_total.charge_total_amount)
#DIAN 1.1.-2021: DSAU14 DSAU15 # DIAN 1.1.-2021: DSAU14 DSAU15
#DIAN 1.1.-2021: NSAU14 DSAU15 # DIAN 1.1.-2021: NSAU14 DSAU15
fexml.set_element_amount('./cac:LegalMonetaryTotal/cbc:PayableAmount', fexml.set_element_amount(
'./cac:LegalMonetaryTotal/cbc:PayableAmount',
invoice.invoice_legal_monetary_total.payable_amount) invoice.invoice_legal_monetary_total.payable_amount)
def _set_invoice_document_reference(fexml, reference): def _set_invoice_document_reference(fexml, reference):
fexml._do_set_billing_reference(reference, 'cac:InvoiceDocumentReference') fexml._do_set_billing_reference(
reference, 'cac:InvoiceDocumentReference')
def _set_credit_note_document_reference(fexml, reference): def _set_credit_note_document_reference(fexml, reference):
fexml._do_set_billing_reference(reference, 'cac:CreditNoteDocumentReference') fexml._do_set_billing_reference(
reference, 'cac:CreditNoteDocumentReference')
def _set_debit_note_document_reference(fexml, reference): def _set_debit_note_document_reference(fexml, reference):
fexml._do_set_billing_reference(reference, 'cac:DebitNoteDocumentReference') fexml._do_set_billing_reference(
reference, 'cac:DebitNoteDocumentReference')
def _do_set_billing_reference(fexml, reference, tag_document): def _do_set_billing_reference(fexml, reference, tag_document):
@ -270,12 +321,14 @@ class DIANSupportDocumentXML(fe.FeXML):
else: else:
schemeName = 'CUDS-SHA384' schemeName = 'CUDS-SHA384'
fexml.set_element('./cac:BillingReference/%s/cbc:ID' %(tag_document), fexml.set_element('./cac:BillingReference/%s/cbc:ID' % (tag_document),
reference.ident) reference.ident)
fexml.set_element('./cac:BillingReference/cac:InvoiceDocumentReference/cbc:UUID', fexml.set_element(
'./cac:BillingReference/cac:InvoiceDocumentReference/cbc:UUID',
reference.uuid, reference.uuid,
schemeName=schemeName) schemeName=schemeName)
fexml.set_element('./cac:BillingReference/cac:InvoiceDocumentReference/cbc:IssueDate', fexml.set_element(
'./cac:BillingReference/cac:InvoiceDocumentReference/cbc:IssueDate',
reference.date.strftime("%Y-%m-%d")) reference.date.strftime("%Y-%m-%d"))
def set_billing_reference(fexml, invoice): def set_billing_reference(fexml, invoice):
@ -319,60 +372,64 @@ class DIANSupportDocumentXML(fe.FeXML):
for invoice_line in invoice.invoice_lines: for invoice_line in invoice.invoice_lines:
for subtotal in invoice_line.tax.subtotals: for subtotal in invoice_line.tax.subtotals:
if subtotal.scheme is not None: if subtotal.scheme is not None:
tax_amount_for[subtotal.scheme.code]['tax_amount'] += subtotal.tax_amount tax_amount_for[
tax_amount_for[subtotal.scheme.code]['taxable_amount'] += invoice_line.taxable_amount subtotal.scheme.code][
'tax_amount'] += subtotal.tax_amount
tax_amount_for[subtotal.scheme.code][
'taxable_amount'] += invoice_line.taxable_amount
# MACHETE ojo InvoiceLine.tax pasar a Invoice # MACHETE ojo InvoiceLine.tax pasar a Invoice
percent_for[subtotal.scheme.code] = subtotal.percent percent_for[subtotal.scheme.code] = subtotal.percent
total_tax_amount += subtotal.tax_amount total_tax_amount += subtotal.tax_amount
if total_tax_amount != Amount(0.0): if total_tax_amount != Amount(0.0):
fexml.placeholder_for('./cac:TaxTotal') fexml.placeholder_for('./cac:TaxTotal')
fexml.set_element_amount('./cac:TaxTotal/cbc:TaxAmount', fexml.set_element_amount('./cac:TaxTotal/cbc:TaxAmount',
total_tax_amount) total_tax_amount)
for index, item in enumerate(tax_amount_for.items()): for index, item in enumerate(tax_amount_for.items()):
cod_impuesto, amount_of = item cod_impuesto, amount_of = item
next_append = index > 0 next_append = index > 0
#DIAN 1.7.-2020: FAS01 # DIAN 1.7.-2020: FAS01
line = fexml.fragment('./cac:TaxTotal', append=next_append) line = fexml.fragment('./cac:TaxTotal', 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:TaxTotal/cbc:TaxAmount', '/cac:TaxTotal/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:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount', '/cac:TaxTotal/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:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount', '/cac:TaxTotal/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:TaxTotal/cac:TaxSubtotal/cbc:Percent', line.set_element('/cac:TaxTotal/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:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', line.set_element(
'/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent',
percent_for[cod_impuesto]) percent_for[cod_impuesto])
line.set_element('/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', line.set_element(
'/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID',
cod_impuesto) cod_impuesto)
line.set_element('/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', line.set_element(
'IVA') '/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', 'IVA')
# abstract method # abstract method
def tag_document(fexml): def tag_document(fexml):
return 'Invoice' return 'Invoice'
@ -384,50 +441,83 @@ class DIANSupportDocumentXML(fe.FeXML):
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_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_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(
'./cbc:%sQuantity' %
(fexml.tag_document_concilied()),
invoice_line.quantity,
unitCode='NAR')
fexml.set_element_amount_for(line, fexml.set_element_amount_for(line,
'./cbc:LineExtensionAmount', './cbc:LineExtensionAmount',
invoice_line.total_amount) invoice_line.total_amount)
@ -435,53 +525,69 @@ class DIANSupportDocumentXML(fe.FeXML):
period = line.fragment('./cac:InvoicePeriod') period = line.fragment('./cac:InvoicePeriod')
period.set_element('./cbc:StartDate', period.set_element('./cbc:StartDate',
datetime.now().strftime('%Y-%m-%d')) datetime.now().strftime('%Y-%m-%d'))
period.set_element('./cbc:DescriptionCode', period.set_element(
'1') './cbc:DescriptionCode', '1')
period.set_element('./cbc:Description', period.set_element('./cbc:Description',
'Por operación') 'Por operación')
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(
#DIAN 1.7.-2020: FBB04 './cac:Price/cbc:PriceAmount',
invoice_line.price.amount,
currencyID=invoice_line.price.amount.currency.code)
# DIAN 1.7.-2020: FBB04
line.set_element('./cac:Price/cbc:BaseQuantity', line.set_element('./cac:Price/cbc:BaseQuantity',
invoice_line.quantity, invoice_line.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):
next_append = idx > 0 next_append = idx > 0
fexml.append_allowance_charge(fexml, idx + 1, charge, append=next_append) fexml.append_allowance_charge(
fexml, idx + 1, charge, append=next_append)
def append_allowance_charge(fexml, parent, idx, charge, append=False): def append_allowance_charge(fexml, parent, idx, charge, append=False):
line = parent.fragment('./cac:AllowanceCharge', append=append) line = parent.fragment('./cac:AllowanceCharge', append=append)
#DIAN 1.7.-2020: FAQ02 # DIAN 1.7.-2020: FAQ02
line.set_element('./cbc:ID', idx) line.set_element('./cbc:ID', idx)
#DIAN 1.7.-2020: FAQ03 # DIAN 1.7.-2020: FAQ03
line.set_element('./cbc:ChargeIndicator', str(charge.charge_indicator).lower()) line.set_element('./cbc:ChargeIndicator',
str(charge.charge_indicator).lower())
if charge.reason: if charge.reason:
line.set_element('./cbc:AllowanceChargeReasonCode', charge.reason.code) line.set_element(
line.set_element('./cbc:allowanceChargeReason', charge.reason.reason) './cbc:AllowanceChargeReasonCode',
line.set_element('./cbc:MultiplierFactorNumeric', str(round(charge.multiplier_factor_numeric, 2))) charge.reason.code)
line.set_element(
'./cbc:allowanceChargeReason',
charge.reason.reason)
line.set_element('./cbc:MultiplierFactorNumeric',
str(round(charge.multiplier_factor_numeric, 2)))
fexml.set_element_amount_for(line, './cbc:Amount', charge.amount) fexml.set_element_amount_for(line, './cbc:Amount', charge.amount)
fexml.set_element_amount_for(line, './cbc:BaseAmount', charge.base_amount) fexml.set_element_amount_for(
line, './cbc:BaseAmount', charge.base_amount)
def attach_invoice(fexml, invoice): def attach_invoice(fexml, invoice):
"""adiciona etiquetas a FEXML y retorna FEXML """adiciona etiquetas a FEXML y retorna FEXML
@ -489,25 +595,37 @@ class DIANSupportDocumentXML(fe.FeXML):
fexml.placeholder_for('./ext:UBLExtensions') fexml.placeholder_for('./ext:UBLExtensions')
fexml.set_element('./cbc:UBLVersionID', 'UBL 2.1') fexml.set_element('./cbc:UBLVersionID', 'UBL 2.1')
fexml.set_element('./cbc:CustomizationID', invoice.invoice_operation_type) fexml.set_element(
'./cbc:CustomizationID',
invoice.invoice_operation_type)
fexml.placeholder_for('./cbc:ProfileID') fexml.placeholder_for('./cbc:ProfileID')
fexml.placeholder_for('./cbc:ProfileExecutionID') fexml.placeholder_for('./cbc:ProfileExecutionID')
fexml.set_element('./cbc:ID', invoice.invoice_ident) fexml.set_element('./cbc:ID', invoice.invoice_ident)
fexml.placeholder_for('./cbc:UUID') fexml.placeholder_for('./cbc:UUID')
fexml.set_element('./cbc:DocumentCurrencyCode', 'COP') fexml.set_element('./cbc:DocumentCurrencyCode', 'COP')
fexml.set_element('./cbc:IssueDate', invoice.invoice_issue.strftime('%Y-%m-%d')) fexml.set_element(
#DIAN 1.7.-2020: FAD10 './cbc:IssueDate',
fexml.set_element('./cbc:IssueTime', invoice.invoice_issue.strftime('%H:%M:%S-05:00')) invoice.invoice_issue.strftime('%Y-%m-%d'))
fexml.set_element('./cbc:%sTypeCode' % (fexml.tag_document()), # 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, invoice.invoice_type_code,
listAgencyID='195', listAgencyID='195',
listAgencyName='No matching global declaration available for the validation root', listAgencyName='No matching global declaration available for the validation root',
listURI='http://www.dian.gov.co') listURI='http://www.dian.gov.co')
fexml.set_element('./cbc:LineCountNumeric', len(invoice.invoice_lines)) fexml.set_element('./cbc:LineCountNumeric', len(invoice.invoice_lines))
fexml.set_element('./cac:%sPeriod/cbc:StartDate' % (fexml.tag_document()), fexml.set_element(
'./cac:%sPeriod/cbc:StartDate' %
(fexml.tag_document()),
invoice.invoice_period_start.strftime('%Y-%m-%d')) invoice.invoice_period_start.strftime('%Y-%m-%d'))
fexml.set_element('./cac:%sPeriod/cbc:EndDate' % (fexml.tag_document()), fexml.set_element(
'./cac:%sPeriod/cbc:EndDate' %
(fexml.tag_document()),
invoice.invoice_period_end.strftime('%Y-%m-%d')) invoice.invoice_period_end.strftime('%Y-%m-%d'))
fexml.customize(invoice) fexml.customize(invoice)

View File

@ -1,9 +1,10 @@
from .. import fe # from .. import fe
from ..form import * # from ..form import *
from .support_document import DIANSupportDocumentXML from .support_document import DIANSupportDocumentXML
__all__ = ['DIANSupportDocumentCreditNoteXML'] __all__ = ['DIANSupportDocumentCreditNoteXML']
class DIANSupportDocumentCreditNoteXML(DIANSupportDocumentXML): class DIANSupportDocumentCreditNoteXML(DIANSupportDocumentXML):
""" """
DianInvoiceXML mapea objeto form.Invoice a XML segun DianInvoiceXML mapea objeto form.Invoice a XML segun
@ -11,11 +12,14 @@ class DIANSupportDocumentCreditNoteXML(DIANSupportDocumentXML):
""" """
def __init__(self, invoice): def __init__(self, invoice):
super(DIANSupportDocumentCreditNoteXML, self).__init__(invoice, 'CreditNote') super(
DIANSupportDocumentCreditNoteXML,
self).__init__(
invoice,
'CreditNote')
def tag_document(fexml): def tag_document(fexml):
return 'CreditNote' return 'CreditNote'
def tag_document_concilied(fexml): def tag_document_concilied(fexml):
return 'Credited' return 'Credited'

View File

@ -2,18 +2,30 @@ from .. import fe
__all__ = ['DIANWrite', 'DIANWriteSigned'] __all__ = ['DIANWrite', 'DIANWriteSigned']
def DIANWrite(xml, filename): def DIANWrite(xml, filename):
document = xml.tostring(xml_declaration=True, encoding='UTF-8') document = xml.tostring(xml_declaration=True, encoding='UTF-8')
with open(filename, 'w') as f: with open(filename, 'w') as f:
f.write(document) f.write(document)
def DIANWriteSigned(xml, filename, private_key, passphrase, use_cache_policy=False, dian_signer=None): def DIANWriteSigned(
document = xml.tostring(xml_declaration=True, encoding='UTF-8').encode('utf-8') xml,
filename,
private_key,
passphrase,
use_cache_policy=False,
dian_signer=None):
document = xml.tostring(
xml_declaration=True,
encoding='UTF-8').encode('utf-8')
if dian_signer is None: if dian_signer is None:
dian_signer = fe.DianXMLExtensionSigner dian_signer = fe.DianXMLExtensionSigner
signer = dian_signer(private_key, passphrase=passphrase, localpolicy=use_cache_policy) signer = dian_signer(
private_key,
passphrase=passphrase,
localpolicy=use_cache_policy)
with open(filename, 'w') as f: with open(filename, 'w') as f:
f.write(signer.sign_xml_string(document)) f.write(signer.sign_xml_string(document))