fache/fe/fe.py(DianXMLExtensionCUDE): nuevo.
FossilOrigin-Name: edced6a3095b29e92295242a73ac4654498abe458d4037b21eb13a4b351d60fd
This commit is contained in:
		| @@ -3,8 +3,11 @@ from .fe import NAMESPACES | ||||
| from .fe import DianXMLExtensionSigner | ||||
| from .fe import DianXMLExtensionSoftwareSecurityCode | ||||
| from .fe import DianXMLExtensionCUFE | ||||
| from .fe import DianXMLExtensionCUDE | ||||
| from .fe import DianXMLExtensionInvoiceAuthorization | ||||
| from .fe import DianXMLExtensionSoftwareProvider | ||||
| from .fe import DianXMLExtensionAuthorizationProvider | ||||
| from .fe import DianZIP | ||||
| from .fe import AMBIENTE_PRUEBAS | ||||
| from .fe import AMBIENTE_PRODUCCION | ||||
| from . import form_xml | ||||
|   | ||||
							
								
								
									
										137
									
								
								facho/fe/fe.py
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								facho/fe/fe.py
									
									
									
									
									
								
							| @@ -14,6 +14,10 @@ from contextlib import contextmanager | ||||
| from .data.dian import codelist | ||||
| from . import form | ||||
|  | ||||
| AMBIENTE_PRUEBAS = codelist.TipoAmbiente.by_name('Pruebas')['code'] | ||||
| AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code'] | ||||
|  | ||||
|  | ||||
| SCHEME_AGENCY_ATTRS = { | ||||
|     'schemeAgencyName': 'CO, DIAN (Dirección de Impuestos y Aduanas Nacionales)', | ||||
|     'schemeAgencyID': '195' | ||||
| @@ -76,20 +80,18 @@ class FeXML(FachoXML): | ||||
|             .replace("xmlns:fe", "xmlns") | ||||
|  | ||||
|  | ||||
| class DianXMLExtensionCUFE(FachoXMLExtension): | ||||
|     AMBIENTE_PRUEBAS = codelist.TipoAmbiente.by_name('Pruebas')['code'] | ||||
|     AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code'] | ||||
|  | ||||
|     def __init__(self, invoice, tipo_ambiente = AMBIENTE_PRUEBAS, clave_tecnica = ''): | ||||
| class DianXMLExtensionCUDFE(FachoXMLExtension): | ||||
|  | ||||
|     def __init__(self, invoice, tipo_ambiente = AMBIENTE_PRUEBAS): | ||||
|         self.tipo_ambiente = tipo_ambiente | ||||
|         self.clave_tecnica = clave_tecnica | ||||
|         self.invoice = invoice | ||||
|  | ||||
|     def _tipo_ambiente(self): | ||||
|         return int(self.tipo_ambiente) | ||||
|  | ||||
|     def build(self, fachoxml): | ||||
|         cufe = self._generate_cufe(self.invoice, fachoxml) | ||||
|         cufe = self._generate_cufe(fachoxml) | ||||
|         fachoxml.set_element('./cbc:UUID', cufe, | ||||
|                              schemeID=self.tipo_ambiente, | ||||
|                              schemeName='CUFE-SHA384') | ||||
| @@ -105,49 +107,38 @@ class DianXMLExtensionCUFE(FachoXMLExtension): | ||||
|     def issue_date(self, datetime_): | ||||
|         return datetime_.strftime('%Y-%m-%d') | ||||
|  | ||||
|     def formatVars(self, invoice): | ||||
|         NumFac = invoice.invoice_ident | ||||
|         FecFac = self.issue_date(invoice.invoice_issue) | ||||
|         HoraFac = self.issue_time(invoice.invoice_issue) | ||||
|     def buildVars(self): | ||||
|         invoice = self.invoice | ||||
|         build_vars = {} | ||||
|         build_vars['NumFac'] = invoice.invoice_ident | ||||
|         build_vars['FecFac'] = self.issue_date(invoice.invoice_issue) | ||||
|         build_vars['HoraFac'] = self.issue_time(invoice.invoice_issue) | ||||
|         # PAG 601 | ||||
|         ValorBruto = invoice.invoice_legal_monetary_total.line_extension_amount | ||||
|         ValorTotalPagar = invoice.invoice_legal_monetary_total.payable_amount | ||||
|         build_vars['ValorBruto'] = invoice.invoice_legal_monetary_total.line_extension_amount | ||||
|         build_vars['ValorTotalPagar'] = invoice.invoice_legal_monetary_total.payable_amount | ||||
|         ValorImpuestoPara = {} | ||||
|         CodImpuesto1 = 1 | ||||
|         CodImpuesto2 = 4 | ||||
|         CodImpuesto3 = 3 | ||||
|         build_vars['CodImpuesto1'] = 1 | ||||
|         build_vars['CodImpuesto2'] = 4 | ||||
|         build_vars['CodImpuesto3'] = 3 | ||||
|         for invoice_line in invoice.invoice_lines: | ||||
|             for subtotal in invoice_line.tax.subtotals: | ||||
|                 # TODO cual es la naturaleza de tax_scheme_ident? | ||||
|                 codigo_impuesto = int(subtotal.tax_scheme_ident) | ||||
|                 ValorImpuestoPara.setdefault(codigo_impuesto, form.Amount(0.0)) | ||||
|                 ValorImpuestoPara[codigo_impuesto] += subtotal.tax_amount | ||||
|         build_vars['ValorImpuestoPara'] = ValorImpuestoPara | ||||
|         build_vars['NitOFE'] = invoice.invoice_supplier.ident | ||||
|         build_vars['NumAdq'] = invoice.invoice_customer.ident | ||||
|         build_vars['TipoAmb'] = self._tipo_ambiente() | ||||
|  | ||||
|         NitOFE = invoice.invoice_supplier.ident | ||||
|         NumAdq = invoice.invoice_customer.ident | ||||
|         TipoAmb = self._tipo_ambiente() | ||||
|         ClTec = str(self.clave_tecnica) | ||||
|         return build_vars | ||||
|  | ||||
|         return [ | ||||
|             '%s' % NumFac, | ||||
|             '%s' % FecFac, | ||||
|             '%s' % HoraFac, | ||||
|             '%.02f' % round(ValorBruto, 2), | ||||
|             '%02d' % CodImpuesto1, | ||||
|             '%.02f' % round(ValorImpuestoPara.get(CodImpuesto1, 0.0), 2), | ||||
|             '%02d' % CodImpuesto2, | ||||
|             '%.02f' % round(ValorImpuestoPara.get(CodImpuesto2, 0.0), 2), | ||||
|             '%02d' % CodImpuesto3, | ||||
|             '%.02f' % round(ValorImpuestoPara.get(CodImpuesto3, 0.0), 2), | ||||
|             '%.02f' % round(ValorTotalPagar, 2), | ||||
|             '%s' % NitOFE, | ||||
|             '%s' % NumAdq, | ||||
|             '%s' % ClTec, | ||||
|             '%d' % TipoAmb, | ||||
|         ] | ||||
|  | ||||
|     def _generate_cufe(self, invoice, fachoxml): | ||||
|         formatVars = self.formatVars(invoice) | ||||
|     def formatVars(self, invoice): | ||||
|         raise NotImplementedError() | ||||
|  | ||||
|     def _generate_cufe(self, fachoxml): | ||||
|         formatVars = self.formatVars() | ||||
|         cufe = "".join(formatVars) | ||||
|  | ||||
|         # crear hash... | ||||
| @@ -156,6 +147,74 @@ class DianXMLExtensionCUFE(FachoXMLExtension): | ||||
|         return h.hexdigest() | ||||
|  | ||||
|  | ||||
| class DianXMLExtensionCUFE(DianXMLExtensionCUDFE): | ||||
|     def __init__(self, invoice, tipo_ambiente = AMBIENTE_PRUEBAS, clave_tecnica = ''): | ||||
|         self.tipo_ambiente = tipo_ambiente | ||||
|         self.clave_tecnica = clave_tecnica | ||||
|         self.invoice = invoice | ||||
|  | ||||
|     def buildVars(self): | ||||
|         build_vars = super().buildVars() | ||||
|         build_vars['ClTec'] = str(self.clave_tecnica) | ||||
|         return build_vars | ||||
|  | ||||
|     def formatVars(self): | ||||
|         build_vars = self.buildVars() | ||||
|         CodImpuesto1 = build_vars['CodImpuesto1'] | ||||
|         CodImpuesto2 = build_vars['CodImpuesto2'] | ||||
|         CodImpuesto3 = build_vars['CodImpuesto3'] | ||||
|         return [ | ||||
|             '%s' % build_vars['NumFac'], | ||||
|             '%s' % build_vars['FecFac'], | ||||
|             '%s' % build_vars['HoraFac'], | ||||
|             '%.02f' % round(build_vars['ValorBruto'], 2), | ||||
|             '%02d' % CodImpuesto1, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto1, 0.0), 2), | ||||
|             '%02d' % CodImpuesto2, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto2, 0.0), 2), | ||||
|             '%02d' % CodImpuesto3, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto3, 0.0), 2), | ||||
|             '%.02f' % round(build_vars['ValorTotalPagar'], 2), | ||||
|             '%s' % build_vars['NitOFE'], | ||||
|             '%s' % build_vars['NumAdq'], | ||||
|             '%s' % build_vars['ClTec'], | ||||
|             '%d' % build_vars['TipoAmb'], | ||||
|         ] | ||||
|  | ||||
| class DianXMLExtensionCUDE(DianXMLExtensionCUDFE): | ||||
|     def __init__(self, invoice, software_pin, tipo_ambiente = AMBIENTE_PRUEBAS): | ||||
|         self.tipo_ambiente = tipo_ambiente | ||||
|         self.software_pin = software_pin | ||||
|         self.invoice = invoice | ||||
|  | ||||
|     def buildVars(self): | ||||
|         build_vars = super().buildVars() | ||||
|         build_vars['Software-PIN'] = str(self.software_pin) | ||||
|         return build_vars | ||||
|  | ||||
|     def formatVars(self): | ||||
|         build_vars = self.buildVars() | ||||
|         CodImpuesto1 = build_vars['CodImpuesto1'] | ||||
|         CodImpuesto2 = build_vars['CodImpuesto2'] | ||||
|         CodImpuesto3 = build_vars['CodImpuesto3'] | ||||
|         return [ | ||||
|             '%s' % build_vars['NumFac'], | ||||
|             '%s' % build_vars['FecFac'], | ||||
|             '%s' % build_vars['HoraFac'], | ||||
|             '%.02f' % round(build_vars['ValorBruto'], 2), | ||||
|             '%02d' % CodImpuesto1, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto1, 0.0), 2), | ||||
|             '%02d' % CodImpuesto2, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto2, 0.0), 2), | ||||
|             '%02d' % CodImpuesto3, | ||||
|             '%.02f' % round(build_vars['ValorImpuestoPara'].get(CodImpuesto3, 0.0), 2), | ||||
|             '%.02f' % round(build_vars['ValorTotalPagar'], 2), | ||||
|             '%s' % build_vars['NitOFE'], | ||||
|             '%s' % build_vars['NumAdq'], | ||||
|             '%s' % build_vars['Software-PIN'], | ||||
|             '%d' % build_vars['TipoAmb'], | ||||
|         ] | ||||
|  | ||||
| class DianXMLExtensionSoftwareProvider(FachoXMLExtension): | ||||
|     # RESOLUCION 0004: pagina 108 | ||||
|  | ||||
| @@ -300,7 +359,7 @@ class DianXMLExtensionInvoiceSource(FachoXMLExtension): | ||||
|                           listAgencyID="6", | ||||
|                           listAgencyName="United Nations Economic Commission for Europe", | ||||
|                           listSchemeURI="urn:oasis:names:specification:ubl:codelist:gc:CountryIdentificationCode-2.1") | ||||
|          | ||||
|  | ||||
|  | ||||
| class DianXMLExtensionInvoiceAuthorization(FachoXMLExtension): | ||||
|     # RESOLUCION 0004: pagina 106 | ||||
|   | ||||
| @@ -470,6 +470,8 @@ class NationalSalesInvoice(Invoice): | ||||
|  | ||||
| class CreditNote(Invoice): | ||||
|     def __init__(self, invoice_document_reference: BillingReference): | ||||
|         super().__init__(CreditNoteDocumentType()) | ||||
|  | ||||
|         if not isinstance(invoice_document_reference, BillingReference): | ||||
|             raise TypeError('invoice_document_reference invalid type') | ||||
|         self.invoice_billing_reference = invoice_document_reference | ||||
|   | ||||
		Reference in New Issue
	
	Block a user