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).

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.

Download files

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

Source Distribution

arcalib-0.1.1.tar.gz (57.7 kB view details)

Uploaded Source

Built Distribution

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

arcalib-0.1.1-py3-none-any.whl (59.0 kB view details)

Uploaded Python 3

File details

Details for the file arcalib-0.1.1.tar.gz.

File metadata

  • Download URL: arcalib-0.1.1.tar.gz
  • Upload date:
  • Size: 57.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for arcalib-0.1.1.tar.gz
Algorithm Hash digest
SHA256 cf128284ec06951c6c030243754c42d3552eaa9a3a72eba8db3f7841b02a8b4f
MD5 d3dfcb2ef1957e22abfb5bcdc04bd204
BLAKE2b-256 8bf28632d760be4c7ed3184d6c838ab7bb0db3a5361646d3af4c3a90d7f5cff7

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcalib-0.1.1.tar.gz:

Publisher: publish.yml on kmee/arcalib

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arcalib-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: arcalib-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 59.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for arcalib-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5738fe5a0b531a114ff41c380b6abff59ab9021a9bda23d1ac15ec80c091be28
MD5 53eec01e65efee4b39f54addc5e7c240
BLAKE2b-256 d3bed18c1d0e9a06648fc2f14db63566406e0eb8d81d299fb9aedad278865e0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for arcalib-0.1.1-py3-none-any.whl:

Publisher: publish.yml on kmee/arcalib

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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