RSS Amplifier

PyPI recent updates · Aug 21, 2026

satcfdi 26.8.0

0
Sign in to vote or save

PyPI

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 y API Web)

    • 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

Built Distribution

Filter files by name, interpreter, ABI, and platform.

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

Copy a direct link to the current filters

File name

Interpreter

ABI

Platform

File details

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

File metadata

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

File hashes

Hashes for satcfdi-26.8.0.tar.gz
Algorithm Hash digest
SHA256 ee3981822213aa81014052a74c625a421e6d5f6c2876cf09ab74a08f5a37b20a
MD5 73485521e70c91b7768caf3bd056f6f9
BLAKE2b-256 8d0a08add99d9da8def10cda8b6b8ce755d46003d91361e6b76d1dcb1b6f4451

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for satcfdi-26.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4386f9135217b1ffb4259070c277fcfbbc7120b6a5cfd30ce14883ddec9773a3
MD5 f1159f1a4f9f9e5182e60b0617b4ff23
BLAKE2b-256 341f41119d261dfaec9ce5ad2af1908cde71dc7dc87cdb101fcd077e208721f2

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

Read the original on pypi.org

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.