{ "info": { "author": "N\u00e2mio Evangelista Cavalcante de Sousa", "author_email": "namio.sousa@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Natural Language :: Portuguese", "Natural Language :: Portuguese (Brazilian)", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "[](https://pypi.org/project/bradocs4py/)\n[](https://github.com/namio/BRADocs4Py.git)\n[](https://pypi.org/project/bradocs4py/)\n[](https://pypi.org/project/bradocs4py/)\n[](https://pypi.org/project/bradocs4py/)\n[](https://github.com/namio/BRADocs4Py/blob/master/LICENSE)\n[](https://github.com/namio/BRADocs4Py.git)\n[](https://saythanks.io/to/namio)\n\n# BRADocs4Py\n\nBRADocs4Py \u00e9 uma biblioteca que visa fornecer componentes para trabalhar com tipos de dados espec\u00edficos da realidade brasileira.\n\nEsta biblioteca surgiu mediante a necessidade de se ter tipos espec\u00edficos que possibilitem lidar com documentos de identifica\u00e7\u00e3o pr\u00f3prios do Brasil, como \u00e9 o caso do Cadastro de Pessoa F\u00edsica (CPF) e do Cadastro Nacional de Pessoa Jur\u00eddica (CNPJ).\n\nAl\u00e9m de conter classes que representam o modelo computacional dos principais documentos brasileiros, esta biblioteca tamb\u00e9m disponibiliza classes que permitem a valida\u00e7\u00e3o e a gera\u00e7\u00e3o de n\u00fameros v\u00e1lidos para estes documentos; sendo estas \u00faltimas disponibilizadas exclusivamente para fins de testes computacionais.\n\n> This software is coded and documented in portuguese only as it is intended to be used to generate the necessary files for the brazilian government regarding to digital bookkeeping.\n\n## Requisitos\n\n * python\n\n## Como instalar\n\n $ pip install bradocs4py\n\n## Objetivos do Projeto\n\nA ideia inicial do projeto e unificar em uma \u00fanica biblioteca m\u00f3dulos que permitam representar computacionalmente e validar documentos brasileiros - inicialmente CPF e CNPJ, al\u00e9m de permitir a gera\u00e7\u00e3o de n\u00fameros v\u00e1lidos para estes documentos.\n\n## Compatibilidade do Projeto\n\nO projeto inicialmente suportar\u00e1 apenas Python 3.6.5+.\n\nOutras linguagens de programa\u00e7\u00e3o poder\u00e3o ter vers\u00f5es especificas conforme minha disponibilidade de tempo.\n\n## Status do Projeto\n\nO projeto est\u00e1 em fase inicial de desenvolvimento.\n\n| M\u00f3dulo | Situa\u00e7\u00e3o |\n|:------------------------------------|:---------------:|\n| [DocumentoIdentificacao](#di) |Funcional |\n| [CPF](#cpf) |Funcional |\n| [ValidadorCpf](#vcpf) |Funcional |\n| [GeradorCpf](#gcpf) |Funcional |\n| [Cnpj](#cnpj) |Funcional |\n| [ValidadorCnpj](#vcnpj) |Funcional |\n| [GeradorCnpj](#gcnpj) |Funcional |\n| [InscricaoEstadual](#ie) |Funcional |\n| [ValidadorInscricaoEstadual](#vie) |Funcional |\n| [GeradorInscricaoEstadual](#gie) |N\u00e3o implementado |\n| [InscricaoSuframa](#is) |Funcional |\n| [ValidadorSuframa](#vs) |Funcional |\n| [GeradorSuframa](#gs) |Funcional |\n| [ChaveAcessoNFe](#chave) |Funcional |\n| [ValidadorChaveAcessoNFe](#vchave) |Funcional |\n| [GeradorChaveAcessoNFe](#gchave) |Funcional |\n| [GTIN](#gtin) |Funcional |\n| [ValidadorGTIN](#vgtin) |Funcional |\n| [GeradorGTIN](#ggtin) |Funcional |\n\n\n### DocumentoIdentificacao\n\nClasse abstrata, n\u00e3o podendo ser instanciada diretamente, serve como base para todas as classes que representam um documento de identifica\u00e7\u00e3o ou qualquer outro documento brasileiro que necessite de valida\u00e7\u00e3o.\n\n### CPF\n\nClasse usada para representar em c\u00f3digo Pyhton um _Cadastro de Pessoa F\u00edsica_ (CPF); permitindo represent\u00e1-lo textualmente, com a devida formata\u00e7\u00e3o e identificar a sua validade.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> cpf = CPF('52513127765')\n >>> cpf\n '525.131.277-65'\n\n >>> cpf.isValid\n True\n\n >>> cpf.rawValue\n 52513127765\n\n >>> cpf = CPF('abcdefghijk')\n >>> cpf.isValid\n False\n\n >>> print(cpf)\n abcdefghijk\n\n >>> print(cpf.rawValue)\n abcdefghijk\n\n> Independente do conte\u00fado passado ao se criar uma inst\u00e2ncia de CPF, **sempre** obter-se-\u00e1 uma inst\u00e2ncia deste. Caber\u00e1 consultar a propriedade __isValid__ de uma inst\u00e2ncia de CPF para verificar se esta \u00e9 v\u00e1lida ou n\u00e3o.\n\n> A representa\u00e7\u00e3o textual de uma inst\u00e2ncia de CPF s\u00f3 ser\u00e1 exibida caso esta inst\u00e2ncia contenha um n\u00famero v\u00e1lido de CPF; ao contr\u00e1rio ser\u00e1 exibida a _string_ utilizada para cri\u00e1-la.\n\n> Para obter a _string_ utilizada ao instanciar um CPF, basta acessar a propriedade **rawValue** da inst\u00e2ncia criada.\n\n### ValidadorCpf\n\nClasse respons\u00e1vel por validar uma inst\u00e2ncia de CPF ou uma _string_ contendo a representa\u00e7\u00e3o num\u00e9rica de um CPF.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> cpf = CPF('abcdefghijk')\n >>> ValidadorCpf.validar(cpf)\n False\n\n >>> ValidadorCpf.validar('123.456.789-00')\n False\n\n Foi criado um CPF v\u00e1lido, por\u00e9m foi digitado um caractere de separa\u00e7\u00e3o diferente dos caracteres esperados (.-/ ). Mesmo assim, o validador informa tratar-se de um CPF correto\n >>> cpf = CPF('508,697,212-40')\n >>> ValidadorCpf.validar(cpf)\n True\n\n### GeradorCpf\n\nClasse respons\u00e1vel por gerar aleatoriamente um CPF v\u00e1lido.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> cpf = GeradorCpf.gerar()\n >>> cpf.isValid\n True\n\n### Cnpj\n\nClasse usada para representar em c\u00f3digo Pyhton um _Cadastro Nacional de Pessoa Jur\u00eddica_ (CNPJ); permitindo represent\u00e1-lo textualmente, com a devida formata\u00e7\u00e3o e identificar a sua validade.\n\n#### Utiliza\u00e7\u00e3o\n\n\t>>> cnpj = Cnpj('abcdefghijklmn')\n\t>>> cnpj.isValid\n\tFalse\n\n\t>>> cnpj = Cnpj('12345678901234')\n\t>>> cnpj.isValid\n\tFalse\n\n\t>>> cnpj = Cnpj('19.658.147/0001-0O')\n\t>>> cnpj.isValid\n\tFalse\n\n\t>>> cnpj = Cnpj('19.658.147/0001-00')\n\t>>> cnpj.isValid\n\tTrue\n\n> Independente do conte\u00fado passado ao se criar uma inst\u00e2ncia de CNPJ, **sempre** obter-se-\u00e1 uma inst\u00e2ncia deste. Caber\u00e1 consultar a propriedade __isValid__ de uma inst\u00e2ncia de CNPJ para verificar se esta \u00e9 v\u00e1lida ou n\u00e3o.\n\n> A representa\u00e7\u00e3o textual de uma inst\u00e2ncia de CNPJ s\u00f3 ser\u00e1 exibida caso esta inst\u00e2ncia contenha um n\u00famero v\u00e1lido de CNPJ; ao contr\u00e1rio ser\u00e1 exibida a _string_ utilizada para cri\u00e1-la.\n\n> Para obter a _string_ utilizada ao instanciar um CNPJ, basta acessar a propriedade **rawValue** da inst\u00e2ncia criada.\n\n### ValidadorCnpj\n\nClasse respons\u00e1vel por validar uma inst\u00e2ncia de CNPJ ou uma _string_ contendo a representa\u00e7\u00e3o num\u00e9rica de um CNPJ.\n\n#### Utiliza\u00e7\u00e3o\n\n\t>>> cnpj = Cnpj('abcdefghijklmn')\n\t>>> ValidadorCnpj.validar(cnpj)\n\tFalse\n\n\t>>> cnpj = Cnpj('19.658.147/0001-0O')\n\t>>>ValidadorCnpj.validar(cnpj)\n\tFalse\n\n\t>>> ValidadorCnpj.validar('12345678901234')\n\tFalse\n\n\t>>> cnpj = Cnpj('34 633 423,0001/60')\n\t>>> ValidadorCnpj.validar(cnpj)\n\tTrue\n\n\t>>> ValidadorCnpj.validar('05.692.744/0001-38')\n\tTrue\n\n### GeradorCnpj\n\nClasse respons\u00e1vel por gerar aleatoriamente um CNPJ v\u00e1lido.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> cnpj = GeradorCnpj.gerar()\n >>> cnpj.isValid\n True\n\n### InscricaoSuframa\n\nRepresenta o n\u00famero de inscri\u00e7\u00e3o na Superintend\u00eancia da Zona Franca de Manaus (SUFRAMA)\n\n> A SUFRAMA mant\u00e9m controle sobre as empresas com insentivo fiscal, identificando-as atrav\u00e9s do n\u00famero de _Inscri\u00e7\u00e3o SUFRAMA_.\n\nA composi\u00e7\u00e3o deste indicador \u00e9: _SS.NNNN.LLD_, onde:\n\n**SS** representa o __c\u00f3digo do setor de atividade__ da empresa, conforme exemplo abaixo:\n\n| C\u00f3digo | Descri\u00e7\u00e3o |\n| :----: | :---------------------------|\n| 01 e 02 | Cooperativa |\n| 10 e 11 | Com\u00e9rcio |\n| 20 | Ind\u00fastria com projeto pleno |\n| 60 | Servi\u00e7os |\n\n**NNNN** n\u00famero sequencial\n\n**LL** representa o c\u00f3digo da licalidade da Unidade Administrativa da Suframa que habilitou a empresa, conforme exemplo abaixo:\n\n\n| C\u00f3digo | Descri\u00e7\u00e3o |\n| :----: | :-----------|\n| 01 | Manaus |\n| 10 | Boa Vista |\n| 30 | Porto Velho |\n\n**D** d\u00edgito verificador\n\n#### Valida\u00e7\u00e3o\n\n* Campo num\u00e9rico com 9 posi\u00e7\u00f5es (incluindo o d\u00edgito verificador).\n* Pode iniciar por 0 (zero), mas n\u00e3o pode iniciar por 00.\n* D\u00edgito verificador calculado por [__m\u00f3dulo 11__](https://pt.wikipedia.org/wiki/D%C3%ADgito_verificador#M\u00f3dulo_11 \"M\u00e9todo de c\u00e1lculo do d\u00edgito verificador usando M\u00f3dulo 11\"), pesos 2 a 9.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> x = InscricaoSuframa('01.1234.129')\n >>> x.rawValue\n '011234129'\n >>> print(x)\n 01.1234.129\n >>> x.isValid\n False\n\n >>> x = InscricaoSuframa('101580100')\n >>> x.rawValue\n '101580100'\n >>> print(x)\n 10.1580.100\n >>> x.isValid\n True\n\n >>> x = InscricaoSuframa('1015801OO')\n >>> x.rawValue\n '1015801OO'\n >>> print(x)\n 1015801OO\n >>> x.isValid\n False\n\n### ValidadorSuframa\n\nValida uma inst\u00e2ncia de InscricaoSuframa ou uma _string_ contendo a representa\u00e7\u00e3o num\u00e9rica de uma Inscri\u00e7\u00e3o Suframa.\n\n#### Utiliza\u00e7\u00e3o\n\n # Valida\u00e7\u00e3o de uma _string_ representando uma Inscri\u00e7\u00e3o Suframa:\n >>> ValidadorSuframa.validar('101580100')\n True\n\n # Valida\u00e7\u00e3o de uma _string_ representando uma Inscri\u00e7\u00e3o Suframa inv\u00e1lida (contendo caracteres n\u00e3o num\u00e9ricos):\n >>> ValidadorSuframa.validar('1015801OO')\n False\n\n # Valida\u00e7\u00e3o de uma inst\u00e2ncia de Inscri\u00e7\u00e3oSuframa:\n >>> x = InscricaoSuframa('01.1234.129')\n >>> ValidadorSuframa.validar(x)\n False\n\n### GeradorSuframa\n\nGera aleatoriamente uma Inscri\u00e7\u00e3o Suframa v\u00e1lida\n\n >>> x = GeradorSuframa.gerar()\n >>> x.isValid\n True\n\n> **IMPORTANTE**: O __GeradorSuframa__ tem por objetivo ajudar estudantes, programadores, analistas de sistemas e testadores de c\u00f3digo a gerar Inscri\u00e7\u00f5es Suframa v\u00e1lidas visando auxiliar as rotinas de testes de softwares em desenvolvimento.\n\n> A m\u00e1 utiliza\u00e7\u00e3o dos dados gerados pelo __GeradorSuframa__ \u00e9 de **total responsabilidade do usu\u00e1rio** desta biblioteca.\n\n> As inscri\u00e7\u00f5es s\u00e3o geradas de forma aleat\u00f3ria, respeitando as leis de forma\u00e7\u00e3o estabelecidas pela SUFRAMA.\n\n### InscricaoEstadual\n\nRepresenta, em c\u00f3digo Pyhton, uma _Inscri\u00e7\u00e3o Estadual_ (IE), ou o registro do contribuinte no cadastro do ICMS mantido pela Receita Estadual; permitindo represent\u00e1-lo textualmente, com a devida formata\u00e7\u00e3o e identificar a sua validade.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> ie = InscricaoEstadual('613.855.219.926', 'SP')\n >>> ie.isValid\n True\n >>> ie.rawValue\n '613855219926'\n >>> ie.UF\n 'SP'\n >>> print(ie)\n 613.855.219.926\n\n### ValidadorInscricaoEstadual\n\nValida a consist\u00eancia de uma inst\u00e2ncia de InscricaoEstadual ou uma _string_ contendo a representa\u00e7\u00e3o num\u00e9rica de uma Inscri\u00e7\u00e3o Estadual para uma determinada Unidade da Federa\u00e7\u00e3o, informada juntamente com a representa\u00e7\u00e3o num\u00e9rica da IE a qual se deseja validar.\n\n> A valida\u00e7\u00e3o da Inscri\u00e7\u00e3o Estadual para cada Unidade da Federa\u00e7\u00e3o brasileira, leva em considera\u00e7\u00e3o o disposto no [__Conv\u00eanio 57/59__](http://www.sintegra.gov.br/conv_5795.html \"Conv\u00eanioICMS 57/59\"), como tamb\u00e9m as orienta\u00e7\u00f5es e especificidades contidas na p\u00e1gina [Confer\u00eancias de Inscri\u00e7\u00f5es Estaduais](http://www.sintegra.gov.br/insc_est.html \"Confer\u00eancia de Inscri\u00e7\u00f5es Estaduais\") do SINTEGRA.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> ie = InscricaoEstadual('613.855.219.926', 'SP')\n >>> ValidadorInscricaoEstadual.validar(ie)\n True\n\n >>> ValidadorInscricaoEstadual.validarStr('207653461', 'RN')\n True\n >>> ValidadorInscricaoEstadual.validarStr('209564598', 'TO')\n False\n\n> **NOTA**: Caso n\u00e3o se deseje utilizar o __ValidadorInscricaoEstadual__, pode-se utilizar o validador espec\u00edfico para uma determinada Unidade da Federa\u00e7\u00e3o.\n
Cada Unidade da Federa\u00e7\u00e3o brasileira possui o seu pr\u00f3prio validador, definido por: **Validador**XX, onde _XX_ deve ser substitu\u00eddo pela sigla da Unidade da Federa\u00e7\u00e3o desejada.
\nO Exemplo a seguir mostra como utilizar somente o validador espec\u00edfico para o Cear\u00e1, visando validar uma Inscri\u00e7\u00e3o Estadual deste Estado:
\n\n >>> from bradocs4py.validadoresie import ValidadorCE\n >>> ValidadorCE.validar('1234567')\n False\n >>> ValidadorCE.validar('50374156-6')\n True\n\n> **IMPORTANTE**: Ao contr\u00e1rio de ValidadorInscricaoEstadual, os validadores espec\u00edficos de cada UF validam somente uma cadeia de caracteres (_string_) contendo o n\u00famero representativo da Inscri\u00e7\u00e3o Estadual a ser validada.\n\n### ChaveAcessoNFe\n\nRepresenta a **Chave de Acesso** de uma Nota Fiscal Eletr\u00f4nica.\n\n#### Lei de forma\u00e7\u00e3o de uma Chave de Acesso de NF-e\nA Chave de Acesso da Nota Fiscal Eletr\u00f4nica \u00e9 representada por uma sequ\u00eancia de 44 caracteres num\u00e9ricos, devendo ser composta pelos seguintes campos que se encontram dispersos no Layout da NF-e:\n\n* UF - C\u00f3digo da UF do emitente do Documento Fiscal\n* AAMM - Ano e m\u00eas da emiss\u00e3o da NF-e\n* CNPJ - CNPJ do emitente do Documento Fiscal\n* Modelo - Modelo do Documento Fiscal\n* S\u00e9rie - S\u00e9rie do Documento Fiscal\n* N\u00famero - N\u00famero do Documento Fiscal\n* Forma Emiss\u00e3o - Forma de emiss\u00e3o do Documento Fiscal\n* C\u00f3digo Num\u00e9rico - C\u00f3digo num\u00e9rico que comp\u00f5e a Chave de Acesso\n* DV - D\u00edgito verificados\n\n| C\u00f3digo | UF | AAMM | CNPJ | Modelo | S\u00e9rie | N\u00famero | Forma Emiss\u00e3o | C\u00f3digo Num\u00e9rico | DV |\n| :--------:|:----:|:----:|:----:|:------:|:-----:|:------:|:-------------:|:---------------:|:----:|\n|Quantidade de caracteres |02 |04 |14 |02 |03 |09 |01 |08 |01 |\n\n\n#### Utiliza\u00e7\u00e3o\n\n >>> ca = ChaveAcessoNFe('23 1811 06850713000120 55 001 001766829 1 11103011 2')\n >>> ca\n