Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 26 additions & 7 deletions Guia1/src/repositories/record_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,34 @@ def __init__(self, file_path: str):

def load_all(self):
data = FileLoader.load_csv(self._file_path)
self._records = [
Record(int(row["id"]), row["name"], row["address"])
for row in data
]
self._records = []

for row in data:
try:
if not row.get("id"):
raise ValueError("ID vazio")

record_id = int(row["id"])

if record_id <= 0:
raise ValueError("ID negativo ou zero")

if not row.get("name", "").strip() or not row.get("address", "").strip():
raise ValueError("Nome ou endereço vazio")

registro = Record(record_id, row["name"], row["address"])
self._records.append(registro)

except ValueError:
print(f"Registro inválido ignorado: {row}")

return self._records

def search(self, term: str):
term = term.lower()
termos_busca = term.lower().split()

return [
r for r in self._records
if term in r.name.lower() or term in r.address.lower()
]
if all(t in f"{r.name} {r.address}".lower() for t in termos_busca)
]

155 changes: 155 additions & 0 deletions Guia2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# Guia 2 — Sistema de Folha de Pagamento (RH)

## Contexto

Você faz parte da equipe responsável por manter um módulo de **Folha de Pagamento** dentro de um sistema de **Recursos Humanos (RH)**.

Esse módulo calcula informações básicas de funcionários de diferentes cargos, como:

- nome
- matricula
- salario_base

Atualmente o sistema possui uma hierarquia de classes para representar funcionários, mas carece implementar as subclasses de acordo com o diagrama UML abaixo:

--------------------------------
| Funcionario |
--------------------------------
| - nome |
| - matricula |
| - salario_base |
--------------------------------
| + dados_basicos() |
| + gerar_contracheque() |
| + calcular_salario_liquido() |
| # calcular_bonus() |
| # calcular_descontos() |
| # calcular_adicionais() |
--------------------------------
-----------------------------------------
| | |
| | |
----------------- ----------------- -----------------
| Desenvolvedor | | Gerente | | Estagiari o |
----------------- ----------------- -----------------
| linguagem | | setor | | curso |
| senioridade | | qtd_equipe | | carga_horaria |
----------------- ----------------- -----------------

Seu papel é implementar as subclasses passando nos testes propostos.

---

## 1. Desenvolvedor

### Atributos adicionais

- `linguagem`
- `senioridade`

### Regras

#### `calcular_bonus()`

O bônus depende da senioridade:

| Senioridade | Bônus |
|-------------|----------------------|
| junior | 5% do salário base |
| pleno | 10% do salário base |
| senior | 15% do salário base |

---

#### `calcular_descontos()`

Desconto fixo de **8% do salário base**.

---

#### `calcular_adicionais()`

Adicional definido pela linguagem principal:

| Linguagem | Adicional |
|----------------|-----------|
| Python | +500 |
| Java | +400 |
| JavaScript | +350 |
| Qualquer outra | +200 |

---

## 2. Gerente

### Atributos adicionais

- `setor`
- `qtd_equipe`

### Regras

#### `calcular_bonus()`

O bônus depende da quantidade de pessoas na equipe:

| Tamanho da equipe | Bônus |
|-------------------|---------------------|
| até 5 | 10% do salário base |
| de 6 até 10 | 15% do salário base |
| acima de 10 | 20% do salário base |

---

#### `calcular_descontos()`

Desconto fixo de **12% do salário base**.

---

#### `calcular_adicionais()`

Adicional por responsabilidade:

| Quantidade da equipe | Adicional |
|----------------------|-----------|
| equipe > 10 | +2000 |
| equipe > 5 | +1000 |
| caso contrário | +500 |

---

## 3. Estagiario

### Atributos adicionais

- `curso`
- `carga_horaria`

### Regras

#### `calcular_bonus()`

Bônus fixo de **3% do salário base**.

---

#### `calcular_descontos()`

Desconto fixo de **2% do salário base**.

---

#### `calcular_adicionais()`

Auxílio baseado na carga horária:

| Carga horária | Adicional |
|---------------|-----------|
| até 20h | +150 |
| até 30h | +250 |
| acima de 30h | +350 |

---
995b5983a8b684cba7bbc7f802c760906f0d690c1e90bf440631cfe486082eb3
3 changes: 3 additions & 0 deletions Guia2/pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[pytest]
pythonpath = src
testpaths = tests
Empty file added Guia2/requirements.txt
Empty file.
2 changes: 2 additions & 0 deletions Guia2/run_tests.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pytest -v
pause
1 change: 1 addition & 0 deletions Guia2/src/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from folha_pagamento import Estagiario, Gerente, Desenvolvedor, Funcionario
Binary file added Guia2/src/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
4 changes: 4 additions & 0 deletions Guia2/src/folha_pagamento/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from .funcionario import Funcionario
from .estagiario import Estagiario
from .desenvolvedor import Desenvolvedor
from .gerente import Gerente
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
36 changes: 36 additions & 0 deletions Guia2/src/folha_pagamento/desenvolvedor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from folha_pagamento.funcionario import Funcionario

# Desenvolva a classe Desenvolvedor aqui.

class Desenvolvedor(Funcionario):
def _init_(self, nome, matricula, salario_base, linguagem, senioridade):
super()._init_(nome, matricula, salario_base)
self.linguagem = linguagem
self.senioridade = senioridade

def calcular_bonus(self):
nivel = self.senioridade.lower()

if nivel == "junior":
return self.salario_base * 0.05
elif nivel == "pleno":
return self.salario_base * 0.10
elif nivel == "senior":
return self.salario_base * 0.15

return 0.0

def calcular_descontos(self):
return self.salario_base * 0.08

def calcular_adicionais(self):
ling = self.linguagem.lower()

if ling == "python":
return self.salario_base + 500.0
elif ling == "java":
return self.salario_base + 400.0
elif ling == "javascript":
return self.salario_base + 350.0

pass
26 changes: 26 additions & 0 deletions Guia2/src/folha_pagamento/estagiario.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from folha_pagamento.funcionario import Funcionario

# Desenvolva a classe Estagiario aqui.

class Estagiario(Funcionario):
def _init_(self, nome, matricula, salario_base, curso, carga_horaria):
super()._init_(nome, matricula, salario_base)
self.curso = curso
self.carga_horaria = carga_horaria

def calcular_bonus(self):
return self.salario_base * 0.03

def calcular_descontos(self):
return self.salario_base * 0.02

def calcular_adicionais(self):

if self.carga_horaria <= 20:
return self.salario_base + 150.0
elif self.carga_horaria >20 and self.carga_horaria<=30:
return self.salario_base + 250.0
elif self.carga_horaria > 30:
return self.salario_base + 350.0

pass
77 changes: 77 additions & 0 deletions Guia2/src/folha_pagamento/funcionario.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from abc import ABC, abstractmethod

class Funcionario(ABC):
def __init__(self, nome: str, matricula: str, salario_base: float):
if not nome:
raise ValueError("Nome inválido.")

if not matricula:
raise ValueError("Matrícula inválida.")

if salario_base < 0:
raise ValueError("Salário não pode ser negativo.")

self._nome = nome
self._matricula = matricula
self._salario_base = salario_base

# ---------------------------
# Propriedades comuns
# ---------------------------
@property
def nome(self) -> str:
return self._nome

@property
def matricula(self) -> str:
return self._matricula

@property
def salario_base(self) -> float:
return self._salario_base

# ---------------------------
# Métodos concretos
# ---------------------------
def dados_basicos(self) -> dict:
return {
"nome": self.nome,
"matricula": self.matricula,
"salario_base": self.salario_base,
"cargo": self.__class__.__name__
}

def calcular_salario_liquido(self) -> float:
return (
self.salario_base
+ self.calcular_bonus()
+ self.calcular_adicionais()
- self.calcular_descontos()
)

def gerar_contracheque(self) -> dict:
return {
"nome": self.nome,
"matricula": self.matricula,
"cargo": self.__class__.__name__,
"salario_base": self.salario_base,
"bonus": self.calcular_bonus(),
"adicionais": self.calcular_adicionais(),
"descontos": self.calcular_descontos(),
"salario_liquido": self.calcular_salario_liquido()
}

# ---------------------------
# Contrato abstrato
# ---------------------------
@abstractmethod
def calcular_bonus(self) -> float:
pass

@abstractmethod
def calcular_descontos(self) -> float:
pass

@abstractmethod
def calcular_adicionais(self) -> float:
pass
34 changes: 34 additions & 0 deletions Guia2/src/folha_pagamento/gerente.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from folha_pagamento.funcionario import Funcionario

# Desenvolva a classe Gerente aqui.

class Gerente(Funcionario):
def _init_(self, nome, matricula, salario_base, setor, qtd_equipe):
super()._init_(nome, matricula, salario_base)
self.setor = setor
self.qtd_equipe = qtd_equipe

def calcular_bonus(self):

if self.setor <= 5:
return self.salario_base * 0.10
elif self.setor > 5 and self.qtd_equipe <=10:
return self.salario_base * 0.15
elif self.setor > 10:
return self.salario_base * 0.15

return 0.0

def calcular_descontos(self):
return self.salario_base * 0.12

def calcular_adicionais(self):

if self.qtd_equipe > 10:
return self.salario_base + 2000.0
elif self.qtd_equipe > 5:
return self.salario_base + 1000.0

return self.salario_base + 500.0

pass
Empty file added Guia2/tests/__init__.py
Empty file.
Binary file added Guia2/tests/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading