Fix #DAU14, #DAU02, #DAU04, #DAU06 FossilOrigin-Name: 6e5f2ebacd38dd9e7975875c70e32f567ebeac0f74975cba0f938ba3af35d9c5
This commit is contained in:
		| @@ -1,406 +1,37 @@ | ||||
| from .. import fe | ||||
| from ..form import * | ||||
| from .invoice import DIANInvoiceXML | ||||
|  | ||||
| __all__ = ['DIANDebitNoteXML'] | ||||
|  | ||||
| class DIANDebitNoteXML(fe.FeXML): | ||||
| class DIANDebitNoteXML(DIANInvoiceXML): | ||||
|     """ | ||||
|     DianInvoiceXML mapea objeto form.Invoice a XML segun | ||||
|     lo indicado para la facturacion electronica. | ||||
|     """ | ||||
|  | ||||
|     def __init__(self, invoice): | ||||
|         super().__init__('DebitNote', 'http://www.dian.gov.co/contratos/facturaelectronica/v1') | ||||
|         self.placeholder_for('/fe:DebitNote/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent') | ||||
|         super().__init__(invoice, 'DebitNote') | ||||
|  | ||||
|         # ZE02 se requiere existencia para firmar | ||||
|         ublextension = self.fragment('/fe:DebitNote/ext:UBLExtensions/ext:UBLExtension', append=True) | ||||
|         extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent') | ||||
|         self.attach_invoice(invoice) | ||||
|     def tag_document(fexml): | ||||
|         return 'DebitNote' | ||||
|  | ||||
|     def set_supplier(fexml, invoice): | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty') | ||||
|         #DIAN 1.7.-2020: DAJ02 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cbc:AdditionalAccountID', | ||||
|                           invoice.invoice_supplier.organization_code) | ||||
|         #DIAN 1.7.-2020: DAJ06 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name', | ||||
|                           invoice.invoice_supplier.name) | ||||
|         #DIAN 1.7.-2020: DAJ07, DAJ08 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address') | ||||
|         #DIAN 1.7.-2020: DAJ09 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID', | ||||
|                           invoice.invoice_supplier.address.city.code) | ||||
|         #DIAN 1.7.-2020: DAJ10 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName', | ||||
|                           invoice.invoice_supplier.address.city.name) | ||||
|         #DIAN 1.7.-2020: DAJ11 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity', | ||||
|                           invoice.invoice_supplier.address.countrysubentity.name) | ||||
|         #DIAN 1.7.-2020: DAJ12 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode', | ||||
|                           invoice.invoice_supplier.address.countrysubentity.code) | ||||
|         #DIAN 1.7.-2020: DAJ13, DAJ14 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line', | ||||
|                           invoice.invoice_supplier.address.street) | ||||
|         #DIAN 1.7.-2020: DAJ16, DAJ16 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode', | ||||
|                           invoice.invoice_supplier.address.country.code) | ||||
|         #DIAN 1.7.-2020: DAJ17 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name', | ||||
|                           invoice.invoice_supplier.address.country.name, | ||||
|                          #DIAN 1.7.-2020: DAJ18 | ||||
|                           languageID='es') | ||||
|  | ||||
|         supplier_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy() | ||||
|         supplier_company_id_attrs.update({'schemeID': invoice.invoice_supplier.ident.dv, | ||||
|                                           'schemeName': invoice.invoice_supplier.ident.type_fiscal}) | ||||
|  | ||||
|         #DIAN 1.7.-2020: DAJ19 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme') | ||||
|         #DIAN 1.7.-2020: DAJ20 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName', | ||||
|                           invoice.invoice_supplier.legal_name) | ||||
|         #DIAN 1.7.-2020: DAJ21 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID', | ||||
|                           invoice.invoice_supplier.ident, | ||||
|                           #DIAN 1.7.-2020: DAJ22,DAJ23,DAJ24,DAJ25 | ||||
|                           **supplier_company_id_attrs) | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode', | ||||
|                           #DIAN 1.7.-2020: DAJ26 | ||||
|                           invoice.invoice_supplier.responsability_code, | ||||
|                           #DIAN 1.7.-2020: DAJ27 | ||||
|                           listName=invoice.invoice_supplier.responsability_regime_code) | ||||
|         #DIAN 1.7.-2020: DAJ28 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress') | ||||
|         #DIAN 1.7.-2020: DAJ29 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID', | ||||
|                           invoice.invoice_supplier.address.city.code) | ||||
|         #DIAN 1.7.-2020: DAJ30 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName', invoice.invoice_supplier.address.city.name) | ||||
|         #DIAN 1.7.-2020: DAJ31 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity', | ||||
|                           invoice.invoice_supplier.address.countrysubentity.name) | ||||
|         #DIAN 1.7.-2020: DAJ32 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode', | ||||
|                           invoice.invoice_supplier.address.countrysubentity.code) | ||||
|         #DIAN 1.7.-2020: DAJ33,DAJ34 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line', | ||||
|                           invoice.invoice_supplier.address.street) | ||||
|         #DIAN 1.7.-2020: DAJ35,DAJ36 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode', | ||||
|                           invoice.invoice_supplier.address.country.code) | ||||
|         #DIAN 1.7.-2020: DAJ37,DAJ38 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name', | ||||
|                           invoice.invoice_supplier.address.country.name, | ||||
|                           languageID='es') | ||||
|         #DIAN 1.7.-2020: DAJ39 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme') | ||||
|         #DIAN 1.7.-2020: DAJ40 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID', | ||||
|                           invoice.invoice_customer.tax_scheme.code) | ||||
|         #DIAN 1.7.-2020: DAJ41 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name', | ||||
|                           invoice.invoice_customer.tax_scheme.name) | ||||
|         #DIAN 1.7.-2020: DAJ42 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity') | ||||
|         #DIAN 1.7.-2020: DAJ43 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName', | ||||
|                           invoice.invoice_supplier.legal_name) | ||||
|         #DIAN 1.7.-2020: DAJ44,DAJ45,DAJ46,DAJ47,DAJ48 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID', | ||||
|                           invoice.invoice_supplier.ident, | ||||
|                           **supplier_company_id_attrs) | ||||
|         #DIAN 1.7.-2020: DAJ49 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme') | ||||
|         #DIAN 1.7.-2020: DAJ50 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cac:CorporateRegistrationScheme/cbc:ID', | ||||
|                           'SETP') | ||||
|         #DIAN 1.7.-2020: DAJ67 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:Contact') | ||||
|         #DIAN 1.7.-2020: DAJ71 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingSupplierParty/cac:Party/cac:Contact/cbc:ElectronicMail', | ||||
|                           invoice.invoice_supplier.email) | ||||
|  | ||||
|  | ||||
|     def set_customer(fexml, invoice): | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty') | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cbc:AdditionalAccountID', | ||||
|                           invoice.invoice_customer.organization_code) | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID', | ||||
|                           invoice.invoice_customer.ident) | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyName/cbc:Name', | ||||
|                           invoice.invoice_customer.name) | ||||
|  | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation') | ||||
|         customer_company_id_attrs = fe.SCHEME_AGENCY_ATTRS.copy() | ||||
|         #DIAN 1.7.-2020: DAK25 | ||||
|         customer_company_id_attrs.update({'schemeID': invoice.invoice_customer.ident.dv, | ||||
|                                           'schemeName': invoice.invoice_customer.ident.type_fiscal}) | ||||
|         #DIAN 1.7.-2020: DAK07 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address') | ||||
|         #DIAN 1.7.-2020: DAK08 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:ID', | ||||
|                           invoice.invoice_customer.address.city.code) | ||||
|         #DIAN 1.7.-2020: DAK09 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CityName', invoice.invoice_customer.address.city.name) | ||||
|         #DIAN 1.7.-2020: DAK11 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentity', | ||||
|                           invoice.invoice_customer.address.countrysubentity.name) | ||||
|         #DIAN 1.7.-2020: DAK12 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cbc:CountrySubentityCode', | ||||
|                           invoice.invoice_customer.address.countrysubentity.code) | ||||
|         #DIAN 1.7.-2020: DAK13, DAK14 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:AddressLine/cbc:Line', | ||||
|                           invoice.invoice_customer.address.street) | ||||
|         #DIAN 1.7.-2020: DAK16 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:IdentificationCode', | ||||
|                           invoice.invoice_customer.address.country.code) | ||||
|         #DIAN 1.7.-2020: DAK17 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PhysicalLocation/cac:Address/cac:Country/cbc:Name', | ||||
|                           invoice.invoice_customer.address.country.name, | ||||
|                          #DIAN 1.7.-2020: DAK18 | ||||
|                           languageID='es') | ||||
|         #DIAN 1.7.-2020: DAK19 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme') | ||||
|         #DIAN 1.7.-2020: DAK20 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:RegistrationName', | ||||
|                           invoice.invoice_customer.legal_name) | ||||
|         #DIAN 1.7.-2020: DAK21 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID', | ||||
|                           invoice.invoice_customer.ident, | ||||
|                           #DIAN 1.7.-2020: DAK22, DAK23, DAK24, DAK25 | ||||
|                           **customer_company_id_attrs) | ||||
|         #DIAN 1.7.-2020: DAK26 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode', | ||||
|                           invoice.invoice_customer.responsability_code, | ||||
|                           #DIAN 1.7.-2020: DAK27 | ||||
|                           listName=invoice.invoice_customer.responsability_regime_code) | ||||
|         #DIAN 1.7.-2020: DAK28 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress') | ||||
|         #DIAN 1.7.-2020: DAK29 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:ID', | ||||
|                           invoice.invoice_customer.address.city.code) | ||||
|         #DIAN 1.7.-2020: DAK30 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CityName', | ||||
|                           invoice.invoice_customer.address.city.name) | ||||
|         #DIAN 1.7.-2020: DAK31 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentity', | ||||
|                           invoice.invoice_customer.address.countrysubentity.name) | ||||
|         #DIAN 1.7.-2020: DAK32 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cbc:CountrySubentityCode', | ||||
|                           invoice.invoice_customer.address.countrysubentity.code) | ||||
|         #DIAN 1.7.-2020: DAK33 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine') | ||||
|         #DIAN 1.7.-2020: DAK34 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:AddressLine/cbc:Line', | ||||
|                           invoice.invoice_customer.address.street) | ||||
|         #DIAN 1.7.-2020: DAK35 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country') | ||||
|         #DIAN 1.7.-2020: DAK36 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode', | ||||
|                           invoice.invoice_customer.address.country.code) | ||||
|         #DIAN 1.7.-2020: DAK37 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:Name', invoice.invoice_customer.address.country.name) | ||||
|         #DIAN 1.7.-2020: DAK38 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:RegistrationAddress/cac:Country/cbc:IdentificationCode', | ||||
|                           invoice.invoice_customer.address.country.code, | ||||
|                           languageID='es') | ||||
|         #DIAN 1.7.-2020: DAK39 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme') | ||||
|         #DIAN 1.7.-2020: DAK40 Machete Construir Validación | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:ID', | ||||
|                           invoice.invoice_customer.tax_scheme.code) | ||||
|         #DIAN 1.7.-2020: DAK41 Machete Construir Validación | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme/cbc:Name', | ||||
|                           invoice.invoice_customer.tax_scheme.name) | ||||
|         #DIAN 1.7.-2020: DAK42 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity') | ||||
|         #DIAN 1.7.-2020: DAK43 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName', | ||||
|                           invoice.invoice_customer.legal_name) | ||||
|         #DIAN 1.7.-2020: DAK44 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity/cbc:CompanyID', | ||||
|                           invoice.invoice_customer.ident, | ||||
|                           #DIAN 1.7.-2020: DAK45, DAK46, DAK47, DAK48 | ||||
|                           **customer_company_id_attrs) | ||||
|         #DIAN 1.7.-2020: CAK51 | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:PartyLegalEntity') | ||||
|         #DIAN 1.7.-2020: CAK51, CAK55 | ||||
|         fexml.set_element('/fe:DebitNote/cac:AccountingCustomerParty/cac:Party/cac:Contact/cbc:ElectronicMail', | ||||
|                           invoice.invoice_customer.email) | ||||
|  | ||||
|  | ||||
|     def set_payment_mean(fexml, invoice): | ||||
|         payment_mean = invoice.invoice_payment_mean | ||||
|         fexml.set_element('/fe:DebitNote/cac:PaymentMeans/cbc:ID', payment_mean.id) | ||||
|         fexml.set_element('/fe:DebitNote/cac:PaymentMeans/cbc:PaymentMeansCode', payment_mean.code) | ||||
|         fexml.set_element('/fe:DebitNote/cac:PaymentMeans/cbc:PaymentDueDate', payment_mean.due_at.strftime('%Y-%m-%d')) | ||||
|         fexml.set_element('/fe:DebitNote/cac:PaymentMeans/cbc:PaymentID', payment_mean.payment_id) | ||||
|  | ||||
|     def set_element_amount_for(fexml, xml, xpath, amount): | ||||
|         if not isinstance(amount, Amount): | ||||
|             raise TypeError("amount not is Amount") | ||||
|  | ||||
|         xml.set_element(xpath, amount, currencyID=amount.currency.code) | ||||
|  | ||||
|     def set_element_amount(fexml, xpath, amount): | ||||
|         if not isinstance(amount, Amount): | ||||
|             raise TypeError("amount not is Amount") | ||||
|  | ||||
|         fexml.set_element(xpath, amount, currencyID=amount.currency.code) | ||||
|     def tag_document_concilied(fexml): | ||||
|         return 'Debited' | ||||
|  | ||||
|     #DIAN 1.7.-2020: DAU03 | ||||
|     def set_legal_monetary(fexml, invoice): | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:LegalMonetaryTotal/cbc:LineExtensionAmount', | ||||
|         fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:LineExtensionAmount', | ||||
|                                  invoice.invoice_legal_monetary_total.line_extension_amount) | ||||
|  | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount', | ||||
|         fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:TaxExclusiveAmount', | ||||
|                                 invoice.invoice_legal_monetary_total.tax_exclusive_amount) | ||||
|  | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount', | ||||
|         fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:TaxInclusiveAmount', | ||||
|                                 invoice.invoice_legal_monetary_total.tax_inclusive_amount) | ||||
|  | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:LegalMonetaryTotal/cbc:ChargeTotalAmount', | ||||
|         fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:ChargeTotalAmount', | ||||
|                                 invoice.invoice_legal_monetary_total.charge_total_amount) | ||||
|  | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:LegalMonetaryTotal/cbc:PayableAmount', | ||||
|         fexml.set_element_amount('./cac:RequestedMonetaryTotal/cbc:PayableAmount', | ||||
|                                 invoice.invoice_legal_monetary_total.payable_amount) | ||||
|     def set_billing_reference(fexml, invoice): | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:BillingReference') | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:BillingReference/cac:InvoiceDocumentReference') | ||||
|         fexml.set_element('/fe:DebitNote/cac:BillingReference/cac:InvoiceDocumentReference/cbc:ID', | ||||
|                                 invoice.invoice_billing_reference.ident) | ||||
|         fexml.set_element('/fe:DebitNote/cac:BillingReference/cac:InvoiceDocumentReference/cbc:UUID', | ||||
|                                 invoice.invoice_billing_reference.uuid, | ||||
|                                 schemeName='CUFE-SHA384') | ||||
|         fexml.set_element('/fe:DebitNote/cac:BillingReference/cac:InvoiceDocumentReference/cbc:IssueDate', | ||||
|                                 invoice.invoice_billing_reference.date) | ||||
|  | ||||
|  | ||||
|     def set_invoice_totals(fexml, invoice): | ||||
|         tax_amount_for = defaultdict(lambda: defaultdict(lambda: Amount(0.0))) | ||||
|         percent_for = defaultdict(lambda: None) | ||||
|  | ||||
|         #requeridos para CUDE | ||||
|         tax_amount_for['01']['tax_amount'] = Amount(0.0) | ||||
|         tax_amount_for['01']['taxable_amount'] = Amount(0.0) | ||||
|         #DIAN 1.7.-2020: DAS07 => Se debe construir estrategia para  su manejo | ||||
|         #tax_amount_for['04']['tax_amount'] = 0.0 | ||||
|         #tax_amount_for['04']['taxable_amount'] = 0.0 | ||||
|         #tax_amount_for['03']['tax_amount'] = 0.0 | ||||
|         #tax_amount_for['03']['taxable_amount'] = 0.0 | ||||
|  | ||||
|         total_tax_amount = Amount(0.0) | ||||
|  | ||||
|         for invoice_line in invoice.invoice_lines: | ||||
|             for subtotal in invoice_line.tax.subtotals: | ||||
|                 tax_amount_for[subtotal.tax_scheme_ident]['tax_amount'] += subtotal.tax_amount | ||||
|                 tax_amount_for[subtotal.tax_scheme_ident]['taxable_amount'] += subtotal.taxable_amount | ||||
|                 total_tax_amount += subtotal.tax_amount | ||||
|                 # MACHETE ojo DebitNoteLine.tax pasar a DebitNote | ||||
|                 percent_for[subtotal.tax_scheme_ident] = subtotal.percent | ||||
|  | ||||
|         fexml.placeholder_for('/fe:DebitNote/cac:TaxTotal') | ||||
|         fexml.set_element_amount('/fe:DebitNote/cac:TaxTotal/cbc:TaxAmount', | ||||
|                                 total_tax_amount) | ||||
|  | ||||
|  | ||||
|         for index, item in enumerate(tax_amount_for.items()): | ||||
|             cod_impuesto, amount_of = item | ||||
|             next_append = index > 0 | ||||
|  | ||||
|             #DIAN 1.7.-2020: DAS01 | ||||
|             line = fexml.fragment('/fe:DebitNote/cac:TaxTotal', append=next_append) | ||||
|  | ||||
|             #DIAN 1.7.-2020: DAU06 | ||||
|             tax_amount = amount_of['tax_amount'] | ||||
|             fexml.set_element_amount_for(line, | ||||
|                                          '/cac:TaxTotal/cbc:TaxAmount', | ||||
|                                          tax_amount) | ||||
|  | ||||
|             #DIAN 1.7.-2020: DAS05 | ||||
|             fexml.set_element_amount_for(line, | ||||
|                                          '/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount', | ||||
|                                          amount_of['taxable_amount']) | ||||
|  | ||||
|             #DIAN 1.7.-2020: DAU06 | ||||
|             fexml.set_element_amount_for(line, | ||||
|                                          '/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount', | ||||
|                                          amount_of['tax_amount']) | ||||
|  | ||||
|             #DIAN 1.7.-2020: DAS07 | ||||
|             if percent_for[cod_impuesto]: | ||||
|                 line.set_element('/cac:TaxTotal/cac:TaxSubtotal/cbc:Percent', | ||||
|                                  percent_for[cod_impuesto]) | ||||
|  | ||||
|  | ||||
|             if percent_for[cod_impuesto]: | ||||
|                 line.set_element('/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', | ||||
|                                  percent_for[cod_impuesto]) | ||||
|             line.set_element('/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', | ||||
|                              cod_impuesto) | ||||
|  | ||||
|  | ||||
|     def set_invoice_lines(fexml, invoice): | ||||
|         next_append = False | ||||
|         for index, invoice_line in enumerate(invoice.invoice_lines): | ||||
|             line = fexml.fragment('/fe:DebitNote/cac:DebitNoteLine', append=next_append) | ||||
|             next_append = True | ||||
|  | ||||
|             line.set_element('/cac:DebitNoteLine/cbc:ID', index + 1) | ||||
|             line.set_element('/cac:DebitNoteLine/cbc:DebitedQuantity', invoice_line.quantity, unitCode = 'NAR') | ||||
|             fexml.set_element_amount_for(line, | ||||
|                                          '/cac:DebitNoteLine/cbc:LineExtensionAmount', | ||||
|                                          invoice_line.total_amount) | ||||
|             fexml.set_element_amount_for(line, | ||||
|                                          '/cac:DebitNoteLine/cac:TaxTotal/cbc:TaxAmount', | ||||
|                                          invoice_line.tax_amount) | ||||
|  | ||||
|  | ||||
|             for subtotal in invoice_line.tax.subtotals: | ||||
|                 fexml.set_element_amount_for(line, | ||||
|                                              '/cac:DebitNoteLine/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount', | ||||
|                                              subtotal.taxable_amount) | ||||
|                 line.set_element('/cac:DebitNoteLine/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount', subtotal.tax_amount, currencyID='COP') | ||||
|                 line.set_element('/cac:DebitNoteLine/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent', subtotal.percent) | ||||
|                 line.set_element('/cac:DebitNoteLine/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID', subtotal.tax_scheme_ident) | ||||
|                 line.set_element('/cac:DebitNoteLine/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:Name', subtotal.tax_scheme_name) | ||||
|             line.set_element('/cac:DebitNoteLine/cac:Item/cbc:Description', invoice_line.item.description) | ||||
|             # TODO | ||||
|             line.set_element('/cac:DebitNoteLine/cac:Item/cac:StandardItemIdentification/cbc:ID', invoice_line.item.id) | ||||
|             line.set_element('/cac:DebitNoteLine/cac:Price/cbc:PriceAmount', invoice_line.price.amount, currencyID="COP") | ||||
|             #DIAN 1.7.-2020: DBB04 | ||||
|             line.set_element('/cac:DebitNoteLine/cac:Price/cbc:BaseQuantity', invoice_line.price.amount) | ||||
|  | ||||
|     def attach_invoice(fexml, invoice): | ||||
|         """adiciona etiquetas a FEXML y retorna FEXML | ||||
|         en caso de fallar validacion retorna None""" | ||||
|  | ||||
|         fexml.placeholder_for('/fe:DebitNote/ext:UBLExtensions') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:UBLVersionID', 'UBL 2.1') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:CustomizationID', invoice.invoice_operation_type) | ||||
|         fexml.placeholder_for('/fe:DebitNote/cbc:ProfileID') | ||||
|         fexml.placeholder_for('/fe:DebitNote/cbc:ProfileExecutionID') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:ID', invoice.invoice_ident) | ||||
|         fexml.placeholder_for('/fe:DebitNote/cbc:UUID') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:DocumentCurrencyCode', 'COP') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:IssueDate', invoice.invoice_issue.strftime('%Y-%m-%d')) | ||||
|         #DIAN 1.7.-2020: DAD10 | ||||
|         fexml.set_element('/fe:DebitNote/cbc:IssueTime', invoice.invoice_issue.strftime('%H:%M:%S-05:00')) | ||||
|         fexml.set_billing_reference(invoice) | ||||
|         fexml.set_element('/fe:DebitNote/cbc:DebitNoteTypeCode', codelist.TipoDocumento.by_name('Nota Crédito')['code'], | ||||
|                           listAgencyID='195', | ||||
|                           listAgencyName='No matching global declaration available for the validation root', | ||||
|                           listURI='http://www.dian.gov.co') | ||||
|         fexml.set_element('/fe:DebitNote/cbc:LineCountNumeric', len(invoice.invoice_lines)) | ||||
|         fexml.set_element('/fe:DebitNote/cac:DebitNotePeriod/cbc:StartDate', invoice.invoice_period_start.strftime('%Y-%m-%d')) | ||||
|         fexml.set_element('/fe:DebitNote/cac:DebitNotePeriod/cbc:EndDate', invoice.invoice_period_end.strftime('%Y-%m-%d')) | ||||
|  | ||||
|         fexml.set_supplier(invoice) | ||||
|         fexml.set_customer(invoice) | ||||
|         fexml.set_invoice_totals(invoice) | ||||
|         fexml.set_legal_monetary(invoice) | ||||
|         fexml.set_invoice_lines(invoice) | ||||
|         fexml.set_payment_mean(invoice) | ||||
|  | ||||
|         return fexml | ||||
|   | ||||
		Reference in New Issue
	
	Block a user