This is a helper script for generating Python and Odoo ERP libraries for the Brazilian electronic fiscal documents using http://www.davekuhlman.org/generateDS.html. It supports all fiscal documents that have XSD schemas, that is: NF-e, CC-e, NFS-e, MDF-e, CT-e, EFD-Reinf, e-Social, GNRE, BP-e...
But why a helper instead of launching generateDS manually?
- For all these fiscal documents there is a common pattern: the schemas are inside a zip archive that can be downloaded from an official URL.
- After normalizing the xsd file names, we launch the generateDS.py generator on them. But we also want to keep our libraries small, so edoc-gen enables to specify that only some xsd files should support both export and import.
- Finally automating all the steps with the proper settings allowed me to quickly re-generate the Python libraries for all the fiscal documents and run the pytests import/export tests on them to ensure any patch in generateDS would would retain real life compatibility (I got some 6 patches merged into generateDS). And mostly it allowed me to the do the same with the Odoo mixin generator plugin: quicky re-generate all Odoo modules and ensure they install and pass the tests. The libraries and Odoo modules are typically distributed as separated packages inside different repos that can get their own bug reports, forks and contributions but it also work to generate everything in the same directory for a quick extensive testing.
Install generateDS somewhere https://www.davekuhlman.org/generateDS.html#how-to-build-and-install-it
Then export its home directory for the script to know where to find it:
export GENERATEDS_HOME=path_to_generateds
Optionnally, if you want to generate Odoo models mixins, you need the Akretion plugin for Odoo. It is available in the generateDS pull request for now: https://bitbucket.org/dkuhlman/generateds/pull-requests/51/d7e954682a90/diff .
Download this Odoo plugin branch and export the ODOO_GEN_HOM environment variable to the odoo plugin directory with (alternatively you can also merge the plugin branch):
export ODOO_GEN_HOM=path_to_odoo_plugin_dir
The script is meant to be run inline from curl so the maintenance can be centralized here without the need to bother packaging the bash scripts. The API is:
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s schema_name plugin_name version \
'schema_url' \
'files'
were the arguments mean:
- schema_name: name of the schame, can be nfe, nfse, cce, mdfe...
- plugin_name: python|odoo (Akretion made an Odoo plugin for GenarateDS, similar to the Django plugin)
- version: example v4_00
- schema_url: URL of the zip archive containing the schemas
- files: optionally if you want to support XML import of only some XSD files, list them separated by |. ex: 'file1|file2'
The script has a modular structure were you can override your own scripts in scripts/gen_plugin to target custom plugin. This projects assumes
- a plugin for a Python library (marshall and unmarshall XML docs according to the provided XSD)
- a plugin for the Odoo open source ERP that generates Odoo mixins to be injected later properly into Odoo models
For each kind of these Brazilian electronic fiscal documents you can find here the generated lib maintained by Akretion and also the basic command that has been used to generate the Python lib. These scripts are only here to demonstrate how it works (you can run them in an empty directory), but the real Python libraries have additional README.rst, tests and limited overrides maintained manually in their respective repo. We also don't generate Python classes (1000 lines minimum) for very small 20 lines schemas such as communication events as these can be easily dealt with simple Python strings or Jinja2.
Python | https://github.com/akretion/nfelib |
---|---|
Odoo | OCA/l10n-brazil#658 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s nfe python v4_00 \
'http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=vdxcmJ2AgTo=' \
'leiauteNFe|leiauteInutNFe'
Python | https://github.com/akretion/ccelib |
---|---|
Odoo | OCA/l10n-brazil#659 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s cce python v1_00 \
'http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=P/FXaGiLKo0=' \
leiauteCCe
Python | https://github.com/akretion/mdfelib |
---|---|
Odoo | OCA/l10n-brazil#660 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s mdfe python v3_00 \
'https://dfe-portal.sefazvirtual.rs.gov.br/MDFE/DownloadArquivoEstatico/?sistema=MDFE&tipoArquivo=2&nomeArquivo=PL_MDFe_300_NT022018_v1.02.zip' \
'mdfe|mdfeModalAereo|mdfeModalAquaviario|mdfeModalFerroviario|mdfeModalRodoviario'
Python | https://github.com/akretion/ctelib |
---|---|
Odoo | OCA/l10n-brazil#661 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s cte python v3_00 \
'http://www.cte.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=xuFsi7DbwBk=' \
'cte|cteModalAereo|cteModalAquaviario|cteModalDutoviario|cteModalFerroviario|cteModalRodoviarioOS|cteModalRodoviario|cteMultiModal'
Python | https://github.com/akretion/nfselib |
---|---|
Odoo | OCA/l10n-brazil#662 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s nfse python v2_03 \
'http://www.abrasf.org.br/arquivos/publico/NFS-e/Versao_2.03/schema_xml_nfs-e_%20v2.03.zip' \
nfse
Python | https://github.com/akretion/nfselib |
---|---|
Odoo | OCA/l10n-brazil#666 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s efdreinf python v01_04 \
'http://sped.rfb.gov.br/estatico/CA/E40B96DD94D4B54626EDDF0CC3004937AB1597/Pacote%20XSD%20Eventos%20EFD%20Reinf%20v1_04_00.zip'
Python | https://github.com/akretion/esociallib |
---|---|
Odoo | OCA/l10n-brazil#665 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s esocial python v02_05 \
'https://portal.esocial.gov.br/manuais/2019-01-29_esquemas_xsd_v02-05-00.zip'
Python | https://github.com/akretion/gnrelib |
---|---|
Odoo | OCA/l10n-brazil#663 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s gnre python v1_00 \
'http://www.gnre.pe.gov.br/gnre/portal/arquivos/EsquemaLote.zip' \
lote_gnre
Python | https://github.com/akretion/bpelib |
---|---|
Odoo | OCA/l10n-brazil#664 |
curl https://raw.githubusercontent.com/akretion/edoc-gen/master/generate | bash -s bpe python v1_00 \
'https://portal.fazenda.sp.gov.br/servicos/bpe/Documents/PL_BPe_100_NT022018.zip' \
'bpe|eventoBPeTiposBasico'