Skip to main content

Activity Documentation Status Tests CodeQL Publish Releases Downloads Supported Versions Contributors Scrutinizer Code Quality Code Coverage Discord

SAT-CFDI

The best open-source python library to generate and process SAT’s CFDI

Documentation and User Guide available

SAT-CFDI Read the Docs

Supported Features

  • CFDI 3.2, 3.3, 4.0 - Ingreso, Nomina, Pagos, Traslados y Complementos

  • Retenciones 1.0, 2.0

  • Contabilidad Electronica 1.3

  • Representación Impresa PDF, HTML, JSON

  • Facturación con PAC’s

    • Comercio Digital

    • Diverza

    • Facturama (Multiemisor)

    • Finkok

    • Prodigia

    • SW Sapien

  • Descarga Masiva

  • Validación de Comprobantes

  • Listado 69B

  • Exportar Comprobantes a Excel

  • Descarga de Constancia de Situación Fiscal

  • Portal SAT - Factura Electrónica

    • Validación de RFC, Razón Social

    • LCO - Lista de Contribuyentes Obligados

  • DIOT - Declaración Informativa de Operaciones con Terceros

  • Certifica - Solicitud de Certificados, Renovación de Fiel

  • PLD - Prevención de Lavado de Dinero

Installation

Install SAT-CFDI from PyPI with:

python -m pip install satcfdi

or install from source with:

git clone https://github.com/SAT-CFDI/python-satcfdi
cd python-satcfdi
python -m pip install .

Load

from satcfdi.cfdi import CFDI

# from file
invoice = CFDI.from_file('comprobante.xml')

# from string/bytes
invoice = CFDI.from_string(open('comprobante.xml', 'rb').read())

Create

from decimal import Decimal
from satcfdi.models import Signer
from satcfdi.create.cfd import cfdi40
from satcfdi.create.cfd.catalogos import RegimenFiscal, UsoCFDI, MetodoPago, Impuesto, TipoFactor

# Load signing certificate
signer = Signer.load(
    certificate=open('csd/xiqb891116qe4_csd.cer', 'rb').read(),
    key=open('csd/xiqb891116qe4_csd.key', 'rb').read(),
    password=open('csd/xiqb891116qe4_csd.txt', 'r').read()
)

# create Comprobante
invoice = cfdi40.Comprobante(
    emisor=cfdi40.Emisor(
        rfc=signer.rfc,
        nombre=signer.legal_name,
        regimen_fiscal=RegimenFiscal.GENERAL_DE_LEY_PERSONAS_MORALES
    ),
    lugar_expedicion="56820",
    receptor=cfdi40.Receptor(
        rfc='KIJ0906199R1',
        nombre='KIJ, S.A DE C.V.',
        uso_cfdi=UsoCFDI.GASTOS_EN_GENERAL,
        domicilio_fiscal_receptor="59820",
        regimen_fiscal_receptor=RegimenFiscal.GENERAL_DE_LEY_PERSONAS_MORALES
    ),
    metodo_pago=MetodoPago.PAGO_EN_PARCIALIDADES_O_DIFERIDO,
    serie="A",
    folio="123456",
    conceptos=[
        cfdi40.Concepto(
            clave_prod_serv='84111506',
            cantidad=Decimal('1.00'),
            clave_unidad='E48',
            descripcion='SERVICIOS DE FACTURACION',
            valor_unitario=Decimal('1250.30'),
            impuestos=cfdi40.Impuestos(
                traslados=cfdi40.Traslado(
                        impuesto=Impuesto.IVA,
                        tipo_factor=TipoFactor.TASA,
                        tasa_o_cuota=Decimal('0.160000'),
                    ),
                retenciones=[
                    cfdi40.Retencion(
                        impuesto=Impuesto.ISR,
                        tipo_factor=TipoFactor.TASA,
                        tasa_o_cuota=Decimal('0.100000'),
                    ),
                    cfdi40.Retencion(
                        impuesto=Impuesto.IVA,
                        tipo_factor=TipoFactor.TASA,
                        tasa_o_cuota=Decimal('0.106667'),
                    )
                ],
            )
        )
    ]
)
invoice.sign(signer)
invoice = invoice.process()

Output

from satcfdi import render
from satcfdi.render import BODY_TEMPLATE

# XML
invoice.xml_write("my_invoice.xml")

# JSON
render.json_write(invoice, "my_invoice.json", pretty_print=True)

# HTML
render.html_write(invoice, "my_invoice.html")

# PDF
render.pdf_write(invoice, "my_invoice.pdf")

# Multiple HTML
render.html_write([invoice1, invoice2], "my_invoice.html")

# Multiple PDF
render.pdf_write([invoice1, invoice2], "my_invoice.pdf")

# HTML Body only
html_body = render.html_str(invoice, template=BODY_TEMPLATE)

Contributing

We value feedback and contributions from our community.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

satcfdi-26.7.3.tar.gz (10.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

satcfdi-26.7.3-py3-none-any.whl (11.4 MB view details)

Uploaded Python 3

File details

Details for the file satcfdi-26.7.3.tar.gz.

File metadata

  • Download URL: satcfdi-26.7.3.tar.gz
  • Upload date:
  • Size: 10.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for satcfdi-26.7.3.tar.gz
Algorithm Hash digest
SHA256 ffb38046a60f3aac71107905eafc7b484975d993bb58b9392c75ef1be340a9a1
MD5 ca127d15528947fd111c2f6270941c49
BLAKE2b-256 fbca7a9e446bef99b58f81438d2c43375f1c7c3c498ed4a64960d126182130f8

See more details on using hashes here.

File details

Details for the file satcfdi-26.7.3-py3-none-any.whl.

File metadata

  • Download URL: satcfdi-26.7.3-py3-none-any.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for satcfdi-26.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 cf5317bc0c64b6c16d5f0425c1be892306e8634bcb45a62f60fdd1a055b6d7cf
MD5 600b18f18accff581d21797e1d0890d5
BLAKE2b-256 4b4d55110a85d15992d759286ec7bdcb7c8104543970dff78342d4c752795994

See more details on using hashes here.

Release history Release notifications | RSS feed

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page