Last active
April 29, 2022 00:13
-
-
Save Alkz6/e67c1c48940e724010bc4d7c6ad9e871 to your computer and use it in GitHub Desktop.
Ejemplo básico de como crear un cfdi usando las clases generadas con el XSD del SAT y la librería generateDS de python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
## Importar libreria generada con generateDS | |
#from . import CFDI33 | |
import CFDI33 | |
## StringIO lo usamos para "guardar" el cfdi procesado | |
from io import StringIO | |
## Declaración del schemaLocation para un CFDI sin complementos | |
SCHEMA_LOCATION = ' xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd"' | |
## Diccionario de datos donde va a ir establecida toda la información del CFDI | |
comprobante_dict = {} | |
#### COMIENZA INFORMACION DEL CFDI | |
## Atributos elemento Comprobante | |
CFDI_COMPROBANTE = { | |
'Version': '3.3', | |
'FormaPago': '28', | |
'Sello': '', | |
'Certificado': '', | |
'NoCertificado': '', | |
'SubTotal': '800', | |
'Total': '800', | |
'Moneda': 'MXN', | |
'TipoDeComprobante': 'I', | |
'MetodoPago': 'PUE', | |
'LugarExpedicion': '22010', | |
} | |
## Atributos elemento Emisor | |
CFDI_EMISOR = { | |
'Rfc': 'EKU9003173C9', | |
'Nombre': 'ESCUELA KEMPER URGATE SA DE CV', | |
'RegimenFiscal': '601', | |
} | |
##Atributos elemento Receptor | |
CFDI_RECEPTOR = { | |
'Rfc': 'XAXX010101000', | |
'Nombre': 'Publico en General', | |
'UsoCFDI': 'D01', | |
} | |
## Atributos elemento Concepto | |
CFDI_CONCEPTO = [{ | |
'ClaveProdServ': '01010101', | |
'NoIdentificacion': '01-1-NO', | |
'Cantidad': '1', | |
'ClaveUnidad': 'E48', | |
'Unidad': 'NO APLICA', | |
'Descripcion': 'Servicio de prueba', | |
'ValorUnitario': '800.00', | |
'Importe': '800.00', | |
'Impuestos': { | |
'Base': '800.00', | |
'Impuesto': '002', | |
'TipoFactor': 'Exento', | |
} | |
}] | |
#### FINALIZA INFORMACION DEL CFDI | |
#### COMIENZA LLENADO DEL DICCIONARIO comprobante_dict | |
### Creando elemento Emisor | |
comprobante_dict.update({ | |
'Emisor': CFDI33.EmisorType( | |
**CFDI_EMISOR | |
) | |
}) | |
### Creando elemento Receptor | |
comprobante_dict.update({ | |
'Receptor': CFDI33.ReceptorType( | |
**CFDI_RECEPTOR | |
) | |
}) | |
### Creando elementos Conceptos | |
conceptos_obj = CFDI33.ConceptosType() | |
### Itero elementos concepto | |
for concepto in CFDI_CONCEPTO: | |
### obtenemos información de los impuestos | |
### Lo trate como si siempre trae un impuestos probablemente se deba cambiar la logica | |
### un concepto puede traer más de un nodo Impuesto | |
concepto_impuesto = concepto.pop('Impuestos', {}) | |
if concepto_impuesto: | |
traslados_concepto_obj = CFDI33.TrasladosType() | |
traslados_concepto_obj.add_Traslado(CFDI33.TrasladoType(**concepto_impuesto)) | |
concepto.update({ | |
'Impuestos': CFDI33.ImpuestosType(Traslados=traslados_concepto_obj) | |
}) | |
conceptos_obj.add_Concepto( | |
CFDI33.ConceptoType(**concepto) | |
) | |
comprobante_dict.update({ | |
'Conceptos': conceptos_obj | |
}) | |
cfdi_obj = CFDI33.Comprobante(**comprobante_dict) | |
output = StringIO | |
cfdi_obj.export(output, 0, schemaLocation=SCHEMA_LOCATION, pretty_print=False) | |
print(output.getvalue()) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Por tiempo no pude comentar bien el código, disculpen