# ---- Pacotes ----
if(!require(openxlsx)){
install.packages("openxlsx", repos="https://cloud.r-project.org")
library(openxlsx)
} else {
library(openxlsx)
}
## Carregando pacotes exigidos: openxlsx
## Warning: pacote 'openxlsx' foi compilado no R versão 4.5.2
# ---- Dados ----
funcionarios <- data.frame(
nome = c("Ana Souza", "Bruno Lima", "Carla Nunes", "Daniel Freitas", "Elisa Rocha", "Fernando Alves"),
n_inscricao = 1001:1006,
setor = c("Administrativo", "Apoio", "Operação", "Operação", "Operação", "Gerência"),
cargo = c("Assistente", "Auxiliar", "Operador", "Supervisor", "Operador", "Gerente de Operações"),
contrato = as.Date(c("2022-01-10","2023-05-02","2021-03-15","2020-08-21","2023-02-14","2019-07-01")),
salario_base = c(2500, 2300, 1800, 3200, 2000, 6000),
stringsAsFactors = FALSE
)
vendas <- data.frame(
nome = rep(funcionarios$nome, each = 1),
mes = 9,
ano = 2024,
valor_venda = c(0, 0, 25000, 40000, 30000, 120000)
)
# ---- Funções ----
calc_comissao <- function(setor, cargo, vendas_valor){
if(is.na(vendas_valor)) vendas_valor <- 0
s <- tolower(setor)
c <- tolower(cargo)
if(grepl("gerente", c)) return(vendas_valor * 0.01)
if(grepl("oper", s) | grepl("oper", c) | grepl("super", c)) return(vendas_valor * 0.05)
return(0)
}
get_aliquota_ir <- function(renda){
if(renda <= 1903.98) return(0)
else if(renda <= 2826.65) return(7.5)
else if(renda <= 3751.05) return(15)
else if(renda <= 4664.68) return(22.5)
else return(27.5)
}
calc_irpf <- function(renda, aliquota) renda * aliquota / 100
calc_inss_empregado <- function(renda) renda * 0.08
calc_inss_empregador <- function(renda) renda * 0.20
calc_fgts <- function(renda) renda * 0.08
# ---- Montagem da Folha ----
folha <- merge(funcionarios, vendas, by="nome")
# Inicializar colunas
colunas <- c("comissao", "renda_bruta", "aliquota_ir", "irpf",
"inss", "inss_empregador", "fgts", "salario_liquido")
for(col in colunas) folha[[col]] <- 0
# Cálculos
for(i in 1:nrow(folha)){
vendas_atual <- ifelse(is.na(folha$valor_venda[i]), 0, folha$valor_venda[i])
folha$comissao[i] <- calc_comissao(folha$setor[i], folha$cargo[i], vendas_atual)
folha$renda_bruta[i] <- folha$salario_base[i] + folha$comissao[i]
folha$aliquota_ir[i] <- get_aliquota_ir(folha$renda_bruta[i])
folha$irpf[i] <- calc_irpf(folha$renda_bruta[i], folha$aliquota_ir[i])
folha$inss[i] <- calc_inss_empregado(folha$renda_bruta[i])
folha$inss_empregador[i] <- calc_inss_empregador(folha$renda_bruta[i])
folha$fgts[i] <- calc_fgts(folha$renda_bruta[i])
folha$salario_liquido[i] <- folha$renda_bruta[i] - folha$irpf[i] - folha$inss[i]
}
# ---- Estatísticas ----
summary(folha[,c("salario_base","comissao","renda_bruta","irpf","inss","salario_liquido")])
## salario_base comissao renda_bruta irpf
## Min. :1800 Min. : 0.0 Min. :2300 Min. : 172.5
## 1st Qu.:2075 1st Qu.: 300.0 1st Qu.:2638 1st Qu.: 255.0
## Median :2400 Median :1225.0 Median :3275 Median : 491.2
## Mean :2967 Mean : 991.7 Mean :3958 Mean : 792.1
## 3rd Qu.:3025 3rd Qu.:1437.5 3rd Qu.:4775 3rd Qu.:1203.8
## Max. :6000 Max. :2000.0 Max. :7200 Max. :1980.0
## inss salario_liquido
## Min. :184.0 Min. :1944
## 1st Qu.:211.0 1st Qu.:2172
## Median :262.0 Median :2522
## Mean :316.7 Mean :2850
## 3rd Qu.:382.0 3rd Qu.:3189
## Max. :576.0 Max. :4644
folha
## nome n_inscricao setor cargo contrato
## 1 Ana Souza 1001 Administrativo Assistente 2022-01-10
## 2 Bruno Lima 1002 Apoio Auxiliar 2023-05-02
## 3 Carla Nunes 1003 Operação Operador 2021-03-15
## 4 Daniel Freitas 1004 Operação Supervisor 2020-08-21
## 5 Elisa Rocha 1005 Operação Operador 2023-02-14
## 6 Fernando Alves 1006 Gerência Gerente de Operações 2019-07-01
## salario_base mes ano valor_venda comissao renda_bruta aliquota_ir irpf
## 1 2500 9 2024 0 0 2500 7.5 187.5
## 2 2300 9 2024 0 0 2300 7.5 172.5
## 3 1800 9 2024 25000 1250 3050 15.0 457.5
## 4 3200 9 2024 40000 2000 5200 27.5 1430.0
## 5 2000 9 2024 30000 1500 3500 15.0 525.0
## 6 6000 9 2024 120000 1200 7200 27.5 1980.0
## inss inss_empregador fgts salario_liquido
## 1 200 500 200 2112.5
## 2 184 460 184 1943.5
## 3 244 610 244 2348.5
## 4 416 1040 416 3354.0
## 5 280 700 280 2695.0
## 6 576 1440 576 4644.0
# ---- Gráfico de Custo Total ----
folha$custo_total <- folha$salario_base + folha$comissao + folha$inss_empregador + folha$fgts
barplot(folha$custo_total, names.arg = folha$nome, col = "skyblue",
las = 2, main = "Custo Total por Funcionário", ylab = "R$ Total")
