Skip to content

Instantly share code, notes, and snippets.

@Alkz6
Last active April 29, 2022 00:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Alkz6/e67c1c48940e724010bc4d7c6ad9e871 to your computer and use it in GitHub Desktop.
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
# -*- 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())
@Alkz6
Copy link
Author

Alkz6 commented Jul 24, 2020

Por tiempo no pude comentar bien el código, disculpen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment