Skip to main content

arcalib

Bindings Python para os webservices da ARCA (Agencia de Recaudación y Control Aduanero, ex-AFIP) da Argentina, gerados automaticamente a partir dos XSD/WSDL oficiais via xsdata, no mesmo padrão da nfelib (Brasil) e da sifen (Paraguai).

Cobre:

  • WSAA: autenticação por certificado (Login Ticket Request/Response, CMS/PKCS#7).
  • WSFEv1: factura electrónica, mercado interno (CAE).
  • WSFEXv1: factura electrónica, exportación (fora do MVP, incluído porque o binding sai de graça da geração).
  • WSCDC: constatación de comprobantes de terceiros (fatura de fornecedor).
  • WSBFEv1: bono fiscal electrónico (bindings dos tipos apenas; sem camada de transmissão. Ver script.sh sobre o contorno necessário para gerar este WSDL).
  • Padrón A5 (personaServiceA5): consulta de dados cadastrais do contribuinte (razão social, endereço, regime tributário) a partir do CUIT.

Princípio central

Zero código manual para o schema. Todo binding é gerado pelo xsdata a partir dos WSDL oficiais da ARCA (vendorizados em arcalib/<serviço>/schemas/). Código escrito à mão se limita a CommonMixin, transmissao/, os dois XSD do WSAA que a ARCA não publica (loginTicketRequest.xsd, loginTicketResponse.xsd, com a proveniência documentada no cabeçalho de cada um), testes e o script de geração.

Por que existe

O core do Odoo 18 já traz o motor fiscal argentino (l10n_ar, l10n_latam_*, LGPL-3, autoria ADHOC SA). O que falta é só o delta do Enterprise: l10n_ar_edi (EDI) e l10n_ar_reports (relatórios). Esta lib cobre o transporte do EDI, sem depender de zeep (parse de WSDL em runtime, sem tipos versionados) nem de pyafipws/pysimplesoap (PyPI parado desde 2016, external_dependencies de URL git impede publicação de módulo OCA: foi o motivo do PR OCA/l10n-argentina#88 ter morrido). Contexto completo, plano de execução e decisões de arquitetura no brain oca/l10n-argentina (workspace interno da KMEE).

Instalação

pip install arcalib              # só os bindings
pip install "arcalib[sign]"      # + assinatura CMS/PKCS#7 (cryptography)
pip install "arcalib[transmissao]"  # + camada de transporte SOAP completa

Uso

from arcalib.transmissao import WSAA, HOMOLOGACION, TransmissaoWSFEv1
from arcalib.wsfev1.bindings.wsfev1 import (
    AlicIva, ArrayOfAlicIva, ArrayOfFecaedetRequest,
    FecaecabRequest, FecaedetRequest, Fecaerequest,
)

wsaa = WSAA(HOMOLOGACION, cert_pem, key_pem)
wsfe = TransmissaoWSFEv1(HOMOLOGACION, wsaa, cuit=20111111112)

det = FecaedetRequest(
    Concepto=1, DocTipo=99, DocNro=0,
    CbteDesde=1, CbteHasta=1, CbteFch="20260729",
    ImpTotal=121.0, ImpTotConc=0.0, ImpNeto=100.0,
    ImpOpEx=0.0, ImpTrib=0.0, ImpIVA=21.0,
    MonId="PES", MonCotiz=1.0, CondicionIVAReceptorId=5,
    Iva=ArrayOfAlicIva(AlicIva=[AlicIva(Id=5, BaseImp=100.0, Importe=21.0)]),
)
req = Fecaerequest(
    FeCabReq=FecaecabRequest(CantReg=1, PtoVta=1, CbteTipo=6),
    FeDetReq=ArrayOfFecaedetRequest(FECAEDetRequest=[det]),
)
response = wsfe.fecae_solicitar(req)

cert_pem/key_pem são o certificado e a chave privada da empresa em PEM. No addon Odoo, vêm do modelo certificate.certificate/certificate.key do core (LGPL-3), exportados para PEM antes de chegar aqui: esta lib é agnóstica de Odoo e testável isoladamente.

Estrutura do projeto

arcalib/
├── .xsdata.xml              # config do xsdata (originalCase, CommonMixin extension)
├── pyproject.toml
├── script.sh                # gera/regenera todos os bindings
├── arcalib/
│   ├── CommonMixin.py       # from_xml, to_xml
│   ├── wsaa/
│   │   ├── schemas/         # wsaa.wsdl (oficial) + os 2 XSD escritos à mão
│   │   └── bindings/        # gerados (NÃO editar manualmente)
│   ├── wsfev1/  wsfexv1/  wscdc/  wsbfev1/    # mesmo padrão
│   └── transmissao/
│       ├── config.py        # endpoints producción/homologación
│       ├── wsaa.py           # WSAA: login, cache de token, assinatura CMS
│       ├── base.py           # envelope SOAP 1.1, extração de corpo, SoapFault
│       ├── wsfev1.py  wscdc.py  wsfexv1.py
├── tests/
└── .github/workflows/

Comandos frequentes

pip install -e ".[sign,transmissao,test]"
./script.sh              # gerar/regenerar bindings (após alterar XSD ou .xsdata.xml)
pytest tests/ -v
ruff check arcalib/ tests/

Convenções

  • Bindings são gerados: nunca editar arcalib/*/bindings/ manualmente.
  • FieldName originalCase: campos mantêm o nome do WSDL (CantReg, ImpIVA, CondicionIVAReceptorId), não snake_case.
  • Nomes de classe/campo usados nesta lib e nos testes foram confirmados por leitura direta do binding gerado, nunca adivinhados: a superfície do WSDL da ARCA tem inconsistências (ver wscdc.py vs wsfev1.py: nomes de operação e de campo de autenticação diferem entre webservices).
  • Testes não tocam rede, exceto TestSchemaUpdates (tests/test_schema_versions.py), que só roda com CHECK_SCHEMA_UPDATES=1 (job agendado do CI).

Licença

MIT. Copyright (c) 2026 KMEE.

Metadata

Release files for arcalib 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for arcalib 0.2.0
File Size Uploaded
arcalib-0.2.0.tar.gz 63.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for arcalib 0.2.0
File Interpreter ABI Platform
arcalib-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 129.2 kB

Release files / arcalib-0.2.0.tar.gz

Download URL arcalib-0.2.0.tar.gz
Size 63.4 kB
Tags Source
SHA-256 checksum
How to use checksums
2afb00ec0b44d8a40a14a0103960e5d925fdadb837c123ec93ff3cb1d5da22a9
BLAKE2b-256 checksum
How to use checksums
f46dfb0db5652bfc8d6786ceabfa504c3354ef7eb2301a529c033263eceb631a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.

Transparency log

Release files / arcalib-0.2.0-py3-none-any.whl

Download URL arcalib-0.2.0-py3-none-any.whl
Size 65.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3c01945daf265b60dce56beb15fcf8fce0eb2bbb30ce1751a22b2ebf820546ae
BLAKE2b-256 checksum
How to use checksums
1d8e0f070603de5f0f08f2e06172923f8f3f447511393d81a495b7eb27116b3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page