Coder Social home page Coder Social logo

mdfelib's Introduction

mdfelib Python library

A mdfelib é uma biblioteca para ler e gerir Manifesto Eletrônico de Documentos Fiscais brasileiros (MDF-e). Ja existem varias outras bibliotecas, porem na Akretion queriamos algo que fosse simples de manter para usar com o ERP open source Odoo. A mdfeelib nao tem a pretençao de solucionar toda burocracia do SPED sozinha, mas apenas a questao da geraçao dos documentos de MDF-e. Tambem criamos outras bibliotecas semelhantes para os outros documentos electronicos do SPED.

A mdfelib permite de:

  • Gerir os XMLs dos documentos fiscais.
  • Validar os dados com as mesmas validaçoes dos XSDs ao montar os objetos, o que evita detetar os erros apenas ao transmitir o XML.
  • Importar XMLs e transfoma-los em objetos Python. Usando um sistema de sub-classes, fica facil mapear esses objetos em outros objetos ou adicionar qualquer metodo customizado.

A mdfelib é:

  • Simples e confiavel. O codigo é gerido pelo generateDS a partir dos XSD's da Fazenda usando o script generate de menos de 70 linhas de codigo apenas.
  • Compativel com Python 2 e Python 3.
  • Capaz de carregar varias versoes dos esquemas. Isso pode ser bem util ao receber um documento com um layout antigo.

As tecnologias XML (XSD, WSDL, SOAP...) usadas pelo site da Fazenda foram criadas inicialmente para Java e .Net. Durante um bom tempo essas tecnologias ficaram para tras no mundo do Python. Por isso varias pessoas foram criar bibliotecas manualmente com milhares de linhas e poucos testes para montar os XMLs dos documentos electronicos. Mas hoje é um absurdo usar biblitecas escritas manualmente e depender do autor inicial a cada atualizaçao dos esquemas ou quando seu programa deve migrar para Python 3. Veja o conceito do 'Truck Factor' <https://en.wikipedia.org/wiki/Bus_factor>

É debativel qual é a melhor forma de transmitir esses documentos electronicos para o site da Fazenda (talvez com essas bibliotecas que ja existem, talvez com outras bibilotecas em Java especializadas em transmitir os documentos electronicos). Porem na questao de montar os XML e poder efetuar validaçoes dos dados o mais cedo possivel (perto do momento em qual o usuario preenchou os dados), dificilmente uma biblioteca de milhares de linhas escrita manualmente fica mais confiavel do que codigo gerido a partir dos XSD da Fazenda apenas. As classes da mdfelib sao geridas usando a ferramenta generateDS. A funcionalidade de sub-classes do generateDS tambem ajuda na questao dos mapeamentos entre o modelo de dados dos esquemas da fazenda e o modelo de dados do seu software (ERP por examplo). Finalmente ficou possivel fazer com Python o que o pessoal do Java ja fazia ha muito tempo com as tecnologias do tipo JAXB.

Voce pode aprender mais sobre o generateDS.py aqui: <http://www.davekuhlman.org/generateDS.html>

como instalar

pip install -e git+https://github.com/akretion/mdfelib.git#egg=mdfelib

como usar

:
>>> from mdfelib.v3_00 import mdfe as mdfe3
# TODO documentar melhor

mdfelib's People

Contributors

rvalyi avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

kmee linneudm

mdfelib's Issues

Erro na instalação

Ao instalar dessa forma acabou gerando o erro
pip install -e git+https://github.com/akretion/mdfelib.git#egg=mdfelib

AttributeError: module 'mdfelib.v3_00.mdfe' has no attribute 'TEndeEmi'
analisando com o pip freeze e retornou essa lista de pacotes python

asn1crypto==0.24.0
attrs==19.1.0
certifi==2019.9.11
cffi==1.12.3
chardet==3.0.4
cryptography==2.7
defusedxml==0.6.0
eight==0.4.2
endesive==1.2.0
erpbrasil.assinatura==0.2.0
erpbrasil.transmissao==0.0.0
fonttools==4.0.1
future==0.16.0
lxml==4.4.1
-e git+https://github.com/akretion/mdfelib.git@d949d2c30aa1d6e83f38ef772292c7b4b47051cb#egg=mdfelib
pdf-annotate==0.11.0
pdfminer.six==20181108
pdfrw==0.4
Pillow==6.1.0
pycparser==2.19
pycryptodome==3.9.0
PyKCS11==1.5.5
pyOpenSSL==18.0.0
pytz==2019.2
signxml==2.6.0
six==1.12.0
sortedcontainers==2.1.0
tzlocal==2.0.0

Ao fazer um git clone e instalar usando o comando:
python setup.py install

Tudo funcionou corretamente.

Erro ao validar datas

Ao tentar validar alguma data ele esta gerando o seguinte erro:
UserWarning: Value "b'2019-09-27T15:19:46-03:00'" does not match xsd pattern restrictions:

[['^(((20(([02468][048])$|^([13579][26]))-02-29))$|^(20[0-9][0-9])-((((0[1-9])$|^(1[0-2]))-((0[1-9])$|^(1\d)$|^(2[0-8])))$|^((((0[13578])$|^(1[02]))-31)$|^(((0[1,3-9])$|^(1[0-2]))-(29$|^30)))))T(20$|^21$|^22$|^23$|^[0-1]\d):[0-5]\d:[0-5]\d(\-,\+:00$|^(\+:00))$']]

warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_TDateTimeUTC_patterns_, ))

E ao analisar o regex aplicado verifiquei que existe um erro nessa parte [\\-,\\+] e existe diversas posições que ele não vai validar.

Não fiz um regex para corrigir essa situação pq não sou bom com isso rsrs

Falha na exportação de algumas tags

Estou tentando gerar um XML e estou com problemas nas TAGs verProc e xMunCarrega.

Não sei dizer se é um problema nas lib ou eu que estou usando a lib de forma incorreta.

Agradeço qualquer ajuda.

https://github.com/akretion/mdfelib/blob/generated/mdfelib/v3_00/mdfeTiposBasico.py#L1555
https://github.com/akretion/mdfelib/blob/generated/mdfelib/v3_00/mdfeTiposBasico.py#L1703

fmdf

In [22]: import sys
    ...: from mdfelib.v3_00.mdfeTiposBasico import ide
    ...: from mdfelib.v3_00.mdfeTiposBasico import infMunCarrega
    ...: from mdfelib.v3_00.mdfeTiposBasico import tot
    ...: from mdfelib.v3_00.mdfeTiposBasico import verProc
    ...: 
    ...: carregamento = infMunCarrega(cMunCarrega=2305506,xMunCarrega='TESTE')
    ...: 
    ...: ver_proc = verProc()
    ...: # TODO: Corrigir o ver_proc pois eu não consegui, segui em frente.
    ...: # ver_proc
    ...: identificacao = ide()
    ...: identificacao.cUF = 23
    ...: identificacao.tpAmb = 2
    ...: identificacao.mod = '1'
    ...: identificacao.serie = '1'
    ...: identificacao.nMDF = '1'
    ...: identificacao.cMDF= '00004894'
    ...: identificacao.cDV = 4
    ...: identificacao.modal = 1
    ...: identificacao.dhEmi = '2017-10-02T18:05:55-03:00'
    ...: identificacao.tpEmis = 1
    ...: identificacao.procEmi = '0'
    ...: identificacao.verProc = ver_proc
    ...: identificacao.UFIni = 'CE'
    ...: identificacao.UFFim = 'CE'
    ...: identificacao.infMunCarrega.append(carregamento)
    ...: identificacao.export(sys.stdout, 0)
    ...: 
<ide>
    <cUF>23</cUF>
    <tpAmb>2</tpAmb>
    <mod>1</mod>
    <serie>1</serie>
    <nMDF>1</nMDF>
    <cMDF>00004894</cMDF>
    <cDV>4</cDV>
    <modal>1</modal>
    <dhEmi>2017-10-02T18:05:55-03:00</dhEmi>
    <tpEmis>1</tpEmis>
    <procEmi>0</procEmi>
    <verProc/>
    <UFIni>CE</UFIni>
    <UFFim>CE</UFFim>
    <infMunCarrega>
        <cMunCarrega>2305506</cMunCarrega>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-c9f2f19bdffc> in <module>()
     26 identificacao.UFFim = 'CE'
     27 identificacao.infMunCarrega.append(carregamento)
---> 28 identificacao.export(sys.stdout, 0)

/home/mileo/Projects/test/src/mdfelib/mdfelib/v3_00/mdfeTiposBasico.py in export(self, outfile, level, namespace_, name_, namespacedef_, pretty_print)
   1131         if self.hasContent_():
   1132             outfile.write('>%s' % (eol_, ))
-> 1133             self.exportChildren(outfile, level + 1, namespace_='', name_='ide', pretty_print=pretty_print)
   1134             showIndent(outfile, level, pretty_print)
   1135             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))

/home/mileo/Projects/test/src/mdfelib/mdfelib/v3_00/mdfeTiposBasico.py in exportChildren(self, outfile, level, namespace_, name_, fromsubclass_, pretty_print)
   1191             outfile.write('<%sUFFim>%s</%sUFFim>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.UFFim), input_name='UFFim')), namespace_, eol_))
   1192         for infMunCarrega_ in self.infMunCarrega:
-> 1193             infMunCarrega_.export(outfile, level, namespace_, name_='infMunCarrega', pretty_print=pretty_print)
   1194         for infPercurso_ in self.infPercurso:
   1195             infPercurso_.export(outfile, level, namespace_, name_='infPercurso', pretty_print=pretty_print)

/home/mileo/Projects/test/src/mdfelib/mdfelib/v3_00/mdfeTiposBasico.py in export(self, outfile, level, namespace_, name_, namespacedef_, pretty_print)
   1661         if self.hasContent_():
   1662             outfile.write('>%s' % (eol_, ))
-> 1663             self.exportChildren(outfile, level + 1, namespace_='', name_='infMunCarrega', pretty_print=pretty_print)
   1664             showIndent(outfile, level, pretty_print)
   1665             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))

/home/mileo/Projects/test/src/mdfelib/mdfelib/v3_00/mdfeTiposBasico.py in exportChildren(self, outfile, level, namespace_, name_, fromsubclass_, pretty_print)
   1677             outfile.write('<%scMunCarrega>%s</%scMunCarrega>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.cMunCarrega), input_name='cMunCarrega')), namespace_, eol_))
   1678         if self.xMunCarrega is not None:
-> 1679             self.xMunCarrega.export(outfile, level, namespace_, name_='xMunCarrega', pretty_print=pretty_print)
   1680     def build(self, node):
   1681         already_processed = set()

AttributeError: 'str' object has no attribute 'export'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.