diff --git a/src/output_test/expected/expected_04_2020.json b/src/output_test/expected/expected_04_2020.json index 2966d5a..3e19cbd 100644 --- a/src/output_test/expected/expected_04_2020.json +++ b/src/output_test/expected/expected_04_2020.json @@ -17,24 +17,29 @@ }, { "categoria": "Remuneração Básica", - "item": "Outras Verbas Remuneratórias Legais ou Judiciais" + "item": "Outras Verbas Remuneratórias Legais ou Judiciais", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Função de Confiança ou Cargo em Comissão" + "item": "Função de Confiança ou Cargo em Comissão", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Gratificação Natalina" + "item": "Gratificação Natalina", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Férias (1/3 constitucional)" + "item": "Férias (1/3 constitucional)", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", "item": "Abono de Permanência", - "valor": 5834.9 + "valor": 5834.9, + "tipoReceita": "O" }, { "natureza": "D", diff --git a/src/output_test/expected/expected_05_2019.json b/src/output_test/expected/expected_05_2019.json index 6524524..7f42e86 100644 --- a/src/output_test/expected/expected_05_2019.json +++ b/src/output_test/expected/expected_05_2019.json @@ -17,24 +17,29 @@ }, { "categoria": "Remuneração Básica", - "item": "Outras Verbas Remuneratórias Legais ou Judiciais" + "item": "Outras Verbas Remuneratórias Legais ou Judiciais", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Função de Confiança ou Cargo em Comissão" + "item": "Função de Confiança ou Cargo em Comissão", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Gratificação Natalina" + "item": "Gratificação Natalina", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", "item": "Férias (1/3 constitucional)", - "valor": 27581.72 + "valor": 27581.72, + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Abono de Permanência" + "item": "Abono de Permanência", + "tipoReceita": "O" }, { "natureza": "D", diff --git a/src/output_test/expected/expected_05_2020.json b/src/output_test/expected/expected_05_2020.json index 8f5e29c..6b5a3c9 100644 --- a/src/output_test/expected/expected_05_2020.json +++ b/src/output_test/expected/expected_05_2020.json @@ -17,24 +17,29 @@ }, { "categoria": "Remuneração Básica", - "item": "Outras Verbas Remuneratórias Legais ou Judiciais" + "item": "Outras Verbas Remuneratórias Legais ou Judiciais", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Função de Confiança ou Cargo em Comissão" + "item": "Função de Confiança ou Cargo em Comissão", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Gratificação Natalina" + "item": "Gratificação Natalina", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Férias (1/3 constitucional)" + "item": "Férias (1/3 constitucional)", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", "item": "Abono de Permanência", - "valor": 5834.9 + "valor": 5834.9, + "tipoReceita": "O" }, { "natureza": "D", diff --git a/src/output_test/expected/expected_06_2020.json b/src/output_test/expected/expected_06_2020.json index eaa2741..a7ecd1e 100644 --- a/src/output_test/expected/expected_06_2020.json +++ b/src/output_test/expected/expected_06_2020.json @@ -17,24 +17,29 @@ }, { "categoria": "Remuneração Básica", - "item": "Outras Verbas Remuneratórias Legais ou Judiciais" + "item": "Outras Verbas Remuneratórias Legais ou Judiciais", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Função de Confiança ou Cargo em Comissão" + "item": "Função de Confiança ou Cargo em Comissão", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Gratificação Natalina" + "item": "Gratificação Natalina", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Férias (1/3 constitucional)" + "item": "Férias (1/3 constitucional)", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", "item": "Abono de Permanência", - "valor": 5834.9 + "valor": 5834.9, + "tipoReceita": "O" }, { "natureza": "D", diff --git a/src/output_test/expected/expected_07_2020.json b/src/output_test/expected/expected_07_2020.json index 8d33918..1c53891 100644 --- a/src/output_test/expected/expected_07_2020.json +++ b/src/output_test/expected/expected_07_2020.json @@ -17,24 +17,29 @@ }, { "categoria": "Remuneração Básica", - "item": "Outras Verbas Remuneratórias Legais ou Judiciais" + "item": "Outras Verbas Remuneratórias Legais ou Judiciais", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Função de Confiança ou Cargo em Comissão" + "item": "Função de Confiança ou Cargo em Comissão", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Gratificação Natalina" + "item": "Gratificação Natalina", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", - "item": "Férias (1/3 constitucional)" + "item": "Férias (1/3 constitucional)", + "tipoReceita": "O" }, { "categoria": "Remuneração Eventual ou Temporária", "item": "Abono de Permanência", - "valor": 5834.9 + "valor": 5834.9, + "tipoReceita": "O" }, { "natureza": "D", diff --git a/src/parser.py b/src/parser.py index bd19707..88acdb4 100644 --- a/src/parser.py +++ b/src/parser.py @@ -1,3 +1,8 @@ +""" +Script responsável por iterar sobre os membros da folha, +listando cada rubrica do contracheque e das indenizações e seus respectivos valores recebidos por cada membro. +""" + import number import re import numpy as np @@ -5,16 +10,26 @@ from coleta import coleta_pb2 as Coleta from headers_keys import ( - HEADERS, REM_BASICA, REM_EVENTUAL, OBRIGATORIOS, VERBAS, TEMPORARIAS, VERBAS_06_20, TEMPORARIAS_06_20, TEMPORARIAS_07_20) - - + HEADERS, + REM_BASICA, + REM_EVENTUAL, + OBRIGATORIOS, + VERBAS, + TEMPORARIAS, + VERBAS_06_20, + TEMPORARIAS_06_20, + TEMPORARIAS_07_20, +) + + +# Listando os membros da folha de contracheque def parse_employees(file, colect_key, month, year): employees = {} counter = 1 # As informações dos membros começam somente a partir da 9ª linha file = file[8:] for row in file: - if 'Fonte da Informação' in row[0]: + if "Fonte da Informação" in row[0]: break # As planilhas do MPT possui células vazias (NaN) entre os dados, # aqui removemos essas células e deixamos apenas as informações dos membros @@ -23,16 +38,14 @@ def parse_employees(file, colect_key, month, year): member.id_contra_cheque = colect_key + "/" + str(counter) member.chave_coleta = colect_key # A matrícula é fornecida juntamente ao nome, aqui separamos nome e matrícula. - matNome = re.split(r'-', new_row[0]) + matNome = re.split(r"-", new_row[0]) member.matricula = matNome[0] member.nome = matNome[1] member.funcao = new_row[1] member.local_trabalho = new_row[2] member.tipo = Coleta.ContraCheque.Tipo.Value("MEMBRO") member.ativo = True - member.remuneracoes.CopyFrom( - create_remuneration(new_row, month, year) - ) + member.remuneracoes.CopyFrom(create_remuneration(new_row, month, year)) employees[matNome[0]] = member counter += 1 @@ -40,6 +53,9 @@ def parse_employees(file, colect_key, month, year): return employees +# Listando cada rubrica do contracheque e seus valores +# Apenas a Remuneração do Cargo Efetivo é do tipo B = Base +# Os demais são O, outras remunerações, ou D, descontos def create_remuneration(row, month, year): remuneration_array = Coleta.Remuneracoes() # REMUNERAÇÃO BÁSICA @@ -50,7 +66,10 @@ def create_remuneration(row, month, year): remuneration.item = key valor = re.sub("[R$] ?", "", row[value]) # Tirando o "R$" da string remuneration.valor = float(number.format_value(valor)) - remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("B") + if value == 3: + remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("B") + else: + remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O") remuneration_array.remuneracao.append(remuneration) # REMUNERAÇÃO EVENTUAL OU TEMPORÁRIA for key, value in HEADERS[REM_EVENTUAL].items(): @@ -60,7 +79,7 @@ def create_remuneration(row, month, year): remuneration.item = key valor = re.sub("[R$] ?", "", row[value]) # Tirando o "R$" da string remuneration.valor = float(number.format_value(valor)) - remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("B") + remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O") remuneration_array.remuneracao.append(remuneration) # OBRIGATÓRIOS/LEGAIS for key, value in HEADERS[OBRIGATORIOS].items(): @@ -69,12 +88,13 @@ def create_remuneration(row, month, year): remuneration.categoria = OBRIGATORIOS remuneration.item = key valor = re.sub("[R$] ?", "", row[value]) # Tirando o "R$" da string - remuneration.valor = abs( - float(number.format_value(valor))) * (-1) + remuneration.valor = abs(float(number.format_value(valor))) * (-1) remuneration_array.remuneracao.append(remuneration) return remuneration_array +# Listando cada rubrica da folha de indenizações e seus valores a partir de 07/2020 +# R = Receita; O = Outras def remunerations_2020_07(row): remuneration_array = Coleta.Remuneracoes() # VERBAS INDENIZATÓRIAS @@ -94,8 +114,7 @@ def remunerations_2020_07(row): remuneration.categoria = TEMPORARIAS remuneration.item = key remuneration.valor = float(number.format_value(row[value])) - remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value( - "O") + remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O") remuneration_array.remuneracao.append(remuneration) except: # O cabeçalho da planilha de julho de 2020 tem 2 colunas a menos @@ -105,11 +124,13 @@ def remunerations_2020_07(row): remuneration.categoria = TEMPORARIAS remuneration.item = key remuneration.valor = float(number.format_value(row[value])) - remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value( - "O") + remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O") remuneration_array.remuneracao.append(remuneration) return remuneration_array + +# Listando cada rubrica da folha de indenizações e seus valores em 06/2020 +# R = Receita; O = Outras # A planilha de indenizações de junho de 2020 possui menos colunas def remunerations_06_20(row): remuneration_array = Coleta.Remuneracoes() @@ -134,6 +155,8 @@ def remunerations_06_20(row): return remuneration_array +# Listando cada rubrica da folha de indenizações e seus valores até 04/2020 +# R = Receita; O = Outras def remunerations_2019_2020(row): remuneration_array = Coleta.Remuneracoes() # VERBAS INDENIZATÓRIAS @@ -142,7 +165,7 @@ def remunerations_2019_2020(row): rem.natureza = Coleta.Remuneracao.Natureza.Value("R") rem.categoria = "Verbas indenizatórias" # O nome do item e seu valor vêm na mesma célula, aqui separamos esses valores - value = re.split(r'\(R\$', row[4]) + value = re.split(r"\(R\$", row[4]) # value[1] recebe o valor, sem parênteses e sem 'R$'. value[1] = re.sub("[)]?", "", value[1]) # Evitando o erro 'Invalid escape character in string' nos testes @@ -157,7 +180,7 @@ def remunerations_2019_2020(row): rem.natureza = Coleta.Remuneracao.Natureza.Value("R") rem.categoria = "Outras Remunerações Temporárias" # O nome do item e seu valor vêm na mesma célula, aqui separamos esses valores - value = re.split(r'\(R\$', row[6]) + value = re.split(r"\(R\$", row[6]) # value[1] recebe o valor, sem parênteses e sem 'R$'. value[1] = re.sub("[)]?", "", value[1]) rem.item = value[0] # value[0] contém o nome do item/verba @@ -167,6 +190,8 @@ def remunerations_2019_2020(row): return remuneration_array +# Listando cada rubrica da folha de indenizações e seus valores a partir de 2024 +# R = Receita; O = Outras def remunerations_2024(row): remuneration_array = Coleta.Remuneracoes() # VERBAS INDENIZATÓRIAS @@ -206,7 +231,7 @@ def remunerations_2018(row): def update_employees_05_20(data, employees): # A planilha de indenizações de maio de 2020 é diferente dos demais meses, tendo mais de 200 colunas. for row in data.indenizacoes: - if 'Auxílio-Alimentação' in row: + if "Auxílio-Alimentação" in row: head = row registration = str(row[0]) if registration in employees.keys(): @@ -217,6 +242,8 @@ def update_employees_05_20(data, employees): return employees +# Listando cada rubrica da folha de indenizações e seus valores em 05/2020 +# R = Receita; O = Outras def remunerations_05_20(head, row): remuneration_array = Coleta.Remuneracoes() for i in range(4, len(row)): @@ -229,6 +256,7 @@ def remunerations_05_20(head, row): remuneration_array.remuneracao.append(rem) return remuneration_array + # As planilhas seguem um padrão diferente a partir de junho de 2019 a abril de 2020 def update_employees_2019_2020(indenizacoes, employees): for i in range(len(indenizacoes)): @@ -237,7 +265,7 @@ def update_employees_2019_2020(indenizacoes, employees): if not number.is_nan(indenizacoes[i][0]): registration = str(indenizacoes[i][0]) else: - registration = str(indenizacoes[i-1][0]) + registration = str(indenizacoes[i - 1][0]) if registration in employees.keys(): emp = employees[registration] @@ -246,6 +274,7 @@ def update_employees_2019_2020(indenizacoes, employees): employees[registration] = emp return employees + # As planilhas seguem um padrão diferente a partir de junho de 2020 def update_employees_2020_06(data, employees): for row in data.indenizacoes: @@ -282,11 +311,16 @@ def update_employees_2024(data, employees): # As planilhas de indenizações possuem um padrão de 2018 a maio de 2019 def update_employees_2018(data, employees): for row in data: - if 'Observações:' in str(row[0]) or 'Fonte' in str(row[0]): + if "Observações:" in str(row[0]) or "Fonte" in str(row[0]): break - if not number.is_nan(row[0]) and 'NOME' not in row[0] and '(a)' not in row[0] and 'Nome' not in row[0]: + if ( + not number.is_nan(row[0]) + and "NOME" not in row[0] + and "(a)" not in row[0] + and "Nome" not in row[0] + ): # A matrícula vem juntamente ao nome, entre parênteses - value = re.split(r'\(', row[0]) + value = re.split(r"\(", row[0]) registration = re.sub("[)]?", "", value[1]) if registration in employees.keys(): emp = employees[registration] @@ -296,23 +330,35 @@ def update_employees_2018(data, employees): return employees +# Executando todas as funções, +# iterando os contracheques e indenizações e retornando a folha completa def parse(data, colect_key): employees = {} payroll = Coleta.FolhaDePagamento() - employees.update(parse_employees( - data.contracheque, colect_key, data.month, data.year)) + employees.update( + parse_employees(data.contracheque, colect_key, data.month, data.year) + ) if int(data.year) == 2018 or int(data.year) == 2019 and int(data.month) <= 5: update_employees_2018(data.indenizacoes, employees) - elif int(data.year) == 2019 and int(data.month) > 5 or int(data.year) == 2020 and int(data.month) <= 4: + elif ( + int(data.year) == 2019 + and int(data.month) > 5 + or int(data.year) == 2020 + and int(data.month) <= 4 + ): update_employees_2019_2020(data.indenizacoes, employees) elif int(data.year) == 2020 and int(data.month) == 5: update_employees_05_20(data, employees) - elif (int(data.year) > 2020 and int(data.year) < 2024) or int(data.year) == 2020 and int(data.month) >= 6: + elif ( + (int(data.year) > 2020 and int(data.year) < 2024) + or int(data.year) == 2020 + and int(data.month) >= 6 + ): update_employees_2020_06(data, employees) else: update_employees_2024(data, employees)