{ "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": "[![PyPI](https://img.shields.io/pypi/v/BRADocs4Py.svg)](https://pypi.org/project/bradocs4py/)\n[![GitHub top language](https://img.shields.io/github/languages/top/namio/BRADocs4Py.svg)](https://github.com/namio/BRADocs4Py.git)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/BRADocs4Py.svg)](https://pypi.org/project/bradocs4py/)\n[![PyPI - Wheel](https://img.shields.io/pypi/wheel/BRADocs4Py.svg)](https://pypi.org/project/bradocs4py/)\n[![PyPI - Implementation](https://img.shields.io/pypi/implementation/BRADocs4Py.svg)](https://pypi.org/project/bradocs4py/)\n[![GitHub](https://img.shields.io/github/license/namio/BRADocs4Py.svg)](https://github.com/namio/BRADocs4Py/blob/master/LICENSE)\n[![GitHub last commit](https://img.shields.io/github/last-commit/namio/BRADocs4PY.svg)](https://github.com/namio/BRADocs4Py.git)\n[![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](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.

\n

O 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 \n >>> print(ca)\n 2318 1106 8507 1300 0120 5500 1001 7668 2911 1103 0112\n >>> ca.rawValue\n '23181106850713000120550010017668291111030112'\n >>> ca.isValid\n True\n\n### ValidadorChaveAcessoNFe\n\nValida a consist\u00eancia e a integridade de uma inst\u00e2ncia de [ChaveAcessoNFe](#chave) ou uma _string_ contendo a representa\u00e7\u00e3o num\u00e9rica de uma Chave de Acesso, atrav\u00e9s do c\u00e1lculo de seu _d\u00edgito verificador_.\n\n> O **D\u00edgito Verificador** (DV) visa garantir a integridade da Chave de Acesso, protegendo-a principalmente contra digita\u00e7\u00f5es erradas.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> chave = ChaveAcessoNFe(35181298957205000164667451830925015791400679)\n >>> validarChaveAcessoNFe(chave)\n True\n >>> ValidadorChaveAcessoNFe.validar(52060433009911002506550120000007800267301615)\n True\n >>> ValidadorChaveAcessoNFe.validar('52060433009911002506550120000007800267301615')\n True\n >>> ValidadorChaveAcessoNFe.validar('52060433009911002506550120000007800267301625')\n False\n\n ou\n\n >>> validarChaveAcessoNFe(52060433009911002506550120000007800267301615)\n True\n >>> validarChaveAcessoNFe('52060433009911002506550120000007800267301615')\n True\n >>> validarChaveAcessoNFe('52060433009911002506550120000007800267301625')\n False\n >>> validarChaveAcessoNFe(chave)\n True\n\n\n#### C\u00e1lculo do d\u00edgito verificador\n\nO d\u00edgito verificador da chave de acesso da NF-e \u00e9 baseado em um c\u00e1lculo do m\u00f3dulo 11. O m\u00f3dulo 11 de um n\u00famero \u00e9 calculado multiplicando-se cada algarismo pela sequ\u00eancia de multiplicadores 2,3,4,5,6,7,8,9,2,3, ..., posicionados da direita para a esquerda.\n\nA somat\u00f3ria dos resultados das pondera\u00e7\u00f5es dos algarismos \u00e9 dividida por 11 e o DV (d\u00edgito verificador) ser\u00e1 a diferen\u00e7a entre o divisor (11) e o resto da divis\u00e3o:\n\nDV = 11 - (resto da divis\u00e3o)\n\n> Quando o resto da divis\u00e3o for 0 (zero) ou 1 (um), o DV dever\u00e1 ser igual a 0 (zero).\n\nExemplo: consideremos a seguinte chave de acesso: _52060433009911002506550120000007800267301615_\n\nIsolando o _d\u00edgito verificador_, temos: _5206043300991100250655012000000780026730161_\n\n|**Chave** | 5 | 2 | 0 | 6 | 0 | 4 | 3 | 3 | 0 | 0 | 9 | 9 | 1 | 1 | 0 | 0 | 2 | 5 | 0 | 6 | 5 | 5 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 8 | 0 | 0 | 2 | 6 | 7 | 3 | 0 | 1 | 6 | 1 |\n|:------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|\n|**Pesos** | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |\n|**Pondera\u00e7\u00e3o** |20 | 6 | 0 |54 | 0 |28 |18 |15 | 0 | 0 |18 |81 | 8 | 7 | 0 | 0 | 8 |15 | 0 |54 |40 |35 | 0 | 5 | 8 | 0 | 0 | 0 | 0 | 0 | 0 |35 |32 | 0 | 0 |18 |48 |49 |18 | 0 | 4 |18 | 2 |\n\n**Somat\u00f3rio das pondera\u00e7\u00f5es**: _644_\n\nDividindo o somat\u00f3rio das pondera\u00e7\u00f5es por **11**, temos: 644/11 = 58, restando **6**\n\nComo o d\u00edgito verificador (DV) = 11 - (resto da divis\u00e3o), temos: **11 - 6 = 5**\n\nNeste caso o DV da chave de acesso da NF-e \u00e9 igual a \"5\".\n\n#### Verifica\u00e7\u00e3o da _consist\u00eancia_ da Chave de Acesso\n\nPor ter uma [lei de forma\u00e7\u00e3o](#lfchave) peculiar, o _[ValidadorChaveAcessoNFe](#vchave)_ verifica a consist\u00eancia de uma determinada chave de acesso, observando:\n\n* se os dois primeiros d\u00edgitos correspondem ao c\u00f3digo, segundo o IBGE, de uma Unidade da Federa\u00e7\u00e3o Brasileira;\n* Se a data de emiss\u00e3o (**m\u00eas** e **ano**) *ano* de emiss\u00e3o n\u00e3o \u00e9 **posterior** \u00e0 data (m\u00eas e ano) atual;\n* Se o *m\u00eas* de emiss\u00e3o, que corresponde ao terceiro par de d\u00edgitos, corresponde ao valor de um dos meses do ano;\n* Se o *CNPJ* do emitente corresponde a um n\u00famero de CNPJ v\u00e1lido.\n\n> Desta forma, para que uma chave de acesso de NF-e seja v\u00e1lida, esta dever\u00e1 passar pelo c\u00e1lculo do D\u00edgito Verificador e pelo teste de consist\u00eancia.\n\n### GeradorChaveAcessoNFe\n\nGera uma [Chave de Acesso de NF-e](#chave) v\u00e1lida.\n\nA chave gerada pelo [GeradorChaveAcessoNFe](#gchave) obedece \u00e0s [regras de consist\u00eancia](#consistenciachave) anteriormente citadas.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> chave = GeradorChaveAcessoNFe.gerar()\n >>> chave\n \n >>> print(chave)\n 2518 1230 1738 3400 0160 6512 2705 9459 8418 3830 0521\n >>> chave.rawValue\n '25181230173834000160651227059459841838300521'\n >>> chave.isValid\n True\n\n OU\n\n >>> chave = gerarChaveAcessoNFe\n >>> chave\n \n >>> print(chave)\n 1118 1205 0017 0900 0125 6504 2852 2143 4939 5680 0409\n >>> chave.rawValue\n '11181205001709000125650428522143493956800409'\n >>> chave.isValid\n True\n\n\u00c9 poss\u00edvel passar para o gerador qualquer um dos seguintes par\u00e2metros, ou combina\u00e7\u00e3o deles:\n\n* UF - [Gera de uma chave de acesso para uma determinada Unidade da Federa\u00e7\u00e3o](#gchaveUF) Brasileira\n* anoEmissao - [Gera uma chave de acesso para um determinado ano de emiss\u00e3o](#gchaveAno)\n* mesEmissao - [Gera uma chave de acesso para um determinado m\u00eas de emiss\u00e3o](#gchaveMes)\n* cnpjEmitente - [Gera uma chave de acesso informando o CNPJ do emitente](#gchaveCNPJ)\n* modelo - [Gera uma chame de acesso informando o modelo do documento fiscal](#gchaveModelo)\n* serie - [Gera uma chave de acesso informando a s\u00e9rie do Documento Fiscal](#gchaveSerie)\n* numero - [Gera uma chave de acesso informando o n\u00faemro do Documento Fiscal](#gchaveNumero)\n* formaEmissao - [Gera uma chave de acesso informando o tipo de emiss\u00e3o da NF-e](#gchaveEmissao)\n\n##### Gerar uma chave de acesso para uma determinada Unidade da Federa\u00e7\u00e3o (23 - Cear\u00e1):\n\n >>> chave = GeradorChaveAcessoNFe.gerar(UF=23)\n >>> chave.rawValue\n '23181200840039000117652898295631409915000755'\n\n##### Gerar uma chave de acesso para um determinado ano:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(anoEmissao=2015)\n >>> chave.rawValue\n '23151289106950000109651490922639616463100456'\n\n##### Gerar uma chave de acesso para um determinado m\u00eas:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(mesEmissao=8)\n >>> chave.rawValue\n '15180853477826000102655678711686215463600041'\n\n##### Gerar uma chave de acesso para uma determinada data (m\u00eas e ano) de emiss\u00e3o:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(anoEmissao=2015, mesEmissao=1)\n >>> chave.rawValue\n '29150139480855000100653317092547617382300904'\n\n##### Gerar uma chave de acesso informando o CNPJ do emitente:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(cnpjEmitente='64802611000136')\n >>> chave.rawValue\n '13181264802611000136651456599176257515300837'\n\n##### Gerar uma chave de acesso de uma NF-e, utilizada nas opera\u00e7\u00f5es de venda no varejo (modelo de documento fiscal = 55)\n\n >>> chave = GeradorChaveAcessoNFe.gerar(modelo=55)\n >>> chave.rawValue\n '27181282761929000106555079534095503558300935'\n\n##### Gerar uma chave de acesso para uma NF-e que n\u00e3o possui s\u00e9rie:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(serie=0)\n >>> chave.rawValue\n '13181202699369000160650006987155021599900654'\n\n> Nota: A s\u00e9rie tamb\u00e9m pode ser informada como uma cadeia de caracteres num\u00e9ricos. No exemplo acima, poderia ter sido informado **'000'** para _serie_.\n\n##### Gerar uma chave de acesso informando o n\u00famero do documento fiscal:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(numero=1766829)\n >>> chave.rawValue\n '23181241761925000132652850017668297691400378'\n\n##### Gerar uma chave de acesso para uma NF-e emitida com Conting\u00eancia FS-IA, com impress\u00e3o do DANFE em formul\u00e1rio de seguran\u00e7a (Tipo de emiss\u00e30 = 2)\n\n >>> chave = GeradorChaveAcessoNFe.gerar(formaEmissao=2)\n >>> chave.rawValue\n '51181278981604000153656457693627102018200143'\n\nIsto posto, desejando-se criar uma chave de acesso emitida no Cear\u00e1 (C\u00f3digo IBGE=23) em Maio de 2016, para o CNPJ 64802611/0001-36, ter\u00edamos:\n\n >>> chave = GeradorChaveAcessoNFe.gerar(formaEmissao=2, UF=23, anoEmissao=2016, mesEmissao=5, cnpjEmitente=64802611000136)\n >>> chave.rawValue\n '23160564802611000136554038699639442073100081'\n >>> chave.isValid\n True\n\n> **Aten\u00e7\u00e3o**: a forma abreviada do gerador _(gerarChaveAcessoNFe)_ n\u00e3o permite a passagem de par\u00e2metros.\n\n### GTIN\n\nRepresenta um N\u00famero Global do Item Comercial - Global Trade Item Number (GTIN)\n\nO GTIN \u00e9 um identificador para itens comerciais desenvolvido e controlado pela [GS1][gs1], antiga EAN/UCC. Os GTINs,\nanteriormente chamados de c\u00f3digos EAN, s\u00e3o atribu\u00eddos para qualquer item (produto ou servi\u00e7o) que pode ser\nprecificado, pedido ou faturado em qualquer ponto da cadeia de suprimentos. O GTIN \u00e9 utilizado para recuperar\ninforma\u00e7\u00e3o pr\u00e9-definida e abrange desde as mat\u00e9rias primas at\u00e9 produtos acabados. GTIN \u00e9 um termo \u201cguarda-chuva\u201d\npara descrever toda a fam\u00edlia de identifica\u00e7\u00e3o das estruturas de dados GS1 para itens comerciais (produtos e servi\u00e7os).\nOs GTINs podem ter o tamanho de 8, 12, 13 ou 14 d\u00edgitos e podem ser constru\u00eddos utilizando qualquer uma das quatro\nestruturas de numera\u00e7\u00e3o dependendo da aplica\u00e7\u00e3o. O GTIN-8 \u00e9 codificado no c\u00f3digo de barras EAN-8. O GTIN-12 \u00e9 mais\nutilizado no c\u00f3digo de barras UPC-A, o GTIN-13 \u00e9 codificado no EAN-13 e o GTIN-14 no ITF-14.\n\n#### Utiliza\u00e7\u00e3o\n\n##### Criando uma inst\u00e2ncia de [GTIN](#gtin) a partir de um inteiro\n\n >>> gtin = GTIN(6291041500213)\n >>> gtin\n \n >>> gtin.rawValue\n '6291041500213'\n >>> gtin.isValid\n True\n\n##### Criando uma inst\u00e2ncia de [GTIN](#gtin) a partir de uma cadeia de caracteres num\u00e9ricos\n\n >>> gtin = GTIN('35723189')\n >>> gtin\n \n >>> gtin.rawValue\n '35723189'\n >>> gtin.isValid\n True\n\n### ValidadorGTIN\n\nValida uma inst\u00e2ncia de GTIN, um inteiro ou uma cadeia de caracteres num\u00e9ricos que representa um GTIN, a partir do [c\u00e1lculo de seu d\u00edgito verificador][calculo-digito-gtin], o qual assegura a sua integridade.\n\n> Nota: Muito embora o ValidadorGTIN valide uma inst\u00e2ncia de GTIN, a valida\u00e7\u00e3o desta inst\u00e2ncia pode ser verificada atrav\u00e9s da sua propriedade _isValid_, conforme exemplos acima.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> gtin = GTIN('35723189')\n >>> ValidadorGTIN.validar(gtin)\n True\n >>> ValidadorGTIN.validar('3572318')\n False\n >>> ValidadorGTIN.validar('35723189')\n True\n >>> ValidadorGTIN.validar(6291041500213)\n True\n >>> ValidadorGTIN.validar('62910415OO213')\n False\n\n**OU**\n\n >>> gtin = GTIN('35723189')\n >>> validar_gtin(gtin)\n True\n >>> validar_gtin('3572318')\n False\n >>> validar_gtin('35723189')\n True\n >>> validar_gtin(6291041500213)\n True\n >>> validar_gtin('62910415OO213')\n False\n\n### GeradorGTIN\n\nGera uma inst\u00e2ncia de um [GTIN](#gtin) v\u00e1lido.\n\n>IMPORTANTE: Este gerador de GTIN tem como inten\u00e7\u00e3o ajudar estudantes, programadores, analistas e testadores de sistemas computacionais a gerar GTINs v\u00e1lidas. Normalmente necess\u00e1rias parar testar seus softwares em desenvolvimento. A m\u00e1 utiliza\u00e7\u00e3o dos dados aqui gerados \u00e9 de total responsabilidade do usu\u00e1rio. Os n\u00fameros s\u00e3o gerados de forma aleat\u00f3ria, respeitando as regras de cria\u00e7\u00e3o de um GTIN.\n\n#### Utiliza\u00e7\u00e3o\n\n >>> gtin = GeradorGTIN.gerar()\n >>> gtin\n \n\n**ou**\n\n >>> gtin = gerar_gtin()\n >>> gtin\n \n\n\u00c9 poss\u00edvel informar ao gerador o tipo de GTIN que se deseja gerar. Para isso, deve-se passar o _GeradorGTIN.TipoGTIN_ desejado.\n\n##### Para gerar um GTIN-8\n\n >>> gtin = GeradorGTIN.gerar(GeradorGTIN.TipoGTIN.GTIN8)\n >>> gtin\n \n\nTamb\u00e9m \u00e9 poss\u00edvel gerar GTINs chamando diretamente _gerar_gtin_:\n\n >>> gtin = gerar_gtin(GeradorGTIN.TipoGTIN.GTIN13)\n >>> gtin\n \n\nUtilize:\n\n* GeradorGTIN.TipoGTIN.GTIN8 para gerar GTIN-8\n* GeradorGTIN.TipoGTIN.GTIN12 para gerar GTIN-12\n* GeradorGTIN.TipoGTIN.GTIN13 para gerar GTIN-13, ou\n* GeradorGTIN.TipoGTIN.GTIN14 para gerar GTIN-14\n\n> Se n\u00e3o for passado nenhum tipo para o gerador, este gerar\u00e1 sempre um GTIN-8.\n\n[gs1]: https://www.gs1br.org\n[calculo-digito-gtin]: https://www.gs1.org/services/how-calculate-check-digit-manually\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/namio/BRADocs4Py.git", "keywords": "cpf cnpj documentos brasileiros receita federal", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "bradocs4py", "package_url": "https://pypi.org/project/bradocs4py/", "platform": "", "project_url": "https://pypi.org/project/bradocs4py/", "project_urls": { "Homepage": "https://github.com/namio/BRADocs4Py.git" }, "release_url": "https://pypi.org/project/bradocs4py/1.3.1.0/", "requires_dist": null, "requires_python": ">=3", "summary": "Implementa a funcionalidade validar_inscao_estadual.", "version": "1.3.1.0" }, "last_serial": 5673389, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "3c48049d997cda5c1a06dc6b544cca8e", "sha256": "e951c03ccf89b92efc32e119fe5eb769610fdf4bece728fe7f04b5af698df253" }, "downloads": -1, "filename": "bradocs4py-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3c48049d997cda5c1a06dc6b544cca8e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28197, "upload_time": "2018-12-14T20:17:54", "url": "https://files.pythonhosted.org/packages/83/42/e81a7463769a685a9ded8d3022880c2177de5bcfbeb2899ad342f947ce0c/bradocs4py-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c1ea1674576d591b69f237c69148c76d", "sha256": "74032e5154ef044715e23722934c9530c9e58b8e2aa5cefd12c1b783750ae0df" }, "downloads": -1, "filename": "bradocs4py-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c1ea1674576d591b69f237c69148c76d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11796, "upload_time": "2018-12-14T20:17:55", "url": "https://files.pythonhosted.org/packages/68/a8/70cc5e407ff5a7af11214c737f79dbe81ebd8cb43dc12c2a03c259ef28ee/bradocs4py-1.0.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5794568716d7ab498553fb65132ea718", "sha256": "d838717cffeb1c0bc239c8f3ea0764d064ea2d283244fe67f9a29ee86f45d290" }, "downloads": -1, "filename": "bradocs4py-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5794568716d7ab498553fb65132ea718", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31264, "upload_time": "2018-12-17T18:13:30", "url": "https://files.pythonhosted.org/packages/3e/56/1e035fb5294a3e7c83ab7c8de6e62faed793960c60ef198bd016e239681d/bradocs4py-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bc2fde8a944a1b92393364c2e8612716", "sha256": "a9732c560e80c28f8c87a75a566c0bfac8a510760882bd34aca363d62e56395e" }, "downloads": -1, "filename": "bradocs4py-1.1.1.tar.gz", "has_sig": false, "md5_digest": "bc2fde8a944a1b92393364c2e8612716", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16518, "upload_time": "2018-12-17T18:13:33", "url": "https://files.pythonhosted.org/packages/51/ab/3a338a5fe8cafd9e4db56b5bac92e752f40e0f0dc47f2f7889ad72de6c09/bradocs4py-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "919d655c92ec6a8e5de19c8980041a14", "sha256": "305e54f52c2db65a77c99f072a9e056b9f141aae2808e07a3aac7de68adc3831" }, "downloads": -1, "filename": "bradocs4py-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "919d655c92ec6a8e5de19c8980041a14", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 40881, "upload_time": "2019-02-22T00:51:16", "url": "https://files.pythonhosted.org/packages/c0/28/7d438c6dde29bac5b2c85736a846a4196edab28e9a8edca0c54557d10bcd/bradocs4py-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "65171fdc50bd5a024157a598a6c25693", "sha256": "590afb0f62d4eed1f67345bcdcd2e4e44dc73d5c6cf9df269f6d5d90d2534cb1" }, "downloads": -1, "filename": "bradocs4py-1.2.0.tar.gz", "has_sig": false, "md5_digest": "65171fdc50bd5a024157a598a6c25693", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 32401, "upload_time": "2019-02-22T00:51:19", "url": "https://files.pythonhosted.org/packages/65/f0/3a84f764928911468cac6184b39e59dd6587510bee3c4dc7494aef9e0602/bradocs4py-1.2.0.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "6937547ee2b198840b682761d812f7e4", "sha256": "eff5d5a7aba6904f70ee5a1a87a0b8906e0045ba082d56788cbc77f0d1d8ab9c" }, "downloads": -1, "filename": "bradocs4py-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6937547ee2b198840b682761d812f7e4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41089, "upload_time": "2019-06-06T20:09:49", "url": "https://files.pythonhosted.org/packages/e8/72/ac1fc61972209867f38a05473e9a31184efe10bd1d57adaa57d0bfd1555f/bradocs4py-1.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f98d9d69610cdf3f273c5e47aae13f6", "sha256": "a3c32d5292980a435549d95385ca03eda46cfe5106f917e774c5b902c17a63c0" }, "downloads": -1, "filename": "bradocs4py-1.2.2.tar.gz", "has_sig": false, "md5_digest": "9f98d9d69610cdf3f273c5e47aae13f6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33415, "upload_time": "2019-06-06T20:09:55", "url": "https://files.pythonhosted.org/packages/4b/ed/d21c163e896b26f4ad821d053cc2690a7eec3c94b2ab526599cefc058f2a/bradocs4py-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "39ee83dbd11877cd2d85d82829b4912d", "sha256": "a1b6d04c93f9960cb35d19da9c6f7aa8aa10475aac4475e08873dbebee4310c2" }, "downloads": -1, "filename": "bradocs4py-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "39ee83dbd11877cd2d85d82829b4912d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41116, "upload_time": "2019-07-11T23:50:43", "url": "https://files.pythonhosted.org/packages/47/3c/1b5bf325fa56117ff67fc0fc6f5719ef85701da922a0301f090b5f6debf8/bradocs4py-1.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76001a7a8c296647e2b24edac580ce18", "sha256": "e6ca2afdc1334a5f0f416f565e0a413446ad6cc63e13348fc8691566a6fcb905" }, "downloads": -1, "filename": "bradocs4py-1.2.3.tar.gz", "has_sig": false, "md5_digest": "76001a7a8c296647e2b24edac580ce18", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33399, "upload_time": "2019-07-11T23:50:51", "url": "https://files.pythonhosted.org/packages/45/44/290292292beb89e17cd3d32608df030dde14b4fa108b83ec0c72dff1c17b/bradocs4py-1.2.3.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "3636bc1e7f333b5a7112e8ec99c1a42d", "sha256": "e104fff1d2046a409b45fbfe85d96e77a0456c292e510e72909803fe29302dc6" }, "downloads": -1, "filename": "bradocs4py-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3636bc1e7f333b5a7112e8ec99c1a42d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41132, "upload_time": "2019-07-18T13:58:10", "url": "https://files.pythonhosted.org/packages/4b/14/082a3690daf27e5bc8d2310f015eea8d15af5e184140c9b35bc53e65b68b/bradocs4py-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2fdd7f75fbbe791afca7c9b906e3170e", "sha256": "2551da137408870dc43079479f21e05c50ebb65ebbc2d6107ec3078302600474" }, "downloads": -1, "filename": "bradocs4py-1.3.0.tar.gz", "has_sig": false, "md5_digest": "2fdd7f75fbbe791afca7c9b906e3170e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33375, "upload_time": "2019-07-18T13:58:17", "url": "https://files.pythonhosted.org/packages/b6/73/d100d13fd512159f0dfd0279731f4c47df7d55c12b229c3e293b2412f100/bradocs4py-1.3.0.tar.gz" } ], "1.3.1.0": [ { "comment_text": "", "digests": { "md5": "15455454133cb2732b2e1c9f690a5544", "sha256": "97cf170e40d322c21d605052f6d55e0814f5a6e44dc9399bff76228835f1e4f4" }, "downloads": -1, "filename": "bradocs4py-1.3.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "15455454133cb2732b2e1c9f690a5544", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41196, "upload_time": "2019-08-13T20:00:25", "url": "https://files.pythonhosted.org/packages/f8/51/a01168758327283b94f4702f0c7d53b1e3a0c42127a6dd94d3f57c79cb11/bradocs4py-1.3.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5cccc6d7c4ac21196106fa5e6e303a2c", "sha256": "6991508a3a9448a626318eb5d59a409cff4177815b6bad3f3244fb1810149029" }, "downloads": -1, "filename": "bradocs4py-1.3.1.0.tar.gz", "has_sig": false, "md5_digest": "5cccc6d7c4ac21196106fa5e6e303a2c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33398, "upload_time": "2019-08-13T20:00:34", "url": "https://files.pythonhosted.org/packages/55/d0/b448136daeec51703d557700540749d1ec7a4d734997b040c1d233e27ae1/bradocs4py-1.3.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "15455454133cb2732b2e1c9f690a5544", "sha256": "97cf170e40d322c21d605052f6d55e0814f5a6e44dc9399bff76228835f1e4f4" }, "downloads": -1, "filename": "bradocs4py-1.3.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "15455454133cb2732b2e1c9f690a5544", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41196, "upload_time": "2019-08-13T20:00:25", "url": "https://files.pythonhosted.org/packages/f8/51/a01168758327283b94f4702f0c7d53b1e3a0c42127a6dd94d3f57c79cb11/bradocs4py-1.3.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5cccc6d7c4ac21196106fa5e6e303a2c", "sha256": "6991508a3a9448a626318eb5d59a409cff4177815b6bad3f3244fb1810149029" }, "downloads": -1, "filename": "bradocs4py-1.3.1.0.tar.gz", "has_sig": false, "md5_digest": "5cccc6d7c4ac21196106fa5e6e303a2c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 33398, "upload_time": "2019-08-13T20:00:34", "url": "https://files.pythonhosted.org/packages/55/d0/b448136daeec51703d557700540749d1ec7a4d734997b040c1d233e27ae1/bradocs4py-1.3.1.0.tar.gz" } ] }