Skip to content

Commit

Permalink
Merge pull request #9 from dadosjusbr/corrige-rb-para-ro
Browse files Browse the repository at this point in the history
mudando rubricas R/B para R/O
  • Loading branch information
joellensilva authored Dec 14, 2024
2 parents 5fbacf9 + 66e067c commit 2cb1112
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 48 deletions.
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pandas==1.2.3
pandas>=1.2.3
protoDadosjusbr>=0.7
protobuf==3.18.0
odfpy==1.4.1
Expand Down
15 changes: 10 additions & 5 deletions src/output_test/expected/expected_05_2019.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,28 @@
},
{
"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"
"item": "Abono de Permanência",
"tipoReceita": "O"
},
{
"natureza": "D",
Expand Down
15 changes: 10 additions & 5 deletions src/output_test/expected/expected_06_2019.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,28 @@
},
{
"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"
"item": "Abono de Permanência",
"tipoReceita": "O"
},
{
"natureza": "D",
Expand Down
15 changes: 10 additions & 5 deletions src/output_test/expected/expected_07_2019.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,28 @@
},
{
"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"
"item": "Abono de Permanência",
"tipoReceita": "O"
},
{
"natureza": "D",
Expand Down
15 changes: 10 additions & 5 deletions src/output_test/expected/expected_09_2021.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,28 @@
},
{
"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"
"item": "Abono de Permanência",
"tipoReceita": "O"
},
{
"natureza": "D",
Expand Down
91 changes: 64 additions & 27 deletions src/parser.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
"""
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 re
import number

from coleta import coleta_pb2 as Coleta

from headers_keys import (HEADERS, INDENIZACOES_ANTES, OBRIGATORIOS_ANTES, REMTEMP_ANTES, REMUNERACAOBASICA,
EVENTUALTEMP, OBRIGATORIOS)
from headers_keys import (
HEADERS,
INDENIZACOES_ANTES,
OBRIGATORIOS_ANTES,
REMTEMP_ANTES,
REMUNERACAOBASICA,
EVENTUALTEMP,
OBRIGATORIOS,
)


# Listando os membros da folha de contracheque após 07/2019
def parse_employees_after(file_name, colect_key, month, year):
employees = {}
counter = 1
for row in file_name:
if str(row[0]) == "TOTAL GERAL":
break
if not number.is_nan(row[0]) and str(row[0]) not in ["Matrícula","Lotação"]:
if not number.is_nan(row[0]) and str(row[0]) not in ["Matrícula", "Lotação"]:
# As planilhas do MPF possui células vazias (NaN) entre os dados,
# aqui removemos essas células e deixamos apenas as informações dos membros
new_row = [x for x in row if not number.is_nan(x)]
Expand All @@ -32,16 +45,15 @@ def parse_employees_after(file_name, colect_key, month, year):
member.local_trabalho = new_row[3]
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[member.matricula] = member
counter += 1

return employees


# Listando os membros da folha de contracheque antes de 07/2019
def parse_employees_before(file_name, colect_key, month, year):
employees = {}
counter = 1
Expand All @@ -58,26 +70,26 @@ def parse_employees_before(file_name, colect_key, month, year):
member.local_trabalho = new_row[3]
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[str(new_row[0])] = member
counter += 1

return employees


# Listando cada rubrica da folha de indenizações e seus valores após 09/2021
# R = Receita; O = Outras
def remunerations_after(file_indenizatorias, month, year):
dict_remuneracoes = {}
for row in file_indenizatorias:
if 'Data' in str(row):
if "Data" in str(row):
break
if not number.is_nan(row[0]) and str(row[0]) not in ["Matrícula", "Lotação"]:
# As planilhas do MPF possui células vazias (NaN) entre os dados,
# aqui removemos essas células e deixamos apenas as informações dos membros
new_row = [x for x in row if not number.is_nan(x)]
if int(year) >= 2024:
if int(year) >= 2024:
mat = str(new_row[1])
else:
mat = str(new_row[0])
Expand All @@ -93,22 +105,33 @@ def remunerations_after(file_indenizatorias, month, year):
rem.natureza = Coleta.Remuneracao.Natureza.Value("R")
rem.categoria = "Verbas indenizatórias"
rem.item = str(new_row[4])
rem.valor = float(number.format_value(str(new_row[5]).replace('R$','')))
rem.valor = float(
number.format_value(str(new_row[5]).replace("R$", ""))
)
rem.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O")
remuneracoes.remuneracao.append(rem)
# Outras remunerações temporárias
if "N/C" not in [new_row[len(new_row)-2], new_row[len(new_row)-1]] and len(new_row) in [8, 6]:
if "N/C" not in [
new_row[len(new_row) - 2],
new_row[len(new_row) - 1],
] and len(new_row) in [8, 6]:
rem = Coleta.Remuneracao()
rem.natureza = Coleta.Remuneracao.Natureza.Value("R")
rem.categoria = "Outras remunerações temporárias"
rem.item = str(new_row[len(new_row)-2])
rem.valor = float(number.format_value(str(new_row[len(new_row)-1]).replace('R$','')))
rem.item = str(new_row[len(new_row) - 2])
rem.valor = float(
number.format_value(
str(new_row[len(new_row) - 1]).replace("R$", "")
)
)
rem.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O")
remuneracoes.remuneracao.append(rem)
dict_remuneracoes[mat] = remuneracoes
return dict_remuneracoes


# Listando cada rubrica da folha de indenizações e seus valores antes de 09/2021
# R = Receita; O = Outras
def remunerations_before(row):
remuneration_array = Coleta.Remuneracoes()
# VERBAS INDENIZATÓRIAS
Expand All @@ -132,6 +155,9 @@ def remunerations_before(row):
return remuneration_array


# 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
Expand All @@ -141,7 +167,10 @@ def create_remuneration(row, month, year):
remuneration.categoria = REMUNERACAOBASICA
remuneration.item = key
remuneration.valor = float(number.format_value(row[value]))
remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("B")
if value == 4:
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[EVENTUALTEMP].items():
Expand All @@ -150,7 +179,7 @@ def create_remuneration(row, month, year):
remuneration.categoria = EVENTUALTEMP
remuneration.item = key
remuneration.valor = float(number.format_value(row[value]))
remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("B")
remuneration.tipo_receita = Coleta.Remuneracao.TipoReceita.Value("O")
remuneration_array.remuneracao.append(remuneration)
# OBRIGATÓRIOS/LEGAIS
if int(year) > 2019 or (int(year) == 2019 and int(month) >= 7):
Expand All @@ -159,21 +188,21 @@ def create_remuneration(row, month, year):
remuneration.natureza = Coleta.Remuneracao.Natureza.Value("D")
remuneration.categoria = OBRIGATORIOS
remuneration.item = key
remuneration.valor = abs(
float(number.format_value(row[value]))) * (-1)
remuneration.valor = abs(float(number.format_value(row[value]))) * (-1)
remuneration_array.remuneracao.append(remuneration)
else:
for key, value in HEADERS[OBRIGATORIOS_ANTES].items():
remuneration = Coleta.Remuneracao()
remuneration.natureza = Coleta.Remuneracao.Natureza.Value("D")
remuneration.categoria = OBRIGATORIOS
remuneration.item = key
remuneration.valor = abs(
float(number.format_value(row[value]))) * (-1)
remuneration.valor = abs(float(number.format_value(row[value]))) * (-1)
remuneration_array.remuneracao.append(remuneration)
return remuneration_array


# Mapeando as indenizações para cada membro da folha de contracheque
# O tratamento é diferente antes e depois de 09/2021
def update_employees_after(data, employees):
remuneracoes = remunerations_after(data.indenizatorias, data.month, data.year)
for employee in employees:
Expand All @@ -197,23 +226,31 @@ def update_employees_before(file_indenizacoes, 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()
# As planilhas de contracheque até junho de 2019 não possuem matrícula e seguem uma ordem diferente de dados.
# As planilhas de indenizações somente passam a ser disponibilizadas em julho de 2019.
if int(data.year) > 2019 or (int(data.year) == 2019 and int(data.month) >= 7):
employees.update(parse_employees_after(
data.contracheque, colect_key, data.month, data.year))
# As planilhas de indenizacoes seguem um formato de dados diferente a partir de setembro de 2021.
employees.update(
parse_employees_after(data.contracheque, colect_key, data.month, data.year)
)
# As planilhas de indenizacoes seguem um formato de dados diferente a partir de setembro de 2021.
# 07/2020 também segue esse formato, sendo uma exceção em 2020.
if int(data.year) > 2021 or (int(data.year) == 2021 and int(data.month) >= 9) or (int(data.year) == 2020 and int(data.month) == 7):
if (
int(data.year) > 2021
or (int(data.year) == 2021 and int(data.month) >= 9)
or (int(data.year) == 2020 and int(data.month) == 7)
):
update_employees_after(data, employees)
else:
update_employees_before(data.indenizatorias, employees)
else:
employees.update(parse_employees_before(
data.contracheque, colect_key, data.month, data.year))
employees.update(
parse_employees_before(data.contracheque, colect_key, data.month, data.year)
)

for i in employees.values():
payroll.contra_cheque.append(i)
Expand Down

0 comments on commit 2cb1112

Please sign in to comment.