Essa biblioteca utiliza a API do Redmine para extrair informações da plataforma Fiscaliza da Anatel e atualizar inspeções
Project description
Fiscaliza
Scripts para baixar informações sobre inspeções no Sistema Fiscaliza da Anatel e atualizar inspeções por meio da API do Redmine.
from nbdev.showdoc import show_doc
from getpass import getuser, getpass
from fiscaliza.redmine import detalhar_inspecao, validar_dicionario, relatar_inspecao
from rich.console import Console
console = Console()
Instalação
pip install fiscaliza
Como utilizar
O Fiscaliza
da Anatel é um sistema web que utiliza a plataforma Redmine. É basicamente um softaware de gerenciamento e atividades.
O Fiscaliza possui 2 módulos para os fiscais utilizarem:
- Módulo de Teste ( Homologação ) : "https://sistemashm.anatel.gov.br/fiscaliza"
- Módulo de Produção: "https://sistemas.anatel.gov.br/fiscaliza/"
Ambos módulos precisam de um usuário e senha com acesso autorizado, em geral somente servidores da Anatel.
O Escopo desse módulo basicamente está encapsulado em 3 funções básicas:
- detalhar_inspecao - Retorna as informações do estado atual da Issue ( Inspeção )
- validar_dicionario - Para dado dicionário de dados, formata-o para a API do Redmine
- relatar_inspecao - Atualiza e Issue com o dicionário de dados passado
{% include note.html content='O escopo da terceira função
relatar_inspecao
possui escopo limitado. Atualmente somente é formatado e relatado Inspeções ( Issue ) to tipo "Uso do Espectro - Monitoração". Essa inspeção é a principal utilizada para as atividades de monitoração da Anatel e foi o que motivou a criação da presente biblioteca. Outras inspeções possuem campos distintos e assim exigem formatação distinta. Versões futuras poderão abarcar o relato de diferentes inspeções. ' %}
show_doc(detalhar_inspecao)
detalhar_inspecao
[source]
> detalhar_inspecao
(**`inspecao`**:`str`, **`login`**:`str`=*`None`*, **`senha`**:`str`=*`None`*, **`fiscaliza`**:`Redmine`=*`None`*, **`teste`**:`bool`=*`True`*)
Recebe número da inspeção `inspecao`, o login e senha ou opcionalmente objeto Redmine logado `fiscaliza`
inspecao: str - Número da Inspeção a ser relatada
login: str - Login Anatel do Usuário
senha: str - Senha Utilizada nos Sistemas Interativos da
fiscaliza: Redmine - Objeto Redmine logado, opcional ao login e senha
teste: bool - Caso verdadeiro o Fiscaliza de Teste ( Homologação ) é utilizado
Returns: dict: Retorna um dicionário com a Situação Atual e campos preenchidos da Inspeção
Vamos exemplificar a Inspeção de Teste 57684
login = getuser()
senha = getpass()
inspecao = '57684'
··········
detalhes = detalhar_inspecao(inspecao, login, senha)
for k,v in detalhes.items():
console.print(f'[red]{k} [blue]-> [green]{v}')
id -> 57684
subject -> INSP_GR01_2021_0504
status -> Rascunho
priority -> Normal
start_date ->
due_date ->
Classe da Inspeção ->
Tipo de inspeção ->
Ano -> 2021
Número Sei do Processo -> {"numero"=>"53504.000007/2021-50", "link_acesso"=>"https://seihm.an atel.gov.br/sei/controlador.php?acao=procedimento_trabalhar&id_procedimento=1962455"}
Descrição da Inspeção ->
Fiscal Responsável ->
Fiscais -> []
Entidade da Inspeção -> []
UF/Município -> []
Serviços da Inspeção -> []
Horas de Preparação ->
Horas de Deslocamento ->
Horas de Execução ->
Horas de Conclusão ->
SAV ->
PCDP ->
Procedimentos -> []
Agrupamento ->
AppFiscaliza -> 0
id_ACAO -> 52876
nome_ACAO -> ACAO_GR01_2021_0491
descrição_ACAO -> Teste
Users -> ['Alexandre Elias de Andrade Oliveira', 'Alexandre Freitas de Lima', 'Alexandre Inacio', 'Alexandre Junzo Hamada', 'Alfredo de Andrade Filho', 'Ananias Pereira', 'Antonio Carlos Cardoso de Mello', 'Aparecido Sebastiao da Silva', 'Arthur Pisaruk', 'Carlos Augusto de Carvalho', 'Carlos Eduardo Guimaraes Silveira', 'Carlos da Paixao Filho', 'Celio Yukio Takahashi', 'Celso Luiz Maximino', 'Diogo Caldeira', 'Ediceu Beraldi', 'Eduardo Narkevicius', 'Elcio Maehara', 'Eustaquio Lages Duarte', 'Fiscal UD', 'Gauber Albuquerque', 'Gilson Ponce Ayres Filho', 'Helio Lopes de Carvalho Filho', 'Higor Paz Melo', 'Hugo Santana Lima', 'Humberto Barbosa Vinagre', 'Jamilson Evangelista', 'Joao Yokoyama', 'Joaquim Miranda', 'José Antônio S. Sanches', 'Julio Cesar de Assis Santos', 'Kiyotomo Kawamura', 'Laert Calil Junior', 'Lannei Vilela Moraes', 'Luis Lagomes', 'Luiz Vinicios Mielniczuk Seelig', 'Marcelo Augusto Scacabarozi', 'Marcio Costa', 'Marcio Rodrigues Maciel', 'Marcos Antônio Rodrigues', 'Marcos Juliano Valim da Silva', 'Maria Teresa Flosi Garrafa', 'Mario Augusto Volpini', 'Murilo Amaro', 'Osnir Lopes', 'Paulo Diogo Costa', 'Pedro Arai', 'Renato Sadao Kushioyada', 'Ricardo Santos Marques', 'Ricardo da Silva e Souza', 'Roberto Carlos Soares Campos', 'Roberto Ferreira dos Santos', 'Roberto Takata', 'Rodrigo Barbosa de Paula', 'Rogerio Zambotto', 'Ronaldo da Silva Alves Batista', 'Sergio Pereira', 'Thiago Silva', 'Thomaz Honma Ishida', 'Vinicius Paiva de Oliveira', 'Vitor Zelada', 'Wellington Devechi Piauilino', 'Wladimir Senise', 'marcio colazingari']
Agora vamos testar o retorno de informações para um Inspeção no Fiscaliza de produção teste=False
.
inspecao = '51804'
detalhes = detalhar_inspecao(inspecao, login, senha, teste=False)
for k,v in detalhes.items():
console.print(f'[blue]{k} [red]-> [green]{v}')
id -> 51804
subject -> INSP_GR01_2021_0449
status -> Conferida
priority -> Normal
start_date -> 2020-10-22
due_date -> 2021-03-31
Classe da Inspeção -> Técnica
Tipo de inspeção -> Uso do Espectro - Monitoração
Ano -> 2021
178 ->
Número Sei do Processo -> {"numero"=>"53504.006733/2020-03", "link_acesso"=>"https://sei.anat el.gov.br/sei/controlador.php?acao=procedimento_trabalhar&id_procedimento=6892566"}
Descrição da Inspeção -> Atendimento da Denúncia AC202010213075425 (6104512), verificação da Potência e Intensidade de Campo Elétrico da Frequência 105.1MHz e seus harmônicos, além da checagem de Intermodulação e Espúrios nas frequências 450.3MHz e 750MHz.
Fiscal Responsável -> Ronaldo da Silva Alves Batista
Fiscais -> ['Ronaldo da Silva Alves Batista']
Entidade da Inspeção -> ['{"valor":"30913990000110","texto":"SISTEMA TRANSRIO DE COMUNICACAO LTDA (30913990000110)"}']
UF/Município -> ['RJ/Rio de Janeiro']
Serviços da Inspeção -> ['230 - COLETIVO - RADIODIFUSÃO SONORA EM FREQÜÊNCIA MODULADA']
Qnt. de emissões na faixa -> 1
Emissões não autorizadas/desc -> 0
Horas de Preparação -> 2
Horas de Deslocamento -> 0
Horas de Execução -> 32
Horas de Conclusão -> 6
SAV ->
PCDP ->
Procedimentos -> []
Latitude (coordenadas) -> -22.94694
Longitude (coordenadas) -> -43.21944
Uso de PF -> Não se aplica PF - uso apenas de formulários
Ação de risco à vida criada? -> Não
Frequência Inicial -> 105.1
Unidade da Frequência Inicial -> MHz
Frequência Final -> 750
Unidade da Frequência Final -> MHz
Agrupamento ->
AppFiscaliza -> 0
596 ->
598 ->
id_ACAO -> 51803
nome_ACAO -> ACAO_GR01_2021_0456
descrição_ACAO -> Atendimento à Denúncia AC202010213075425 (6104512)
Users -> ['Alexandre Elias de Andrade Oliveira', 'Alexandre Freitas de Lima', 'Alexandre Inacio', 'Alexandre Junzo Hamada', 'Alfredo de Andrade Filho', 'Ananias Pereira', 'Antonio Carlos Cardoso de Mello', 'Aparecido Sebastiao da Silva', 'Arthur Pisaruk', 'Carlos Augusto de Carvalho', 'Carlos Eduardo Guimaraes Silveira', 'Carlos da Paixao Filho', 'Celio Yukio Takahashi', 'Celso Luiz Maximino', 'Diogo Caldeira', 'Ediceu Beraldi', 'Eduardo Narkevicius', 'Elcio Maehara', 'Eustaquio Lages Duarte', 'Fiscal UD', 'Gauber Albuquerque', 'Gilson Ponce Ayres Filho', 'Helio Lopes de Carvalho Filho', 'Higor da Paz Melo', 'Hugo Santana Lima', 'Humberto Barbosa Vinagre', 'Jamilson Evangelista', 'Joao Yokoyama', 'Joaquim Miranda', 'José Antônio S. Sanches', 'Julio Cesar de Assis Santos', 'Kiyotomo Kawamura', 'Laert Calil Junior', 'Lannei Vilela Moraes', 'Luis Lagomes', 'Luiz Vinicios Mielniczuk Seelig', 'Marcelo Augusto Scacabarozi', 'Marcelo Vaz Netto', 'Marcio Colazingari', 'Marcio Costa', 'Marcio Rodrigues Maciel', 'Marcos Antônio Rodrigues', 'Marcos Juliano Valim da Silva', 'Maria Teresa Flosi Garrafa', 'Mario Augusto Volpini', 'Murilo Amaro', 'Osnir Lopes', 'Paulo Diogo Costa', 'Pedro Arai', 'Renato Sadao Kushioyada', 'Ricardo Santos Marques', 'Ricardo da Silva e Souza', 'Roberto Carlos Soares Campos', 'Roberto Ferreira dos Santos', 'Roberto Takata', 'Rodrigo Barbosa de Paula', 'Rogerio Zambotto', 'Ronaldo da Silva Alves Batista', 'Sergio Pereira', 'Thiago Silva', 'Thomaz Honma Ishida', 'Vinicius Paiva de Oliveira', 'Vitor Zelada', 'Wellington Devechi Piauilino', 'Wladimir Senise']
Dicionário de Dados
A função anterior somente retorna as informações já constantes em dada Inspeção ( Issue ) do Fiscaliza. Para alterarmos ou atualizarmos dada inspeção, precisamos passar um dicionário de dados ou um caminho para um arquivo .json
ou pickle .pkl
onde conste esse dicionário de dados serializado. O exemplo seguinte mostra um dicionário de dados com as informações básicas constantes de uma monitoração e a formatação que elas são validadas:
d = {}
d['Classe da Inspeção'] = 'Técnica' # str
d['Tipo de inspeção'] = 'Uso do Espectro - Monitoração' #str
d['Descrição da Inspeção'] = '''Atendimento da Denúncia AC202010213075425 (6104512),
verificação da Potência e Intensidade de Campo Elétrico da Frequência 105.1MHz e seus harmônicos,
além da checagem de Intermodulação e Espúrios nas frequências 450.3MHz e 750MHz.''' #str
d['Fiscal Responsável'] = 'Ronaldo da Silva Alves Batista' #str
d['Fiscais'] = ['Ronaldo da Silva Alves Batista', 'Paulo Diogo Costa', 'Mario Augusto Volpini'] #string ou lista de strings
# Windows
d['Html'] = 'D:\\OneDrive - ANATEL\\Monitoramento\\Processos\\53504.0005432021-55\\Guarulhos.html' #str
#ou
#Unix d['Html'] = '/d/OneDrive - ANATEL/Monitoramento/53504.0005432021-55/Guarulhos.html' #str
d['Gerar Relatório'] = 1 # int 0 ou 1
d['Frequência Inicial'] = 54 #int ou float
d['Unidade da Frequência Inicial'] = 'MHz' #string
d['Frequência Final'] = 700 #int ou float
d['Unidade da Frequência Final'] = 'MHz' #string
d['Data de Início'] = '2021-03-19' #YYYY-MM-DD #string nesse formato
d['Data Limite'] = '2021-12-31' #YYYY-MM-DD #string nesse formato
d['UF/Município'] = "SP/São Paulo" # string ou Lista de Strings: ["SP/São Paulo", "SP/Sorocaba"]
d['Serviços da Inspeção'] = ['230', '231', '800'] # String ou Lista de Strings
d['Qnt. de emissões na faixa'] = 12 # int
d['Emissões não autorizadas/desc'] = 70 # int
d['Horas de Preparação'] = 2 # int
d['Horas de Deslocamento'] = 0 # int
d['Horas de Execução'] = 32 # int
d['Horas de Conclusão'] = 6 # int
d['Latitude (coordenadas)'] = -22.94694 # float
d['Longitude (coordenadas)'] = -43.21944 # float
d['Uso de PF'] = 'Não se aplica PF - uso apenas de formulários' # string
d['Ação de risco à vida criada?'] = 'Não' # string Sim | Não
d['Impossibilidade acesso online?'] = '0' # string '0' | '1'
d['Reservar Instrumentos?'] = '0' #string '0' = Não | '1' = 'Sim'
d['Utilizou algum instrumento?'] = '0'
#d['Reserva de Instrumentos'] = ''
d['Notes'] = "Não foi constatada irregularidade no Período monitorado" # string
# No caso de uma tabela, string formatada como csv
d['Notes'] = """Faixa, Classe Especial, Classe A, Classe B, Classe C
VHF-L,0,5,7,5
VHF-H,0,12,1,0
UHF,1,1,2,4
FM,5,1,0,0
RADCOM,0,0,0,0
Outorgadas com indícios de irregularidades,1,2,3,4
"""
A API do Redmine possui formatos específicos de como esses campos devem ser submetidos, validar os formatos acima e fazer essa formatação exigida pela API do Redmine é o papel da função validar_dicionario
.
show_doc(validar_dicionario)
validar_dicionario
[source]
> validar_dicionario
(**`data_dict`**:"Dicionário de Dados ou Caminho para o arquivo .json ou .pkl", **`inspecao`**:"Número da Inspeção a ser relatada", **`login`**:"Login Anatel do Usuário"=*`None`*, **`senha`**:"Senha Utilizada nos Sistemas Interativos da Anatel"=*`None`*, **`fiscaliza`**:"Objeto Redmine logado, opcional ao login e senha"=*`None`*, **`teste`**:"Caso verdadeiro o Fiscaliza de Teste ( Homologação ) é utilizado"=*`True`*)
inspecao = '57684'
dados = validar_dicionario(d, inspecao, login, senha)
for k,v in dados.items():
if k == "Html":
v = str(v)
v = v[:100] + '\n...\n' + v[-100:]
console.print(f'[blue]{k} [red]-> [green]{v}')
Classe da Inspeção -> {'id': 89, 'value': '{"valor":"Técnica","texto":"Técnica"}'}
Tipo de inspeção -> {'id': 2, 'value': '{"valor":"Uso do Espectro - Monitoração","texto":"Uso do Espectro - Monitoração"}'}
Descrição da Inspeção -> {'id': 22, 'value': 'Atendimento da Denúncia AC202010213075425 (6104512), \nverificação da Potência e Intensidade de Campo Elétrico da Frequência 105.1MHz e seus harmônicos, \nalém da checagem de Intermodulação e Espúrios nas frequências 450.3MHz e 750MHz.'}
Fiscal Responsável -> {'id': 25, 'value': 'Ronaldo da Silva Alves Batista'}
Fiscais -> {'id': 26, 'value': ['Ronaldo da Silva Alves Batista', 'Paulo Diogo Costa', 'Mario Augusto Volpini']}
Html -> {'id': 537, 'value': '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/ ... nte do exposto, conclui-se este relatório de\n\t\tatividades.\n\t</p>\n\n</body>\n\n</html>'}
Gerar Relatório -> {'id': 534, 'value': 1}
Frequência Inicial -> {'id': 156, 'value': 54}
Unidade da Frequência Inicial -> {'id': 157, 'value': 'MHz'}
Frequência Final -> {'id': 158, 'value': 700}
Unidade da Frequência Final -> {'id': 159, 'value': 'MHz'}
Data de Início -> 2021-03-19
Data Limite -> 2021-12-31
UF/Município -> {'id': 31, 'value': ['{"valor":"SP/São Paulo","texto":"SP/São Paulo"}']}
Serviços da Inspeção -> {'id': 57, 'value': ['{"valor":"230 - COLETIVO - RADIODIFUSÃO SONORA EM FREQÜÊNCIA MODULADA","texto":"230 - COLETIVO - RADIODIFUSÃO SONORA EM FREQÜÊNCIA MODULADA"}', '{"valor":"231 - COLETIVO - RADIODIFUSÃO COMUNITÁRIA","texto":"231 - COLETIVO - RADIODIFUSÃO COMUNITÁRIA"}', '{"valor":"800 - COLETIVO - RETRANSMISSAO DE T.V.","texto":"800 - COLETIVO - RETRANSMISSAO DE T.V."}']}
Qnt. de emissões na faixa -> {'id': 69, 'value': 12}
Emissões não autorizadas/desc -> {'id': 70, 'value': 70}
Horas de Preparação -> {'id': 91, 'value': 2}
Horas de Deslocamento -> {'id': 92, 'value': 0}
Horas de Execução -> {'id': 93, 'value': 32}
Horas de Conclusão -> {'id': 94, 'value': 6}
Latitude (coordenadas) -> {'id': 170, 'value': -22.94694}
Longitude (coordenadas) -> {'id': 171, 'value': -43.21944}
Uso de PF -> {'id': 151, 'value': 'Não se aplica PF - uso apenas de formulários'}
Ação de risco à vida criada? -> {'id': 154, 'value': 'Não'}
Impossibilidade acesso online? -> {'id': 450, 'value': '0'}
Reservar Instrumentos? -> {'id': 658, 'value': '0'}
Utilizou algum instrumento? -> {'id': 660, 'value': '0'}
Notes -> |_. Faixa |_. Classe Especial |_. Classe A |_. Classe B |_. Classe C | |<. VHF-L |>. 0 |>. 5 |>. 7 |>. 5 | |<. VHF-H |>. 0 |>. 12 |>. 1 |>. 0 | |<. UHF |>. 1 |>. 1 |>. 2 |>. 4 | |<. FM |>. 5 |>. 1 |>. 0 |>. 0 | |<. RADCOM |>. 0 |>. 0 |>. 0 |>. 0 | |<. Outorgadas com indícios de irregularidades |>. 1 |>. 2 |>. 3 |>. 4 |
Relatar Inspeção
A função a seguir é a mais importante do módulo porque ela de fato altera os dados na plataforma Fiscaliza.
show_doc(relatar_inspecao)
relatar_inspecao
[source]
> relatar_inspecao
(**`login`**:"Login Anatel do Usuário", **`senha`**:"Senha Utilizada nos Sistemas Interativos da Anatel", **`inspecao`**:"Número da Inspeção a ser relatada", **`dados`**:"Dicionário com os Dados a serem relatados", **`teste`**:"Indica se o relato será de teste"=*`True`*)
Relata a inspeção `inspecao` com os dados constantes no dicionário `dados`
inspecao = '57684'
relatar_inspecao(login, senha, inspecao, dados=dados, teste=True)
Usuário Autenticado com Sucesso 👍
Inspeção 57684 vinculada à Ação {'id_ACAO': 52876, 'nome_ACAO': 'ACAO_GR01_2021_0491', 'descrição_ACAO': 'Teste'}
Estado Atual: Aguardando Execução ❗
Sucesso ✨
Estado Atual: Em andamento ❗
Sucesso ✨
Assine o Relatório de Monitoramento: {"numero"=>"0190565", "link_acesso"=>"https://seihm.anat el.gov.br/sei/controlador.php?acao=procedimento_trabalhar&id_procedimento=1962455&id_document o=1962827"} e chame a função novamente ❗
O dicionário de dados possui os dados completos obrigatórios para o relato, no entanto o relato é feito em algumas etapas, utilizando somente algumas das informações do dicionário:
Rascunho
paraAguardando Execução
Aguardando Execução
paraEm Andamento
Em Andamento
paraRelatando
Relatando
paraRelatada
Na terceira etapa é gerado um relatório da monitoração no Sistema Eletrônico de Informações - SEI. Para executar a quarta etapa é preciso que esse relatório da terceira etapa esteja assinado. Por essa razão a função para na terceira etapa e informa da necessidade do relatório estar assinado.
Após o relatório ser assinado basta chamar a função com os mesmos argumentos para que a etapa final seja realizada.
estado = relatar_inspecao(login, senha, inspecao, dados=dados, teste=True)
Usuário Autenticado com Sucesso 👍
Inspeção 57684 vinculada à Ação {'id_ACAO': 52876, 'nome_ACAO': 'ACAO_GR01_2021_0491', 'descrição_ACAO': 'Teste'}
Sucesso ✨
Estado Atual: Relatada ❗
Inspeção Relatada 😎
{ 'id': '57684', 'subject': 'INSP_GR01_2021_0504', 'status': 'Relatada', 'priority': 'Normal', 'start_date': '2021-03-19', 'due_date': '2021-12-31', 'Classe da Inspeção': 'Técnica', 'Tipo de inspeção': 'Uso do Espectro - Monitoração', 'Ano': '2021', 'Número Sei do Processo': '{"numero"=>"53504.000007/2021-50", "link_acesso"=>"https://sei hm.anatel.gov.br/sei/controlador.php?acao=procedimento_trabalhar&id_procedimento=1962455"}', 'Descrição da Inspeção': 'Atendimento da Denúncia AC202010213075425 (6104512), \nverificação da Potência e Intensidade de Campo Elétrico da Frequência 105.1MHz e seus harmônicos, \nalém da checagem de Intermodulação e Espúrios nas frequências 450.3MHz e 750MHz.', 'Fiscal Responsável': 'Ronaldo da Silva Alves Batista', 'Fiscais': [ 'Ronaldo da Silva Alves Batista', 'Paulo Diogo Costa', 'Mario Augusto Volpini' ], 'Entidade da Inspeção': [], 'UF/Município': ['SP/São Paulo'], 'Serviços da Inspeção': [ '800 - COLETIVO - RETRANSMISSAO DE T.V.', '231 - COLETIVO - RADIODIFUSÃO COMUNITÁRIA', '230 - COLETIVO - RADIODIFUSÃO SONORA EM FREQÜÊNCIA MODULADA' ], 'Qnt. de emissões na faixa': '12', 'Emissões não autorizadas/desc': '70', 'Horas de Preparação': '2', 'Horas de Deslocamento': '0', 'Horas de Execução': '32', 'Horas de Conclusão': '6', 'SAV': '', 'PCDP': '', 'Procedimentos': [], 'Latitude (coordenadas)': '-22.94694', 'Longitude (coordenadas)': '-43.21944', 'Uso de PF': 'Não se aplica PF - uso apenas de formulários', 'Ação de risco à vida criada?': 'Não', 'Frequência Inicial': '54', 'Unidade da Frequência Inicial': 'MHz', 'Frequência Final': '700', 'Unidade da Frequência Final': 'MHz', 'Agrupamento': '', 'AppFiscaliza': '0', 'Relatório de Monitoramento': '{"numero"=>"0190565", "link_acesso"=>"https://seihm.anatel .gov.br/sei/controlador.php?acao=procedimento_trabalhar&id_procedimento=1962455&id_documento= 1962827"}', 'Reservar Instrumentos?': '0', 'Utilizou algum instrumento?': '0', 'id_ACAO': 52876, 'nome_ACAO': 'ACAO_GR01_2021_0491', 'descrição_ACAO': 'Teste', 'Users': [ 'Alexandre Elias de Andrade Oliveira', 'Alexandre Freitas de Lima', 'Alexandre Inacio', 'Alexandre Junzo Hamada', 'Alfredo de Andrade Filho', 'Ananias Pereira', 'Antonio Carlos Cardoso de Mello', 'Aparecido Sebastiao da Silva', 'Arthur Pisaruk', 'Carlos Augusto de Carvalho', 'Carlos Eduardo Guimaraes Silveira', 'Carlos da Paixao Filho', 'Celio Yukio Takahashi', 'Celso Luiz Maximino', 'Diogo Caldeira', 'Ediceu Beraldi', 'Eduardo Narkevicius', 'Elcio Maehara', 'Eustaquio Lages Duarte', 'Fiscal UD', 'Gauber Albuquerque', 'Gilson Ponce Ayres Filho', 'Helio Lopes de Carvalho Filho', 'Higor Paz Melo', 'Hugo Santana Lima', 'Humberto Barbosa Vinagre', 'Jamilson Evangelista', 'Joao Yokoyama', 'Joaquim Miranda', 'José Antônio S. Sanches', 'Julio Cesar de Assis Santos', 'Kiyotomo Kawamura', 'Laert Calil Junior', 'Lannei Vilela Moraes', 'Luis Lagomes', 'Luiz Vinicios Mielniczuk Seelig', 'Marcelo Augusto Scacabarozi', 'Marcio Costa', 'Marcio Rodrigues Maciel', 'Marcos Antônio Rodrigues', 'Marcos Juliano Valim da Silva', 'Maria Teresa Flosi Garrafa', 'Mario Augusto Volpini', 'Murilo Amaro', 'Osnir Lopes', 'Paulo Diogo Costa', 'Pedro Arai', 'Renato Sadao Kushioyada', 'Ricardo Santos Marques', 'Ricardo da Silva e Souza', 'Roberto Carlos Soares Campos', 'Roberto Ferreira dos Santos', 'Roberto Takata', 'Rodrigo Barbosa de Paula', 'Rogerio Zambotto', 'Ronaldo da Silva Alves Batista', 'Sergio Pereira', 'Thiago Silva', 'Thomaz Honma Ishida', 'Vinicius Paiva de Oliveira', 'Vitor Zelada', 'Wellington Devechi Piauilino', 'Wladimir Senise', 'marcio colazingari' ] }
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fiscaliza-0.0.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9574b455671b02f89ef376820bbfe63a37d5570115ee7e8c25a302e2aa578fe2 |
|
MD5 | 55f30eb43d06dd844d4e6d8f4636965c |
|
BLAKE2b-256 | 625516bd4b879bebe83758caa0a21da116ae606763b243430be5078b080bf589 |